From cc3dc3ca9674754353cd010791a458fbc9607c42 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Wed, 2 Jan 2019 12:20:42 +0100 Subject: [PATCH 001/771] ENH: Include defined constants for current library version --- .gitignore | 3 +++ CMakeLists.txt | 12 +++++++++++- src/h3lib/include/h3api.h | 2 ++ src/h3lib/include/version.h.in | 28 ++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/h3lib/include/version.h.in diff --git a/.gitignore b/.gitignore index 98be742b5..11569aa01 100644 --- a/.gitignore +++ b/.gitignore @@ -96,3 +96,6 @@ binding-functions # These KML files are generated by `make kml` KML/res*cells.kml KML/res*centers.kml + +# Generated header files +src/h3lib/include/version.h \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 95af19557..b39198f39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,10 @@ endif() file(READ VERSION H3_VERSION LIMIT_COUNT 1) # Clean any newlines string(REPLACE "\n" "" H3_VERSION "${H3_VERSION}") +string(REPLACE "." ";" H3_VERSION_LIST "${H3_VERSION}") +list(GET H3_VERSION_LIST 0 H3_VERSION_MAJOR) +list(GET H3_VERSION_LIST 1 H3_VERSION_MINOR) +list(GET H3_VERSION_LIST 2 H3_VERSION_PATCH) set(H3_SOVERSION 1) project(h3 LANGUAGES C VERSION ${H3_VERSION}) @@ -90,6 +94,7 @@ set(LIB_SOURCE_FILES src/h3lib/include/geoCoord.h src/h3lib/include/vec2d.h src/h3lib/include/vec3d.h + src/h3lib/include/version.h src/h3lib/include/linkedGeo.h src/h3lib/include/localij.h src/h3lib/include/baseCells.h @@ -184,6 +189,10 @@ set(OTHER_SOURCE_FILES set(ALL_SOURCE_FILES ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) +configure_file( + src/h3lib/include/version.h.in + src/h3lib/include/version.h) + # Build the H3 library add_library(h3 ${LIB_SOURCE_FILES}) @@ -207,7 +216,8 @@ if(have_vla) target_compile_definitions(h3 PUBLIC H3_HAVE_VLA) endif() target_include_directories(h3 PUBLIC - $) + $ + $) # Automatic code formatting find_program(CLANG_FORMAT_PATH clang-format) diff --git a/src/h3lib/include/h3api.h b/src/h3lib/include/h3api.h index cdf8373c3..164e5205d 100644 --- a/src/h3lib/include/h3api.h +++ b/src/h3lib/include/h3api.h @@ -23,6 +23,8 @@ #ifndef H3API_H #define H3API_H +#include "version.h" + /* * Preprocessor code to support renaming (prefixing) the public API. * All public functions should be wrapped in H3_EXPORT so they can be diff --git a/src/h3lib/include/version.h.in b/src/h3lib/include/version.h.in new file mode 100644 index 000000000..2e46533c4 --- /dev/null +++ b/src/h3lib/include/version.h.in @@ -0,0 +1,28 @@ +/* + * Copyright 2016-2018 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file version.h + * @brief Generated library version numbers + */ + +#ifndef VERSION_H +#define VERSION_H + +/* library version numbers generated from VERSION file */ +#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ +#define H3_VERSION_MINOR @H3_VERSION_MINOR@ +#define H3_VERSION_PATCH @H3_VERSION_PATCH@ + +#endif From 46d5b49cef14912f4dd326351e7314da028d08e5 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Wed, 2 Jan 2019 22:11:28 +0100 Subject: [PATCH 002/771] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c5ced43c..1fed9cf87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h](./src/h3lib/include/h3api.h). ## [Unreleased] +### Added +- Include defined constants for current library version ## [3.3.0] - 2018-12-25 ### Added From 9241521ae0e7cce8f992172c823c11c6ab1cb7a9 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 3 Jan 2019 01:48:12 +0100 Subject: [PATCH 003/771] FIX: Don't format generated file --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b39198f39..bd6e07e59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,6 @@ set(LIB_SOURCE_FILES src/h3lib/include/geoCoord.h src/h3lib/include/vec2d.h src/h3lib/include/vec3d.h - src/h3lib/include/version.h src/h3lib/include/linkedGeo.h src/h3lib/include/localij.h src/h3lib/include/baseCells.h @@ -191,7 +190,7 @@ set(ALL_SOURCE_FILES configure_file( src/h3lib/include/version.h.in - src/h3lib/include/version.h) + src/h3lib/include/version.h) # Build the H3 library add_library(h3 ${LIB_SOURCE_FILES}) From 1af08597a9c3f8d3fdfcba495129851eb01d47dc Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 3 Jan 2019 02:02:01 +0100 Subject: [PATCH 004/771] FIX: Add generated file without formatting it --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd6e07e59..0a61d81d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,12 +188,14 @@ set(OTHER_SOURCE_FILES set(ALL_SOURCE_FILES ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) +set(GENERATED_SOURCE_FILES + src/h3lib/include/version.h) configure_file( src/h3lib/include/version.h.in src/h3lib/include/version.h) # Build the H3 library -add_library(h3 ${LIB_SOURCE_FILES}) +add_library(h3 ${LIB_SOURCE_FILES} ${GENERATED_SOURCE_FILES}) target_compile_options(h3 PRIVATE ${H3_COMPILE_FLAGS}) target_link_libraries(h3 PRIVATE ${H3_LINK_FLAGS}) From 624420aff2b42ac9c2e6ec303d8d8caa5f98d312 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 3 Jan 2019 14:07:16 +0100 Subject: [PATCH 005/771] FIX: Configure h3api.h instead --- CMakeLists.txt | 11 ++++----- src/h3lib/include/{h3api.h => h3api.h.in} | 7 ++++-- src/h3lib/include/version.h.in | 28 ----------------------- 3 files changed, 10 insertions(+), 36 deletions(-) rename src/h3lib/include/{h3api.h => h3api.h.in} (98%) delete mode 100644 src/h3lib/include/version.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a61d81d3..5eb39c709 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,6 @@ set(LIB_SOURCE_FILES src/h3lib/include/constants.h src/h3lib/include/coordijk.h src/h3lib/include/algos.h - src/h3lib/include/h3api.h src/h3lib/include/stackAlloc.h src/h3lib/lib/algos.c src/h3lib/lib/coordijk.c @@ -189,10 +188,10 @@ set(ALL_SOURCE_FILES ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) set(GENERATED_SOURCE_FILES - src/h3lib/include/version.h) + src/h3lib/include/h3api.h) configure_file( - src/h3lib/include/version.h.in - src/h3lib/include/version.h) + src/h3lib/include/h3api.h.in + src/h3lib/include/h3api.h) # Build the H3 library add_library(h3 ${LIB_SOURCE_FILES} ${GENERATED_SOURCE_FILES}) @@ -218,7 +217,7 @@ if(have_vla) endif() target_include_directories(h3 PUBLIC $ - $) + $) # Automatic code formatting find_program(CLANG_FORMAT_PATH clang-format) @@ -563,7 +562,7 @@ install( # * src/h3lib/include/h3api.h -> /include/h3/h3api.h # Only the h3api.h header is needed by applications using H3. install( - FILES src/h3lib/include/h3api.h + FILES "${CMAKE_CURRENT_BINARY_DIR}/src/h3lib/include/h3api.h" DESTINATION "${include_install_dir}/h3" ) diff --git a/src/h3lib/include/h3api.h b/src/h3lib/include/h3api.h.in similarity index 98% rename from src/h3lib/include/h3api.h rename to src/h3lib/include/h3api.h.in index 164e5205d..0a5e87f8e 100644 --- a/src/h3lib/include/h3api.h +++ b/src/h3lib/include/h3api.h.in @@ -23,8 +23,6 @@ #ifndef H3API_H #define H3API_H -#include "version.h" - /* * Preprocessor code to support renaming (prefixing) the public API. * All public functions should be wrapped in H3_EXPORT so they can be @@ -56,6 +54,11 @@ extern "C" { /** @brief the H3Index fits within a 64-bit unsigned integer */ typedef uint64_t H3Index; +/* library version numbers generated from VERSION file */ +#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ +#define H3_VERSION_MINOR @H3_VERSION_MINOR@ +#define H3_VERSION_PATCH @H3_VERSION_PATCH@ + /** Maximum number of cell boundary vertices; worst case is pentagon: * 5 original verts + 5 edge crossings */ diff --git a/src/h3lib/include/version.h.in b/src/h3lib/include/version.h.in deleted file mode 100644 index 2e46533c4..000000000 --- a/src/h3lib/include/version.h.in +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file version.h - * @brief Generated library version numbers - */ - -#ifndef VERSION_H -#define VERSION_H - -/* library version numbers generated from VERSION file */ -#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ -#define H3_VERSION_MINOR @H3_VERSION_MINOR@ -#define H3_VERSION_PATCH @H3_VERSION_PATCH@ - -#endif From a0940f618eeecf10327c2f7c65ba4a48596f4184 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 3 Jan 2019 14:14:06 +0100 Subject: [PATCH 006/771] REV: Remove version.h from gitignore --- .gitignore | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 11569aa01..31320a63f 100644 --- a/.gitignore +++ b/.gitignore @@ -95,7 +95,4 @@ binding-functions # These KML files are generated by `make kml` KML/res*cells.kml -KML/res*centers.kml - -# Generated header files -src/h3lib/include/version.h \ No newline at end of file +KML/res*centers.kml \ No newline at end of file From 578188528a110fba610de0528e2de685b9b932a2 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Sun, 6 Jan 2019 15:23:12 +0100 Subject: [PATCH 007/771] FIX: Make sure h3api.h.in is also auto formatted --- .gitignore | 5 ++++- CMakeLists.txt | 11 +++++------ src/h3lib/include/h3api.h.in | 8 +++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 31320a63f..9c09ec1f8 100644 --- a/.gitignore +++ b/.gitignore @@ -95,4 +95,7 @@ binding-functions # These KML files are generated by `make kml` KML/res*cells.kml -KML/res*centers.kml \ No newline at end of file +KML/res*centers.kml + +# Generated files +src/h3lib/include/h3api.h \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5eb39c709..37756a293 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,14 +187,12 @@ set(OTHER_SOURCE_FILES set(ALL_SOURCE_FILES ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) -set(GENERATED_SOURCE_FILES - src/h3lib/include/h3api.h) -configure_file( - src/h3lib/include/h3api.h.in - src/h3lib/include/h3api.h) +set(UNCONFIGURED_API_HEADER src/h3lib/include/h3api.h) +set(CONFIGURED_API_HEADER src/h3lib/include/h3api.h) +configure_file(${UNCONFIGURED_API_HEADER} ${CONFIGURED_API_HEADER}) # Build the H3 library -add_library(h3 ${LIB_SOURCE_FILES} ${GENERATED_SOURCE_FILES}) +add_library(h3 ${LIB_SOURCE_FILES} ${CONFIGURED_API_HEADER}) target_compile_options(h3 PRIVATE ${H3_COMPILE_FLAGS}) target_link_libraries(h3 PRIVATE ${H3_LINK_FLAGS}) @@ -232,6 +230,7 @@ if(ENABLE_FORMAT) -i ${ALL_SOURCE_FILES} ${EXAMPLE_SOURCE_FILES} + ${UNCONFIGURED_API_HEADER} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Formatting sources" ) diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 0a5e87f8e..be10391dc 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -55,9 +55,11 @@ extern "C" { typedef uint64_t H3Index; /* library version numbers generated from VERSION file */ -#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ -#define H3_VERSION_MINOR @H3_VERSION_MINOR@ -#define H3_VERSION_PATCH @H3_VERSION_PATCH@ +// clang-format off +#define H3_VERSION_MAJOR @H3_VERSION_MAJOR @ +#define H3_VERSION_MINOR @H3_VERSION_MINOR @ +#define H3_VERSION_PATCH @H3_VERSION_PATCH @ +// clang-format on /** Maximum number of cell boundary vertices; worst case is pentagon: * 5 original verts + 5 edge crossings From 5278a3b067e43b5d82ed34d2042ef7536544df55 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Sun, 6 Jan 2019 15:26:49 +0100 Subject: [PATCH 008/771] FIX: fix cmake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 37756a293..ca804eec1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,7 +187,7 @@ set(OTHER_SOURCE_FILES set(ALL_SOURCE_FILES ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) -set(UNCONFIGURED_API_HEADER src/h3lib/include/h3api.h) +set(UNCONFIGURED_API_HEADER src/h3lib/include/h3api.h.in) set(CONFIGURED_API_HEADER src/h3lib/include/h3api.h) configure_file(${UNCONFIGURED_API_HEADER} ${CONFIGURED_API_HEADER}) From d447b22c74751aeddda9c8513420165cdbfa101d Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 8 Jan 2019 00:50:44 +0100 Subject: [PATCH 009/771] ENH: Add test and fix wrongly formatted clang constants --- src/apps/testapps/testH3Api.c | 6 ++++++ src/h3lib/include/h3api.h.in | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/testapps/testH3Api.c b/src/apps/testapps/testH3Api.c index 78d25e3e6..9a6059f28 100644 --- a/src/apps/testapps/testH3Api.c +++ b/src/apps/testapps/testH3Api.c @@ -78,4 +78,10 @@ SUITE(h3Api) { setGeoDegs(&boundary.verts[6], 18.043007860, -66.27669118199998); t_assertBoundary(h3, &boundary); } + + TEST(version) { + t_assert(H3_VERSION_MAJOR >= 0, "major version is set"); + t_assert(H3_VERSION_MINOR >= 0, "minor version is set"); + t_assert(H3_VERSION_PATCH >= 0, "patch version is set"); + } } diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index be10391dc..65aacb09b 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -56,9 +56,9 @@ typedef uint64_t H3Index; /* library version numbers generated from VERSION file */ // clang-format off -#define H3_VERSION_MAJOR @H3_VERSION_MAJOR @ -#define H3_VERSION_MINOR @H3_VERSION_MINOR @ -#define H3_VERSION_PATCH @H3_VERSION_PATCH @ +#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ +#define H3_VERSION_MINOR @H3_VERSION_MINOR@ +#define H3_VERSION_PATCH @H3_VERSION_PATCH@ // clang-format on /** Maximum number of cell boundary vertices; worst case is pentagon: From ebe248a659052d3434ed7f85307b78d222eb2db9 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 7 Jan 2019 17:21:19 -0800 Subject: [PATCH 010/771] Add script to build the website and publish to gh-pages --- scripts/publish_website.sh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 scripts/publish_website.sh diff --git a/scripts/publish_website.sh b/scripts/publish_website.sh new file mode 100644 index 000000000..01732f5a3 --- /dev/null +++ b/scripts/publish_website.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# Copyright 2019 Uber Technologies, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script builds the current version of the H3 documentation website +# and pushes it to production. This assumes that you have set the remote +# for gh-pages to the upstream (i.e. uber/h3) remote. + +git checkout gh-pages +git pull +git checkout master +pushd website +./scripts/build-to-gh-pages.sh +git push +git checkout master +popd + + From 06ae433f10b87307fda703181301b30b3caa4ce2 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 7 Jan 2019 17:31:06 -0800 Subject: [PATCH 011/771] Add cmake target, update website README --- CMakeLists.txt | 6 ++++++ website/README.md | 17 ++--------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 95af19557..aba049b03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,12 @@ else() ) endif() +# Website publishing +add_custom_target(publish-website + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/publish_website.sh + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + # Link all executables against H3 macro(add_h3_executable name) # invoke built-in add_executable diff --git a/website/README.md b/website/README.md index f151477d3..ae2e828b1 100644 --- a/website/README.md +++ b/website/README.md @@ -17,21 +17,8 @@ npm start ## Updating the H3 Website -From `./website`: +Make sure your `gh-pages` branch has its remote set to the upstream repo, then -Make sure your `gh-pages` branch is up to date with the upstream repo: ``` -git checkout gh-pages -git pull upstream gh-pages -``` - -Switch back to `master` and run the build: -``` -git checkout master -./scripts/build-to-gh-pages.sh -``` - -You're now on branch `gh-pages` again. Push changes to the live site: -``` -git push upstream gh-pages:gh-pages +make publish-website ``` \ No newline at end of file From a6dd2c8671f659399d9967b090343d95e2563388 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 7 Jan 2019 17:31:55 -0800 Subject: [PATCH 012/771] Fix script permissions --- scripts/publish_website.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/publish_website.sh diff --git a/scripts/publish_website.sh b/scripts/publish_website.sh old mode 100644 new mode 100755 From b657142afe086ba01c6a22a397fb0e9edc87dc76 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 7 Jan 2019 17:40:26 -0800 Subject: [PATCH 013/771] Add publishing the website to the list of release tasks --- RELEASE.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 23ea59f18..ff471ffcf 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -7,3 +7,6 @@ 2. Create a release "Release X.Y.Z" on Github * Create Tag `vX.Y.Z` * Copy CHANGELOG.md into the release notes + +3. Publish the website to display the latest docs + * `make publish-website` From 420929173beac7e7989f85a8c26cbaaf26bf1c0f Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 4 Jan 2019 12:53:02 +0100 Subject: [PATCH 014/771] ENH: Add getBaseCells function --- CHANGELOG.md | 3 ++- CMakeLists.txt | 1 + src/apps/testapps/testBaseCells.c | 29 +++++++++++++++++++++++++++++ src/h3lib/include/h3api.h.in | 8 ++++++++ src/h3lib/lib/baseCells.c | 16 ++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/apps/testapps/testBaseCells.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fed9cf87..0bf572b58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added -- Include defined constants for current library version +- `getBaseCells` function for getting all base cells (#174) +- Include defined constants for current library version (#173) ## [3.3.0] - 2018-12-25 ### Added diff --git a/CMakeLists.txt b/CMakeLists.txt index 20f275007..997db0b53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -485,6 +485,7 @@ if(BUILD_TESTING) add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) add_h3_test(testH3Line src/apps/testapps/testH3Line.c) add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) + add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c new file mode 100644 index 000000000..38e1fb616 --- /dev/null +++ b/src/apps/testapps/testBaseCells.c @@ -0,0 +1,29 @@ +/* + * Copyright 2017-2018 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "constants.h" +#include "h3api.h" +#include "test.h" + +SUITE(baseCells) { + TEST(getBaseCells) { + H3Index* baseCells = calloc(NUM_BASE_CELLS, sizeof(H3Index)); + H3_EXPORT(getBaseCells)(baseCells); + t_assert(baseCells[0] == 0x8001fffffffffff, "correct first basecell"); + t_assert(baseCells[121] == 0x80f3fffffffffff, "correct last basecell"); + } +} diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 65aacb09b..035a5103a 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -282,6 +282,14 @@ double H3_EXPORT(edgeLengthM)(int res); int64_t H3_EXPORT(numHexagons)(int res); /** @} */ +/** @defgroup getBaseCells getBaseCells + * Functions for getBaseCells + * @{ + */ +/** @brief provides all base cells */ +void H3_EXPORT(getBaseCells)(H3Index *out); +/** @} */ + /** @defgroup h3GetResolution h3GetResolution * Functions for h3GetResolution * @{ diff --git a/src/h3lib/lib/baseCells.c b/src/h3lib/lib/baseCells.c index 9dfc87e82..a4342fd02 100644 --- a/src/h3lib/lib/baseCells.c +++ b/src/h3lib/lib/baseCells.c @@ -18,6 +18,7 @@ */ #include "baseCells.h" +#include "h3Index.h" /** @struct BaseCellOrient * @brief base cell at a given ijk and required rotations into its system @@ -886,3 +887,18 @@ Direction _getBaseCellDirection(int originBaseCell, int neighboringBaseCell) { } return INVALID_DIGIT; } + +/** + * getBaseCells generates all base cells storing them into the provided + * memory pointer. + * + * @param out H3Index* the memory to store the resulting base cells in + */ +void H3_EXPORT(getBaseCells)(H3Index* out) { + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + H3Index baseCell = H3_INIT; + H3_SET_MODE(baseCell, H3_HEXAGON_MODE); + H3_SET_BASE_CELL(baseCell, bc); + out[bc] = baseCell; + } +} \ No newline at end of file From efaf5080017f6f244566b66cc73d1fa3fdb843a7 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Sun, 6 Jan 2019 15:09:44 +0100 Subject: [PATCH 015/771] Move NUM_BASE_CELLS to h3api.h, rename to getRes0Indexes --- src/apps/miscapps/generateNumHexagons.c | 1 + src/apps/testapps/testBaseCells.c | 11 ++++++----- src/h3lib/include/constants.h | 2 -- src/h3lib/include/h3api.h.in | 5 ++++- src/h3lib/lib/baseCells.c | 6 +++--- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/apps/miscapps/generateNumHexagons.c b/src/apps/miscapps/generateNumHexagons.c index 41326dc29..1e396b722 100644 --- a/src/apps/miscapps/generateNumHexagons.c +++ b/src/apps/miscapps/generateNumHexagons.c @@ -27,6 +27,7 @@ #include #include #include "constants.h" +#include "h3api.h" #define NUM_PENTAGONS 12 diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c index 38e1fb616..dfa628fe5 100644 --- a/src/apps/testapps/testBaseCells.c +++ b/src/apps/testapps/testBaseCells.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,9 +21,10 @@ SUITE(baseCells) { TEST(getBaseCells) { - H3Index* baseCells = calloc(NUM_BASE_CELLS, sizeof(H3Index)); - H3_EXPORT(getBaseCells)(baseCells); - t_assert(baseCells[0] == 0x8001fffffffffff, "correct first basecell"); - t_assert(baseCells[121] == 0x80f3fffffffffff, "correct last basecell"); + H3Index* indexes = malloc(NUM_BASE_CELLS * sizeof(H3Index)); + H3_EXPORT(getRes0Indexes)(indexes); + t_assert(indexes[0] == 0x8001fffffffffff, "correct first basecell"); + t_assert(indexes[121] == 0x80f3fffffffffff, "correct last basecell"); + free(indexes); } } diff --git a/src/h3lib/include/constants.h b/src/h3lib/include/constants.h index d6ef3ae02..e0f2a61db 100644 --- a/src/h3lib/include/constants.h +++ b/src/h3lib/include/constants.h @@ -68,8 +68,6 @@ /** The number of faces on an icosahedron */ #define NUM_ICOSA_FACES 20 -/** The number of H3 base cells */ -#define NUM_BASE_CELLS 122 /** The number of vertices in a hexagon */ #define NUM_HEX_VERTS 6 /** The number of vertices in a pentagon */ diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 035a5103a..98b7e7587 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -66,6 +66,9 @@ typedef uint64_t H3Index; */ #define MAX_CELL_BNDRY_VERTS 10 +/** The number of H3 base cells */ +#define NUM_BASE_CELLS 122 + /** @struct GeoCoord @brief latitude/longitude in radians */ @@ -287,7 +290,7 @@ int64_t H3_EXPORT(numHexagons)(int res); * @{ */ /** @brief provides all base cells */ -void H3_EXPORT(getBaseCells)(H3Index *out); +void H3_EXPORT(getRes0Indexes)(H3Index *out); /** @} */ /** @defgroup h3GetResolution h3GetResolution diff --git a/src/h3lib/lib/baseCells.c b/src/h3lib/lib/baseCells.c index a4342fd02..328318be8 100644 --- a/src/h3lib/lib/baseCells.c +++ b/src/h3lib/lib/baseCells.c @@ -889,12 +889,12 @@ Direction _getBaseCellDirection(int originBaseCell, int neighboringBaseCell) { } /** - * getBaseCells generates all base cells storing them into the provided - * memory pointer. + * getRes0Indexes generates all base cells storing them into the provided + * memory pointer. Buffer must be of size NUM_BASE_CELLS * sizeof(H3Index). * * @param out H3Index* the memory to store the resulting base cells in */ -void H3_EXPORT(getBaseCells)(H3Index* out) { +void H3_EXPORT(getRes0Indexes)(H3Index* out) { for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { H3Index baseCell = H3_INIT; H3_SET_MODE(baseCell, H3_HEXAGON_MODE); From c2fda995f878b32b01fcb16dc94d53b639b555c4 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 8 Jan 2019 01:01:31 +0100 Subject: [PATCH 016/771] Add res0IndexCount instead of using NUM_BASE_CELLS --- src/apps/testapps/testBaseCells.c | 3 ++- src/h3lib/include/constants.h | 2 ++ src/h3lib/include/h3api.h.in | 6 +++--- src/h3lib/lib/baseCells.c | 7 +++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c index dfa628fe5..ad5d99db8 100644 --- a/src/apps/testapps/testBaseCells.c +++ b/src/apps/testapps/testBaseCells.c @@ -21,7 +21,8 @@ SUITE(baseCells) { TEST(getBaseCells) { - H3Index* indexes = malloc(NUM_BASE_CELLS * sizeof(H3Index)); + int count = res0IndexCount(); + H3Index* indexes = malloc(count * sizeof(H3Index)); H3_EXPORT(getRes0Indexes)(indexes); t_assert(indexes[0] == 0x8001fffffffffff, "correct first basecell"); t_assert(indexes[121] == 0x80f3fffffffffff, "correct last basecell"); diff --git a/src/h3lib/include/constants.h b/src/h3lib/include/constants.h index e0f2a61db..d6ef3ae02 100644 --- a/src/h3lib/include/constants.h +++ b/src/h3lib/include/constants.h @@ -68,6 +68,8 @@ /** The number of faces on an icosahedron */ #define NUM_ICOSA_FACES 20 +/** The number of H3 base cells */ +#define NUM_BASE_CELLS 122 /** The number of vertices in a hexagon */ #define NUM_HEX_VERTS 6 /** The number of vertices in a pentagon */ diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 98b7e7587..e0b91d00a 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -66,9 +66,6 @@ typedef uint64_t H3Index; */ #define MAX_CELL_BNDRY_VERTS 10 -/** The number of H3 base cells */ -#define NUM_BASE_CELLS 122 - /** @struct GeoCoord @brief latitude/longitude in radians */ @@ -289,6 +286,9 @@ int64_t H3_EXPORT(numHexagons)(int res); * Functions for getBaseCells * @{ */ +/** @brief returns the number of resolution 0 indexes */ +int H3_EXPORT(res0IndexCount)(); + /** @brief provides all base cells */ void H3_EXPORT(getRes0Indexes)(H3Index *out); /** @} */ diff --git a/src/h3lib/lib/baseCells.c b/src/h3lib/lib/baseCells.c index 328318be8..5677d881d 100644 --- a/src/h3lib/lib/baseCells.c +++ b/src/h3lib/lib/baseCells.c @@ -888,6 +888,13 @@ Direction _getBaseCellDirection(int originBaseCell, int neighboringBaseCell) { return INVALID_DIGIT; } +/** + * res0IndexCount returns the number of resolution 0 indexes + * + * @return int count of resolution 0 indexes + */ +int H3_EXPORT(res0IndexCount)() { return NUM_BASE_CELLS; } + /** * getRes0Indexes generates all base cells storing them into the provided * memory pointer. Buffer must be of size NUM_BASE_CELLS * sizeof(H3Index). From 84b2e715be1c8881fe453c85ac83b4e27bdc80b8 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 8 Jan 2019 01:04:27 +0100 Subject: [PATCH 017/771] REV: Remove no longer needed include --- src/apps/miscapps/generateNumHexagons.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/miscapps/generateNumHexagons.c b/src/apps/miscapps/generateNumHexagons.c index 1e396b722..41326dc29 100644 --- a/src/apps/miscapps/generateNumHexagons.c +++ b/src/apps/miscapps/generateNumHexagons.c @@ -27,7 +27,6 @@ #include #include #include "constants.h" -#include "h3api.h" #define NUM_PENTAGONS 12 From d607744bc4541ce515e329e497fa0bc9b80e7dd6 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 8 Jan 2019 01:12:55 +0100 Subject: [PATCH 018/771] FIX: Forgot to H3_EXPORT res0IndexCount --- src/apps/testapps/testBaseCells.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c index ad5d99db8..70ef2f23c 100644 --- a/src/apps/testapps/testBaseCells.c +++ b/src/apps/testapps/testBaseCells.c @@ -21,7 +21,7 @@ SUITE(baseCells) { TEST(getBaseCells) { - int count = res0IndexCount(); + int count = H3_EXPORT(res0IndexCount)(); H3Index* indexes = malloc(count * sizeof(H3Index)); H3_EXPORT(getRes0Indexes)(indexes); t_assert(indexes[0] == 0x8001fffffffffff, "correct first basecell"); From 95f0e09dedd0e7ca4de29e281d97ec2c78ba9e89 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 8 Jan 2019 01:14:49 +0100 Subject: [PATCH 019/771] ENH: Remove unneeded include --- src/apps/testapps/testBaseCells.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c index 70ef2f23c..63dd9ec2c 100644 --- a/src/apps/testapps/testBaseCells.c +++ b/src/apps/testapps/testBaseCells.c @@ -15,7 +15,6 @@ */ #include -#include "constants.h" #include "h3api.h" #include "test.h" From 8539cfb49273cbdfc6bd99324a3feeaad7916e20 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Wed, 9 Jan 2019 10:58:56 +0100 Subject: [PATCH 020/771] FIX: Rename getBaseCells to getRes0Indexes in comments/tests --- CHANGELOG.md | 2 +- src/apps/testapps/testBaseCells.c | 2 +- src/h3lib/include/h3api.h.in | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bf572b58..292d33272 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added -- `getBaseCells` function for getting all base cells (#174) +- `getRes0Indexes` function for getting all base cells, and helper function `res0IndexCount` (#174) - Include defined constants for current library version (#173) ## [3.3.0] - 2018-12-25 diff --git a/src/apps/testapps/testBaseCells.c b/src/apps/testapps/testBaseCells.c index 63dd9ec2c..afdd16bdc 100644 --- a/src/apps/testapps/testBaseCells.c +++ b/src/apps/testapps/testBaseCells.c @@ -19,7 +19,7 @@ #include "test.h" SUITE(baseCells) { - TEST(getBaseCells) { + TEST(getRes0Indexes) { int count = H3_EXPORT(res0IndexCount)(); H3Index* indexes = malloc(count * sizeof(H3Index)); H3_EXPORT(getRes0Indexes)(indexes); diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index e0b91d00a..8db158c9d 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -282,8 +282,8 @@ double H3_EXPORT(edgeLengthM)(int res); int64_t H3_EXPORT(numHexagons)(int res); /** @} */ -/** @defgroup getBaseCells getBaseCells - * Functions for getBaseCells +/** @defgroup getRes0Indexes getRes0Indexes + * Functions for getRes0Indexes * @{ */ /** @brief returns the number of resolution 0 indexes */ From ebbd87b8a3a857b62872a9396cbfb7043c5dae5f Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Sat, 12 Jan 2019 11:47:02 +0100 Subject: [PATCH 021/771] FIX: Correct h3api.h.in link in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 292d33272..4585c3f2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). The public API of this library consists of the functions declared in file -[h3api.h](./src/h3lib/include/h3api.h). +[h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] ### Added From aca836a6d500198e073a86ebc6aaee502bae37a8 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Mon, 14 Jan 2019 16:31:03 +0100 Subject: [PATCH 022/771] Add postgresql binding --- docs/community/bindings.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index d1622d246..1072aaa24 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -34,6 +34,7 @@ As a C library, bindings can be made to call H3 functions from different program ## PostgreSQL - [dlr-eoc/pgh3](https://github.com/dlr-eoc/pgh3) +- [bytesandbrains/h3-pg](https://github.com/bytesandbrains/h3-pg) ## Python From c79e828d7dc18fff6af9e16a13b8e971fef568c0 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Wed, 23 Jan 2019 09:19:07 -0800 Subject: [PATCH 023/771] Preparing for release 3.4.0 --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4585c3f2f..0508cf08d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.4.0] - 2019-01-23 ### Added - `getRes0Indexes` function for getting all base cells, and helper function `res0IndexCount` (#174) - Include defined constants for current library version (#173) diff --git a/VERSION b/VERSION index 15a279981..18091983f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.3.0 +3.4.0 From f3557524dcdebccedd700a2ac3eb8dd1a9f044fb Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 25 Jan 2019 10:58:50 +0000 Subject: [PATCH 024/771] Add docs for getRes0Indexes and res0IndexCount. --- docs/api/misc.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/api/misc.md b/docs/api/misc.md index d53276de6..8b197e02a 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -55,3 +55,19 @@ int64_t numHexagons(int res); ``` Number of unique **H3** indexes at the given resolution. + +## getRes0Indexes + +``` +void getRes0Indexes(H3Index *out); +``` + +All the resolution 0 **H3** indexes. + +## res0IndexCount + +``` +int res0IndexCount(); +``` + +Number of resolution 0 **H3** indexes. From db2236297834f70d748c8855d07b0ee6236dd80e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 12 Feb 2019 12:05:12 -0800 Subject: [PATCH 025/771] Add link to isaacbrodsky/h3measurements --- docs/community/tutorials.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/community/tutorials.md b/docs/community/tutorials.md index 5118ba29d..c843deb4c 100644 --- a/docs/community/tutorials.md +++ b/docs/community/tutorials.md @@ -2,6 +2,10 @@ This page lists further learning materials and code walkthroughs for the H3 library and bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/tutorials.md). +## Java + +- [H3 Measurements](https://github.com/isaacbrodsky/h3measurements) + ## JavaScript - [H3 Tutorials on Observable](https://beta.observablehq.com/collection/@nrabinowitz/h3-tutorial) From b4c4d717f774d5643bbd832e1d481a539bb30872 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 13 Feb 2019 12:57:33 -0800 Subject: [PATCH 026/771] Fix binding-functions when building out of source --- CHANGELOG.md | 2 ++ scripts/binding_functions.ps1 | 3 +-- scripts/binding_functions.sh | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0508cf08d..634f6f00b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Fixed +- `binding-functions` build target fixed when running the build out of source ## [3.4.0] - 2019-01-23 ### Added diff --git a/scripts/binding_functions.ps1 b/scripts/binding_functions.ps1 index d81eccba5..783a79720 100644 --- a/scripts/binding_functions.ps1 +++ b/scripts/binding_functions.ps1 @@ -16,5 +16,4 @@ # by bindings of the H3 library. It is invoked by the `binding-functions` # make target and produces a file `binding-functions`. -$scriptDir = Split-Path -parent $PSCommandPath -Get-Content "$scriptDir/../src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} > binding-functions +Get-Content "src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} > binding-functions diff --git a/scripts/binding_functions.sh b/scripts/binding_functions.sh index 491b601e1..408cb17b0 100755 --- a/scripts/binding_functions.sh +++ b/scripts/binding_functions.sh @@ -17,5 +17,6 @@ # by bindings of the H3 library. It is invoked by the `binding-functions` # make target and produces a file `binding-functions`. -SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" -cat "$SCRIPT_DIR/../src/h3lib/include/h3api.h" | sed -n '/@defgroup/s/.*@defgroup \([A-Za-z0-9_]*\) .*/\1/gp' > binding-functions +set -eo pipefail + +cat "src/h3lib/include/h3api.h" | sed -n '/@defgroup/s/.*@defgroup \([A-Za-z0-9_]*\) .*/\1/gp' > binding-functions From 8e676e29e49edb5c3b9d8ae727bb3f299aac4132 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 13 Feb 2019 15:28:01 -0800 Subject: [PATCH 027/771] Add binding-functions to CI (intentionally failing CI to verify) --- .travis.yml | 6 ++++++ appveyor.yml | 3 +++ 2 files changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index e347ed759..9bd5b921e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,6 +57,12 @@ matrix: - coveralls --lcov-file coverage.cleaned.info --verbose - env: NAME="Mac OSX (Xcode 8)" os: osx + - env: NAME="binding-functions target" + script: + # Intentionally failing the build to check the test + #- make binding-functions + # Check that the file exists and has contents + - [ -s binding-functions ] # Configure the build script, out of source. before_script: diff --git a/appveyor.yml b/appveyor.yml index 7b279c2aa..883f56d4c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -39,7 +39,10 @@ environment: build_script: - cmake "-G%GENERATOR%" -H. -Bbuild - cmake --build build --config "%CONFIG%" + # Intentionally failing the build to check the test + #- cmake --build build --config "%CONFIG%" binding-functions test_script: - ps: cd build - ctest -VV -C "%CONFIG%" + - ps: (Get-Item "binding-functions").Length -gt 10 From bf61ccb371b49c470760bdd0cfa88de73f147c2a Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 13 Feb 2019 15:31:13 -0800 Subject: [PATCH 028/771] Replace `[` with `test` --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9bd5b921e..209e3ba07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,7 +62,7 @@ matrix: # Intentionally failing the build to check the test #- make binding-functions # Check that the file exists and has contents - - [ -s binding-functions ] + - test -s binding-functions # Configure the build script, out of source. before_script: From fa3606e175ef57b9f01432d63907a3708af0511e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 13 Feb 2019 17:25:59 -0800 Subject: [PATCH 029/771] Fix build on Travis CI --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 209e3ba07..c5db67596 100644 --- a/.travis.yml +++ b/.travis.yml @@ -59,8 +59,7 @@ matrix: os: osx - env: NAME="binding-functions target" script: - # Intentionally failing the build to check the test - #- make binding-functions + - make binding-functions # Check that the file exists and has contents - test -s binding-functions From fb8cf44c2ef0e426cdf95e91fbfa9318a82ab840 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 14 Feb 2019 12:45:05 -0800 Subject: [PATCH 030/771] Enable testing binding-functions in Appveyor --- appveyor.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 883f56d4c..93b936a18 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -39,10 +39,12 @@ environment: build_script: - cmake "-G%GENERATOR%" -H. -Bbuild - cmake --build build --config "%CONFIG%" - # Intentionally failing the build to check the test - #- cmake --build build --config "%CONFIG%" binding-functions + - cmake --build build --config "%CONFIG%" --target binding-functions test_script: - ps: cd build - ctest -VV -C "%CONFIG%" - - ps: (Get-Item "binding-functions").Length -gt 10 + # Check that binding-functions was generated and has content + - ps: | + $ErrorActionPreference = "Stop" + if ((Get-Item "binding-functions").Length -lt 10) { $host.SetShouldExit(1) } \ No newline at end of file From 81362a21e06b5183085b40e12abf722fbb18ec92 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 14 Feb 2019 12:48:46 -0800 Subject: [PATCH 031/771] Add a short description --- docs/community/tutorials.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/community/tutorials.md b/docs/community/tutorials.md index c843deb4c..f213b824e 100644 --- a/docs/community/tutorials.md +++ b/docs/community/tutorials.md @@ -4,7 +4,7 @@ This page lists further learning materials and code walkthroughs for the H3 libr ## Java -- [H3 Measurements](https://github.com/isaacbrodsky/h3measurements) +- [H3 Measurements](https://github.com/isaacbrodsky/h3measurements): Measurements of average cell area, average cell perimeter length, truncation error, and so on. ## JavaScript From 2643f69f3de7f6298d368e9508263f7ba3c53473 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 15 Feb 2019 15:04:12 -0800 Subject: [PATCH 032/771] Release v3.4.1 --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 634f6f00b..d89b2ee65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.4.1] - 2019-02-15 ### Fixed - `binding-functions` build target fixed when running the build out of source diff --git a/VERSION b/VERSION index 18091983f..47b322c97 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.0 +3.4.1 From ea6914c930615c02960a4d31a03282732df16ab5 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 17 Feb 2019 22:30:27 +0100 Subject: [PATCH 033/771] Added R bindings --- docs/community/bindings.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index 1072aaa24..b1a8547ee 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -43,6 +43,7 @@ As a C library, bindings can be made to call H3 functions from different program ## R - [scottmmjackson/h3r](https://github.com/scottmmjackson/h3r) +- [crazycapivara/h3-r](https://github.com/crazycapivara/h3-r) ## Ruby From e6ff28970229f79da8fbdb7d677ace4c868821f8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 21 Feb 2019 09:24:33 -0800 Subject: [PATCH 034/771] binding-functions encoded in ASCII on Windows The default is for Powershell to generate UTF-16 with BOM, and setting to UTF-8 also generates a BOM. (I understand newer versions of Powershell have a UTF8 with no BOM option, but that wasn't available for me.) The BOM is a problem because Java for example does not discard the BOM, requiring workarounds like Commons IO. This limits function names in the C API to the ASCII character set, which currently appears to be a reasonable limitation. --- CHANGELOG.md | 4 +++- scripts/binding_functions.ps1 | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d89b2ee65..b52d9008f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,12 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Changed +- `binding-functions` build target generates an ASCII file on Windows ## [3.4.1] - 2019-02-15 ### Fixed -- `binding-functions` build target fixed when running the build out of source +- `binding-functions` build target fixed when running the build out of source (#188) ## [3.4.0] - 2019-01-23 ### Added diff --git a/scripts/binding_functions.ps1 b/scripts/binding_functions.ps1 index 783a79720..eda83c934 100644 --- a/scripts/binding_functions.ps1 +++ b/scripts/binding_functions.ps1 @@ -16,4 +16,4 @@ # by bindings of the H3 library. It is invoked by the `binding-functions` # make target and produces a file `binding-functions`. -Get-Content "src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} > binding-functions +Get-Content "src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} | Out-File -FilePath binding-functions -Encoding ASCII From 673f4e9b932f7f7566fc8ef39b010f14feb1f92d Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 21 Feb 2019 12:29:26 -0800 Subject: [PATCH 035/771] Release v3.4.2 --- CHANGELOG.md | 4 +++- VERSION | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b52d9008f..8d52207ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,10 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.4.2] - 2019-02-21 ### Changed -- `binding-functions` build target generates an ASCII file on Windows +- `binding-functions` build target generates an ASCII file on Windows (#193) ## [3.4.1] - 2019-02-15 ### Fixed diff --git a/VERSION b/VERSION index 47b322c97..4d9d11cf5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.1 +3.4.2 From 6fcadcd88f329274285133bfe5220e7ae73775cb Mon Sep 17 00:00:00 2001 From: Roberto Salas Date: Sat, 23 Feb 2019 14:17:57 -0300 Subject: [PATCH 036/771] Added brew formula --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 079ea912f..4174780ca 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ sudo apt install clang-format cmake-curses-gui lcov doxygen First make sure you [have the developer tools installed](http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/) and then ``` -# Installing the bare build requirements -brew install cmake +# Installing the library +brew install h3 # Installing useful tools for development brew install clang-format lcov doxygen ``` From 67527cc5505bd7e0a67a3a927b1627d620b91a04 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 26 Feb 2019 18:58:03 -0800 Subject: [PATCH 037/771] Allocate memory for benchmarkPolyfill on the heap --- CHANGELOG.md | 2 ++ src/apps/benchmarks/benchmarkPolyfill.c | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d52207ad..d8bca6882 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Fixed +- `benchmarkPolyfill` allocates its memory on the heap (#198) ## [3.4.2] - 2019-02-21 ### Changed diff --git a/src/apps/benchmarks/benchmarkPolyfill.c b/src/apps/benchmarks/benchmarkPolyfill.c index 072fa1f6b..b836db2d5 100644 --- a/src/apps/benchmarks/benchmarkPolyfill.c +++ b/src/apps/benchmarks/benchmarkPolyfill.c @@ -16,7 +16,6 @@ #include "algos.h" #include "benchmark.h" #include "h3api.h" -#include "stackAlloc.h" // Fixtures GeoCoord sfVerts[] = { @@ -120,23 +119,27 @@ southernGeofence.verts = southernVerts; southernGeoPolygon.geofence = southernGeofence; int numHexagons; +H3Index* hexagons; BENCHMARK(polyfillSF, 500, { numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); H3_EXPORT(polyfill)(&sfGeoPolygon, 9, hexagons); + free(hexagons); }); BENCHMARK(polyfillAlameda, 500, { numHexagons = H3_EXPORT(maxPolyfillSize)(&alamedaGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); H3_EXPORT(polyfill)(&alamedaGeoPolygon, 9, hexagons); + free(hexagons); }); BENCHMARK(polyfillSouthernExpansion, 10, { numHexagons = H3_EXPORT(maxPolyfillSize)(&southernGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); H3_EXPORT(polyfill)(&southernGeoPolygon, 9, hexagons); + free(hexagons); }); END_BENCHMARKS(); From 88cbaaf73f56bbfcc911f1b449c1d2b94f5df034 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Mon, 11 Mar 2019 16:41:31 +0000 Subject: [PATCH 038/771] Add ECL Binding Information --- docs/community/bindings.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index b1a8547ee..f589952a0 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -48,3 +48,7 @@ As a C library, bindings can be made to call H3 functions from different program ## Ruby - [StuartApp/h3_ruby](https://github.com/StuartApp/h3_ruby) + +## ECL + +- [hpcc-systems/HPCC-Platform](https://github.com/hpcc-systems/HPCC-Platform/tree/master/plugins/h3) From cddec6f9e922f38550a96058082c411ca3ce5218 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Tue, 12 Mar 2019 17:29:21 +0000 Subject: [PATCH 039/771] Update bindings.md --- docs/community/bindings.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index f589952a0..77fa569b4 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -6,6 +6,10 @@ As a C library, bindings can be made to call H3 functions from different program - [entrepreneur-interet-general/h3.standard](https://github.com/entrepreneur-interet-general/H3.Standard) +## ECL + +- [hpcc-systems/HPCC-Platform](https://github.com/hpcc-systems/HPCC-Platform/tree/master/plugins/h3) + ## Erlang - [helium/erlang-h3](https://github.com/helium/erlang-h3) @@ -48,7 +52,3 @@ As a C library, bindings can be made to call H3 functions from different program ## Ruby - [StuartApp/h3_ruby](https://github.com/StuartApp/h3_ruby) - -## ECL - -- [hpcc-systems/HPCC-Platform](https://github.com/hpcc-systems/HPCC-Platform/tree/master/plugins/h3) From 1a0849e5667b97fc67f91d88ae33c01e08854d81 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Thu, 21 Mar 2019 17:01:15 -0700 Subject: [PATCH 040/771] Move brew instructions to the Installation section --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4174780ca..405bdcc51 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Documentation is available at [https://uber.github.io/h3/](https://uber.github.i We recommend using prebuilt bindings if they are available for your programming language. Bindings for [Go](https://github.com/uber/h3-go), [Java](https://github.com/uber/h3-java), [JavaScript](https://github.com/uber/h3-js), [Python](https://github.com/uber/h3-py), and [others](https://uber.github.io/h3/#/documentation/community/bindings) are available. -If no bindings are available, you can only install H3 by building from source. +If no bindings are available, you can only install H3 by building from source. On macOS, you can also install using Homebrew: `brew install h3`. ### Building from source @@ -44,8 +44,8 @@ sudo apt install clang-format cmake-curses-gui lcov doxygen First make sure you [have the developer tools installed](http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/) and then ``` -# Installing the library -brew install h3 +# Installing the bare build requirements +brew install cmake # Installing useful tools for development brew install clang-format lcov doxygen ``` From 9eb6cf5a3b5f9841b4fe0c674b3ba60dd055f8b5 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Thu, 21 Mar 2019 17:31:27 -0700 Subject: [PATCH 041/771] Rephrase per comment --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 405bdcc51..634eac024 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,11 @@ Documentation is available at [https://uber.github.io/h3/](https://uber.github.i We recommend using prebuilt bindings if they are available for your programming language. Bindings for [Go](https://github.com/uber/h3-go), [Java](https://github.com/uber/h3-java), [JavaScript](https://github.com/uber/h3-js), [Python](https://github.com/uber/h3-py), and [others](https://uber.github.io/h3/#/documentation/community/bindings) are available. -If no bindings are available, you can only install H3 by building from source. On macOS, you can also install using Homebrew: `brew install h3`. +On macOS, you can install H3 using brew: +``` +brew install h3 +``` +Otherwise, to build H3 from source, please see the following instructions. ### Building from source From 09d49851a6c54e403e2d20c9c7156918dfcbb0c9 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 21 Mar 2019 18:43:46 -0700 Subject: [PATCH 042/771] Disable very verbose output in Appveyor --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 93b936a18..9b2d02ee4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,8 @@ build_script: test_script: - ps: cd build - - ctest -VV -C "%CONFIG%" + - ctest -C "%CONFIG%" # Check that binding-functions was generated and has content - ps: | $ErrorActionPreference = "Stop" - if ((Get-Item "binding-functions").Length -lt 10) { $host.SetShouldExit(1) } \ No newline at end of file + if ((Get-Item "binding-functions").Length -lt 10) { $host.SetShouldExit(1) } From 16e2e67602d13240b760f4b4ed83c5edfd0d2eb0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 27 Mar 2019 10:15:30 -0700 Subject: [PATCH 043/771] Constrain `coslon` in `_geoAzDistanceRads` --- src/apps/testapps/testH3Api.c | 20 ++++++++++++++++++++ src/h3lib/lib/geoCoord.c | 20 ++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/apps/testapps/testH3Api.c b/src/apps/testapps/testH3Api.c index 9a6059f28..66639d3e4 100644 --- a/src/apps/testapps/testH3Api.c +++ b/src/apps/testapps/testH3Api.c @@ -79,6 +79,26 @@ SUITE(h3Api) { t_assertBoundary(h3, &boundary); } + TEST(h3ToGeoBoundary_coslonConstrain) { + // Bug test for https://github.com/uber/h3/issues/212 + H3Index h3 = 0x87dc6d364ffffffL; + GeoBoundary boundary; + boundary.numVerts = 6; + setGeoDegs(&boundary.verts[0], -52.0130533678236091, + -34.6232931343713091); + setGeoDegs(&boundary.verts[1], -52.0041156384652012, + -34.6096733160584549); + setGeoDegs(&boundary.verts[2], -51.9929610229502472, + -34.6165157145896387); + setGeoDegs(&boundary.verts[3], -51.9907410568096608, + -34.6369680004259877); + setGeoDegs(&boundary.verts[4], -51.9996738734672377, + -34.6505896528323660); + setGeoDegs(&boundary.verts[5], -52.0108315681413629, + -34.6437571897165668); + t_assertBoundary(h3, &boundary); + } + TEST(version) { t_assert(H3_VERSION_MAJOR >= 0, "major version is set"); t_assert(H3_VERSION_MINOR >= 0, "minor version is set"); diff --git a/src/h3lib/lib/geoCoord.c b/src/h3lib/lib/geoCoord.c index 3652ffd9b..70436f3ea 100644 --- a/src/h3lib/lib/geoCoord.c +++ b/src/h3lib/lib/geoCoord.c @@ -221,36 +221,36 @@ void _geoAzDistanceRads(const GeoCoord* p1, double az, double distance, if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole { p2->lat = M_PI_2; - p2->lon = 0.0L; + p2->lon = 0.0; } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole { p2->lat = -M_PI_2; - p2->lon = 0.0L; + p2->lon = 0.0; } else p2->lon = constrainLng(p1->lon); } else // not due north or south { sinlat = sin(p1->lat) * cos(distance) + cos(p1->lat) * sin(distance) * cos(az); - if (sinlat > 1.0L) sinlat = 1.0L; - if (sinlat < -1.0L) sinlat = -1.0L; + if (sinlat > 1.0) sinlat = 1.0; + if (sinlat < -1.0) sinlat = -1.0; p2->lat = asin(sinlat); if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole { p2->lat = M_PI_2; - p2->lon = 0.0L; + p2->lon = 0.0; } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole { p2->lat = -M_PI_2; - p2->lon = 0.0L; + p2->lon = 0.0; } else { sinlon = sin(az) * sin(distance) / cos(p2->lat); coslon = (cos(distance) - sin(p1->lat) * sin(p2->lat)) / cos(p1->lat) / cos(p2->lat); - if (sinlon > 1.0L) sinlon = 1.0L; - if (sinlon < -1.0L) sinlon = -1.0L; - if (coslon > 1.0L) sinlon = 1.0L; - if (coslon < -1.0L) sinlon = -1.0L; + if (sinlon > 1.0) sinlon = 1.0; + if (sinlon < -1.0) sinlon = -1.0; + if (coslon > 1.0) coslon = 1.0; + if (coslon < -1.0) coslon = -1.0; p2->lon = constrainLng(p1->lon + atan2(sinlon, coslon)); } } From d6d3c1b46b839a5a0bb8026f28e465f5eebf9d0f Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 27 Mar 2019 11:57:52 -0700 Subject: [PATCH 044/771] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8bca6882..8416daca7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Fixed - `benchmarkPolyfill` allocates its memory on the heap (#198) +- Fixed constraints of vertex longitudes (#213) ## [3.4.2] - 2019-02-21 ### Changed From de27dced44aa55d3c451f4088a00b12bc36cc63c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 28 Mar 2019 11:59:12 -0700 Subject: [PATCH 045/771] Add branch coverage --- CMakeLists.txt | 2 +- scripts/coverage.sh.in | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 997db0b53..cf66fc26c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -363,7 +363,7 @@ if(BUILD_TESTING) COMMAND bash "${CMAKE_CURRENT_BINARY_DIR}/$/scripts/coverage.sh" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") add_custom_target(clean-coverage # Before running coverage, clear all counters - COMMAND lcov --directory '${CMAKE_CURRENT_BINARY_DIR}' --zerocounters + COMMAND lcov --rc lcov_branch_coverage=1 --directory '${CMAKE_CURRENT_BINARY_DIR}' --zerocounters COMMENT "Zeroing counters" ) endif() diff --git a/scripts/coverage.sh.in b/scripts/coverage.sh.in index 6aac9f87d..3ddb12cce 100755 --- a/scripts/coverage.sh.in +++ b/scripts/coverage.sh.in @@ -45,6 +45,6 @@ src_dir=${1:-"Missing source directory"} binary_dir=${2:-"Missing binary directory"} cd "${binary_dir}" -lcov --directory . --capture --output-file coverage.info -lcov --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info -genhtml -o coverage coverage.cleaned.info --title 'h3 coverage' +lcov --rc lcov_branch_coverage=1 --directory . --capture --output-file coverage.info +lcov --rc lcov_branch_coverage=1 --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info +genhtml --branch-coverage -o coverage coverage.cleaned.info --title 'h3 coverage' From 30c0c80399ed409e1555982f95c90768a1852401 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 12 Apr 2019 10:28:41 -0700 Subject: [PATCH 046/771] Mention roadmap on CONTRIBUTING.md --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1594b66e2..281e19fdc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,8 @@ Pull requests and Github issues are welcome! +Planned improvements and changes are listed on the [H3 Roadmap](https://github.com/uber/h3/wiki/Roadmap). Roadmap items are currently discussed in Github issues. Feel free to open a discussion about an existing roadmap item or proposing a new one. + ## Pull requests * Please include tests that show the bug is fixed or feature works as intended. From 2c387cbb58f28cf5fb5cc8d9e0369cab0913ee52 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 12 Apr 2019 10:29:01 -0700 Subject: [PATCH 047/771] Add local IJ filters --- CMakeLists.txt | 2 + src/apps/filters/h3ToLocalIj.c | 7 +- src/apps/filters/kRing.c | 40 +++++++--- src/apps/filters/localIjToH3.c | 79 +++++++++++++++++++ src/apps/miscapps/generateBaseCellNeighbors.c | 4 +- 5 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 src/apps/filters/localIjToH3.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cf66fc26c..956818b2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,7 @@ set(EXAMPLE_SOURCE_FILES set(OTHER_SOURCE_FILES src/apps/filters/h3ToGeo.c src/apps/filters/h3ToLocalIj.c + src/apps/filters/localIjToH3.c src/apps/filters/h3ToComponents.c src/apps/filters/geoToH3.c src/apps/filters/h3ToGeoBoundary.c @@ -310,6 +311,7 @@ add_h3_executable(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) add_h3_executable(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) add_h3_executable(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) add_h3_executable(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) +add_h3_executable(localIjToH3 src/apps/filters/localIjToH3.c ${APP_SOURCE_FILES}) add_h3_executable(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) add_h3_executable(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) add_h3_executable(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index 52dae15ec..fb955407f 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,8 @@ * usage: `h3ToLocalIj [origin]` * * The program reads H3 indexes from stdin and outputs the corresponding - * IJ coordinates to stdout, until EOF is encountered. The H3 indexes - * should be in integer form. `NA` is printed if the IJ coordinates - * could not be obtained. + * IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the + * IJ coordinates could not be obtained. * * `origin` indicates the origin (or anchoring) index for the IJ coordinate * space. diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 6576cb4a9..496e65a0e 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,43 +17,57 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * k-rings * - * usage: `kRing [k]` + * usage: `kRing [k] [printDistances]` * * The program reads H3 indexes from stdin until EOF and outputs * the H3 indexes within k-ring `k` to stdout. + * + * `printDistances` may be specified to also print the grid distance + * from the origin index. Valid values are 0 to not print distances + * (default) or 1 to print distances. */ +#include #include #include -#include "algos.h" -#include "h3Index.h" -#include "stackAlloc.h" +#include "h3api.h" #include "utility.h" -void doCell(H3Index h, int k) { +void doCell(H3Index h, int k, int printDistances) { int maxSize = H3_EXPORT(maxKringSize)(k); H3Index* rings = calloc(maxSize, sizeof(H3Index)); - H3_EXPORT(kRing)(h, k, rings); + int* distances = calloc(maxSize, sizeof(int)); + H3_EXPORT(kRingDistances)(h, k, rings, distances); for (int i = 0; i < maxSize; i++) { if (rings[i] != 0) { - h3Println(rings[i]); + h3Print(rings[i]); + if (printDistances) { + printf(" %d\n", distances[i]); + } else { + printf("\n"); + } } } + free(distances); free(rings); } int main(int argc, char* argv[]) { // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [k]\n", argv[0]); + if (argc != 2 && argc != 3) { + fprintf(stderr, "usage: %s [k] [printDistances]\n", argv[0]); exit(1); } int k = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); + if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); + + int printDistances = 0; + if (argc > 2) { + if (!sscanf(argv[2], "%d", &printDistances)) + error("printDistances must be an integer"); } // process the indexes on stdin @@ -68,6 +82,6 @@ int main(int argc, char* argv[]) { } H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k); + doCell(h3, k, printDistances); } } diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c new file mode 100644 index 000000000..31bf33dc7 --- /dev/null +++ b/src/apps/filters/localIjToH3.c @@ -0,0 +1,79 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from local IJ coordinates to + * H3 indexes. This is experimental. + * + * usage: `localIjToH3 [origin]` + * + * The program reads IJ coordinates from stdin and outputs the corresponding + * H3 indexes to stdout, until EOF is encountered. `NA` is printed if the H3 + * index could not be obtained. + * + * `origin` indicates the origin (or anchoring) index for the IJ coordinate + * space. + * + * This program has the same limitations as the `experimentalLocalIjToH3` + * function. + */ + +#include +#include +#include +#include "h3api.h" +#include "utility.h" + +void doCell(const CoordIJ *ij, H3Index origin) { + H3Index h; + if (H3_EXPORT(experimentalLocalIjToH3)(origin, ij, &h)) { + printf("NA\n"); + } else { + h3Println(h); + } +} + +int main(int argc, char *argv[]) { + // check command line args + if (argc != 2) { + fprintf(stderr, "usage: %s [origin]\n", argv[0]); + exit(1); + } + + H3Index origin; + + if (!sscanf(argv[1], "%" PRIx64, &origin)) + error("origin could not be read"); + + if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid"); + + // process the coordinates on stdin + char buff[BUFF_SIZE]; + while (1) { + // get coordinates from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading IJ coordinates from stdin"); + } + + CoordIJ ij; + if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) + error("parsing IJ coordinates"); + + doCell(&ij, origin); + } +} diff --git a/src/apps/miscapps/generateBaseCellNeighbors.c b/src/apps/miscapps/generateBaseCellNeighbors.c index f2e0c5379..2ad38b3a0 100644 --- a/src/apps/miscapps/generateBaseCellNeighbors.c +++ b/src/apps/miscapps/generateBaseCellNeighbors.c @@ -161,7 +161,7 @@ static void generate() { if (dir == K_AXES_DIGIT) { // 4 and 117 are 'polar' type pentagons, which have // some different behavior. - if (i == 4 || i == 117) { + if (_isBaseCellPentagon(i)) { _ijkRotate60cw(&ijk); _ijkRotate60cw(&ijk); } else { @@ -172,7 +172,7 @@ static void generate() { // Adjust for the deleted k-subsequence distortion int rotAdj = 0; - if (i == 4 || i == 117) { + if (_isBaseCellPolarPentagon(i)) { // 'polar' type pentagon with all faces pointing // towards i if (dir == IK_AXES_DIGIT) { From 753033ddd7fbdc0653dffbecc8aa792cc755a9f7 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 17 Apr 2019 09:56:43 -0700 Subject: [PATCH 048/771] Add CHANGELOG entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8416daca7..3361cfda3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Added +- `localIjToH3` filter application (#222) +- An option to print distances in the `kRing` filter application (#222) ### Fixed - `benchmarkPolyfill` allocates its memory on the heap (#198) - Fixed constraints of vertex longitudes (#213) From a32d9f8443c54a198c61d50eb164f849045a0b96 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 17 Apr 2019 11:10:56 -0700 Subject: [PATCH 049/771] Improve branch coverage --- CMakeLists.txt | 2 ++ src/apps/testapps/testBBox.c | 18 +++++++++++ src/apps/testapps/testCompact.c | 41 ++++++++++++++++++++++++ src/apps/testapps/testCoordIjk.c | 53 +++++++++++++++++++++++++++++++ src/apps/testapps/testH3UniEdge.c | 7 ++++ src/apps/testapps/testHexRanges.c | 10 ++++++ src/h3lib/lib/h3Index.c | 2 +- 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/apps/testapps/testCoordIjk.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cf66fc26c..244fb10b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -171,6 +171,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testH3Distance.c src/apps/testapps/testH3Line.c src/apps/testapps/testCoordIj.c + src/apps/testapps/testCoordIjk.c src/apps/miscapps/h3ToGeoBoundaryHier.c src/apps/miscapps/h3ToGeoHier.c src/apps/miscapps/generateBaseCellNeighbors.c @@ -485,6 +486,7 @@ if(BUILD_TESTING) add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) add_h3_test(testH3Line src/apps/testapps/testH3Line.c) add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) + add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) diff --git a/src/apps/testapps/testBBox.c b/src/apps/testapps/testBBox.c index e4f710a46..d8901c2f1 100644 --- a/src/apps/testapps/testBBox.c +++ b/src/apps/testapps/testBBox.c @@ -219,4 +219,22 @@ SUITE(BBox) { t_assert(bboxIsTransmeridian(&bboxTransmeridian), "Transmeridian bbox is transmeridian"); } + + TEST(bboxEquals) { + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + BBox north = bbox; + north.north += 0.1; + BBox south = bbox; + south.south += 0.1; + BBox east = bbox; + east.east += 0.1; + BBox west = bbox; + west.west += 0.1; + + t_assert(bboxEquals(&bbox, &bbox), "Equals self"); + t_assert(!bboxEquals(&bbox, &north), "Equals different north"); + t_assert(!bboxEquals(&bbox, &south), "Equals different south"); + t_assert(!bboxEquals(&bbox, &east), "Equals different east"); + t_assert(!bboxEquals(&bbox, &west), "Equals different west"); + } } diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index 39a949333..bc3542867 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -23,6 +23,8 @@ H3Index sunnyvale = 0x89283470c27ffff; H3Index uncompactable[] = {0x89283470803ffff, 0x8928347081bffff, 0x8928347080bffff}; +H3Index uncompactableWithZero[] = {0x89283470803ffff, 0x8928347081bffff, 0, + 0x8928347080bffff}; SUITE(compact) { TEST(roundtrip) { @@ -207,6 +209,45 @@ SUITE(compact) { free(result); } + TEST(uncompact_onlyZero) { + // maxUncompactSize and uncompact both permit 0 indexes + // in the input array, and skip them. When only a zero is + // given, it's a no-op. + + H3Index origin = 0; + + int childrenSz = H3_EXPORT(maxUncompactSize)(&origin, 1, 2); + H3Index* children = calloc(childrenSz, sizeof(H3Index)); + int uncompactResult = + H3_EXPORT(uncompact)(&origin, 1, children, childrenSz, 2); + t_assert(uncompactResult == 0, "uncompact only zero success"); + + free(children); + } + + TEST(uncompactZero) { + // maxUncompactSize and uncompact both permit 0 indexes + // in the input array, and skip them. + + int childrenSz = + H3_EXPORT(maxUncompactSize)(uncompactableWithZero, 4, 10); + H3Index* children = calloc(childrenSz, sizeof(H3Index)); + int uncompactResult = H3_EXPORT(uncompact)(&uncompactableWithZero, 4, + children, childrenSz, 10); + t_assert(uncompactResult == 0, "uncompact with zero succeeds"); + + int found = 0; + for (int i = 0; i < childrenSz; i++) { + if (children[i] != 0) { + found++; + } + } + t_assert(found == childrenSz, + "uncompacted with zero to expected number of hexagons"); + + free(children); + } + TEST(pentagon) { H3Index pentagon; setH3Index(&pentagon, 1, 4, 0); diff --git a/src/apps/testapps/testCoordIjk.c b/src/apps/testapps/testCoordIjk.c new file mode 100644 index 000000000..ee7283f66 --- /dev/null +++ b/src/apps/testapps/testCoordIjk.c @@ -0,0 +1,53 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests IJK grid functions + * + * usage: `testCoordIjk` + */ + +#include "coordijk.h" +#include "test.h" + +SUITE(coordIjk) { + TEST(_unitIjkToDigit) { + CoordIJK zero = {0}; + CoordIJK i = {1, 0, 0}; + CoordIJK outOfRange = {2, 0, 0}; + CoordIJK unnormalizedZero = {2, 2, 2}; + + t_assert(_unitIjkToDigit(&zero) == CENTER_DIGIT, "Unit IJK to zero"); + t_assert(_unitIjkToDigit(&i) == I_AXES_DIGIT, "Unit IJK to I axis"); + t_assert(_unitIjkToDigit(&outOfRange) == INVALID_DIGIT, + "Unit IJK out of range"); + t_assert(_unitIjkToDigit(&unnormalizedZero) == CENTER_DIGIT, + "Unit IJK to zero"); + } + + TEST(_neighbor) { + CoordIJK ijk = {0}; + + CoordIJK zero = {0}; + CoordIJK i = {1, 0, 0}; + + _neighbor(&ijk, CENTER_DIGIT); + t_assert(_ijkMatches(&ijk, &zero), "Center neighbor is self"); + _neighbor(&ijk, I_AXES_DIGIT); + t_assert(_ijkMatches(&ijk, &i), "I neighbor as expected"); + _neighbor(&ijk, INVALID_DIGIT); + t_assert(_ijkMatches(&ijk, &i), "Invalid neighbor is self"); + } +} diff --git a/src/apps/testapps/testH3UniEdge.c b/src/apps/testapps/testH3UniEdge.c index caf00fe8b..469b44732 100644 --- a/src/apps/testapps/testH3UniEdge.c +++ b/src/apps/testapps/testH3UniEdge.c @@ -64,6 +64,8 @@ SUITE(h3UniEdge) { H3_SET_MODE(sfBroken, H3_UNIEDGE_MODE); t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sfBroken) == 0, "broken H3Indexes can't be neighbors"); + t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sfBroken, sf) == 0, + "broken H3Indexes can't be neighbors (reversed)"); H3Index sfBigger = H3_EXPORT(geoToH3)(&sfGeo, 7); t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sfBigger) == 0, @@ -147,6 +149,11 @@ SUITE(h3UniEdge) { H3_SET_MODE(fakeEdge, H3_UNIEDGE_MODE); t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(fakeEdge) == 0, "edges without an edge specified don't work"); + H3Index invalidEdge = sf; + H3_SET_MODE(invalidEdge, H3_UNIEDGE_MODE); + H3_SET_RESERVED_BITS(invalidEdge, INVALID_DIGIT); + t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(invalidEdge) == 0, + "edges with an invalid edge specified don't work"); H3Index pentagon = 0x821c07fffffffff; H3Index goodPentagonalEdge = pentagon; diff --git a/src/apps/testapps/testHexRanges.c b/src/apps/testapps/testHexRanges.c index 44cba031b..4745af5d9 100644 --- a/src/apps/testapps/testHexRanges.c +++ b/src/apps/testapps/testHexRanges.c @@ -25,6 +25,7 @@ SUITE(hexRanges) { H3Index k1[] = {0x89283080ddbffff, 0x89283080c37ffff, 0x89283080c27ffff, 0x89283080d53ffff, 0x89283080dcfffff, 0x89283080dc3ffff}; + H3Index withPentagon[] = {0x8029fffffffffff, 0x801dfffffffffff}; TEST(identityKRing) { int err; @@ -74,4 +75,13 @@ SUITE(hexRanges) { } free(allKrings2); } + + TEST(failed) { + int err; + H3Index* allKrings = calloc(2 * (1 + 6), sizeof(H3Index)); + err = H3_EXPORT(hexRanges)(withPentagon, 2, 1, allKrings); + + t_assert(err != 0, "Error on hexRanges"); + free(allKrings); + } } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index cf4102356..140b5dfc5 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -388,11 +388,11 @@ int H3_EXPORT(uncompact)(const H3Index* compactedSet, const int numHexes, H3Index* h3Set, const int maxHexes, const int res) { int outOffset = 0; for (int i = 0; i < numHexes; i++) { + if (compactedSet[i] == 0) continue; if (outOffset >= maxHexes) { // We went too far, abort! return -1; } - if (compactedSet[i] == 0) continue; int currentRes = H3_GET_RESOLUTION(compactedSet[i]); if (currentRes > res) { // Nonsensical. Abort. From 7b36e5d6f59f6cf8b5764a35b411cfde26d7d525 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 17 Apr 2019 12:02:45 -0700 Subject: [PATCH 050/771] Fix pointer to pointer --- src/apps/testapps/testCompact.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index bc3542867..0e0339eec 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -232,7 +232,7 @@ SUITE(compact) { int childrenSz = H3_EXPORT(maxUncompactSize)(uncompactableWithZero, 4, 10); H3Index* children = calloc(childrenSz, sizeof(H3Index)); - int uncompactResult = H3_EXPORT(uncompact)(&uncompactableWithZero, 4, + int uncompactResult = H3_EXPORT(uncompact)(uncompactableWithZero, 4, children, childrenSz, 10); t_assert(uncompactResult == 0, "uncompact with zero succeeds"); From b3db81e62ab17456360ed42cd5778f39fe1e0c6d Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 17 Apr 2019 16:29:42 -0700 Subject: [PATCH 051/771] Assertion message changes --- src/apps/testapps/testBBox.c | 8 ++++---- src/apps/testapps/testCoordIjk.c | 2 +- src/apps/testapps/testHexRanges.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/testapps/testBBox.c b/src/apps/testapps/testBBox.c index d8901c2f1..278aca8e1 100644 --- a/src/apps/testapps/testBBox.c +++ b/src/apps/testapps/testBBox.c @@ -232,9 +232,9 @@ SUITE(BBox) { west.west += 0.1; t_assert(bboxEquals(&bbox, &bbox), "Equals self"); - t_assert(!bboxEquals(&bbox, &north), "Equals different north"); - t_assert(!bboxEquals(&bbox, &south), "Equals different south"); - t_assert(!bboxEquals(&bbox, &east), "Equals different east"); - t_assert(!bboxEquals(&bbox, &west), "Equals different west"); + t_assert(!bboxEquals(&bbox, &north), "Not equals different north"); + t_assert(!bboxEquals(&bbox, &south), "Not equals different south"); + t_assert(!bboxEquals(&bbox, &east), "Not equals different east"); + t_assert(!bboxEquals(&bbox, &west), "Not equals different west"); } } diff --git a/src/apps/testapps/testCoordIjk.c b/src/apps/testapps/testCoordIjk.c index ee7283f66..e01c4ad28 100644 --- a/src/apps/testapps/testCoordIjk.c +++ b/src/apps/testapps/testCoordIjk.c @@ -34,7 +34,7 @@ SUITE(coordIjk) { t_assert(_unitIjkToDigit(&outOfRange) == INVALID_DIGIT, "Unit IJK out of range"); t_assert(_unitIjkToDigit(&unnormalizedZero) == CENTER_DIGIT, - "Unit IJK to zero"); + "Unnormalized unit IJK to zero"); } TEST(_neighbor) { diff --git a/src/apps/testapps/testHexRanges.c b/src/apps/testapps/testHexRanges.c index 4745af5d9..f2b811cc6 100644 --- a/src/apps/testapps/testHexRanges.c +++ b/src/apps/testapps/testHexRanges.c @@ -81,7 +81,7 @@ SUITE(hexRanges) { H3Index* allKrings = calloc(2 * (1 + 6), sizeof(H3Index)); err = H3_EXPORT(hexRanges)(withPentagon, 2, 1, allKrings); - t_assert(err != 0, "Error on hexRanges"); + t_assert(err != 0, "Expected error on hexRanges"); free(allKrings); } } From 03a2ee03c40e2af9cc04af791b81ae4c2b1a6223 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 18 Apr 2019 08:56:19 -0700 Subject: [PATCH 052/771] Update comments and help text per review --- src/apps/filters/h3ToLocalIj.c | 4 ++-- src/apps/filters/localIjToH3.c | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index fb955407f..496eb5a6c 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -21,13 +21,13 @@ * * The program reads H3 indexes from stdin and outputs the corresponding * IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the - * IJ coordinates could not be obtained. + * IJ coordinates could not be obtained. * * `origin` indicates the origin (or anchoring) index for the IJ coordinate * space. * * This program has the same limitations as the `experimentalH3ToLocalIj` - * function. + * function. */ #include diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index 31bf33dc7..15abb54c9 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -19,15 +19,13 @@ * * usage: `localIjToH3 [origin]` * - * The program reads IJ coordinates from stdin and outputs the corresponding - * H3 indexes to stdout, until EOF is encountered. `NA` is printed if the H3 - * index could not be obtained. + * The program reads IJ coordinates (in the format `i j` separated by newlines) from stdin and outputs the corresponding H3 indexes to stdout, until EOF is encountered. `NA` is printed if the H3 index could not be obtained. * * `origin` indicates the origin (or anchoring) index for the IJ coordinate * space. * * This program has the same limitations as the `experimentalLocalIjToH3` - * function. + * function. */ #include @@ -52,11 +50,7 @@ int main(int argc, char *argv[]) { exit(1); } - H3Index origin; - - if (!sscanf(argv[1], "%" PRIx64, &origin)) - error("origin could not be read"); - + H3Index origin = H3_EXPORT(stringToH3(argv[1])); if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid"); // process the coordinates on stdin @@ -72,7 +66,7 @@ int main(int argc, char *argv[]) { CoordIJ ij; if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) - error("parsing IJ coordinates"); + error("Parsing IJ coordinates. Expected `i j`."); doCell(&ij, origin); } From 25add3eee35c8500c45683f54fb81ae86a376ab5 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 18 Apr 2019 09:07:32 -0700 Subject: [PATCH 053/771] Formatting fix --- src/apps/filters/localIjToH3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index 15abb54c9..ef49de069 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -19,7 +19,9 @@ * * usage: `localIjToH3 [origin]` * - * The program reads IJ coordinates (in the format `i j` separated by newlines) from stdin and outputs the corresponding H3 indexes to stdout, until EOF is encountered. `NA` is printed if the H3 index could not be obtained. + * The program reads IJ coordinates (in the format `i j` separated by newlines) + * from stdin and outputs the corresponding H3 indexes to stdout, until EOF is + * encountered. `NA` is printed if the H3 index could not be obtained. * * `origin` indicates the origin (or anchoring) index for the IJ coordinate * space. From 43199d3a791cc206760f9dd07f8acc4c87349ff9 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 18 Apr 2019 08:50:10 -0700 Subject: [PATCH 054/771] Add argument parsing --- src/apps/applib/include/utility.h | 61 +++++++++++++ src/apps/applib/lib/utility.c | 145 ++++++++++++++++++++++++++++++ src/apps/filters/kRing.c | 82 +++++++++++------ 3 files changed, 261 insertions(+), 27 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index e45dccc83..547043a7b 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -29,7 +29,68 @@ /** Macro: Get the size of a fixed-size array */ #define ARRAY_SIZE(x) sizeof(x) / sizeof(x[0]) +/** Maximum number of names an argument may have. */ +#define NUM_ARG_NAMES 2 + +/** + * An argument accepted by on the command line of an H3 application. Specifies how the argument is presented, parsed, and where parsed values are stored. + */ +typedef struct { + /** + * Both short and long names of the argument. A name may be null, but the + * first name must be non-null. + */ + const char* names[NUM_ARG_NAMES]; + + /** + * If true, this argument must be specified. If the argument is not + * specified, argument parsing will fail. + */ + bool required; + + /** + * If true, this argument suppresses checking for required arguments. + */ + bool isHelp; + + /** + * Scan format for the argument, which will be passed to sscanf. May be null + * to indicate the argument does not take a value. + */ + const char* scanFormat; + + /** + * Name to present the value as when printing help. + */ + const char* valueName; + + /** + * Value will be placed here if the argument is present and scanFormat is + * not null. + */ + void* value; + + /** + * Will be set to true if the argument is present and the pointer is not + * null. + */ + bool* valuePresent; + + /** + * Help text for this argument. + */ + const char* helpText; +} Arg; + // prototypes + +int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, + char** errorMessage, char** errorDetail); + +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, const Arg* args, const char* errorMessage, + const char* errorDetails); + void error(const char* msg); void h3Print(H3Index h); // prints as integer void h3Println(H3Index h); // prints as integer diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 8cb2228c7..8e5acec38 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include "coordijk.h" @@ -28,6 +29,150 @@ #include "h3Index.h" #include "h3api.h" +/** + * Parse command line arguments. + * + * Uses the provided arguments to populate argument values. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more than once. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Each argument to parse. + * @param errorMessage Error message to display, if returning non-zero. Caller + * must free this. + * @param errorDetail Additional error details, if returning non-zero. May be + * null, caller must free this. + * @return 0 if argument parsing succeeded, otherwise non-0. + */ +int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, + char** errorMessage, char** errorDetail) { + bool* foundArgs = calloc(numArgs, sizeof(bool)); + // Whether help was found and required arguments do not need to be checked + bool foundHelp = false; + + for (int i = 1; i < argc; i++) { + bool foundMatch = false; + + for (int j = 0; j < numArgs; j++) { + const char* argName = NULL; + bool isMatch = false; + for (int k = 0; k < NUM_ARG_NAMES; k++) { + if (args[j].names[k] == NULL) continue; + + if (strcmp(argv[i], args[j].names[k]) == 0) { + argName = args[j].names[k]; + isMatch = true; + break; + } + } + if (!isMatch) continue; + + if (foundArgs[j]) { + free(foundArgs); + *errorMessage = strdup("Argument specified multiple times"); + *errorDetail = strdup(argName); + return 1; + } + + if (args[j].valuePresent != NULL) { + *args[j].valuePresent = true; + } + if (args[j].scanFormat != NULL) { + i++; + if (i >= argc) { + free(foundArgs); + *errorMessage = strdup("Argument value not present"); + *errorDetail = strdup(argName); + return 2; + } + + if (!sscanf(argv[i], args[j].scanFormat, args[j].value)) { + free(foundArgs); + *errorMessage = strdup("Failed to parse argument"); + *errorDetail = strdup(argName); + return 3; + } + } + + if (args[j].isHelp) { + foundHelp = true; + } + + foundArgs[j] = true; + foundMatch = true; + break; + } + + if (!foundMatch) { + free(foundArgs); + *errorMessage = strdup("Unknown argument"); + // Don't set errorDetail, since the input could be unprintable. + return 4; + } + } + + // Check for missing required arguments. + if (!foundHelp) { + for (int i = 0; i < numArgs; i++) { + if (args[i].required && !foundArgs[i]) { + free(foundArgs); + *errorMessage = strdup("Required argument missing"); + *errorDetail = strdup(args[i].names[0]); + return 5; + } + } + } + + free(foundArgs); + return 0; +} + +/** + * Print a help message. + * + * @param out Stream to print to, e.g. stdout + * @param programName Program name, such as from argv[0] + * @param helpText Explanation of what the program does + * @param numArgs Number of arguments to print help for + * @param args Arguments to print help for + * @param errorMessage Error message, or null + * @param errorDetails Additional error detail message, or null + */ +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, const Arg* args, const char* errorMessage, + const char* errorDetails) { + if (errorMessage != NULL) { + fprintf(out, "%s: %s", programName, errorMessage); + if (errorDetails != NULL) { + fprintf(out, ": %s", errorDetails); + } + fprintf(out, "\n"); + } + fprintf(out, "%s: %s\n", programName, helpText); + fprintf(out, "H3 %d.%d.%d\n\n", H3_VERSION_MAJOR, H3_VERSION_MINOR, + H3_VERSION_PATCH); + + for (int i = 0; i < numArgs; i++) { + fprintf(out, "\t"); + for (int j = 0; j < NUM_ARG_NAMES; j++) { + if (args[i].names[j] == NULL) continue; + if (j != 0) fprintf(out, ", "); + fprintf(out, "%s", args[i].names[j]); + } + if (args[i].scanFormat != NULL) { + fprintf(out, " <%s>", args[i].valueName); + } + fprintf(out, "\t"); + if (args[i].required) { + fprintf(out, "Required. "); + } + fprintf(out, "%s\n", args[i].helpText); + } +} + void error(const char* msg) { fflush(stdout); fflush(stderr); diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 496e65a0e..d66c89e87 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -17,16 +17,16 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * k-rings * - * usage: `kRing [k] [printDistances]` + * usage: `kRing -k [--print-distances] [--origin origin]` * * The program reads H3 indexes from stdin until EOF and outputs * the H3 indexes within k-ring `k` to stdout. * - * `printDistances` may be specified to also print the grid distance - * from the origin index. Valid values are 0 to not print distances - * (default) or 1 to print distances. + * --print-distances may be specified to also print the grid distance + * from the origin index. */ +#include #include #include #include @@ -55,33 +55,61 @@ void doCell(H3Index h, int k, int printDistances) { } int main(int argc, char* argv[]) { - // check command line args - if (argc != 2 && argc != 3) { - fprintf(stderr, "usage: %s [k] [printDistances]\n", argv[0]); - exit(1); - } - + bool helpArg = false; int k = 0; - if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); + bool printDistances = false; + H3Index origin = 0; + bool originPresent; + Arg args[] = { + {.names = {"-h", "--help"}, + .isHelp = true, + .valuePresent = &helpArg, + .helpText = "Show this help message"}, + {.names = {"-k", NULL}, + .required = true, + .scanFormat = "%d", + .valueName = "k", + .value = &k, + .helpText = "Radius of hexagons"}, + {.names = {"-d", "--print-distances"}, + .valuePresent = &printDistances, + .helpText = "Print distance from origin after index"}, + {.names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .valuePresent = &originPresent, + .helpText = + "Origin, or not specified to read origins from standard in"}}; - int printDistances = 0; - if (argc > 2) { - if (!sscanf(argv[2], "%d", &printDistances)) - error("printDistances must be an integer"); + char* errorMessage = NULL; + char* errorDetails = NULL; + if (parseArgs(argc, argv, 4, args, &errorMessage, &errorDetails) || + helpArg) { + printHelp(helpArg ? stdout : stderr, argv[0], + "Print indexes k distance away from the origin", 4, args, + errorMessage, errorDetails); + free(errorMessage); + free(errorDetails); + return helpArg ? 0 : 1; } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (originPresent) { + doCell(origin, k, printDistances); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k, printDistances); + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, k, printDistances); + } } } From 58ad73f25fe8ea312f72d329ddc79e82ace213cc Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 18 Apr 2019 16:04:17 -0700 Subject: [PATCH 055/771] Formatting --- src/apps/applib/include/utility.h | 3 ++- src/apps/applib/lib/utility.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 547043a7b..562e50206 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -33,7 +33,8 @@ #define NUM_ARG_NAMES 2 /** - * An argument accepted by on the command line of an H3 application. Specifies how the argument is presented, parsed, and where parsed values are stored. + * An argument accepted by on the command line of an H3 application. Specifies + * how the argument is presented, parsed, and where parsed values are stored. */ typedef struct { /** diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 8e5acec38..e6a44a1e8 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -35,7 +35,8 @@ * Uses the provided arguments to populate argument values. * * Returns non-zero if all required arguments are not present, an argument fails - * to parse, is missing its associated value, or arguments are specified more than once. + * to parse, is missing its associated value, or arguments are specified more + * than once. * * @param argc argc from main * @param argv argv from main From 5ea56f21099a114c604ffe6d08f57c616b3825c1 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Apr 2019 17:08:46 -0500 Subject: [PATCH 056/771] Name return codes for parseArgs --- src/apps/applib/include/utility.h | 16 +++++++------- src/apps/applib/lib/utility.c | 35 +++++++++++++++++++++++-------- src/apps/filters/kRing.c | 2 +- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 562e50206..328aab8f2 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -41,46 +41,46 @@ typedef struct { * Both short and long names of the argument. A name may be null, but the * first name must be non-null. */ - const char* names[NUM_ARG_NAMES]; + const char* const names[NUM_ARG_NAMES]; /** * If true, this argument must be specified. If the argument is not * specified, argument parsing will fail. */ - bool required; + const bool required; /** * If true, this argument suppresses checking for required arguments. */ - bool isHelp; + const bool isHelp; /** * Scan format for the argument, which will be passed to sscanf. May be null * to indicate the argument does not take a value. */ - const char* scanFormat; + const char* const scanFormat; /** * Name to present the value as when printing help. */ - const char* valueName; + const char* const valueName; /** * Value will be placed here if the argument is present and scanFormat is * not null. */ - void* value; + void* const value; /** * Will be set to true if the argument is present and the pointer is not * null. */ - bool* valuePresent; + bool* const valuePresent; /** * Help text for this argument. */ - const char* helpText; + const char* const helpText; } Arg; // prototypes diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index e6a44a1e8..4dc99bf97 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -29,6 +29,17 @@ #include "h3Index.h" #include "h3api.h" +/* + * Return codes from parseArgs. + */ + +#define PARSE_ARGS_SUCCESS 0 +#define PARSE_ARGS_REPEATED_ARGUMENT 1 +#define PARSE_ARGS_MISSING_VALUE 2 +#define PARSE_ARGS_FAILED_PARSE 3 +#define PARSE_ARGS_UNKNOWN_ARGUMENT 4 +#define PARSE_ARGS_MISSING_REQUIRED 5 + /** * Parse command line arguments. * @@ -58,43 +69,49 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, bool foundMatch = false; for (int j = 0; j < numArgs; j++) { + // Test this argument, which may have multiple names, for whether it + // matches. argName will be set to the name used for this argument + // if it matches. const char* argName = NULL; - bool isMatch = false; for (int k = 0; k < NUM_ARG_NAMES; k++) { if (args[j].names[k] == NULL) continue; if (strcmp(argv[i], args[j].names[k]) == 0) { argName = args[j].names[k]; - isMatch = true; break; } } - if (!isMatch) continue; + // argName unchanged from NULL indicates this didn't match, try the + // next argument. + if (argName == NULL) continue; if (foundArgs[j]) { free(foundArgs); *errorMessage = strdup("Argument specified multiple times"); *errorDetail = strdup(argName); - return 1; + return PARSE_ARGS_REPEATED_ARGUMENT; } if (args[j].valuePresent != NULL) { + // Program is interested in whether this argument was present, + // regardless of any value it may have. *args[j].valuePresent = true; } if (args[j].scanFormat != NULL) { + // Argument has a value, need to advance one and read the value. i++; if (i >= argc) { free(foundArgs); *errorMessage = strdup("Argument value not present"); *errorDetail = strdup(argName); - return 2; + return PARSE_ARGS_MISSING_VALUE; } if (!sscanf(argv[i], args[j].scanFormat, args[j].value)) { free(foundArgs); *errorMessage = strdup("Failed to parse argument"); *errorDetail = strdup(argName); - return 3; + return PARSE_ARGS_FAILED_PARSE; } } @@ -111,7 +128,7 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, free(foundArgs); *errorMessage = strdup("Unknown argument"); // Don't set errorDetail, since the input could be unprintable. - return 4; + return PARSE_ARGS_UNKNOWN_ARGUMENT; } } @@ -122,13 +139,13 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, free(foundArgs); *errorMessage = strdup("Required argument missing"); *errorDetail = strdup(args[i].names[0]); - return 5; + return PARSE_ARGS_MISSING_REQUIRED; } } } free(foundArgs); - return 0; + return PARSE_ARGS_SUCCESS; } /** diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index d66c89e87..6e59d7db6 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -59,7 +59,7 @@ int main(int argc, char* argv[]) { int k = 0; bool printDistances = false; H3Index origin = 0; - bool originPresent; + bool originPresent = false; Arg args[] = { {.names = {"-h", "--help"}, .isHelp = true, From af67784d05a653b59d057654f032ce5d4bb2a42e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Apr 2019 19:44:16 -0500 Subject: [PATCH 057/771] Record found in the argument structure --- src/apps/applib/include/utility.h | 10 +++--- src/apps/applib/lib/utility.c | 52 +++++++++++---------------- src/apps/filters/kRing.c | 58 +++++++++++++++---------------- 3 files changed, 53 insertions(+), 67 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 328aab8f2..99978ad97 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -72,10 +72,10 @@ typedef struct { void* const value; /** - * Will be set to true if the argument is present and the pointer is not - * null. + * Will be set to true if the argument is present. Should be false when + * passed in to parseArgs. */ - bool* const valuePresent; + bool found; /** * Help text for this argument. @@ -85,11 +85,11 @@ typedef struct { // prototypes -int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], char** errorMessage, char** errorDetail); void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, const Arg* args, const char* errorMessage, + int numArgs, const Arg* args[], const char* errorMessage, const char* errorDetails); void error(const char* msg); diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 4dc99bf97..c7262e695 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -52,16 +52,15 @@ * @param argc argc from main * @param argv argv from main * @param numArgs Number of elements in the args array - * @param args Each argument to parse. + * @param args Pointer to each argument to parse. * @param errorMessage Error message to display, if returning non-zero. Caller * must free this. * @param errorDetail Additional error details, if returning non-zero. May be * null, caller must free this. * @return 0 if argument parsing succeeded, otherwise non-0. */ -int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], char** errorMessage, char** errorDetail) { - bool* foundArgs = calloc(numArgs, sizeof(bool)); // Whether help was found and required arguments do not need to be checked bool foundHelp = false; @@ -74,10 +73,10 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, // if it matches. const char* argName = NULL; for (int k = 0; k < NUM_ARG_NAMES; k++) { - if (args[j].names[k] == NULL) continue; + if (args[j]->names[k] == NULL) continue; - if (strcmp(argv[i], args[j].names[k]) == 0) { - argName = args[j].names[k]; + if (strcmp(argv[i], args[j]->names[k]) == 0) { + argName = args[j]->names[k]; break; } } @@ -85,47 +84,38 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, // next argument. if (argName == NULL) continue; - if (foundArgs[j]) { - free(foundArgs); + if (args[j]->found) { *errorMessage = strdup("Argument specified multiple times"); *errorDetail = strdup(argName); return PARSE_ARGS_REPEATED_ARGUMENT; } - if (args[j].valuePresent != NULL) { - // Program is interested in whether this argument was present, - // regardless of any value it may have. - *args[j].valuePresent = true; - } - if (args[j].scanFormat != NULL) { + if (args[j]->scanFormat != NULL) { // Argument has a value, need to advance one and read the value. i++; if (i >= argc) { - free(foundArgs); *errorMessage = strdup("Argument value not present"); *errorDetail = strdup(argName); return PARSE_ARGS_MISSING_VALUE; } - if (!sscanf(argv[i], args[j].scanFormat, args[j].value)) { - free(foundArgs); + if (!sscanf(argv[i], args[j]->scanFormat, args[j]->value)) { *errorMessage = strdup("Failed to parse argument"); *errorDetail = strdup(argName); return PARSE_ARGS_FAILED_PARSE; } } - if (args[j].isHelp) { + if (args[j]->isHelp) { foundHelp = true; } - foundArgs[j] = true; + args[j]->found = true; foundMatch = true; break; } if (!foundMatch) { - free(foundArgs); *errorMessage = strdup("Unknown argument"); // Don't set errorDetail, since the input could be unprintable. return PARSE_ARGS_UNKNOWN_ARGUMENT; @@ -135,16 +125,14 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, // Check for missing required arguments. if (!foundHelp) { for (int i = 0; i < numArgs; i++) { - if (args[i].required && !foundArgs[i]) { - free(foundArgs); + if (args[i]->required && !args[i]->found) { *errorMessage = strdup("Required argument missing"); - *errorDetail = strdup(args[i].names[0]); + *errorDetail = strdup(args[i]->names[0]); return PARSE_ARGS_MISSING_REQUIRED; } } } - free(foundArgs); return PARSE_ARGS_SUCCESS; } @@ -155,12 +143,12 @@ int parseArgs(int argc, char* argv[], int numArgs, const Arg* args, * @param programName Program name, such as from argv[0] * @param helpText Explanation of what the program does * @param numArgs Number of arguments to print help for - * @param args Arguments to print help for + * @param args Pointer to arguments to print help for * @param errorMessage Error message, or null * @param errorDetails Additional error detail message, or null */ void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, const Arg* args, const char* errorMessage, + int numArgs, const Arg* args[], const char* errorMessage, const char* errorDetails) { if (errorMessage != NULL) { fprintf(out, "%s: %s", programName, errorMessage); @@ -176,18 +164,18 @@ void printHelp(FILE* out, const char* programName, const char* helpText, for (int i = 0; i < numArgs; i++) { fprintf(out, "\t"); for (int j = 0; j < NUM_ARG_NAMES; j++) { - if (args[i].names[j] == NULL) continue; + if (args[i]->names[j] == NULL) continue; if (j != 0) fprintf(out, ", "); - fprintf(out, "%s", args[i].names[j]); + fprintf(out, "%s", args[i]->names[j]); } - if (args[i].scanFormat != NULL) { - fprintf(out, " <%s>", args[i].valueName); + if (args[i]->scanFormat != NULL) { + fprintf(out, " <%s>", args[i]->valueName); } fprintf(out, "\t"); - if (args[i].required) { + if (args[i]->required) { fprintf(out, "Required. "); } - fprintf(out, "%s\n", args[i].helpText); + fprintf(out, "%s\n", args[i]->helpText); } } diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 6e59d7db6..cf23457aa 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -55,47 +55,45 @@ void doCell(H3Index h, int k, int printDistances) { } int main(int argc, char* argv[]) { - bool helpArg = false; int k = 0; - bool printDistances = false; H3Index origin = 0; - bool originPresent = false; - Arg args[] = { - {.names = {"-h", "--help"}, - .isHelp = true, - .valuePresent = &helpArg, - .helpText = "Show this help message"}, - {.names = {"-k", NULL}, - .required = true, - .scanFormat = "%d", - .valueName = "k", - .value = &k, - .helpText = "Radius of hexagons"}, - {.names = {"-d", "--print-distances"}, - .valuePresent = &printDistances, - .helpText = "Print distance from origin after index"}, - {.names = {"-o", "--origin"}, - .scanFormat = "%" PRIx64, - .valueName = "origin", - .value = &origin, - .valuePresent = &originPresent, - .helpText = - "Origin, or not specified to read origins from standard in"}}; + + Arg helpArg = {.names = {"-h", "--help"}, + .isHelp = true, + .helpText = "Show this help message"}; + Arg kArg = {.names = {"-k", NULL}, + .required = true, + .scanFormat = "%d", + .valueName = "k", + .value = &k, + .helpText = "Radius of hexagons"}; + Arg printDistancesArg = { + .names = {"-d", "--print-distances"}, + .helpText = "Print distance from origin after index"}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .helpText = + "Origin, or not specified to read origins from standard in"}; + + Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg}; char* errorMessage = NULL; char* errorDetails = NULL; if (parseArgs(argc, argv, 4, args, &errorMessage, &errorDetails) || - helpArg) { - printHelp(helpArg ? stdout : stderr, argv[0], + helpArg.found) { + printHelp(helpArg.found ? stdout : stderr, argv[0], "Print indexes k distance away from the origin", 4, args, errorMessage, errorDetails); free(errorMessage); free(errorDetails); - return helpArg ? 0 : 1; + return helpArg.found ? 0 : 1; } - if (originPresent) { - doCell(origin, k, printDistances); + if (originArg.found) { + doCell(origin, k, printDistancesArg.found); } else { // process the indexes on stdin char buff[BUFF_SIZE]; @@ -109,7 +107,7 @@ int main(int argc, char* argv[]) { } H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k, printDistances); + doCell(h3, k, printDistancesArg.found); } } } From 2d6da29d91dbd951ec76e9426eea26d1769767e0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Apr 2019 20:06:47 -0500 Subject: [PATCH 058/771] Move help printing into utility --- src/apps/applib/include/utility.h | 6 +-- src/apps/applib/lib/utility.c | 82 ++++++++++++++++++++++--------- src/apps/filters/kRing.c | 11 +---- 3 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 99978ad97..0805f3bf3 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -86,11 +86,7 @@ typedef struct { // prototypes int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], - char** errorMessage, char** errorDetail); - -void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, const Arg* args[], const char* errorMessage, - const char* errorDetails); + const Arg* helpArg, const char* helpText); void error(const char* msg); void h3Print(H3Index h); // prints as integer diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index c7262e695..28bb6a588 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -34,11 +34,12 @@ */ #define PARSE_ARGS_SUCCESS 0 -#define PARSE_ARGS_REPEATED_ARGUMENT 1 -#define PARSE_ARGS_MISSING_VALUE 2 -#define PARSE_ARGS_FAILED_PARSE 3 -#define PARSE_ARGS_UNKNOWN_ARGUMENT 4 -#define PARSE_ARGS_MISSING_REQUIRED 5 +#define PARSE_ARGS_HELP 1 +#define PARSE_ARGS_REPEATED_ARGUMENT 2 +#define PARSE_ARGS_MISSING_VALUE 3 +#define PARSE_ARGS_FAILED_PARSE 4 +#define PARSE_ARGS_UNKNOWN_ARGUMENT 5 +#define PARSE_ARGS_MISSING_REQUIRED 6 /** * Parse command line arguments. @@ -53,14 +54,13 @@ * @param argv argv from main * @param numArgs Number of elements in the args array * @param args Pointer to each argument to parse. - * @param errorMessage Error message to display, if returning non-zero. Caller - * must free this. + * @param errorMessage Error message to display, if returning non-zero. * @param errorDetail Additional error details, if returning non-zero. May be - * null, caller must free this. + * null, and may be a pointer from `argv` or `args`. * @return 0 if argument parsing succeeded, otherwise non-0. */ -int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], - char** errorMessage, char** errorDetail) { +int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], + const char** errorMessage, const char** errorDetail) { // Whether help was found and required arguments do not need to be checked bool foundHelp = false; @@ -85,8 +85,8 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], if (argName == NULL) continue; if (args[j]->found) { - *errorMessage = strdup("Argument specified multiple times"); - *errorDetail = strdup(argName); + *errorMessage = "Argument specified multiple times"; + *errorDetail = argName; return PARSE_ARGS_REPEATED_ARGUMENT; } @@ -94,14 +94,14 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], // Argument has a value, need to advance one and read the value. i++; if (i >= argc) { - *errorMessage = strdup("Argument value not present"); - *errorDetail = strdup(argName); + *errorMessage = "Argument value not present"; + *errorDetail = argName; return PARSE_ARGS_MISSING_VALUE; } if (!sscanf(argv[i], args[j]->scanFormat, args[j]->value)) { - *errorMessage = strdup("Failed to parse argument"); - *errorDetail = strdup(argName); + *errorMessage = "Failed to parse argument"; + *errorDetail = argName; return PARSE_ARGS_FAILED_PARSE; } } @@ -116,7 +116,7 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], } if (!foundMatch) { - *errorMessage = strdup("Unknown argument"); + *errorMessage = "Unknown argument"; // Don't set errorDetail, since the input could be unprintable. return PARSE_ARGS_UNKNOWN_ARGUMENT; } @@ -126,8 +126,8 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], if (!foundHelp) { for (int i = 0; i < numArgs; i++) { if (args[i]->required && !args[i]->found) { - *errorMessage = strdup("Required argument missing"); - *errorDetail = strdup(args[i]->names[0]); + *errorMessage = "Required argument missing"; + *errorDetail = args[i]->names[0]; return PARSE_ARGS_MISSING_REQUIRED; } } @@ -147,9 +147,9 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], * @param errorMessage Error message, or null * @param errorDetails Additional error detail message, or null */ -void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, const Arg* args[], const char* errorMessage, - const char* errorDetails) { +void _printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails) { if (errorMessage != NULL) { fprintf(out, "%s: %s", programName, errorMessage); if (errorDetails != NULL) { @@ -179,6 +179,44 @@ void printHelp(FILE* out, const char* programName, const char* helpText, } } +/** + * Parse command line arguments and prints help, if needed. + * + * Uses the provided arguments to populate argument values and records in the + * argument if it is found. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * Help is printed to stdout if a argument with isHelp = true is found, and help + * si printed to stderr if argument parsing fails. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse + * @param helpArg Pointer to the argument for "--help" + * @param helpText Explanatory text for this program printed with help + * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, + * return value is non-0. + */ +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char* helpText) { + const char* errorMessage = NULL; + const char* errorDetails = NULL; + + int failed = + _parseArgsList(argc, argv, 4, args, &errorMessage, &errorDetails); + + if (failed || helpArg->found) { + _printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, + args, errorMessage, errorDetails); + return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; + } + return PARSE_ARGS_SUCCESS; +} + void error(const char* msg) { fflush(stdout); fflush(stderr); diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index cf23457aa..8ffe5fcc8 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -80,15 +80,8 @@ int main(int argc, char* argv[]) { Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg}; - char* errorMessage = NULL; - char* errorDetails = NULL; - if (parseArgs(argc, argv, 4, args, &errorMessage, &errorDetails) || - helpArg.found) { - printHelp(helpArg.found ? stdout : stderr, argv[0], - "Print indexes k distance away from the origin", 4, args, - errorMessage, errorDetails); - free(errorMessage); - free(errorDetails); + if (parseArgs(argc, argv, 4, args, &helpArg, + "Print indexes k distance away from the origin")) { return helpArg.found ? 0 : 1; } From 0fd3bbf4cbdaea9ed68ace08d842172c6cbd26ae Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Apr 2019 20:10:11 -0500 Subject: [PATCH 059/771] Only specify which argument is for help in one way --- src/apps/applib/include/utility.h | 5 ----- src/apps/applib/lib/utility.c | 11 +++++++---- src/apps/filters/kRing.c | 1 - 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 0805f3bf3..96f449048 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -49,11 +49,6 @@ typedef struct { */ const bool required; - /** - * If true, this argument suppresses checking for required arguments. - */ - const bool isHelp; - /** * Scan format for the argument, which will be passed to sscanf. May be null * to indicate the argument does not take a value. diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 28bb6a588..55cd631f6 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -54,13 +54,16 @@ * @param argv argv from main * @param numArgs Number of elements in the args array * @param args Pointer to each argument to parse. + * @param helpArg Pointer to the argument for "--help" that suppresses checking + * for required arguments. * @param errorMessage Error message to display, if returning non-zero. * @param errorDetail Additional error details, if returning non-zero. May be * null, and may be a pointer from `argv` or `args`. * @return 0 if argument parsing succeeded, otherwise non-0. */ int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], - const char** errorMessage, const char** errorDetail) { + const Arg* helpArg, const char** errorMessage, + const char** errorDetail) { // Whether help was found and required arguments do not need to be checked bool foundHelp = false; @@ -106,7 +109,7 @@ int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], } } - if (args[j]->isHelp) { + if (args[j] == helpArg) { foundHelp = true; } @@ -206,8 +209,8 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], const char* errorMessage = NULL; const char* errorDetails = NULL; - int failed = - _parseArgsList(argc, argv, 4, args, &errorMessage, &errorDetails); + int failed = _parseArgsList(argc, argv, 4, args, helpArg, &errorMessage, + &errorDetails); if (failed || helpArg->found) { _printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 8ffe5fcc8..cb1e74bc3 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -59,7 +59,6 @@ int main(int argc, char* argv[]) { H3Index origin = 0; Arg helpArg = {.names = {"-h", "--help"}, - .isHelp = true, .helpText = "Show this help message"}; Arg kArg = {.names = {"-k", NULL}, .required = true, From c0b19a63995b59c2bedf3d8d3f2965477a8febc8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Apr 2019 20:17:15 -0500 Subject: [PATCH 060/771] Reorder parseArgs internal functions --- src/apps/applib/include/utility.h | 7 +++ src/apps/applib/lib/utility.c | 76 +++++++++++++++---------------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 96f449048..03e36a008 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -105,4 +105,11 @@ void iterateAllIndexesAtRes(int res, void (*callback)(H3Index)); void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int maxBaseCell); +int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char** errorMessage, + const char** errorDetail); +void _printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails); + #endif diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 55cd631f6..774c0f925 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -41,6 +41,44 @@ #define PARSE_ARGS_UNKNOWN_ARGUMENT 5 #define PARSE_ARGS_MISSING_REQUIRED 6 +/** + * Parse command line arguments and prints help, if needed. + * + * Uses the provided arguments to populate argument values and records in the + * argument if it is found. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * Help is printed to stdout if a argument with isHelp = true is found, and help + * si printed to stderr if argument parsing fails. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse + * @param helpArg Pointer to the argument for "--help" + * @param helpText Explanatory text for this program printed with help + * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, + * return value is non-0. + */ +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char* helpText) { + const char* errorMessage = NULL; + const char* errorDetails = NULL; + + int failed = _parseArgsList(argc, argv, 4, args, helpArg, &errorMessage, + &errorDetails); + + if (failed || helpArg->found) { + _printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, + args, errorMessage, errorDetails); + return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; + } + return PARSE_ARGS_SUCCESS; +} + /** * Parse command line arguments. * @@ -182,44 +220,6 @@ void _printHelp(FILE* out, const char* programName, const char* helpText, } } -/** - * Parse command line arguments and prints help, if needed. - * - * Uses the provided arguments to populate argument values and records in the - * argument if it is found. - * - * Returns non-zero if all required arguments are not present, an argument fails - * to parse, is missing its associated value, or arguments are specified more - * than once. - * - * Help is printed to stdout if a argument with isHelp = true is found, and help - * si printed to stderr if argument parsing fails. - * - * @param argc argc from main - * @param argv argv from main - * @param numArgs Number of elements in the args array - * @param args Pointer to each argument to parse - * @param helpArg Pointer to the argument for "--help" - * @param helpText Explanatory text for this program printed with help - * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, - * return value is non-0. - */ -int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], - const Arg* helpArg, const char* helpText) { - const char* errorMessage = NULL; - const char* errorDetails = NULL; - - int failed = _parseArgsList(argc, argv, 4, args, helpArg, &errorMessage, - &errorDetails); - - if (failed || helpArg->found) { - _printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, - args, errorMessage, errorDetails); - return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; - } - return PARSE_ARGS_SUCCESS; -} - void error(const char* msg) { fflush(stdout); fflush(stderr); From 048f599ae2fbb883ead2ebf746bca1b419a973ea Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 29 Apr 2019 11:03:45 -0700 Subject: [PATCH 061/771] Migrate to travis-ci.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 634eac024..220ef41bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # H3: A Hexagonal Hierarchical Geospatial Indexing System -[![Build Status](https://travis-ci.org/uber/h3.svg?branch=master)](https://travis-ci.org/uber/h3) +[![Build Status](https://travis-ci.com/uber/h3.svg?branch=master)](https://travis-ci.com/uber/h3) [![Build status](https://ci.appveyor.com/api/projects/status/61431y4sc5w0tsuk/branch/master?svg=true)](https://ci.appveyor.com/project/Uber/h3/branch/master) [![Coverage Status](https://coveralls.io/repos/github/uber/h3/badge.svg?branch=master)](https://coveralls.io/github/uber/h3?branch=master) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) From e290b2204995fad3311e1efc22660a71aa6d3580 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 30 Apr 2019 14:43:38 -0700 Subject: [PATCH 062/771] Fix typo --- src/apps/applib/lib/utility.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 774c0f925..1f95ad7e5 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -52,7 +52,7 @@ * than once. * * Help is printed to stdout if a argument with isHelp = true is found, and help - * si printed to stderr if argument parsing fails. + * is printed to stderr if argument parsing fails. * * @param argc argc from main * @param argv argv from main From 2b5bd7b40c8e3e4375347c88e64f2bbead8312e2 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 1 May 2019 11:40:38 -0700 Subject: [PATCH 063/771] Argument parsing for h3ToGeo, h3ToGeoBoundayr, geoToH3 --- CHANGELOG.md | 2 + src/apps/filters/geoToH3.c | 84 ++++++++++++++++------ src/apps/filters/h3ToGeo.c | 110 ++++++++++++++++------------ src/apps/filters/h3ToGeoBoundary.c | 112 ++++++++++++++++------------- src/apps/filters/kRing.c | 8 +-- 5 files changed, 194 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3361cfda3..01a2b585c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ The public API of this library consists of the functions declared in file ### Added - `localIjToH3` filter application (#222) - An option to print distances in the `kRing` filter application (#222) +### Changed +- Arguments parsing for filter applications is more flexible. (#224) ### Fixed - `benchmarkPolyfill` allocates its memory on the heap (#198) - Fixed constraints of vertex longitudes (#213) diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index 21aeaeaae..a88e2d369 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from lat/lon coordinates to integer * H3 indexes * - * usage: `geoToH3 resolution` + * usage: `geoToH3 --resolution res [--latitude lat --longitude lon]` * * The program reads lat/lon pairs from stdin until EOF is encountered. For * each lat/lon the program outputs to stdout the integer H3 index of the @@ -34,40 +34,78 @@ #include #include -#include "coordijk.h" #include "h3Index.h" #include "utility.h" int main(int argc, char* argv[]) { - // get the command line argument resolution - if (argc != 2) { - fprintf(stderr, "usage: %s resolution\n", argv[0]); - exit(1); - } + int res = 0; + double lat = 0; + double lon = 0; - int res; - if (!sscanf(argv[1], "%d", &res)) error("parsing resolution"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg latArg = {.names = {"-lat", "--latitude"}, + .scanFormat = "%lf", + .valueName = "lat", + .value = &lat, + .helpText = + "Latitude in degrees. If not specified, \"latitude " + "longitude\" pairs will be read from stdin."}; + Arg lonArg = {.names = {"-lon", "--longitude"}, + .scanFormat = "%lf", + .valueName = "lon", + .value = &lon, + .helpText = "Longitude in degrees."}; - // process the lat/lon's on stdin - char buff[BUFF_SIZE]; - double lat, lon; - while (1) { - // get a lat/lon from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading lat/lon"); - } + Arg* args[] = {&helpArg, &resArg, &latArg, &lonArg}; - if (sscanf(buff, "%lf %lf", &lat, &lon) != 2) error("parsing lat/lon"); + if (parseArgs( + argc, argv, 4, args, &helpArg, + "Convert degrees latitude/longitude coordinates to H3 indexes.")) { + return helpArg.found ? 0 : 1; + } + + if (latArg.found != lonArg.found) { + // One is true but the other is not. + fprintf(stderr, "Latitude and longitude must both be specified.\n"); + return 2; + } - // convert to H3 + if (latArg.found) { GeoCoord g; setGeoDegs(&g, lat, lon); H3Index h = H3_EXPORT(geoToH3)(&g, res); h3Println(h); + } else { + // process the lat/lon's on stdin + char buff[BUFF_SIZE]; + while (1) { + // get a lat/lon from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading lat/lon"); + } + + if (sscanf(buff, "%lf %lf", &lat, &lon) != 2) + error("parsing lat/lon"); + + // convert to H3 + GeoCoord g; + setGeoDegs(&g, lat, lon); + + H3Index h = H3_EXPORT(geoToH3)(&g, res); + + h3Println(h); + } } } diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index f71ec8038..fc96a42a7 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,20 +17,17 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon * cell center point * - * usage: `h3ToGeo [outputMode kmlName kmlDesc]` + * usage: `h3ToGeo [--index index] [--kml [--kml-name name] [--kml-description + * desc]]` * * The program reads H3 indexes from stdin and outputs the corresponding * cell center points to stdout, until EOF is encountered. The H3 indexes * should be in integer form. * - * `outputMode` indicates the type of output; the choices are 0 for - * plain text output (the default) and 1 for KML output - * - * `kmlName` indicates the string for the name tag in KML output (only used - * when `outputMode` == 1). The default is "geo from H3". - * - * `kmlName` indicates the string for the desc tag in KML output (only used - * when `outputMode` == 1). The default is "generated by h3ToGeo". + * `--kml` causes KML output to be printed. `--kml-name` and + * `--kml-description` can be used to change the name and description in the + * KML header, which default to "geo from H3" and "generated by h3ToGeo" + * respectively. * * Examples: * @@ -38,22 +35,19 @@ * - outputs plain text cell center points for the H3 indexes contained * in the file `indexes.txt` * - * `h3ToGeo 1 "kml file" "h3 cells" < indexes.txt > cells.kml` + * `h3ToGeo --kml --kml-name "kml file" --kml-description "h3 cells" < + * indexes.txt > cells.kml` * - creates the KML file `cells.kml` containing the cell center points * for all of the H3 indexes contained in the file `indexes.txt`. */ +#include #include #include #include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" void doCell(H3Index h, int isKmlOut) { GeoCoord g; @@ -72,46 +66,68 @@ void doCell(H3Index h, int isKmlOut) { } int main(int argc, char *argv[]) { - // check command line args - if (argc > 5) { - fprintf(stderr, "usage: %s [outputMode kmlName kmlDesc]\n", argv[0]); - exit(1); - } + H3Index index = 0; + char userKmlName[BUFF_SIZE] = {0}; + char userKmlDesc[BUFF_SIZE] = {0}; - int isKmlOut = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &isKmlOut)) - error("outputMode must be an integer"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg indexArg = { + .names = {"-i", "--index"}, + .scanFormat = "%" PRIx64, + .valueName = "index", + .value = &index, + .helpText = + "Index, or not specified to read indexes from standard in."}; + Arg kmlArg = {.names = {"-k", "--kml"}, + .helpText = "Print output in KML format."}; + Arg kmlNameArg = {.names = {"-kn", "--kml-name"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "name", + .value = &userKmlName, + .helpText = "Name of the KML file."}; + Arg kmlDescArg = {.names = {"-kd", "--kml-description"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "description", + .value = &userKmlDesc, + .helpText = "Description of the KML file."}; - if (isKmlOut != 0 && isKmlOut != 1) error("outputMode must be 0 or 1"); - char *defaultKmlName = "geo from H3"; - char *defaultKmlDesc = "from h3ToGeo"; + Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; - char *kmlName = defaultKmlName; - char *kmlDesc = defaultKmlDesc; + if (parseArgs(argc, argv, 5, args, &helpArg, + "Converts indexes to latitude/longitude center coordinates " + "in degrees")) { + return helpArg.found ? 0 : 1; + } - if (argc > 2) { - kmlName = argv[2]; - if (argc > 3) kmlDesc = argv[3]; - } + if (kmlArg.found) { + char *kmlName = "geo from H3"; + if (kmlNameArg.found) kmlName = userKmlName; + + char *kmlDesc = "from h3ToGeo"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; kmlPtsHeader(kmlName, kmlDesc); } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (indexArg.found) { + doCell(index, kmlArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, isKmlOut); + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, kmlArg.found); + } } - if (isKmlOut) kmlPtsFooter(); + if (kmlArg.found) kmlPtsFooter(); } diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index 130959d94..3774a87c5 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,19 +17,16 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon * cell boundaries * - * usage: `h3ToGeoBoundary [outputMode kmlName kmlDesc]` + * usage: `h3ToGeoBoundary [--index index] [--kml [--kml-name name] + * [--kml-description desc]]` * * The program reads H3 indexes from stdin and outputs the corresponding * cell boundaries to stdout, until EOF is encountered. * - * `outputMode` indicates the type of output; the choices are 0 for - * plain text output (the default) and 1 for KML output - * - * `kmlName` indicates the string for the name tag in KML output (only used - * when `outputMode` == 1). The default is "geo from H3". - * - * `kmlName` indicates the string for the desc tag in KML output (only used - * when `outputMode` == 1). The default is "generated by h3ToGeoBoundary". + * `--kml` causes KML output to be printed. `--kml-name` and + * `--kml-description` can be used to change the name and description in the + * KML header, which default to "geo from H3" and "generated by + * h3ToGeoBoundary" respectively. * * Examples: * @@ -37,22 +34,19 @@ * - outputs plain text cell boundaries for the H3 indexes contained * in the file `indexes.txt` * - * `h3ToGeoBoundary 1 "kml file" "h3 cells" < indexes.txt > cells.kml` + * `h3ToGeoBoundary --kml --kml-name "kml file" --kml-description "h3 cells" + * < indexes.txt > cells.kml` * - creates the KML file `cells.kml` containing the cell boundaries for - * all of the H3 indexes contained in the file `indexes.txt`. + * all of the H3 indexes contained in the file `indexes.txt`. */ +#include #include #include #include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" void doCell(H3Index h, int isKmlOut) { GeoBoundary b; @@ -70,46 +64,68 @@ void doCell(H3Index h, int isKmlOut) { } int main(int argc, char *argv[]) { - // check command line args - if (argc > 5) { - fprintf(stderr, "usage: %s [outputMode kmlName kmlDesc]\n", argv[0]); - exit(1); - } + H3Index index = 0; + char userKmlName[BUFF_SIZE] = {0}; + char userKmlDesc[BUFF_SIZE] = {0}; - int isKmlOut = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &isKmlOut)) - error("outputMode must be an integer"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg indexArg = { + .names = {"-i", "--index"}, + .scanFormat = "%" PRIx64, + .valueName = "index", + .value = &index, + .helpText = + "Index, or not specified to read indexes from standard in."}; + Arg kmlArg = {.names = {"-k", "--kml"}, + .helpText = "Print output in KML format."}; + Arg kmlNameArg = {.names = {"-kn", "--kml-name"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "name", + .value = &userKmlName, + .helpText = "Name of the KML file."}; + Arg kmlDescArg = {.names = {"-kd", "--kml-description"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "description", + .value = &userKmlDesc, + .helpText = "Description of the KML file."}; - if (isKmlOut != 0 && isKmlOut != 1) error("outputMode must be 0 or 1"); - char *defaultKmlName = "geo from H3"; - char *defaultKmlDesc = "from h3ToGeo"; + Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; - char *kmlName = defaultKmlName; - char *kmlDesc = defaultKmlDesc; + if (parseArgs(argc, argv, 5, args, &helpArg, + "Converts indexes to latitude/longitude cell boundaries in " + "degrees")) { + return helpArg.found ? 0 : 1; + } - if (argc > 2) { - kmlName = argv[2]; - if (argc > 3) kmlDesc = argv[3]; - } + if (kmlArg.found) { + char *kmlName = "geo from H3"; + if (kmlNameArg.found) kmlName = userKmlName; + + char *kmlDesc = "from h3ToGeoBoundary"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; kmlPtsHeader(kmlName, kmlDesc); } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (indexArg.found) { + doCell(index, kmlArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, isKmlOut); + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, kmlArg.found); + } } - if (isKmlOut) kmlPtsFooter(); + if (kmlArg.found) kmlPtsFooter(); } diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index cb1e74bc3..d147b7a9b 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -59,23 +59,23 @@ int main(int argc, char* argv[]) { H3Index origin = 0; Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message"}; + .helpText = "Show this help message."}; Arg kArg = {.names = {"-k", NULL}, .required = true, .scanFormat = "%d", .valueName = "k", .value = &k, - .helpText = "Radius of hexagons"}; + .helpText = "Radius of hexagons."}; Arg printDistancesArg = { .names = {"-d", "--print-distances"}, - .helpText = "Print distance from origin after index"}; + .helpText = "Print distance from origin after index."}; Arg originArg = { .names = {"-o", "--origin"}, .scanFormat = "%" PRIx64, .valueName = "origin", .value = &origin, .helpText = - "Origin, or not specified to read origins from standard in"}; + "Origin, or not specified to read origins from standard in."}; Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg}; From aaf79ae377e7a7abb60d69776ece972da6277aa0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 1 May 2019 13:49:48 -0700 Subject: [PATCH 064/771] Print argument validation error with the help message. --- src/apps/applib/include/utility.h | 6 +++--- src/apps/applib/lib/utility.c | 10 +++++----- src/apps/filters/geoToH3.c | 14 ++++++++------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 03e36a008..c41c089cd 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -82,6 +82,9 @@ typedef struct { int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], const Arg* helpArg, const char* helpText); +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails); void error(const char* msg); void h3Print(H3Index h); // prints as integer @@ -108,8 +111,5 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], const Arg* helpArg, const char** errorMessage, const char** errorDetail); -void _printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, Arg* args[], const char* errorMessage, - const char* errorDetails); #endif diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 1f95ad7e5..ead41ae5d 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -72,8 +72,8 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], &errorDetails); if (failed || helpArg->found) { - _printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, - args, errorMessage, errorDetails); + printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, + args, errorMessage, errorDetails); return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; } return PARSE_ARGS_SUCCESS; @@ -188,9 +188,9 @@ int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], * @param errorMessage Error message, or null * @param errorDetails Additional error detail message, or null */ -void _printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, Arg* args[], const char* errorMessage, - const char* errorDetails) { +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails) { if (errorMessage != NULL) { fprintf(out, "%s: %s", programName, errorMessage); if (errorDetails != NULL) { diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index a88e2d369..fdfbc0239 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -65,16 +65,18 @@ int main(int argc, char* argv[]) { Arg* args[] = {&helpArg, &resArg, &latArg, &lonArg}; - if (parseArgs( - argc, argv, 4, args, &helpArg, - "Convert degrees latitude/longitude coordinates to H3 indexes.")) { + const char* helpText = + "Convert degrees latitude/longitude coordinates to H3 indexes."; + + if (parseArgs(argc, argv, 4, args, &helpArg, helpText)) { return helpArg.found ? 0 : 1; } if (latArg.found != lonArg.found) { - // One is true but the other is not. - fprintf(stderr, "Latitude and longitude must both be specified.\n"); - return 2; + // One is found but the other is not. + printHelp(stderr, argv[0], helpText, 4, args, + "Latitude and longitude must both be specified.", NULL); + return 1; } if (latArg.found) { From 0c28636ffdc677f0a7685c234c8765520b3dea5f Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 11:04:28 -0700 Subject: [PATCH 065/771] Pass the actual number of arguments --- src/apps/applib/lib/utility.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index ead41ae5d..3d258bb99 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -68,8 +68,8 @@ int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], const char* errorMessage = NULL; const char* errorDetails = NULL; - int failed = _parseArgsList(argc, argv, 4, args, helpArg, &errorMessage, - &errorDetails); + int failed = _parseArgsList(argc, argv, numArgs, args, helpArg, + &errorMessage, &errorDetails); if (failed || helpArg->found) { printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, From 1c5cb75e55179ab7d1fcb1288fd25c889896335c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 12:55:11 -0700 Subject: [PATCH 066/771] Abbreviate arguments with `--` when not single character --- src/apps/filters/geoToH3.c | 4 ++-- src/apps/filters/h3ToGeo.c | 4 ++-- src/apps/filters/h3ToGeoBoundary.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index fdfbc0239..4c13186a6 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -50,14 +50,14 @@ int main(int argc, char* argv[]) { .valueName = "res", .value = &res, .helpText = "Resolution, 0-15 inclusive."}; - Arg latArg = {.names = {"-lat", "--latitude"}, + Arg latArg = {.names = {"--lat", "--latitude"}, .scanFormat = "%lf", .valueName = "lat", .value = &lat, .helpText = "Latitude in degrees. If not specified, \"latitude " "longitude\" pairs will be read from stdin."}; - Arg lonArg = {.names = {"-lon", "--longitude"}, + Arg lonArg = {.names = {"--lon", "--longitude"}, .scanFormat = "%lf", .valueName = "lon", .value = &lon, diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index fc96a42a7..d607cc434 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -81,12 +81,12 @@ int main(int argc, char *argv[]) { "Index, or not specified to read indexes from standard in."}; Arg kmlArg = {.names = {"-k", "--kml"}, .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"-kn", "--kml-name"}, + Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "name", .value = &userKmlName, .helpText = "Name of the KML file."}; - Arg kmlDescArg = {.names = {"-kd", "--kml-description"}, + Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "description", .value = &userKmlDesc, diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index 3774a87c5..b58fdd076 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -79,12 +79,12 @@ int main(int argc, char *argv[]) { "Index, or not specified to read indexes from standard in."}; Arg kmlArg = {.names = {"-k", "--kml"}, .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"-kn", "--kml-name"}, + Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "name", .value = &userKmlName, .helpText = "Name of the KML file."}; - Arg kmlDescArg = {.names = {"-kd", "--kml-description"}, + Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "description", .value = &userKmlDesc, From 1f53dc7429d1882732d0aa1f599e95363804fabc Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 17:11:35 -0700 Subject: [PATCH 067/771] KML help text --- src/apps/filters/geoToH3.c | 30 ++++++++++++++++++------------ src/apps/filters/h3ToGeo.c | 12 ++++++------ src/apps/filters/h3ToGeoBoundary.c | 14 +++++++------- src/apps/filters/kRing.c | 2 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index 4c13186a6..8aa62a366 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -37,6 +37,22 @@ #include "h3Index.h" #include "utility.h" +/** + * Convert coordinates to cell and print it. + * + * @param lat Degrees latitude + * @param lon Degrees longitude + * @param res Resolution + */ +void doCoords(double lat, double lon, int res) { + GeoCoord g; + setGeoDegs(&g, lat, lon); + + H3Index h = H3_EXPORT(geoToH3)(&g, res); + + h3Println(h); +} + int main(int argc, char* argv[]) { int res = 0; double lat = 0; @@ -80,12 +96,7 @@ int main(int argc, char* argv[]) { } if (latArg.found) { - GeoCoord g; - setGeoDegs(&g, lat, lon); - - H3Index h = H3_EXPORT(geoToH3)(&g, res); - - h3Println(h); + doCoords(lat, lon, res); } else { // process the lat/lon's on stdin char buff[BUFF_SIZE]; @@ -102,12 +113,7 @@ int main(int argc, char* argv[]) { error("parsing lat/lon"); // convert to H3 - GeoCoord g; - setGeoDegs(&g, lat, lon); - - H3Index h = H3_EXPORT(geoToH3)(&g, res); - - h3Println(h); + doCoords(lat, lon, res); } } } diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index d607cc434..dd6a70c8d 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -26,7 +26,7 @@ * * `--kml` causes KML output to be printed. `--kml-name` and * `--kml-description` can be used to change the name and description in the - * KML header, which default to "geo from H3" and "generated by h3ToGeo" + * KML header, which default to "H3 Geometry" and "Generated by h3ToGeo" * respectively. * * Examples: @@ -35,7 +35,7 @@ * - outputs plain text cell center points for the H3 indexes contained * in the file `indexes.txt` * - * `h3ToGeo --kml --kml-name "kml file" --kml-description "h3 cells" < + * `h3ToGeo --kml --kml-name "kml title" --kml-description "h3 cells" < * indexes.txt > cells.kml` * - creates the KML file `cells.kml` containing the cell center points * for all of the H3 indexes contained in the file `indexes.txt`. @@ -85,12 +85,12 @@ int main(int argc, char *argv[]) { .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "name", .value = &userKmlName, - .helpText = "Name of the KML file."}; + .helpText = "Text for the KML name tag."}; Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "description", .value = &userKmlDesc, - .helpText = "Description of the KML file."}; + .helpText = "Text for the KML description tag."}; Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; @@ -101,10 +101,10 @@ int main(int argc, char *argv[]) { } if (kmlArg.found) { - char *kmlName = "geo from H3"; + char *kmlName = "H3 Geometry"; if (kmlNameArg.found) kmlName = userKmlName; - char *kmlDesc = "from h3ToGeo"; + char *kmlDesc = "Generated by h3ToGeo"; if (kmlDescArg.found) kmlDesc = userKmlDesc; kmlPtsHeader(kmlName, kmlDesc); diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index b58fdd076..1af569fff 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -25,7 +25,7 @@ * * `--kml` causes KML output to be printed. `--kml-name` and * `--kml-description` can be used to change the name and description in the - * KML header, which default to "geo from H3" and "generated by + * KML header, which default to "H3 Geometry" and "Generated by * h3ToGeoBoundary" respectively. * * Examples: @@ -34,8 +34,8 @@ * - outputs plain text cell boundaries for the H3 indexes contained * in the file `indexes.txt` * - * `h3ToGeoBoundary --kml --kml-name "kml file" --kml-description "h3 cells" - * < indexes.txt > cells.kml` + * `h3ToGeoBoundary --kml --kml-name "kml title" --kml-description "h3 + * cells" < indexes.txt > cells.kml` * - creates the KML file `cells.kml` containing the cell boundaries for * all of the H3 indexes contained in the file `indexes.txt`. */ @@ -83,12 +83,12 @@ int main(int argc, char *argv[]) { .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "name", .value = &userKmlName, - .helpText = "Name of the KML file."}; + .helpText = "Text for the KML name tag."}; Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, .scanFormat = "%255c", // BUFF_SIZE - 1 .valueName = "description", .value = &userKmlDesc, - .helpText = "Description of the KML file."}; + .helpText = "Text for the KML description tag."}; Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; @@ -99,10 +99,10 @@ int main(int argc, char *argv[]) { } if (kmlArg.found) { - char *kmlName = "geo from H3"; + char *kmlName = "H3 Geometry"; if (kmlNameArg.found) kmlName = userKmlName; - char *kmlDesc = "from h3ToGeoBoundary"; + char *kmlDesc = "Generated by h3ToGeoBoundary"; if (kmlDescArg.found) kmlDesc = userKmlDesc; kmlPtsHeader(kmlName, kmlDesc); diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index d147b7a9b..4a2a041f2 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -68,7 +68,7 @@ int main(int argc, char* argv[]) { .helpText = "Radius of hexagons."}; Arg printDistancesArg = { .names = {"-d", "--print-distances"}, - .helpText = "Print distance from origin after index."}; + .helpText = "Print distance from origin after each index."}; Arg originArg = { .names = {"-o", "--origin"}, .scanFormat = "%" PRIx64, From becdba331350ae9f07ac5c9f62e8ab5976cb90d9 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 17:13:42 -0700 Subject: [PATCH 068/771] Release v3.4.3 --- CHANGELOG.md | 4 ++++ VERSION | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3361cfda3..564aeaff4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,13 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.4.3] - 2019-05-02 ### Added - `localIjToH3` filter application (#222) - An option to print distances in the `kRing` filter application (#222) +### Changed +- Arguments parsing for `kRing` filter application is more flexible. (#224) ### Fixed - `benchmarkPolyfill` allocates its memory on the heap (#198) - Fixed constraints of vertex longitudes (#213) diff --git a/VERSION b/VERSION index 4d9d11cf5..6cb9d3dd0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.2 +3.4.3 From 8e57f48e2626f07537df958120d968315897c88c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 10:57:55 -0700 Subject: [PATCH 069/771] Note that only zero input to uncompact is no longer an error --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 564aeaff4..4f325dd1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The public API of this library consists of the functions declared in file ### Fixed - `benchmarkPolyfill` allocates its memory on the heap (#198) - Fixed constraints of vertex longitudes (#213) +- Zero only input to `uncompact` does not produce an error (#223) ## [3.4.2] - 2019-02-21 ### Changed From 4f4f4f97c7713e42b9bf4446b1ebfe489de88a00 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 13:44:27 -0700 Subject: [PATCH 070/771] Consistent pentagon local IJ coords Change failed directions so that more than one face cannot be crossed when unfolding a pentagon. --- CHANGELOG.md | 2 + src/apps/testapps/testH3Line.c | 8 ++++ src/apps/testapps/testH3ToLocalIj.c | 70 +++++++++++++++++++++++++++++ src/h3lib/lib/localij.c | 52 ++++++++++----------- 4 files changed, 103 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 564aeaff4..0c8ded434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Changed +- Local coordinate spaces cannot cross more than one icosahedron face. ## [3.4.3] - 2019-05-02 ### Added diff --git a/src/apps/testapps/testH3Line.c b/src/apps/testapps/testH3Line.c index 210054976..0366568f2 100644 --- a/src/apps/testapps/testH3Line.c +++ b/src/apps/testapps/testH3Line.c @@ -107,4 +107,12 @@ SUITE(h3Line) { iterateAllIndexesAtResPartial(3, h3Line_kRing_assertions, 6); // Further resolutions aren't tested to save time. } + + TEST(h3Line_acrossMultipleFaces) { + H3Index start = 0x85285aa7fffffff; + H3Index end = 0x851d9b1bfffffff; + + int lineSz = H3_EXPORT(h3LineSize)(start, end); + t_assert(lineSz < 0, "Line not computable across multiple icosa faces"); + } } diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testH3ToLocalIj.c index 75a972552..64777d44f 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testH3ToLocalIj.c @@ -339,4 +339,74 @@ SUITE(h3ToLocalIj) { t_assert(H3_EXPORT(experimentalH3ToLocalIj)(pent1, bc3, &ij) != 0, "found IJ (5)"); } + + /** + * Test that coming from the same direction outside the pentagon is handled + * the same as coming from the same direction inside the pentagon. + */ + TEST(onOffPentagonSame) { + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + for (int res = 1; res <= MAX_H3_RES; res++) { + // K_AXES_DIGIT is the first internal direction, and it's also + // invalid for pentagons, so skip to next. + Direction startDir = K_AXES_DIGIT; + if (_isBaseCellPentagon(bc)) { + startDir++; + } + + for (Direction dir = startDir; dir < NUM_DIGITS; dir++) { + H3Index internalOrigin; + setH3Index(&internalOrigin, res, bc, dir); + + H3Index externalOrigin; + setH3Index(&externalOrigin, res, + _getBaseCellNeighbor(bc, dir), CENTER_DIGIT); + + for (Direction testDir = startDir; testDir < NUM_DIGITS; + testDir++) { + H3Index testIndex; + setH3Index(&testIndex, res, bc, testDir); + + CoordIJ internalIj; + int internalIjFailed = + H3_EXPORT(experimentalH3ToLocalIj)( + internalOrigin, testIndex, &internalIj); + CoordIJ externalIj; + int externalIjFailed = + H3_EXPORT(experimentalH3ToLocalIj)( + externalOrigin, testIndex, &externalIj); + + t_assert( + (bool)internalIjFailed == (bool)externalIjFailed, + "internal/external failed matches when getting IJ"); + + if (internalIjFailed) { + continue; + } + + H3Index internalIndex; + int internalIjFailed2 = + H3_EXPORT(experimentalLocalIjToH3)( + internalOrigin, &internalIj, &internalIndex); + H3Index externalIndex; + int externalIjFailed2 = + H3_EXPORT(experimentalLocalIjToH3)( + externalOrigin, &externalIj, &externalIndex); + + t_assert( + (bool)internalIjFailed2 == (bool)externalIjFailed2, + "internal/external failed matches when getting " + "index"); + + if (internalIjFailed2) { + continue; + } + + t_assert(internalIndex == externalIndex, + "internal/external index matches"); + } + } + } + } + } } diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 38392d053..275609689 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -87,24 +87,28 @@ const int PENTAGON_ROTATIONS_REVERSE_POLAR[7][7] = { {0, 1, 1, 0, 1, 1, 1}, // 6 }; -// Simply prohibit many pentagon distortion cases rather than handling them. -const bool FAILED_DIRECTIONS_II[7][7] = { - {false, false, false, false, false, false, false}, // 0 - {false, false, false, false, false, false, false}, // 1 - {false, false, false, false, true, false, false}, // 2 - {false, false, false, false, false, false, true}, // 3 - {false, false, false, true, false, false, false}, // 4 - {false, false, true, false, false, false, false}, // 5 - {false, false, false, false, false, true, false}, // 6 -}; -const bool FAILED_DIRECTIONS_III[7][7] = { +/** + * Prohibited directions when unfolding a pentagon. + * + * Indexes by two directions, both relative to the pentagon base cell. The first + * is the direction of the origin index and the second is the direction of the + * index to unfold. Direction refers to the direction from base cell to base + * cell if the indexes are on different base cells, or the leading digit if + * within the pentagon base cell. + * + * This previously included a Class II/Class III check but these were removed + * due failure cases. It's possible this could be restricted to a narrower set + * of a failure cases. Currently, the logic is any unfolding across more than + * one icosahedron face is not permitted. + */ +const bool FAILED_DIRECTIONS[7][7] = { {false, false, false, false, false, false, false}, // 0 {false, false, false, false, false, false, false}, // 1 - {false, false, false, false, false, true, false}, // 2 - {false, false, false, false, true, false, false}, // 3 - {false, false, true, false, false, false, false}, // 4 - {false, false, false, false, false, false, true}, // 5 - {false, false, false, true, false, false, false}, // 6 + {false, false, false, false, true, true, false}, // 2 + {false, false, false, false, true, false, true}, // 3 + {false, false, true, true, false, false, false}, // 4 + {false, false, true, false, false, false, true}, // 5 + {false, false, false, true, false, true, false}, // 6 }; /** @@ -183,13 +187,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { if (originOnPent) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); - // TODO: This previously included the Class III-based checks - // as in the index-on-pentagon case below, but these were - // removed due to some failure cases. It is possible that we - // could restrict this error to a narrower set of cases. - // https://github.com/uber/h3/issues/163 - if (FAILED_DIRECTIONS_III[originLeadingDigit][dir] || - FAILED_DIRECTIONS_II[originLeadingDigit][dir]) { + if (FAILED_DIRECTIONS[originLeadingDigit][dir]) { // TODO this part of the pentagon might not be unfolded // correctly. return 3; @@ -200,10 +198,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { } else if (indexOnPent) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); - if ((isResClassIII(res) && - FAILED_DIRECTIONS_III[indexLeadingDigit][revDir]) || - (!isResClassIII(res) && - FAILED_DIRECTIONS_II[indexLeadingDigit][revDir])) { + if (FAILED_DIRECTIONS[indexLeadingDigit][revDir]) { // TODO this part of the pentagon might not be unfolded // correctly. return 4; @@ -248,8 +243,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); - if (FAILED_DIRECTIONS_III[originLeadingDigit][indexLeadingDigit] || - FAILED_DIRECTIONS_II[originLeadingDigit][indexLeadingDigit]) { + if (FAILED_DIRECTIONS[originLeadingDigit][indexLeadingDigit]) { // TODO this part of the pentagon might not be unfolded // correctly. return 5; From 02449fb558bc066ed51b4f3270d331a2b573aae1 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 13 May 2019 10:17:09 -0700 Subject: [PATCH 071/771] Remove all stack allocations --- CHANGELOG.md | 2 + CMakeLists.txt | 7 ---- cmake/CheckAlloca.cmake | 33 --------------- cmake/CheckVLA.cmake | 33 --------------- cmake/alloca_test.c | 29 ------------- cmake/vla_test.c | 26 ------------ src/apps/applib/lib/utility.c | 6 ++- src/apps/filters/hexRange.c | 1 - src/apps/testapps/testCoordIj.c | 1 - src/apps/testapps/testH3Distance.c | 8 ++-- src/apps/testapps/testH3Line.c | 16 +++++--- src/apps/testapps/testH3ToLocalIj.c | 8 ++-- src/apps/testapps/testH3UniEdge.c | 21 +++++----- src/apps/testapps/testKRing.c | 18 ++++---- src/h3lib/include/stackAlloc.h | 64 ----------------------------- src/h3lib/lib/algos.c | 3 +- src/h3lib/lib/h3Index.c | 1 - src/h3lib/lib/localij.c | 2 +- 18 files changed, 50 insertions(+), 229 deletions(-) delete mode 100644 cmake/CheckAlloca.cmake delete mode 100644 cmake/CheckVLA.cmake delete mode 100644 cmake/alloca_test.c delete mode 100644 cmake/vla_test.c delete mode 100644 src/h3lib/include/stackAlloc.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 564aeaff4..d8c559b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Changed +- All dynamic internal memory allocations happen on the heap instead of the stack ## [3.4.3] - 2019-05-02 ### Added diff --git a/CMakeLists.txt b/CMakeLists.txt index f1b581a8e..2afca59c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,12 +79,6 @@ include(CMakeDependentOption) include(CheckIncludeFile) include(CTest) -include(CheckAlloca) -include(CheckVLA) - -check_alloca(have_alloca) -check_vla(have_vla) - set(LIB_SOURCE_FILES src/h3lib/include/bbox.h src/h3lib/include/polygon.h @@ -103,7 +97,6 @@ set(LIB_SOURCE_FILES src/h3lib/include/constants.h src/h3lib/include/coordijk.h src/h3lib/include/algos.h - src/h3lib/include/stackAlloc.h src/h3lib/lib/algos.c src/h3lib/lib/coordijk.c src/h3lib/lib/bbox.c diff --git a/cmake/CheckAlloca.cmake b/cmake/CheckAlloca.cmake deleted file mode 100644 index 80adfa96e..000000000 --- a/cmake/CheckAlloca.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2018 Uber Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -if(__check_alloca) - return() -endif() -set(__check_alloca 1) - -function(check_alloca var) - if(NOT DEFINED have_alloca) - try_compile(have_alloca - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/alloca_test - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/alloca_test.c) - endif() - set(description "Checking for stack allocation function (alloca)") - if(have_alloca) - set(${var} ON PARENT_SCOPE) - message(STATUS "${description} - Success") - else() - message(STATUS "${description} - Failed") - endif() -endfunction() diff --git a/cmake/CheckVLA.cmake b/cmake/CheckVLA.cmake deleted file mode 100644 index f285ba747..000000000 --- a/cmake/CheckVLA.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2018 Uber Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -if(__check_vla) - return() -endif() -set(__check_vla 1) - -function(check_vla var) - if(NOT DEFINED ${var}) - try_compile(have_vla - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/vla_test - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/vla_test.c) - endif() - set(description "Checking for VLA support") - if(have_vla) - set(${var} ON PARENT_SCOPE) - message(STATUS "${description} - Success") - else() - message(STATUS "${description} - Failed") - endif() -endfunction() diff --git a/cmake/alloca_test.c b/cmake/alloca_test.c deleted file mode 100644 index bc144c238..000000000 --- a/cmake/alloca_test.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef _MSC_VER -#include -#define alloc_fn _alloca -#else -#include -#define alloc_fn alloca -#endif - -int main(void) { - char* vla = alloc_fn(10); - memset(vla, 0, 10); - return 0; -} diff --git a/cmake/vla_test.c b/cmake/vla_test.c deleted file mode 100644 index 48d687fc7..000000000 --- a/cmake/vla_test.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -int main(void) { - int x; - scanf("%d", &x); - char vla[x]; - (void)vla; - return 0; -} diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 1f95ad7e5..de8987cb3 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -20,10 +20,10 @@ #include "utility.h" #include #include -#include #include #include #include +#include #include "coordijk.h" #include "geoCoord.h" #include "h3Index.h" @@ -385,7 +385,7 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), H3Index bc; setH3Index(&bc, 0, i, 0); int childrenSz = H3_EXPORT(maxUncompactSize)(&bc, 1, res); - STACK_ARRAY_CALLOC(H3Index, children, childrenSz); + H3Index* children = calloc(childrenSz, sizeof(H3Index)); H3_EXPORT(uncompact)(&bc, 1, children, childrenSz, res); for (int j = 0; j < childrenSz; j++) { @@ -395,5 +395,7 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), (*callback)(children[j]); } + + free(children); } } diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index 3b7350ba1..79adba607 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -32,7 +32,6 @@ #include #include "algos.h" #include "h3Index.h" -#include "stackAlloc.h" #include "utility.h" void doCell(H3Index h, int k) { diff --git a/src/apps/testapps/testCoordIj.c b/src/apps/testapps/testCoordIj.c index c4db4ac42..1c35c026b 100644 --- a/src/apps/testapps/testCoordIj.c +++ b/src/apps/testapps/testCoordIj.c @@ -28,7 +28,6 @@ #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" diff --git a/src/apps/testapps/testH3Distance.c b/src/apps/testapps/testH3Distance.c index 27803cb85..055ed8d0d 100644 --- a/src/apps/testapps/testH3Distance.c +++ b/src/apps/testapps/testH3Distance.c @@ -28,7 +28,6 @@ #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" @@ -44,8 +43,8 @@ static void h3Distance_kRing_assertions(H3Index h3) { int maxK = MAX_DISTANCES[r]; int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - STACK_ARRAY_CALLOC(int, distances, sz); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); @@ -61,6 +60,9 @@ static void h3Distance_kRing_assertions(H3Index h3) { t_assert(calculatedDistance == distances[i] || calculatedDistance == -1, "kRingDistances matches h3Distance"); } + + free(distances); + free(neighbors); } SUITE(h3Distance) { diff --git a/src/apps/testapps/testH3Line.c b/src/apps/testapps/testH3Line.c index 210054976..4a2e9a1c4 100644 --- a/src/apps/testapps/testH3Line.c +++ b/src/apps/testapps/testH3Line.c @@ -25,7 +25,6 @@ #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" @@ -37,7 +36,7 @@ static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; static void h3Line_assertions(H3Index start, H3Index end) { int sz = H3_EXPORT(h3LineSize)(start, end); t_assert(sz > 0, "got valid size"); - STACK_ARRAY_CALLOC(H3Index, line, sz); + H3Index *line = calloc(sz, sizeof(H3Index)); int err = H3_EXPORT(h3Line)(start, end, line); @@ -51,10 +50,12 @@ static void h3Line_assertions(H3Index start, H3Index end) { "index is a neighbor of the previous index"); if (i > 1) { t_assert( - !H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 3]), + !H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 2]), "index is not a neighbor of the index before the previous"); } } + + free(line); } /** @@ -64,7 +65,7 @@ static void h3Line_invalid_assertions(H3Index start, H3Index end) { int sz = H3_EXPORT(h3LineSize)(start, end); t_assert(sz < 0, "line size marked as invalid"); - H3Index* line = {0}; + H3Index *line = {0}; int err = H3_EXPORT(h3Line)(start, end, line); t_assert(err != 0, "line marked as invalid"); } @@ -78,13 +79,14 @@ static void h3Line_kRing_assertions(H3Index h3) { int maxK = MAX_DISTANCES[r]; int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - H3_EXPORT(kRing)(h3, maxK, neighbors); if (H3_EXPORT(h3IsPentagon)(h3)) { return; } + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + H3_EXPORT(kRing)(h3, maxK, neighbors); + for (int i = 0; i < sz; i++) { if (neighbors[i] == 0) { continue; @@ -96,6 +98,8 @@ static void h3Line_kRing_assertions(H3Index h3) { h3Line_invalid_assertions(h3, neighbors[i]); } } + + free(neighbors); } SUITE(h3Line) { diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testH3ToLocalIj.c index 75a972552..20ae79193 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testH3ToLocalIj.c @@ -29,7 +29,6 @@ #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" @@ -131,8 +130,8 @@ void localIjToH3_kRing_assertions(H3Index h3) { int maxK = MAX_DISTANCES[r]; int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - STACK_ARRAY_CALLOC(int, distances, sz); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); @@ -152,6 +151,9 @@ void localIjToH3_kRing_assertions(H3Index h3) { "round trip neighboring index matches expected"); } } + + free(distances); + free(neighbors); } void localIjToH3_traverse_assertions(H3Index h3) { diff --git a/src/apps/testapps/testH3UniEdge.c b/src/apps/testapps/testH3UniEdge.c index 469b44732..f1cd90111 100644 --- a/src/apps/testapps/testH3UniEdge.c +++ b/src/apps/testapps/testH3UniEdge.c @@ -23,7 +23,6 @@ #include "constants.h" #include "geoCoord.h" #include "h3Index.h" -#include "stackAlloc.h" #include "test.h" // Fixtures @@ -32,7 +31,7 @@ static GeoCoord sfGeo = {0.659966917655, -2.1364398519396}; SUITE(h3UniEdge) { TEST(h3IndexesAreNeighbors) { H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); + H3Index ring[7] = {0}; H3_EXPORT(hexRing)(sf, 1, ring); t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sf) == 0, @@ -47,7 +46,7 @@ SUITE(h3UniEdge) { t_assert(neighbors == 6, "got the expected number of neighbors from a k-ring of 1"); - STACK_ARRAY_CALLOC(H3Index, largerRing, H3_EXPORT(maxKringSize)(2)); + H3Index largerRing[19] = {0}; H3_EXPORT(hexRing)(sf, 2, largerRing); neighbors = 0; @@ -77,7 +76,7 @@ SUITE(h3UniEdge) { TEST(getH3UnidirectionalEdgeAndFriends) { H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); + H3Index ring[7] = {0}; H3_EXPORT(hexRing)(sf, 1, ring); H3Index sf2 = ring[0]; @@ -95,7 +94,7 @@ SUITE(h3UniEdge) { t_assert(originDestination[1] == sf2, "got the destination last in the pair request"); - STACK_ARRAY_CALLOC(H3Index, largerRing, H3_EXPORT(maxKringSize)(2)); + H3Index largerRing[19] = {0}; H3_EXPORT(hexRing)(sf, 2, largerRing); H3Index sf3 = largerRing[0]; @@ -135,7 +134,7 @@ SUITE(h3UniEdge) { TEST(h3UnidirectionalEdgeIsValid) { H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); + H3Index ring[7] = {0}; H3_EXPORT(hexRing)(sf, 1, ring); H3Index sf2 = ring[0]; @@ -171,7 +170,7 @@ SUITE(h3UniEdge) { TEST(getH3UnidirectionalEdgesFromHexagon) { H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, edges, 6); + H3Index edges[6] = {0}; H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(sf, edges); for (int i = 0; i < 6; i++) { @@ -189,7 +188,7 @@ SUITE(h3UniEdge) { TEST(getH3UnidirectionalEdgesFromPentagon) { H3Index pentagon = 0x821c07fffffffff; - STACK_ARRAY_CALLOC(H3Index, edges, 6); + H3Index edges[6] = {0}; H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(pentagon, edges); int missingEdgeCount = 0; @@ -218,7 +217,7 @@ SUITE(h3UniEdge) { H3Index sf; GeoBoundary boundary; GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); + H3Index edges[6] = {0}; const int expectedVertices[][2] = {{3, 4}, {1, 2}, {2, 3}, {5, 0}, {4, 5}, {0, 1}}; @@ -249,7 +248,7 @@ SUITE(h3UniEdge) { H3Index pentagon; GeoBoundary boundary; GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); + H3Index edges[6] = {0}; const int expectedVertices[][3] = {{-1, -1, -1}, {2, 3, 4}, {4, 5, 6}, {8, 9, 0}, {6, 7, 8}, {0, 1, 2}}; @@ -289,7 +288,7 @@ SUITE(h3UniEdge) { H3Index pentagon; GeoBoundary boundary; GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); + H3Index edges[6] = {0}; const int expectedVertices[][3] = {{-1, -1}, {1, 2}, {2, 3}, {4, 0}, {3, 4}, {0, 1}}; diff --git a/src/apps/testapps/testKRing.c b/src/apps/testapps/testKRing.c index df410b8ab..e256b45bf 100644 --- a/src/apps/testapps/testKRing.c +++ b/src/apps/testapps/testKRing.c @@ -19,7 +19,6 @@ * usage: `testKRing` */ -#include #include #include "algos.h" #include "baseCells.h" @@ -31,13 +30,12 @@ static void kRing_equals_kRingInternal_assertions(H3Index h3) { for (int k = 0; k < 3; k++) { int kSz = H3_EXPORT(maxKringSize)(k); - STACK_ARRAY_CALLOC(H3Index, neighbors, kSz); - STACK_ARRAY_CALLOC(int, distances, kSz); - H3_EXPORT(kRingDistances) - (h3, k, neighbors, distances); + H3Index *neighbors = calloc(kSz, sizeof(H3Index)); + int *distances = calloc(kSz, sizeof(int)); + H3_EXPORT(kRingDistances)(h3, k, neighbors, distances); - STACK_ARRAY_CALLOC(H3Index, internalNeighbors, kSz); - STACK_ARRAY_CALLOC(int, internalDistances, kSz); + H3Index *internalNeighbors = calloc(kSz, sizeof(H3Index)); + int *internalDistances = calloc(kSz, sizeof(int)); _kRingInternal(h3, k, internalNeighbors, internalDistances, kSz, 0); int found = 0; @@ -64,6 +62,12 @@ static void kRing_equals_kRingInternal_assertions(H3Index h3) { "produce same output"); } } + + free(internalDistances); + free(internalNeighbors); + + free(distances); + free(neighbors); } } diff --git a/src/h3lib/include/stackAlloc.h b/src/h3lib/include/stackAlloc.h deleted file mode 100644 index 479f66b31..000000000 --- a/src/h3lib/include/stackAlloc.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2016-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file stackAlloc.h - * @brief Macro to provide cross-platform mechanism for allocating variable - * length arrays on the stack. - */ - -#ifndef STACKALLOC_H -#define STACKALLOC_H - -#include -#include - -#ifdef H3_HAVE_VLA - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type name##Buffer[(numElements)]; \ - memset(name##Buffer, 0, (numElements) * sizeof(type)); \ - type* name = name##Buffer - -#elif defined(H3_HAVE_ALLOCA) - -#ifdef _MSC_VER - -#include - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type* name = (type*)_alloca(sizeof(type) * (numElements)); \ - memset(name, 0, sizeof(type) * (numElements)) - -#else - -#include - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type* name = (type*)alloca(sizeof(type) * (numElements)); \ - memset(name, 0, sizeof(type) * (numElements)) - -#endif - -#else - -#error \ - "This platform does not support stack array allocation, please submit an issue on https://github.com/uber/h3 to report this error" - -#endif - -#endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 7f45991ba..0b1787686 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -18,10 +18,12 @@ */ #include "algos.h" +#include #include #include #include #include +#include #include "baseCells.h" #include "bbox.h" #include "faceijk.h" @@ -30,7 +32,6 @@ #include "h3api.h" #include "linkedGeo.h" #include "polygon.h" -#include "stackAlloc.h" #include "vertexGraph.h" /* diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 140b5dfc5..fe8194d55 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -26,7 +26,6 @@ #include "baseCells.h" #include "faceijk.h" #include "mathExtensions.h" -#include "stackAlloc.h" /** * Returns the H3 resolution of an H3 index. diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 38392d053..36fa75006 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -19,6 +19,7 @@ * These functions try to provide a useful coordinate space in the vicinity of * an origin index. */ +#include #include #include #include @@ -28,7 +29,6 @@ #include "faceijk.h" #include "h3Index.h" #include "mathExtensions.h" -#include "stackAlloc.h" /** * Origin leading digit -> index leading digit -> rotations 60 cw From d9bcfbb8ab0ddf2debc73ccab42a3ed9837adff3 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 16 May 2019 16:30:28 -0700 Subject: [PATCH 072/771] Adjust comments and changelog entry --- CHANGELOG.md | 4 ++-- src/h3lib/lib/localij.c | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20674f29d..997a81661 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Changed -- Local coordinate spaces cannot cross more than one icosahedron face. -- All dynamic internal memory allocations happen on the heap instead of the stack +- Local coordinate spaces cannot cross more than one icosahedron edge. (#234) +- All dynamic internal memory allocations happen on the heap instead of the stack. (#235) ## [3.4.3] - 2019-05-02 ### Added diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 01db024d1..557cf177f 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -97,7 +97,7 @@ const int PENTAGON_ROTATIONS_REVERSE_POLAR[7][7] = { * within the pentagon base cell. * * This previously included a Class II/Class III check but these were removed - * due failure cases. It's possible this could be restricted to a narrower set + * due to failure cases. It's possible this could be restricted to a narrower set * of a failure cases. Currently, the logic is any unfolding across more than * one icosahedron face is not permitted. */ @@ -188,8 +188,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); if (FAILED_DIRECTIONS[originLeadingDigit][dir]) { - // TODO this part of the pentagon might not be unfolded - // correctly. + // TODO In this case this part of the pentagon might not be unfolded correctly. return 3; } @@ -199,8 +198,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[indexLeadingDigit][revDir]) { - // TODO this part of the pentagon might not be unfolded - // correctly. + // TODO In this case this part of the pentagon might not be unfolded correctly. return 4; } @@ -244,8 +242,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[originLeadingDigit][indexLeadingDigit]) { - // TODO this part of the pentagon might not be unfolded - // correctly. + // TODO In this case this part of the pentagon might not be unfolded correctly. return 5; } From b440ffb5ef13d5a68b633b85c667718b8afa4d4b Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 16 May 2019 16:32:01 -0700 Subject: [PATCH 073/771] formatting --- src/h3lib/lib/localij.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 557cf177f..df6281e07 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -97,9 +97,9 @@ const int PENTAGON_ROTATIONS_REVERSE_POLAR[7][7] = { * within the pentagon base cell. * * This previously included a Class II/Class III check but these were removed - * due to failure cases. It's possible this could be restricted to a narrower set - * of a failure cases. Currently, the logic is any unfolding across more than - * one icosahedron face is not permitted. + * due to failure cases. It's possible this could be restricted to a narrower + * set of a failure cases. Currently, the logic is any unfolding across more + * than one icosahedron face is not permitted. */ const bool FAILED_DIRECTIONS[7][7] = { {false, false, false, false, false, false, false}, // 0 @@ -188,7 +188,8 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); if (FAILED_DIRECTIONS[originLeadingDigit][dir]) { - // TODO In this case this part of the pentagon might not be unfolded correctly. + // TODO In this case this part of the pentagon might not be + // unfolded correctly. return 3; } @@ -198,7 +199,8 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[indexLeadingDigit][revDir]) { - // TODO In this case this part of the pentagon might not be unfolded correctly. + // TODO In this case this part of the pentagon might not be + // unfolded correctly. return 4; } @@ -242,7 +244,8 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[originLeadingDigit][indexLeadingDigit]) { - // TODO In this case this part of the pentagon might not be unfolded correctly. + // TODO In this case this part of the pentagon might not be unfolded + // correctly. return 5; } From f1c2199b486b3194cecb1ba1ce2ac2b3796e47e0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 16 May 2019 16:41:35 -0700 Subject: [PATCH 074/771] Adjust arg description --- src/apps/filters/kRing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 4a2a041f2..bc57ce85b 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -65,7 +65,7 @@ int main(int argc, char* argv[]) { .scanFormat = "%d", .valueName = "k", .value = &k, - .helpText = "Radius of hexagons."}; + .helpText = "Radius in hexagons."}; Arg printDistancesArg = { .names = {"-d", "--print-distances"}, .helpText = "Print distance from origin after each index."}; From e8a80ebe9f69d0d74d84f37de8e1be3efc7a677a Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 10:45:08 -0700 Subject: [PATCH 075/771] Migrate other filters to argument parsing --- src/apps/filters/h3ToComponents.c | 100 +++++++++++++++++------------- src/apps/filters/h3ToLocalIj.c | 66 +++++++++++++------- src/apps/filters/hexRange.c | 63 ++++++++++++------- src/apps/filters/localIjToH3.c | 75 ++++++++++++++++------ 4 files changed, 197 insertions(+), 107 deletions(-) diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index 82e035d8a..bd7599727 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -17,16 +17,16 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * components. * - * usage: `h3ToComponents` + * usage: `h3ToComponents [--verbose] [--index index]` * * The program reads H3 indexes from stdin until EOF and outputs the * corresponding component strings to stdout. */ +#include +#include #include #include -#include -#include "baseCells.h" #include "h3Index.h" #include "utility.h" @@ -44,28 +44,11 @@ char resDigitToChar(int d) { return '0' + d; } -void doCell(H3Index h, int verboseMode) { +void doCell(H3Index h, bool verboseMode) { int h3Mode = H3_GET_MODE(h); int h3Res = H3_GET_RESOLUTION(h); int h3BaseCell = H3_GET_BASE_CELL(h); - if (verboseMode == 0) { - if (h3Mode == H3_HEXAGON_MODE) { - printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell); - for (int i = 1; i <= h3Res; i++) { - printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); - } - printf("\n"); - } else if (h3Mode == H3_UNIEDGE_MODE) { - printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res, - h3BaseCell); - for (int i = 1; i <= h3Res; i++) { - printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); - } - printf("\n"); - } else { - printf("INVALID INDEX\n"); - } - } else { + if (verboseMode) { char* modes[] = { "RESERVED", // 0 "Hexagon", // 1 @@ -100,33 +83,64 @@ void doCell(H3Index h, int verboseMode) { resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); } printf("╚════════════╝\n\n"); + } else { + if (h3Mode == H3_HEXAGON_MODE) { + printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell); + for (int i = 1; i <= h3Res; i++) { + printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); + } + printf("\n"); + } else if (h3Mode == H3_UNIEDGE_MODE) { + printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res, + h3BaseCell); + for (int i = 1; i <= h3Res; i++) { + printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); + } + printf("\n"); + } else { + printf("INVALID INDEX\n"); + } } } int main(int argc, char* argv[]) { - // check command line args - int verboseMode = 0; - if (argc > 1) { - if (strncmp("--verbose", argv[1], 9) == 0) { - verboseMode = 1; - } else { - fprintf(stderr, "usage: %s [--verbose]\n", argv[0]); - exit(1); - } + H3Index index = 0; + + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg verboseArg = {.names = {"-v", "--verbose"}, + .helpText = "Verbose output mode."}; + Arg indexArg = { + .names = {"-i", "--index"}, + .scanFormat = "%" PRIx64, + .valueName = "index", + .value = &index, + .helpText = + "Index, or not specified to read indexes from standard in."}; + + Arg* args[] = {&helpArg, &verboseArg, &indexArg}; + + if (parseArgs(argc, argv, 3, args, &helpArg, + "Converts H3 indexes to component parts.")) { + return helpArg.found ? 0 : 1; } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (indexArg.found) { + doCell(index, verboseArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, verboseMode); + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, verboseArg.found); + } } } diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index 496eb5a6c..955c4f1de 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -47,32 +47,54 @@ void doCell(H3Index h, H3Index origin) { } } -int main(int argc, char *argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [origin]\n", argv[0]); - exit(1); - } +int main(int argc, char* argv[]) { + H3Index origin = 0; + H3Index index = 0; - H3Index origin; + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .required = true, + .helpText = + "Origin (anchoring index) for the local coordinate system."}; + Arg indexArg = {.names = {"-i", "--index"}, + .scanFormat = "%" PRIx64, + .valueName = "index", + .value = &index, + .helpText = "Index to convert to IJ coordinates."}; - if (!sscanf(argv[1], "%" PRIx64, &origin)) - error("origin could not be read"); + Arg* args[] = {&helpArg, &originArg, &indexArg}; - if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid"); + if (parseArgs(argc, argv, 3, args, &helpArg, + "Converts H3 indexes to local IJ coordinates")) { + return helpArg.found ? 0 : 1; + } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (!H3_EXPORT(h3IsValid)(origin)) { + // TODO print help here + error("origin is invalid"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, origin); + if (indexArg.found) { + doCell(index, origin); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, origin); + } } } diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index 79adba607..d34b5c3b1 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -28,10 +28,10 @@ * as the only output. */ +#include #include #include -#include "algos.h" -#include "h3Index.h" +#include "h3api.h" #include "utility.h" void doCell(H3Index h, int k) { @@ -50,29 +50,48 @@ void doCell(H3Index h, int k) { } int main(int argc, char* argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [k]\n", argv[0]); - exit(1); - } - int k = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); + H3Index origin = 0; + + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg kArg = {.names = {"-k", NULL}, + .required = true, + .scanFormat = "%d", + .valueName = "k", + .value = &k, + .helpText = "Radius of hexagons."}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .helpText = + "Origin, or not specified to read origins from standard in."}; + + Arg* args[] = {&helpArg, &kArg, &originArg}; + + if (parseArgs(argc, argv, 3, args, &helpArg, + "Print indexes k distance away from the origin")) { + return helpArg.found ? 0 : 1; } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (originArg.found) { + doCell(origin, k); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k); + H3Index h3 = H3_EXPORT(stringToH3)(buff); + doCell(h3, k); + } } } diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index ef49de069..a1a1b47bb 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -46,30 +46,65 @@ void doCell(const CoordIJ *ij, H3Index origin) { } int main(int argc, char *argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [origin]\n", argv[0]); - exit(1); - } + H3Index origin = 0; + CoordIJ ij = {0}; - H3Index origin = H3_EXPORT(stringToH3(argv[1])); - if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .required = true, + .helpText = + "Origin (anchoring index) for the local coordinate system."}; + Arg iArg = {.names = {"-i", NULL}, + .scanFormat = "%d", + .valueName = "i", + .value = &ij.i, + .helpText = "I coordinate."}; + Arg jArg = {.names = {"-j", NULL}, + .scanFormat = "%d", + .valueName = "j", + .value = &ij.j, + .helpText = "J coordinate."}; - // process the coordinates on stdin - char buff[BUFF_SIZE]; - while (1) { - // get coordinates from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading IJ coordinates from stdin"); - } + Arg *args[] = {&helpArg, &originArg, &iArg, &jArg}; + + if (parseArgs(argc, argv, 4, args, &helpArg, + "Converts local IJ coordinates to H3 indexes.")) { + return helpArg.found ? 0 : 1; + } - CoordIJ ij; - if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) - error("Parsing IJ coordinates. Expected `i j`."); + if (!H3_EXPORT(h3IsValid)(origin)) { + // TODO print help here + error("origin is invalid"); + } + if (iArg.found != jArg.found) { + // TODO print help here + error("I and J must both be specified"); + } + + if (iArg.found) { doCell(&ij, origin); + } else { + // process the coordinates on stdin + char buff[BUFF_SIZE]; + while (1) { + // get coordinates from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading IJ coordinates from stdin"); + } + + if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) + error("Parsing IJ coordinates. Expected `i j`."); + + doCell(&ij, origin); + } } } From 112fdde2f7b900d0a567f4735386c37a41decc4d Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 10:55:34 -0700 Subject: [PATCH 076/771] Help printing --- src/apps/filters/geoToH3.c | 6 +++--- src/apps/filters/h3ToComponents.c | 4 ++-- src/apps/filters/h3ToLocalIj.c | 10 ++++++---- src/apps/filters/hexRange.c | 2 +- src/apps/filters/localIjToH3.c | 16 ++++++++++------ 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index 8aa62a366..a12a36811 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -80,17 +80,17 @@ int main(int argc, char* argv[]) { .helpText = "Longitude in degrees."}; Arg* args[] = {&helpArg, &resArg, &latArg, &lonArg}; - + const int numArgs = 4; const char* helpText = "Convert degrees latitude/longitude coordinates to H3 indexes."; - if (parseArgs(argc, argv, 4, args, &helpArg, helpText)) { + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { return helpArg.found ? 0 : 1; } if (latArg.found != lonArg.found) { // One is found but the other is not. - printHelp(stderr, argv[0], helpText, 4, args, + printHelp(stderr, argv[0], helpText, numArgs, args, "Latitude and longitude must both be specified.", NULL); return 1; } diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index bd7599727..068139e93 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,7 +121,7 @@ int main(int argc, char* argv[]) { Arg* args[] = {&helpArg, &verboseArg, &indexArg}; if (parseArgs(argc, argv, 3, args, &helpArg, - "Converts H3 indexes to component parts.")) { + "Converts H3 indexes to component parts")) { return helpArg.found ? 0 : 1; } diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index 955c4f1de..d804cbe1f 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -68,15 +68,17 @@ int main(int argc, char* argv[]) { .helpText = "Index to convert to IJ coordinates."}; Arg* args[] = {&helpArg, &originArg, &indexArg}; + const int numArgs = 3; + const char* helpText = "Converts H3 indexes to local IJ coordinates"; - if (parseArgs(argc, argv, 3, args, &helpArg, - "Converts H3 indexes to local IJ coordinates")) { + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { return helpArg.found ? 0 : 1; } if (!H3_EXPORT(h3IsValid)(origin)) { - // TODO print help here - error("origin is invalid"); + printHelp(stderr, argv[0], helpText, numArgs, args, + "Origin is invalid.", NULL); + return 1; } if (indexArg.found) { diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index d34b5c3b1..d452a6aa1 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index a1a1b47bb..abc2f86e2 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -71,20 +71,24 @@ int main(int argc, char *argv[]) { .helpText = "J coordinate."}; Arg *args[] = {&helpArg, &originArg, &iArg, &jArg}; + const int numArgs = 4; + const char *helpText = "Converts local IJ coordinates to H3 indexes"; - if (parseArgs(argc, argv, 4, args, &helpArg, - "Converts local IJ coordinates to H3 indexes.")) { + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { return helpArg.found ? 0 : 1; } if (!H3_EXPORT(h3IsValid)(origin)) { - // TODO print help here - error("origin is invalid"); + printHelp(stderr, argv[0], helpText, numArgs, args, + "Origin is invalid.", NULL); + return 1; } if (iArg.found != jArg.found) { - // TODO print help here - error("I and J must both be specified"); + // One is found but the other is not. + printHelp(stderr, argv[0], helpText, numArgs, args, + "I and J must both be specified.", NULL); + return 1; } if (iArg.found) { From 672f409211e4f0d81d8f75230e968368cbae0032 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 11:02:53 -0700 Subject: [PATCH 077/771] Strings don't need to be modified, make const --- src/apps/filters/h3ToComponents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index 068139e93..763d659ae 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -49,7 +49,7 @@ void doCell(H3Index h, bool verboseMode) { int h3Res = H3_GET_RESOLUTION(h); int h3BaseCell = H3_GET_BASE_CELL(h); if (verboseMode) { - char* modes[] = { + const char* modes[] = { "RESERVED", // 0 "Hexagon", // 1 "Unidirectional Edge", // 2 From cca5939c5f7f720db4b12e487a594896a053d03e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 May 2019 17:29:10 -0700 Subject: [PATCH 078/771] Note coordinates will be read from standard in --- src/apps/filters/localIjToH3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index abc2f86e2..d94c2d7be 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -63,7 +63,9 @@ int main(int argc, char *argv[]) { .scanFormat = "%d", .valueName = "i", .value = &ij.i, - .helpText = "I coordinate."}; + .helpText = + "I coordinate. If not specified \"i j\" pairs will be read " + "from stdin."}; Arg jArg = {.names = {"-j", NULL}, .scanFormat = "%d", .valueName = "j", From e391bbbf78b7c0f35bc61da81d58e00144a59aca Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 10:45:56 -0700 Subject: [PATCH 079/771] h3ToHier argument parsing --- src/apps/miscapps/h3ToHier.c | 79 ++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 708743c5a..6fe2f3a76 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -29,26 +29,20 @@ * resolution are generated. */ +#include #include #include -#include #include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" #include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" - -#include "algos.h" void recursiveH3IndexToHier(H3Index h, int res) { for (int d = 0; d < 7; d++) { H3_SET_INDEX_DIGIT(h, res, d); // skip the pentagonal deleted subsequence - if (_isBaseCellPentagon(H3_GET_BASE_CELL(h)) && _h3LeadingNonZeroDigit(h) == 1) { continue; @@ -62,28 +56,55 @@ void recursiveH3IndexToHier(H3Index h, int res) { } } -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 3) { - fprintf(stderr, "usage: %s [resolution H3Index]\n", argv[0]); - exit(1); - } +int main(int argc, char *argv[]) { + int res; + H3Index prefixIndex = 0; - int res = 0; - if (!sscanf(argv[1], "%d", &res)) error("resolution must be an integer"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .required = true, + .helpText = "Resolution, 0-15 inclusive."}; + Arg prefixArg = { + .names = {"-p", "--prefix"}, + .scanFormat = "%" PRIx64, + .valueName = "prefix", + .value = &prefixIndex, + .helpText = "Print only indexes descendent from this index."}; - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + Arg *args[] = {&helpArg, &resArg, &prefixArg}; + const int numArgs = 3; + const char *helpText = "Print all indexes at the specified resolution"; - H3Index prefixIndex = 0; - if (argc > 2) { - prefixIndex = H3_EXPORT(stringToH3)(argv[2]); - int h3BaseCell = H3_GET_BASE_CELL(prefixIndex); - if (h3BaseCell < 0 || h3BaseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); - } + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; } - if (prefixIndex == 0) { + if (res > MAX_H3_RES) { + printHelp(stderr, argv[1], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } + + if (prefixArg.found && !H3_EXPORT(h3IsValid)(prefixIndex)) { + printHelp(stderr, argv[1], helpText, numArgs, args, + "Prefix index is invalid.", NULL); + return 1; + } + + if (prefixArg.found) { + // prefix is the same or higher resolution than the target. + if (res <= H3_GET_RESOLUTION(prefixIndex)) { + h3Println(prefixIndex); + } else { + int rootRes = H3_GET_RESOLUTION(prefixIndex); + H3_SET_RESOLUTION(prefixIndex, res); + recursiveH3IndexToHier(prefixIndex, rootRes + 1); + } + } else { // Generate all for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { H3Index rootCell = H3_INIT; @@ -96,15 +117,5 @@ int main(int argc, char* argv[]) { recursiveH3IndexToHier(rootCell, 1); } } - } else { - // prefix is the same or higher resolution than - // the target. - if (res <= H3_GET_RESOLUTION(prefixIndex)) { - h3Println(prefixIndex); - } else { - int rootRes = H3_GET_RESOLUTION(prefixIndex); - H3_SET_RESOLUTION(prefixIndex, res); - recursiveH3IndexToHier(prefixIndex, rootRes + 1); - } } } From 722d192bc5c3c48e7398d0c3e97b8a66b20314ac Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 11:25:27 -0700 Subject: [PATCH 080/771] h3ToGeoHier argument parsing --- src/apps/miscapps/h3ToGeoHier.c | 108 ++++++++++++++++++++++---------- src/apps/miscapps/h3ToHier.c | 2 +- 2 files changed, 76 insertions(+), 34 deletions(-) diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index 0c202dbb3..e25362d15 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -95,55 +95,97 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { } } -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 5) { - fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]); - exit(1); +int main(int argc, char *argv[]) { + int res; + H3Index prefixIndex = 0; + char userKmlName[BUFF_SIZE] = {0}; + char userKmlDesc[BUFF_SIZE] = {0}; + + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .required = true, + .helpText = "Resolution, 0-15 inclusive."}; + Arg prefixArg = { + .names = {"-p", "--prefix"}, + .scanFormat = "%" PRIx64, + .valueName = "prefix", + .value = &prefixIndex, + .required = true, + .helpText = "Print cell centers descendent from this index."}; + Arg kmlArg = {.names = {"-k", "--kml"}, + .helpText = "Print output in KML format."}; + Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "name", + .value = &userKmlName, + .helpText = "Text for the KML name tag."}; + Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "description", + .value = &userKmlDesc, + .helpText = "Text for the KML description tag."}; + + Arg *args[] = {&helpArg, &resArg, &prefixArg, + &kmlArg, &kmlNameArg, &kmlDescArg}; + const int numArgs = 6; + const char *helpText = + "Print cell center points for descendants of an index"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; } - H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]); - int baseCell = H3_GET_BASE_CELL(rootCell); - int rootRes = H3_GET_RESOLUTION(rootCell); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; } - int res = 0; - int isKmlOut = 0; - if (argc > 2) { - if (!sscanf(argv[2], "%d", &res)) - error("resolution must be an integer"); + if (!H3_EXPORT(h3IsValid)(prefixIndex)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Prefix index is invalid.", NULL); + return 1; + } - if (res > MAX_H3_RES) - error("specified resolution exceeds max resolution"); + int baseCell = H3_GET_BASE_CELL(prefixIndex); + int rootRes = H3_GET_RESOLUTION(prefixIndex); + if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { + error("invalid base cell number"); + } - if (argc > 3) { - if (!sscanf(argv[3], "%d", &isKmlOut)) - error("outputMode must be an integer"); + if (kmlArg.found) { + char *kmlName; + if (kmlNameArg.found) { + kmlName = userKmlName; + } else { + kmlName = calloc(BUFF_SIZE, sizeof(char)); - if (isKmlOut != 0 && isKmlOut != 1) - error("outputMode must be 0 or 1"); + sprintf(kmlName, "Cell %" PRIx64 " Res %d", prefixIndex, + ((res <= rootRes) ? rootRes : res)); + } - if (isKmlOut) { - char name[BUFF_SIZE]; + char *kmlDesc = "Generated by h3ToGeoHier"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; - sprintf(name, "Cell %" PRIx64 " Res %d", rootCell, - ((res <= rootRes) ? rootRes : res)); + kmlBoundaryHeader(kmlName, kmlDesc); - kmlBoundaryHeader(name, "cell center"); - } + if (kmlNameArg.found) { + free(kmlName); } } // generate the points if (res <= rootRes) { - doCell(rootCell, isKmlOut); + doCell(prefixIndex, kmlArg.found); } else { - H3_SET_RESOLUTION(rootCell, res); - recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut); + H3_SET_RESOLUTION(prefixIndex, res); + recursiveH3IndexToGeo(prefixIndex, rootRes + 1, kmlArg.found); } - if (isKmlOut) kmlBoundaryFooter(); + if (kmlArg.found) kmlBoundaryFooter(); } diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 6fe2f3a76..dc52ef4cb 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 7c8c8abc8d5a40de413bca97dbdf17ba95209a66 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 11:53:33 -0700 Subject: [PATCH 081/771] h3ToGeoBoundaryHier argument parsing --- src/apps/miscapps/h3ToGeoBoundaryHier.c | 120 ++++++++++++++++-------- src/apps/miscapps/h3ToGeoHier.c | 31 +++--- src/apps/miscapps/h3ToHier.c | 4 +- 3 files changed, 95 insertions(+), 60 deletions(-) diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c index 64dc673cc..c633547d1 100644 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ b/src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,8 @@ * @brief takes an H3 index and generates cell boundaries for all descendants * at a specified resolution. * - * usage: `h3ToGeoBoundaryHier H3Index [resolution outputMode]` + * usage: `h3ToGeoBoundaryHier --prefix prefix [--resolution res] [--kml + * [--kml-name name] [--kml-description desc]]` * * The program generates the cell boundaries in lat/lon coordinates for all * hierarchical children of H3Index at the specified resolution. If the @@ -27,21 +28,23 @@ * `resolution` should be a positive integer. The default is 0 (i.e., only the * specified cell H3Index would be processed). * - * `outputMode` indicates the type of output; currently the choices are 0 for - * plain text output (the default) and 1 for KML output. + * `--kml` indicates KML output format; if not specified plain text output is + * the default. * * Examples: * --------- * - * `h3ToGeoBoundaryHier 836e9bfffffffff` + * `h3ToGeoBoundaryHier --prefix 836e9bfffffffff` * - outputs the cell boundary in lat/lon for cell `836e9bfffffffff` as * plain text * - * `h3ToGeoBoundaryHier 820ceffffffffff 4 1 > cells.kml` + * `h3ToGeoBoundaryHier --prefix 820ceffffffffff --resolution 4 --kml > + * cells.kml` * - outputs the cell boundaries of all of the resolution 4 descendants * of cell `820ceffffffffff` as a KML file (redirected to `cells.kml`). * - * `h3ToGeoBoundaryHier 86283082fffffff 9 1 > uber9cells.kml` + * `h3ToGeoBoundaryHier --prefix 86283082fffffff --resolution 9 --kml > + * uber9cells.kml` * - creates a KML file containing the cell boundaries of all of the * resolution 9 hexagons covering Uber HQ and the surrounding region of * San Francisco @@ -94,55 +97,90 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { } } -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 5) { - fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]); - exit(1); +int main(int argc, char *argv[]) { + int res; + H3Index prefixIndex = 0; + char userKmlName[BUFF_SIZE] = {0}; + char userKmlDesc[BUFF_SIZE] = {0}; + + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, if less than the resolution of the prefix " + "only the prefix is printed. Default 0."}; + Arg prefixArg = { + .names = {"-p", "--prefix"}, + .scanFormat = "%" PRIx64, + .valueName = "prefix", + .value = &prefixIndex, + .required = true, + .helpText = "Print cell boundaries descendent from this index."}; + Arg kmlArg = {.names = {"-k", "--kml"}, + .helpText = "Print output in KML format."}; + Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "name", + .value = &userKmlName, + .helpText = "Text for the KML name tag."}; + Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, + .scanFormat = "%255c", // BUFF_SIZE - 1 + .valueName = "description", + .value = &userKmlDesc, + .helpText = "Text for the KML description tag."}; + + Arg *args[] = {&helpArg, &resArg, &prefixArg, + &kmlArg, &kmlNameArg, &kmlDescArg}; + const int numArgs = 6; + const char *helpText = "Print cell boundaries for descendants of an index"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; } - H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]); - int baseCell = H3_GET_BASE_CELL(rootCell); - int rootRes = H3_GET_RESOLUTION(rootCell); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; } - int res = 0; - int isKmlOut = 0; - if (argc > 2) { - if (!sscanf(argv[2], "%d", &res)) - error("resolution must be an integer"); + if (!H3_EXPORT(h3IsValid)(prefixIndex)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Prefix index is invalid.", NULL); + return 1; + } - if (res > MAX_H3_RES) - error("specified resolution exceeds max resolution"); + int rootRes = H3_GET_RESOLUTION(prefixIndex); - if (argc > 3) { - if (!sscanf(argv[3], "%d", &isKmlOut)) - error("outputMode must be an integer"); + if (kmlArg.found) { + char *kmlName; + if (kmlNameArg.found) { + kmlName = strdup(userKmlName); + } else { + kmlName = calloc(BUFF_SIZE, sizeof(char)); - if (isKmlOut != 0 && isKmlOut != 1) - error("outputMode must be 0 or 1"); + sprintf(kmlName, "Cell %" PRIx64 " Res %d", prefixIndex, + ((res <= rootRes) ? rootRes : res)); + } - if (isKmlOut) { - char name[BUFF_SIZE]; + char *kmlDesc = "Generated by h3ToGeoBoundaryHier"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; - sprintf(name, "Cell %" PRIx64 " Res %d", rootCell, - ((res <= rootRes) ? rootRes : res)); + kmlBoundaryHeader(kmlName, kmlDesc); - kmlBoundaryHeader(name, "cell boundary"); - } - } + free(kmlName); } // generate the points - if (res <= rootRes) { - doCell(rootCell, isKmlOut); + doCell(prefixIndex, kmlArg.found); } else { - H3_SET_RESOLUTION(rootCell, res); - recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut); + H3_SET_RESOLUTION(prefixIndex, res); + recursiveH3IndexToGeo(prefixIndex, rootRes + 1, kmlArg.found); } - if (isKmlOut) kmlBoundaryFooter(); + if (kmlArg.found) kmlBoundaryFooter(); } diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index e25362d15..044401bb2 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -17,7 +17,8 @@ * @brief takes an H3 index and generates cell center points for descendants a * specified resolution. * - * usage: `h3ToGeoHier H3Index [resolution outputMode]` + * usage: `h3ToGeoHier --prefix prefix [--resolution res] [--kml [--kml-name + * name] [--kml-description desc]]` * * The program generates the cell center points in lat/lon coordinates for all * hierarchical children of H3Index at the specified resolution. If the @@ -27,22 +28,23 @@ * `resolution` should be a positive integer. The default is 0 (i.e., only the * specified cell H3Index would be processed). * - * `outputMode` indicates the type of output; currently the choices are 0 for - * plain text output (the default) and 1 for KML output. + * `--kml` indicates KML output format; if not specified plain text output is + * the default. * * Examples: * --------- * - * `h3ToGeoHier 836e9bfffffffff` + * `h3ToGeoHier --prefix 836e9bfffffffff` * - outputs the cell center point in lat/lon for cell * `836e9bfffffffff` as plain text * - * `h3ToGeoHier 820ceffffffffff 4 1 > pts.kml` + * `h3ToGeoHier --prefix 820ceffffffffff --resolution 4 --kml > pts.kml` * - outputs the cell center points of all of the resolution 4 * descendants of cell `820ceffffffffff` as a KML file (redirected to * `pts.kml`). * - * `h3ToGeoHier 86283082fffffff 9 1 > uber9pts.kml` + * `h3ToGeoHier --prefix 86283082fffffff --resolution 9 --kml > + * uber9pts.kml` * - creates a KML file containing the cell center points of all of the * resolution 9 hexagons covering Uber HQ and the surrounding region of * San Francisco. @@ -96,7 +98,7 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { } int main(int argc, char *argv[]) { - int res; + int res = 0; H3Index prefixIndex = 0; char userKmlName[BUFF_SIZE] = {0}; char userKmlDesc[BUFF_SIZE] = {0}; @@ -107,8 +109,9 @@ int main(int argc, char *argv[]) { .scanFormat = "%d", .valueName = "res", .value = &res, - .required = true, - .helpText = "Resolution, 0-15 inclusive."}; + .helpText = + "Resolution, if less than the resolution of the prefix " + "only the prefix is printed. Default 0."}; Arg prefixArg = { .names = {"-p", "--prefix"}, .scanFormat = "%" PRIx64, @@ -151,16 +154,12 @@ int main(int argc, char *argv[]) { return 1; } - int baseCell = H3_GET_BASE_CELL(prefixIndex); int rootRes = H3_GET_RESOLUTION(prefixIndex); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); - } if (kmlArg.found) { char *kmlName; if (kmlNameArg.found) { - kmlName = userKmlName; + kmlName = strdup(userKmlName); } else { kmlName = calloc(BUFF_SIZE, sizeof(char)); @@ -173,9 +172,7 @@ int main(int argc, char *argv[]) { kmlBoundaryHeader(kmlName, kmlDesc); - if (kmlNameArg.found) { - free(kmlName); - } + free(kmlName); } // generate the points diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index dc52ef4cb..44417d536 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -17,7 +17,7 @@ * @brief takes an optional H3 index and generates all descendant cells at the * specified resolution. * - * usage: `h3ToHier [resolution H3Index]` + * usage: `h3ToHier --resolution res [--prefix prefix]` * * The program generates all cells at the specified resolution, optionally * only the children of the given index. @@ -25,7 +25,7 @@ * `resolution` should be a positive integer. The default is 0 (i.e., only the * base cells). * - * `H3Index` should be an H3Index. By default, all indices at the specified + * `prefix` should be an H3Index. By default, all indices at the specified * resolution are generated. */ From 104f2376448cbbe9e3df9427afaf7b52d8a57e7c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 3 May 2019 12:08:20 -0700 Subject: [PATCH 082/771] mkRandGeo/mkRandGeoBoundary argument parsing --- src/apps/applib/include/utility.h | 4 +- src/apps/applib/lib/utility.c | 20 ++++++++- src/apps/testapps/mkRandGeo.c | 57 ++++++++++++++------------ src/apps/testapps/mkRandGeoBoundary.c | 59 +++++++++++++++------------ 4 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index c41c089cd..b66217bc2 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -104,6 +104,8 @@ void geoBoundaryPrint(const GeoBoundary* b); void geoBoundaryPrintln(const GeoBoundary* b); int readBoundary(FILE* f, GeoBoundary* b); +void randomGeo(GeoCoord* p); + void iterateAllIndexesAtRes(int res, void (*callback)(H3Index)); void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int maxBaseCell); diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 33ea1a842..8a8b46c05 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ #include #include #include +#include #include "coordijk.h" #include "geoCoord.h" #include "h3Index.h" @@ -399,3 +400,20 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), free(children); } } + +/** + * Generates a random lat/lon pair. + * + * @param g Lat/lon will be placed here. + */ +void randomGeo(GeoCoord* g) { + static int init = 0; + if (!init) { + srand((unsigned int)time(0)); + init = 1; + } + + g->lat = H3_EXPORT(degsToRads)( + (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); + g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; +} diff --git a/src/apps/testapps/mkRandGeo.c b/src/apps/testapps/mkRandGeo.c index 54bd06030..170b350f2 100644 --- a/src/apps/testapps/mkRandGeo.c +++ b/src/apps/testapps/mkRandGeo.c @@ -25,38 +25,43 @@ #include #include -#include -#include "baseCells.h" -#include "h3Index.h" #include "utility.h" -void randomGeo(GeoCoord* g) { - static int init = 0; - if (!init) { - srand((unsigned int)time(0)); - init = 1; - } - - g->lat = H3_EXPORT(degsToRads)( - (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); - g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; -} - int main(int argc, char* argv[]) { - // check command line args - if (argc > 3) { - fprintf(stderr, "usage: %s numPoints resolution\n", argv[0]); - exit(1); - } - + int res = 0; int numPoints = 0; - if (!sscanf(argv[1], "%d", &numPoints)) - error("numPoints must be an integer"); - int res = 0; - if (!sscanf(argv[2], "%d", &res)) error("resolution must be an integer"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg numPointsArg = { + .names = {"-n", "--num-points"}, + .required = true, + .scanFormat = "%d", + .valueName = "num", + .value = &numPoints, + .helpText = "Number of random lat/lon pairs to generate."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + + Arg* args[] = {&helpArg, &numPointsArg, &resArg}; + const int numArgs = 3; + const char* helpText = + "Generates random lat/lon pairs and indexes them at the specified " + "resolution."; - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } for (int i = 0; i < numPoints; i++) { GeoCoord g; diff --git a/src/apps/testapps/mkRandGeoBoundary.c b/src/apps/testapps/mkRandGeoBoundary.c index 778d9fd4f..04726c444 100644 --- a/src/apps/testapps/mkRandGeoBoundary.c +++ b/src/apps/testapps/mkRandGeoBoundary.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,38 +24,43 @@ #include #include -#include -#include "baseCells.h" -#include "h3Index.h" #include "utility.h" -void randomGeo(GeoCoord* g) { - static int init = 0; - if (!init) { - srand((unsigned int)time(0)); - init = 1; - } - - g->lat = H3_EXPORT(degsToRads)( - (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); - g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; -} - int main(int argc, char* argv[]) { - // check command line args - if (argc > 3) { - fprintf(stderr, "usage: %s numPoints resolution\n", argv[0]); - exit(1); - } - + int res = 0; int numPoints = 0; - if (!sscanf(argv[1], "%d", &numPoints)) - error("numPoints must be an integer"); - int res = 0; - if (!sscanf(argv[2], "%d", &res)) error("resolution must be an integer"); + Arg helpArg = {.names = {"-h", "--help"}, + .helpText = "Show this help message."}; + Arg numPointsArg = { + .names = {"-n", "--num-points"}, + .required = true, + .scanFormat = "%d", + .valueName = "num", + .value = &numPoints, + .helpText = "Number of random lat/lon pairs to generate."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + + Arg* args[] = {&helpArg, &numPointsArg, &resArg}; + const int numArgs = 3; + const char* helpText = + "Generates random cell indexes and cell boundaries at the specified " + "resolution."; - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } for (int i = 0; i < numPoints; i++) { GeoCoord g; From 17c1c55dd390d81c1b9fe026f661c6025f897fad Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 17 May 2019 12:05:17 -0700 Subject: [PATCH 083/771] Standardize naming to `parent` --- src/apps/miscapps/h3ToGeoBoundaryHier.c | 38 ++++++++++++------------- src/apps/miscapps/h3ToGeoHier.c | 38 ++++++++++++------------- src/apps/miscapps/h3ToHier.c | 34 +++++++++++----------- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c index c633547d1..3657d64d9 100644 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ b/src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -17,7 +17,7 @@ * @brief takes an H3 index and generates cell boundaries for all descendants * at a specified resolution. * - * usage: `h3ToGeoBoundaryHier --prefix prefix [--resolution res] [--kml + * usage: `h3ToGeoBoundaryHier --parent parent [--resolution res] [--kml * [--kml-name name] [--kml-description desc]]` * * The program generates the cell boundaries in lat/lon coordinates for all @@ -34,16 +34,16 @@ * Examples: * --------- * - * `h3ToGeoBoundaryHier --prefix 836e9bfffffffff` + * `h3ToGeoBoundaryHier --parent 836e9bfffffffff` * - outputs the cell boundary in lat/lon for cell `836e9bfffffffff` as * plain text * - * `h3ToGeoBoundaryHier --prefix 820ceffffffffff --resolution 4 --kml > + * `h3ToGeoBoundaryHier --parent 820ceffffffffff --resolution 4 --kml > * cells.kml` * - outputs the cell boundaries of all of the resolution 4 descendants * of cell `820ceffffffffff` as a KML file (redirected to `cells.kml`). * - * `h3ToGeoBoundaryHier --prefix 86283082fffffff --resolution 9 --kml > + * `h3ToGeoBoundaryHier --parent 86283082fffffff --resolution 9 --kml > * uber9cells.kml` * - creates a KML file containing the cell boundaries of all of the * resolution 9 hexagons covering Uber HQ and the surrounding region of @@ -99,7 +99,7 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { int main(int argc, char *argv[]) { int res; - H3Index prefixIndex = 0; + H3Index parentIndex = 0; char userKmlName[BUFF_SIZE] = {0}; char userKmlDesc[BUFF_SIZE] = {0}; @@ -110,13 +110,13 @@ int main(int argc, char *argv[]) { .valueName = "res", .value = &res, .helpText = - "Resolution, if less than the resolution of the prefix " - "only the prefix is printed. Default 0."}; - Arg prefixArg = { - .names = {"-p", "--prefix"}, + "Resolution, if less than the resolution of the parent " + "only the parent is printed. Default 0."}; + Arg parentArg = { + .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, - .valueName = "prefix", - .value = &prefixIndex, + .valueName = "parent", + .value = &parentIndex, .required = true, .helpText = "Print cell boundaries descendent from this index."}; Arg kmlArg = {.names = {"-k", "--kml"}, @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { .value = &userKmlDesc, .helpText = "Text for the KML description tag."}; - Arg *args[] = {&helpArg, &resArg, &prefixArg, + Arg *args[] = {&helpArg, &resArg, &parentArg, &kmlArg, &kmlNameArg, &kmlDescArg}; const int numArgs = 6; const char *helpText = "Print cell boundaries for descendants of an index"; @@ -147,13 +147,13 @@ int main(int argc, char *argv[]) { return 1; } - if (!H3_EXPORT(h3IsValid)(prefixIndex)) { + if (!H3_EXPORT(h3IsValid)(parentIndex)) { printHelp(stderr, argv[0], helpText, numArgs, args, - "Prefix index is invalid.", NULL); + "Parent index is invalid.", NULL); return 1; } - int rootRes = H3_GET_RESOLUTION(prefixIndex); + int rootRes = H3_GET_RESOLUTION(parentIndex); if (kmlArg.found) { char *kmlName; @@ -162,7 +162,7 @@ int main(int argc, char *argv[]) { } else { kmlName = calloc(BUFF_SIZE, sizeof(char)); - sprintf(kmlName, "Cell %" PRIx64 " Res %d", prefixIndex, + sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex, ((res <= rootRes) ? rootRes : res)); } @@ -176,10 +176,10 @@ int main(int argc, char *argv[]) { // generate the points if (res <= rootRes) { - doCell(prefixIndex, kmlArg.found); + doCell(parentIndex, kmlArg.found); } else { - H3_SET_RESOLUTION(prefixIndex, res); - recursiveH3IndexToGeo(prefixIndex, rootRes + 1, kmlArg.found); + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found); } if (kmlArg.found) kmlBoundaryFooter(); diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index 044401bb2..386373e22 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -17,7 +17,7 @@ * @brief takes an H3 index and generates cell center points for descendants a * specified resolution. * - * usage: `h3ToGeoHier --prefix prefix [--resolution res] [--kml [--kml-name + * usage: `h3ToGeoHier --parent parent [--resolution res] [--kml [--kml-name * name] [--kml-description desc]]` * * The program generates the cell center points in lat/lon coordinates for all @@ -34,16 +34,16 @@ * Examples: * --------- * - * `h3ToGeoHier --prefix 836e9bfffffffff` + * `h3ToGeoHier --parent 836e9bfffffffff` * - outputs the cell center point in lat/lon for cell * `836e9bfffffffff` as plain text * - * `h3ToGeoHier --prefix 820ceffffffffff --resolution 4 --kml > pts.kml` + * `h3ToGeoHier --parent 820ceffffffffff --resolution 4 --kml > pts.kml` * - outputs the cell center points of all of the resolution 4 * descendants of cell `820ceffffffffff` as a KML file (redirected to * `pts.kml`). * - * `h3ToGeoHier --prefix 86283082fffffff --resolution 9 --kml > + * `h3ToGeoHier --parent 86283082fffffff --resolution 9 --kml > * uber9pts.kml` * - creates a KML file containing the cell center points of all of the * resolution 9 hexagons covering Uber HQ and the surrounding region of @@ -99,7 +99,7 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { int main(int argc, char *argv[]) { int res = 0; - H3Index prefixIndex = 0; + H3Index parentIndex = 0; char userKmlName[BUFF_SIZE] = {0}; char userKmlDesc[BUFF_SIZE] = {0}; @@ -110,13 +110,13 @@ int main(int argc, char *argv[]) { .valueName = "res", .value = &res, .helpText = - "Resolution, if less than the resolution of the prefix " - "only the prefix is printed. Default 0."}; - Arg prefixArg = { - .names = {"-p", "--prefix"}, + "Resolution, if less than the resolution of the parent " + "only the parent is printed. Default 0."}; + Arg parentArg = { + .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, - .valueName = "prefix", - .value = &prefixIndex, + .valueName = "parent", + .value = &parentIndex, .required = true, .helpText = "Print cell centers descendent from this index."}; Arg kmlArg = {.names = {"-k", "--kml"}, @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { .value = &userKmlDesc, .helpText = "Text for the KML description tag."}; - Arg *args[] = {&helpArg, &resArg, &prefixArg, + Arg *args[] = {&helpArg, &resArg, &parentArg, &kmlArg, &kmlNameArg, &kmlDescArg}; const int numArgs = 6; const char *helpText = @@ -148,13 +148,13 @@ int main(int argc, char *argv[]) { return 1; } - if (!H3_EXPORT(h3IsValid)(prefixIndex)) { + if (!H3_EXPORT(h3IsValid)(parentIndex)) { printHelp(stderr, argv[0], helpText, numArgs, args, - "Prefix index is invalid.", NULL); + "Parent index is invalid.", NULL); return 1; } - int rootRes = H3_GET_RESOLUTION(prefixIndex); + int rootRes = H3_GET_RESOLUTION(parentIndex); if (kmlArg.found) { char *kmlName; @@ -163,7 +163,7 @@ int main(int argc, char *argv[]) { } else { kmlName = calloc(BUFF_SIZE, sizeof(char)); - sprintf(kmlName, "Cell %" PRIx64 " Res %d", prefixIndex, + sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex, ((res <= rootRes) ? rootRes : res)); } @@ -178,10 +178,10 @@ int main(int argc, char *argv[]) { // generate the points if (res <= rootRes) { - doCell(prefixIndex, kmlArg.found); + doCell(parentIndex, kmlArg.found); } else { - H3_SET_RESOLUTION(prefixIndex, res); - recursiveH3IndexToGeo(prefixIndex, rootRes + 1, kmlArg.found); + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found); } if (kmlArg.found) kmlBoundaryFooter(); diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 44417d536..8bc723b89 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -17,7 +17,7 @@ * @brief takes an optional H3 index and generates all descendant cells at the * specified resolution. * - * usage: `h3ToHier --resolution res [--prefix prefix]` + * usage: `h3ToHier --resolution res [--parent parent]` * * The program generates all cells at the specified resolution, optionally * only the children of the given index. @@ -25,7 +25,7 @@ * `resolution` should be a positive integer. The default is 0 (i.e., only the * base cells). * - * `prefix` should be an H3Index. By default, all indices at the specified + * `parent` should be an H3Index. By default, all indices at the specified * resolution are generated. */ @@ -58,7 +58,7 @@ void recursiveH3IndexToHier(H3Index h, int res) { int main(int argc, char *argv[]) { int res; - H3Index prefixIndex = 0; + H3Index parentIndex = 0; Arg helpArg = {.names = {"-h", "--help"}, .helpText = "Show this help message."}; @@ -68,14 +68,14 @@ int main(int argc, char *argv[]) { .value = &res, .required = true, .helpText = "Resolution, 0-15 inclusive."}; - Arg prefixArg = { - .names = {"-p", "--prefix"}, + Arg parentArg = { + .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, - .valueName = "prefix", - .value = &prefixIndex, + .valueName = "parent", + .value = &parentIndex, .helpText = "Print only indexes descendent from this index."}; - Arg *args[] = {&helpArg, &resArg, &prefixArg}; + Arg *args[] = {&helpArg, &resArg, &parentArg}; const int numArgs = 3; const char *helpText = "Print all indexes at the specified resolution"; @@ -89,20 +89,20 @@ int main(int argc, char *argv[]) { return 1; } - if (prefixArg.found && !H3_EXPORT(h3IsValid)(prefixIndex)) { + if (parentArg.found && !H3_EXPORT(h3IsValid)(parentIndex)) { printHelp(stderr, argv[1], helpText, numArgs, args, - "Prefix index is invalid.", NULL); + "Parent index is invalid.", NULL); return 1; } - if (prefixArg.found) { - // prefix is the same or higher resolution than the target. - if (res <= H3_GET_RESOLUTION(prefixIndex)) { - h3Println(prefixIndex); + if (parentArg.found) { + // parent is the same or higher resolution than the target. + if (res <= H3_GET_RESOLUTION(parentIndex)) { + h3Println(parentIndex); } else { - int rootRes = H3_GET_RESOLUTION(prefixIndex); - H3_SET_RESOLUTION(prefixIndex, res); - recursiveH3IndexToHier(prefixIndex, rootRes + 1); + int rootRes = H3_GET_RESOLUTION(parentIndex); + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToHier(parentIndex, rootRes + 1); } } else { // Generate all From 83998087d0cc3dd085058abb5d273abcbbe8c672 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 17 May 2019 16:52:19 -0700 Subject: [PATCH 084/771] Adjust comment about pentagon unfolding --- src/h3lib/lib/localij.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index df6281e07..70da2f2cc 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -188,8 +188,9 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); if (FAILED_DIRECTIONS[originLeadingDigit][dir]) { - // TODO In this case this part of the pentagon might not be - // unfolded correctly. + // TODO: We may be unfolding the pentagon incorrectly in this + // case; return an error code until this is guaranteed to be + // correct. return 3; } @@ -199,8 +200,9 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[indexLeadingDigit][revDir]) { - // TODO In this case this part of the pentagon might not be - // unfolded correctly. + // TODO: We may be unfolding the pentagon incorrectly in this + // case; return an error code until this is guaranteed to be + // correct. return 4; } @@ -244,8 +246,8 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); if (FAILED_DIRECTIONS[originLeadingDigit][indexLeadingDigit]) { - // TODO In this case this part of the pentagon might not be unfolded - // correctly. + // TODO: We may be unfolding the pentagon incorrectly in this case; + // return an error code until this is guaranteed to be correct. return 5; } From 6ce9e7423fa520c1e94de9ea16ce4b78be1ba5e1 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 21 May 2019 12:51:54 -0700 Subject: [PATCH 085/771] Consistently use "standard input", remove usage string --- src/apps/filters/geoToH3.c | 4 ++-- src/apps/filters/h3ToComponents.c | 4 ++-- src/apps/filters/h3ToGeo.c | 5 ++--- src/apps/filters/h3ToGeoBoundary.c | 5 ++--- src/apps/filters/h3ToLocalIj.c | 6 ++++-- src/apps/filters/hexRange.c | 6 +++--- src/apps/filters/kRing.c | 4 ++-- src/apps/filters/localIjToH3.c | 7 ++++--- src/apps/miscapps/h3ToGeoBoundaryHier.c | 3 +-- src/apps/miscapps/h3ToGeoHier.c | 3 +-- src/apps/miscapps/h3ToHier.c | 2 +- src/apps/testapps/mkRandGeo.c | 2 +- src/apps/testapps/mkRandGeoBoundary.c | 2 +- 13 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index a12a36811..6b1c17415 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from lat/lon coordinates to integer * H3 indexes * - * usage: `geoToH3 --resolution res [--latitude lat --longitude lon]` + * See `geoToH3 --help` for usage. * * The program reads lat/lon pairs from stdin until EOF is encountered. For * each lat/lon the program outputs to stdout the integer H3 index of the @@ -72,7 +72,7 @@ int main(int argc, char* argv[]) { .value = &lat, .helpText = "Latitude in degrees. If not specified, \"latitude " - "longitude\" pairs will be read from stdin."}; + "longitude\" pairs will be read from standard input."}; Arg lonArg = {.names = {"--lon", "--longitude"}, .scanFormat = "%lf", .valueName = "lon", diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index 763d659ae..2a3328bba 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * components. * - * usage: `h3ToComponents [--verbose] [--index index]` + * See `h3ToComponents --help` for usage. * * The program reads H3 indexes from stdin until EOF and outputs the * corresponding component strings to stdout. @@ -116,7 +116,7 @@ int main(int argc, char* argv[]) { .valueName = "index", .value = &index, .helpText = - "Index, or not specified to read indexes from standard in."}; + "Index, or not specified to read indexes from standard input."}; Arg* args[] = {&helpArg, &verboseArg, &indexArg}; diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index dd6a70c8d..9bcd6ea8d 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -17,8 +17,7 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon * cell center point * - * usage: `h3ToGeo [--index index] [--kml [--kml-name name] [--kml-description - * desc]]` + * See `h3ToGeo --help` for usage. * * The program reads H3 indexes from stdin and outputs the corresponding * cell center points to stdout, until EOF is encountered. The H3 indexes @@ -78,7 +77,7 @@ int main(int argc, char *argv[]) { .valueName = "index", .value = &index, .helpText = - "Index, or not specified to read indexes from standard in."}; + "Index, or not specified to read indexes from standard input."}; Arg kmlArg = {.names = {"-k", "--kml"}, .helpText = "Print output in KML format."}; Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index 1af569fff..c823e0b06 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -17,8 +17,7 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon * cell boundaries * - * usage: `h3ToGeoBoundary [--index index] [--kml [--kml-name name] - * [--kml-description desc]]` + * See `h3ToGeoBoundary --help` for usage. * * The program reads H3 indexes from stdin and outputs the corresponding * cell boundaries to stdout, until EOF is encountered. @@ -76,7 +75,7 @@ int main(int argc, char *argv[]) { .valueName = "index", .value = &index, .helpText = - "Index, or not specified to read indexes from standard in."}; + "Index, or not specified to read indexes from standard input."}; Arg kmlArg = {.names = {"-k", "--kml"}, .helpText = "Print output in KML format."}; Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index d804cbe1f..7ea85e9ad 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from H3 indexes to local IJ * coordinates. This is experimental. * - * usage: `h3ToLocalIj [origin]` + * See `h3ToLocalIj --help` for usage. * * The program reads H3 indexes from stdin and outputs the corresponding * IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the @@ -65,7 +65,9 @@ int main(int argc, char* argv[]) { .scanFormat = "%" PRIx64, .valueName = "index", .value = &index, - .helpText = "Index to convert to IJ coordinates."}; + .helpText = + "Index to convert to IJ coordinates, or not specified " + "to read from standard input."}; Arg* args[] = {&helpArg, &originArg, &indexArg}; const int numArgs = 3; diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index d452a6aa1..8badb426c 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * k-rings * - * usage: `hexRange [k]` + * See `hexRange --help` for usage. * * The program reads H3 indexes from stdin until EOF and outputs * the H3 indexes within k-ring `k` to stdout. Requires all indexes @@ -60,14 +60,14 @@ int main(int argc, char* argv[]) { .scanFormat = "%d", .valueName = "k", .value = &k, - .helpText = "Radius of hexagons."}; + .helpText = "Radius in hexagons."}; Arg originArg = { .names = {"-o", "--origin"}, .scanFormat = "%" PRIx64, .valueName = "origin", .value = &origin, .helpText = - "Origin, or not specified to read origins from standard in."}; + "Origin, or not specified to read origins from standard input."}; Arg* args[] = {&helpArg, &kArg, &originArg}; diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index bc57ce85b..6219ba7da 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * k-rings * - * usage: `kRing -k [--print-distances] [--origin origin]` + * See `kRing --help` for usage. * * The program reads H3 indexes from stdin until EOF and outputs * the H3 indexes within k-ring `k` to stdout. @@ -75,7 +75,7 @@ int main(int argc, char* argv[]) { .valueName = "origin", .value = &origin, .helpText = - "Origin, or not specified to read origins from standard in."}; + "Origin, or not specified to read origins from standard input."}; Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg}; diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index d94c2d7be..dd77878e8 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -17,7 +17,7 @@ * @brief stdin/stdout filter that converts from local IJ coordinates to * H3 indexes. This is experimental. * - * usage: `localIjToH3 [origin]` + * See `localIjToH3 --help` for usage. * * The program reads IJ coordinates (in the format `i j` separated by newlines) * from stdin and outputs the corresponding H3 indexes to stdout, until EOF is @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) { .value = &ij.i, .helpText = "I coordinate. If not specified \"i j\" pairs will be read " - "from stdin."}; + "from standard input."}; Arg jArg = {.names = {"-j", NULL}, .scanFormat = "%d", .valueName = "j", @@ -108,7 +108,8 @@ int main(int argc, char *argv[]) { } if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) - error("Parsing IJ coordinates. Expected `i j`."); + error( + "Parsing IJ coordinates. Expected ` `."); doCell(&ij, origin); } diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c index 3657d64d9..dbd162b35 100644 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ b/src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -17,8 +17,7 @@ * @brief takes an H3 index and generates cell boundaries for all descendants * at a specified resolution. * - * usage: `h3ToGeoBoundaryHier --parent parent [--resolution res] [--kml - * [--kml-name name] [--kml-description desc]]` + * See `h3ToGeoBoundaryHier` for usage. * * The program generates the cell boundaries in lat/lon coordinates for all * hierarchical children of H3Index at the specified resolution. If the diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index 386373e22..22fc50d88 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -17,8 +17,7 @@ * @brief takes an H3 index and generates cell center points for descendants a * specified resolution. * - * usage: `h3ToGeoHier --parent parent [--resolution res] [--kml [--kml-name - * name] [--kml-description desc]]` + * See `h3ToGeoHier --help` for usage. * * The program generates the cell center points in lat/lon coordinates for all * hierarchical children of H3Index at the specified resolution. If the diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 8bc723b89..15389867f 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -17,7 +17,7 @@ * @brief takes an optional H3 index and generates all descendant cells at the * specified resolution. * - * usage: `h3ToHier --resolution res [--parent parent]` + * See `h3ToHier --help` for usage. * * The program generates all cells at the specified resolution, optionally * only the children of the given index. diff --git a/src/apps/testapps/mkRandGeo.c b/src/apps/testapps/mkRandGeo.c index 170b350f2..486765c69 100644 --- a/src/apps/testapps/mkRandGeo.c +++ b/src/apps/testapps/mkRandGeo.c @@ -17,7 +17,7 @@ * @brief generates random lat/lon pairs and bins them at the specified * resolution * - * usage: `mkRandGeo numPoints resolution` + * See `mkRandGeo --help` for usage. * * The program generates `numPoints` random lat/lon coordinates and outputs * them along with the corresponding H3Index at the specified `resolution`. diff --git a/src/apps/testapps/mkRandGeoBoundary.c b/src/apps/testapps/mkRandGeoBoundary.c index 04726c444..ccc29c1ba 100644 --- a/src/apps/testapps/mkRandGeoBoundary.c +++ b/src/apps/testapps/mkRandGeoBoundary.c @@ -16,7 +16,7 @@ /** @file * @brief generates random cell indexes and the corresponding cell boundaries * - * usage: `mkRandGeoBoundary numPoints resolution` + * See `mkRandGeoBoundary --help` for usage. * * The program generates `numPoints` random lat/lon coordinates and outputs * them along with the corresponding H3Index at the specified `resolution`. From 129df3d3af66a2378aa330857fe183a265d77a6e Mon Sep 17 00:00:00 2001 From: WooKyoung Noh Date: Wed, 22 May 2019 04:58:39 +0900 Subject: [PATCH 086/771] Add Julia bindings --- docs/community/bindings.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index 77fa569b4..2e17b303a 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -27,6 +27,10 @@ As a C library, bindings can be made to call H3 functions from different program - [uber/h3-js](https://github.com/uber/h3-js) - [dfellis/h3-node](https://github.com/dfellis/h3-node) +## Julia + +- [wookay/H3.jl](https://github.com/wookay/H3.jl) + ## OCaml - [travisbrady/ocaml-h3](https://github.com/travisbrady/ocaml-h3) From d3604f52f3b020c4c88cea75c7d1d3b5e5901b51 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 22 May 2019 14:03:34 -0700 Subject: [PATCH 087/771] Refactor common arguments --- CMakeLists.txt | 4 +- src/apps/applib/include/args.h | 109 ++++++++++++ src/apps/applib/include/utility.h | 61 ------- src/apps/applib/lib/args.c | 216 ++++++++++++++++++++++++ src/apps/applib/lib/utility.c | 193 --------------------- src/apps/filters/geoToH3.c | 6 +- src/apps/filters/h3ToComponents.c | 7 +- src/apps/filters/h3ToGeo.c | 24 +-- src/apps/filters/h3ToGeoBoundary.c | 21 +-- src/apps/filters/h3ToLocalIj.c | 6 +- src/apps/filters/hexRange.c | 4 +- src/apps/filters/kRing.c | 4 +- src/apps/filters/localIjToH3.c | 4 +- src/apps/miscapps/h3ToGeoBoundaryHier.c | 26 +-- src/apps/miscapps/h3ToGeoHier.c | 26 +-- src/apps/miscapps/h3ToHier.c | 4 +- src/apps/testapps/mkRandGeo.c | 4 +- src/apps/testapps/mkRandGeoBoundary.c | 4 +- 18 files changed, 368 insertions(+), 355 deletions(-) create mode 100644 src/apps/applib/include/args.h create mode 100644 src/apps/applib/lib/args.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2afca59c3..bd6bbb940 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,9 +117,11 @@ set(APP_SOURCE_FILES src/apps/applib/include/kml.h src/apps/applib/include/benchmark.h src/apps/applib/include/utility.h + src/apps/applib/include/args.h + src/apps/applib/lib/test.c src/apps/applib/lib/kml.c src/apps/applib/lib/utility.c - src/apps/applib/lib/test.c) + src/apps/applib/lib/args.c) set(EXAMPLE_SOURCE_FILES examples/index.c examples/distance.c diff --git a/src/apps/applib/include/args.h b/src/apps/applib/include/args.h new file mode 100644 index 000000000..0b5bbb737 --- /dev/null +++ b/src/apps/applib/include/args.h @@ -0,0 +1,109 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file args.h + * @brief Miscellaneous functions and constants. + */ + +#ifndef ARGS_H +#define ARGS_H + +#include +#include +#include "utility.h" + +/** Maximum number of names an argument may have. */ +#define NUM_ARG_NAMES 2 + +/** + * An argument accepted by on the command line of an H3 application. Specifies + * how the argument is presented, parsed, and where parsed values are stored. + */ +typedef struct { + /** + * Both short and long names of the argument. A name may be null, but the + * first name must be non-null. + */ + const char* const names[NUM_ARG_NAMES]; + + /** + * If true, this argument must be specified. If the argument is not + * specified, argument parsing will fail. + */ + const bool required; + + /** + * Scan format for the argument, which will be passed to sscanf. May be null + * to indicate the argument does not take a value. + */ + const char* const scanFormat; + + /** + * Name to present the value as when printing help. + */ + const char* const valueName; + + /** + * Value will be placed here if the argument is present and scanFormat is + * not null. + */ + void* const value; + + /** + * Will be set to true if the argument is present. Should be false when + * passed in to parseArgs. + */ + bool found; + + /** + * Help text for this argument. + */ + const char* const helpText; +} Arg; + +// prototypes + +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char* helpText); +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails); + +int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char** errorMessage, + const char** errorDetail); + +// common arguments + +#define ARG_HELP \ + { .names = {"-h", "--help"}, .helpText = "Show this help message." } +#define ARG_KML \ + { .names = {"-k", "--kml"}, .helpText = "Print output in KML format." } +#define DEFINE_KML_NAME_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = {.names = {"--kn", "--kml-name"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "name", \ + .value = &varName, \ + .helpText = "Text for the KML name tag, if --kml is specified."} +#define DEFINE_KML_DESC_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = {.names = {"--kd", "--kml-description"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "description", \ + .value = &varName, \ + .helpText = "Text for the KML description tag, if --kml is specified."} + +#endif diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index b66217bc2..4ce01e94f 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -29,63 +29,6 @@ /** Macro: Get the size of a fixed-size array */ #define ARRAY_SIZE(x) sizeof(x) / sizeof(x[0]) -/** Maximum number of names an argument may have. */ -#define NUM_ARG_NAMES 2 - -/** - * An argument accepted by on the command line of an H3 application. Specifies - * how the argument is presented, parsed, and where parsed values are stored. - */ -typedef struct { - /** - * Both short and long names of the argument. A name may be null, but the - * first name must be non-null. - */ - const char* const names[NUM_ARG_NAMES]; - - /** - * If true, this argument must be specified. If the argument is not - * specified, argument parsing will fail. - */ - const bool required; - - /** - * Scan format for the argument, which will be passed to sscanf. May be null - * to indicate the argument does not take a value. - */ - const char* const scanFormat; - - /** - * Name to present the value as when printing help. - */ - const char* const valueName; - - /** - * Value will be placed here if the argument is present and scanFormat is - * not null. - */ - void* const value; - - /** - * Will be set to true if the argument is present. Should be false when - * passed in to parseArgs. - */ - bool found; - - /** - * Help text for this argument. - */ - const char* const helpText; -} Arg; - -// prototypes - -int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], - const Arg* helpArg, const char* helpText); -void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, Arg* args[], const char* errorMessage, - const char* errorDetails); - void error(const char* msg); void h3Print(H3Index h); // prints as integer void h3Println(H3Index h); // prints as integer @@ -110,8 +53,4 @@ void iterateAllIndexesAtRes(int res, void (*callback)(H3Index)); void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int maxBaseCell); -int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], - const Arg* helpArg, const char** errorMessage, - const char** errorDetail); - #endif diff --git a/src/apps/applib/lib/args.c b/src/apps/applib/lib/args.c new file mode 100644 index 000000000..742c1eb70 --- /dev/null +++ b/src/apps/applib/lib/args.c @@ -0,0 +1,216 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file args.c + * @brief Miscellaneous useful functions. + */ + +#include "args.h" +#include +#include +#include +#include +#include "h3api.h" + +/* + * Return codes from parseArgs. + */ + +#define PARSE_ARGS_SUCCESS 0 +#define PARSE_ARGS_HELP 1 +#define PARSE_ARGS_REPEATED_ARGUMENT 2 +#define PARSE_ARGS_MISSING_VALUE 3 +#define PARSE_ARGS_FAILED_PARSE 4 +#define PARSE_ARGS_UNKNOWN_ARGUMENT 5 +#define PARSE_ARGS_MISSING_REQUIRED 6 + +/** + * Parse command line arguments and prints help, if needed. + * + * Uses the provided arguments to populate argument values and records in the + * argument if it is found. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * Help is printed to stdout if a argument with isHelp = true is found, and help + * is printed to stderr if argument parsing fails. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse + * @param helpArg Pointer to the argument for "--help" + * @param helpText Explanatory text for this program printed with help + * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, + * return value is non-0. + */ +int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char* helpText) { + const char* errorMessage = NULL; + const char* errorDetails = NULL; + + int failed = _parseArgsList(argc, argv, numArgs, args, helpArg, + &errorMessage, &errorDetails); + + if (failed || helpArg->found) { + printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, + args, errorMessage, errorDetails); + return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; + } + return PARSE_ARGS_SUCCESS; +} + +/** + * Parse command line arguments. + * + * Uses the provided arguments to populate argument values. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse. + * @param helpArg Pointer to the argument for "--help" that suppresses checking + * for required arguments. + * @param errorMessage Error message to display, if returning non-zero. + * @param errorDetail Additional error details, if returning non-zero. May be + * null, and may be a pointer from `argv` or `args`. + * @return 0 if argument parsing succeeded, otherwise non-0. + */ +int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], + const Arg* helpArg, const char** errorMessage, + const char** errorDetail) { + // Whether help was found and required arguments do not need to be checked + bool foundHelp = false; + + for (int i = 1; i < argc; i++) { + bool foundMatch = false; + + for (int j = 0; j < numArgs; j++) { + // Test this argument, which may have multiple names, for whether it + // matches. argName will be set to the name used for this argument + // if it matches. + const char* argName = NULL; + for (int k = 0; k < NUM_ARG_NAMES; k++) { + if (args[j]->names[k] == NULL) continue; + + if (strcmp(argv[i], args[j]->names[k]) == 0) { + argName = args[j]->names[k]; + break; + } + } + // argName unchanged from NULL indicates this didn't match, try the + // next argument. + if (argName == NULL) continue; + + if (args[j]->found) { + *errorMessage = "Argument specified multiple times"; + *errorDetail = argName; + return PARSE_ARGS_REPEATED_ARGUMENT; + } + + if (args[j]->scanFormat != NULL) { + // Argument has a value, need to advance one and read the value. + i++; + if (i >= argc) { + *errorMessage = "Argument value not present"; + *errorDetail = argName; + return PARSE_ARGS_MISSING_VALUE; + } + + if (!sscanf(argv[i], args[j]->scanFormat, args[j]->value)) { + *errorMessage = "Failed to parse argument"; + *errorDetail = argName; + return PARSE_ARGS_FAILED_PARSE; + } + } + + if (args[j] == helpArg) { + foundHelp = true; + } + + args[j]->found = true; + foundMatch = true; + break; + } + + if (!foundMatch) { + *errorMessage = "Unknown argument"; + // Don't set errorDetail, since the input could be unprintable. + return PARSE_ARGS_UNKNOWN_ARGUMENT; + } + } + + // Check for missing required arguments. + if (!foundHelp) { + for (int i = 0; i < numArgs; i++) { + if (args[i]->required && !args[i]->found) { + *errorMessage = "Required argument missing"; + *errorDetail = args[i]->names[0]; + return PARSE_ARGS_MISSING_REQUIRED; + } + } + } + + return PARSE_ARGS_SUCCESS; +} + +/** + * Print a help message. + * + * @param out Stream to print to, e.g. stdout + * @param programName Program name, such as from argv[0] + * @param helpText Explanation of what the program does + * @param numArgs Number of arguments to print help for + * @param args Pointer to arguments to print help for + * @param errorMessage Error message, or null + * @param errorDetails Additional error detail message, or null + */ +void printHelp(FILE* out, const char* programName, const char* helpText, + int numArgs, Arg* args[], const char* errorMessage, + const char* errorDetails) { + if (errorMessage != NULL) { + fprintf(out, "%s: %s", programName, errorMessage); + if (errorDetails != NULL) { + fprintf(out, ": %s", errorDetails); + } + fprintf(out, "\n"); + } + fprintf(out, "%s: %s\n", programName, helpText); + fprintf(out, "H3 %d.%d.%d\n\n", H3_VERSION_MAJOR, H3_VERSION_MINOR, + H3_VERSION_PATCH); + + for (int i = 0; i < numArgs; i++) { + fprintf(out, "\t"); + for (int j = 0; j < NUM_ARG_NAMES; j++) { + if (args[i]->names[j] == NULL) continue; + if (j != 0) fprintf(out, ", "); + fprintf(out, "%s", args[i]->names[j]); + } + if (args[i]->scanFormat != NULL) { + fprintf(out, " <%s>", args[i]->valueName); + } + fprintf(out, "\t"); + if (args[i]->required) { + fprintf(out, "Required. "); + } + fprintf(out, "%s\n", args[i]->helpText); + } +} diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 8a8b46c05..e9f441319 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -20,207 +20,14 @@ #include "utility.h" #include #include -#include #include #include #include #include #include "coordijk.h" -#include "geoCoord.h" #include "h3Index.h" #include "h3api.h" -/* - * Return codes from parseArgs. - */ - -#define PARSE_ARGS_SUCCESS 0 -#define PARSE_ARGS_HELP 1 -#define PARSE_ARGS_REPEATED_ARGUMENT 2 -#define PARSE_ARGS_MISSING_VALUE 3 -#define PARSE_ARGS_FAILED_PARSE 4 -#define PARSE_ARGS_UNKNOWN_ARGUMENT 5 -#define PARSE_ARGS_MISSING_REQUIRED 6 - -/** - * Parse command line arguments and prints help, if needed. - * - * Uses the provided arguments to populate argument values and records in the - * argument if it is found. - * - * Returns non-zero if all required arguments are not present, an argument fails - * to parse, is missing its associated value, or arguments are specified more - * than once. - * - * Help is printed to stdout if a argument with isHelp = true is found, and help - * is printed to stderr if argument parsing fails. - * - * @param argc argc from main - * @param argv argv from main - * @param numArgs Number of elements in the args array - * @param args Pointer to each argument to parse - * @param helpArg Pointer to the argument for "--help" - * @param helpText Explanatory text for this program printed with help - * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, - * return value is non-0. - */ -int parseArgs(int argc, char* argv[], int numArgs, Arg* args[], - const Arg* helpArg, const char* helpText) { - const char* errorMessage = NULL; - const char* errorDetails = NULL; - - int failed = _parseArgsList(argc, argv, numArgs, args, helpArg, - &errorMessage, &errorDetails); - - if (failed || helpArg->found) { - printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, - args, errorMessage, errorDetails); - return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; - } - return PARSE_ARGS_SUCCESS; -} - -/** - * Parse command line arguments. - * - * Uses the provided arguments to populate argument values. - * - * Returns non-zero if all required arguments are not present, an argument fails - * to parse, is missing its associated value, or arguments are specified more - * than once. - * - * @param argc argc from main - * @param argv argv from main - * @param numArgs Number of elements in the args array - * @param args Pointer to each argument to parse. - * @param helpArg Pointer to the argument for "--help" that suppresses checking - * for required arguments. - * @param errorMessage Error message to display, if returning non-zero. - * @param errorDetail Additional error details, if returning non-zero. May be - * null, and may be a pointer from `argv` or `args`. - * @return 0 if argument parsing succeeded, otherwise non-0. - */ -int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], - const Arg* helpArg, const char** errorMessage, - const char** errorDetail) { - // Whether help was found and required arguments do not need to be checked - bool foundHelp = false; - - for (int i = 1; i < argc; i++) { - bool foundMatch = false; - - for (int j = 0; j < numArgs; j++) { - // Test this argument, which may have multiple names, for whether it - // matches. argName will be set to the name used for this argument - // if it matches. - const char* argName = NULL; - for (int k = 0; k < NUM_ARG_NAMES; k++) { - if (args[j]->names[k] == NULL) continue; - - if (strcmp(argv[i], args[j]->names[k]) == 0) { - argName = args[j]->names[k]; - break; - } - } - // argName unchanged from NULL indicates this didn't match, try the - // next argument. - if (argName == NULL) continue; - - if (args[j]->found) { - *errorMessage = "Argument specified multiple times"; - *errorDetail = argName; - return PARSE_ARGS_REPEATED_ARGUMENT; - } - - if (args[j]->scanFormat != NULL) { - // Argument has a value, need to advance one and read the value. - i++; - if (i >= argc) { - *errorMessage = "Argument value not present"; - *errorDetail = argName; - return PARSE_ARGS_MISSING_VALUE; - } - - if (!sscanf(argv[i], args[j]->scanFormat, args[j]->value)) { - *errorMessage = "Failed to parse argument"; - *errorDetail = argName; - return PARSE_ARGS_FAILED_PARSE; - } - } - - if (args[j] == helpArg) { - foundHelp = true; - } - - args[j]->found = true; - foundMatch = true; - break; - } - - if (!foundMatch) { - *errorMessage = "Unknown argument"; - // Don't set errorDetail, since the input could be unprintable. - return PARSE_ARGS_UNKNOWN_ARGUMENT; - } - } - - // Check for missing required arguments. - if (!foundHelp) { - for (int i = 0; i < numArgs; i++) { - if (args[i]->required && !args[i]->found) { - *errorMessage = "Required argument missing"; - *errorDetail = args[i]->names[0]; - return PARSE_ARGS_MISSING_REQUIRED; - } - } - } - - return PARSE_ARGS_SUCCESS; -} - -/** - * Print a help message. - * - * @param out Stream to print to, e.g. stdout - * @param programName Program name, such as from argv[0] - * @param helpText Explanation of what the program does - * @param numArgs Number of arguments to print help for - * @param args Pointer to arguments to print help for - * @param errorMessage Error message, or null - * @param errorDetails Additional error detail message, or null - */ -void printHelp(FILE* out, const char* programName, const char* helpText, - int numArgs, Arg* args[], const char* errorMessage, - const char* errorDetails) { - if (errorMessage != NULL) { - fprintf(out, "%s: %s", programName, errorMessage); - if (errorDetails != NULL) { - fprintf(out, ": %s", errorDetails); - } - fprintf(out, "\n"); - } - fprintf(out, "%s: %s\n", programName, helpText); - fprintf(out, "H3 %d.%d.%d\n\n", H3_VERSION_MAJOR, H3_VERSION_MINOR, - H3_VERSION_PATCH); - - for (int i = 0; i < numArgs; i++) { - fprintf(out, "\t"); - for (int j = 0; j < NUM_ARG_NAMES; j++) { - if (args[i]->names[j] == NULL) continue; - if (j != 0) fprintf(out, ", "); - fprintf(out, "%s", args[i]->names[j]); - } - if (args[i]->scanFormat != NULL) { - fprintf(out, " <%s>", args[i]->valueName); - } - fprintf(out, "\t"); - if (args[i]->required) { - fprintf(out, "Required. "); - } - fprintf(out, "%s\n", args[i]->helpText); - } -} - void error(const char* msg) { fflush(stdout); fflush(stderr); diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c index 6b1c17415..c145c2275 100644 --- a/src/apps/filters/geoToH3.c +++ b/src/apps/filters/geoToH3.c @@ -32,8 +32,7 @@ * latN lonN */ -#include -#include +#include "args.h" #include "h3Index.h" #include "utility.h" @@ -58,8 +57,7 @@ int main(int argc, char* argv[]) { double lat = 0; double lon = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg resArg = {.names = {"-r", "--resolution"}, .required = true, .scanFormat = "%d", diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index 2a3328bba..f3ac99d3d 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -24,9 +24,7 @@ */ #include -#include -#include -#include +#include "args.h" #include "h3Index.h" #include "utility.h" @@ -106,8 +104,7 @@ void doCell(H3Index h, bool verboseMode) { int main(int argc, char* argv[]) { H3Index index = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg verboseArg = {.names = {"-v", "--verbose"}, .helpText = "Verbose output mode."}; Arg indexArg = { diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index 9bcd6ea8d..4f2f7390a 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -41,9 +41,7 @@ */ #include -#include -#include -#include +#include "args.h" #include "h3api.h" #include "kml.h" #include "utility.h" @@ -66,11 +64,8 @@ void doCell(H3Index h, int isKmlOut) { int main(int argc, char *argv[]) { H3Index index = 0; - char userKmlName[BUFF_SIZE] = {0}; - char userKmlDesc[BUFF_SIZE] = {0}; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg indexArg = { .names = {"-i", "--index"}, .scanFormat = "%" PRIx64, @@ -78,18 +73,9 @@ int main(int argc, char *argv[]) { .value = &index, .helpText = "Index, or not specified to read indexes from standard input."}; - Arg kmlArg = {.names = {"-k", "--kml"}, - .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "name", - .value = &userKmlName, - .helpText = "Text for the KML name tag."}; - Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "description", - .value = &userKmlDesc, - .helpText = "Text for the KML description tag."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index c823e0b06..a2258d77c 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -43,6 +43,7 @@ #include #include #include +#include "args.h" #include "h3api.h" #include "kml.h" #include "utility.h" @@ -64,11 +65,8 @@ void doCell(H3Index h, int isKmlOut) { int main(int argc, char *argv[]) { H3Index index = 0; - char userKmlName[BUFF_SIZE] = {0}; - char userKmlDesc[BUFF_SIZE] = {0}; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg indexArg = { .names = {"-i", "--index"}, .scanFormat = "%" PRIx64, @@ -76,18 +74,9 @@ int main(int argc, char *argv[]) { .value = &index, .helpText = "Index, or not specified to read indexes from standard input."}; - Arg kmlArg = {.names = {"-k", "--kml"}, - .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "name", - .value = &userKmlName, - .helpText = "Text for the KML name tag."}; - Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "description", - .value = &userKmlDesc, - .helpText = "Text for the KML description tag."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index 7ea85e9ad..079a9b858 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -33,8 +33,7 @@ #include #include #include -#include "coordijk.h" -#include "h3Index.h" +#include "args.h" #include "h3api.h" #include "utility.h" @@ -51,8 +50,7 @@ int main(int argc, char* argv[]) { H3Index origin = 0; H3Index index = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg originArg = { .names = {"-o", "--origin"}, .scanFormat = "%" PRIx64, diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index 8badb426c..5193a5675 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -31,6 +31,7 @@ #include #include #include +#include "args.h" #include "h3api.h" #include "utility.h" @@ -53,8 +54,7 @@ int main(int argc, char* argv[]) { int k = 0; H3Index origin = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg kArg = {.names = {"-k", NULL}, .required = true, .scanFormat = "%d", diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c index 6219ba7da..cc3fb7376 100644 --- a/src/apps/filters/kRing.c +++ b/src/apps/filters/kRing.c @@ -30,6 +30,7 @@ #include #include #include +#include "args.h" #include "h3api.h" #include "utility.h" @@ -58,8 +59,7 @@ int main(int argc, char* argv[]) { int k = 0; H3Index origin = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg kArg = {.names = {"-k", NULL}, .required = true, .scanFormat = "%d", diff --git a/src/apps/filters/localIjToH3.c b/src/apps/filters/localIjToH3.c index dd77878e8..73aadca41 100644 --- a/src/apps/filters/localIjToH3.c +++ b/src/apps/filters/localIjToH3.c @@ -33,6 +33,7 @@ #include #include #include +#include "args.h" #include "h3api.h" #include "utility.h" @@ -49,8 +50,7 @@ int main(int argc, char *argv[]) { H3Index origin = 0; CoordIJ ij = {0}; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg originArg = { .names = {"-o", "--origin"}, .scanFormat = "%" PRIx64, diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c index dbd162b35..c5faa02a9 100644 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ b/src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -53,14 +53,12 @@ #include #include #include +#include "args.h" #include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" #include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" void doCell(H3Index h, int isKmlOut) { GeoBoundary b; @@ -99,18 +97,15 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { int main(int argc, char *argv[]) { int res; H3Index parentIndex = 0; - char userKmlName[BUFF_SIZE] = {0}; - char userKmlDesc[BUFF_SIZE] = {0}; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg resArg = {.names = {"-r", "--resolution"}, .scanFormat = "%d", .valueName = "res", .value = &res, .helpText = "Resolution, if less than the resolution of the parent " - "only the parent is printed. Default 0."}; + "only the parent is printed. Default the resolution of the parent."}; Arg parentArg = { .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, @@ -118,18 +113,9 @@ int main(int argc, char *argv[]) { .value = &parentIndex, .required = true, .helpText = "Print cell boundaries descendent from this index."}; - Arg kmlArg = {.names = {"-k", "--kml"}, - .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "name", - .value = &userKmlName, - .helpText = "Text for the KML name tag."}; - Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "description", - .value = &userKmlDesc, - .helpText = "Text for the KML description tag."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); Arg *args[] = {&helpArg, &resArg, &parentArg, &kmlArg, &kmlNameArg, &kmlDescArg}; diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index 22fc50d88..42a7dcdb2 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -53,14 +53,12 @@ #include #include #include +#include "args.h" #include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" #include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" void doCell(H3Index h, int isKmlOut) { GeoCoord g; @@ -99,18 +97,15 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { int main(int argc, char *argv[]) { int res = 0; H3Index parentIndex = 0; - char userKmlName[BUFF_SIZE] = {0}; - char userKmlDesc[BUFF_SIZE] = {0}; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg resArg = {.names = {"-r", "--resolution"}, .scanFormat = "%d", .valueName = "res", .value = &res, .helpText = "Resolution, if less than the resolution of the parent " - "only the parent is printed. Default 0."}; + "only the parent is printed. Default the resolution of the parent."}; Arg parentArg = { .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, @@ -118,18 +113,9 @@ int main(int argc, char *argv[]) { .value = &parentIndex, .required = true, .helpText = "Print cell centers descendent from this index."}; - Arg kmlArg = {.names = {"-k", "--kml"}, - .helpText = "Print output in KML format."}; - Arg kmlNameArg = {.names = {"--kn", "--kml-name"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "name", - .value = &userKmlName, - .helpText = "Text for the KML name tag."}; - Arg kmlDescArg = {.names = {"--kd", "--kml-description"}, - .scanFormat = "%255c", // BUFF_SIZE - 1 - .valueName = "description", - .value = &userKmlDesc, - .helpText = "Text for the KML description tag."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); Arg *args[] = {&helpArg, &resArg, &parentArg, &kmlArg, &kmlNameArg, &kmlDescArg}; diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 15389867f..091448242 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -32,6 +32,7 @@ #include #include #include +#include "args.h" #include "baseCells.h" #include "h3Index.h" #include "h3api.h" @@ -60,8 +61,7 @@ int main(int argc, char *argv[]) { int res; H3Index parentIndex = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg resArg = {.names = {"-r", "--resolution"}, .scanFormat = "%d", .valueName = "res", diff --git a/src/apps/testapps/mkRandGeo.c b/src/apps/testapps/mkRandGeo.c index 486765c69..640fa85a4 100644 --- a/src/apps/testapps/mkRandGeo.c +++ b/src/apps/testapps/mkRandGeo.c @@ -25,14 +25,14 @@ #include #include +#include "args.h" #include "utility.h" int main(int argc, char* argv[]) { int res = 0; int numPoints = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg numPointsArg = { .names = {"-n", "--num-points"}, .required = true, diff --git a/src/apps/testapps/mkRandGeoBoundary.c b/src/apps/testapps/mkRandGeoBoundary.c index ccc29c1ba..d4797087f 100644 --- a/src/apps/testapps/mkRandGeoBoundary.c +++ b/src/apps/testapps/mkRandGeoBoundary.c @@ -24,14 +24,14 @@ #include #include +#include "args.h" #include "utility.h" int main(int argc, char* argv[]) { int res = 0; int numPoints = 0; - Arg helpArg = {.names = {"-h", "--help"}, - .helpText = "Show this help message."}; + Arg helpArg = ARG_HELP; Arg numPointsArg = { .names = {"-n", "--num-points"}, .required = true, From 93c032b3ab1c084e426f25e810ac73ade7366154 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 22 May 2019 15:37:06 -0700 Subject: [PATCH 088/771] Fix formatting --- src/apps/applib/include/args.h | 31 ++++++++++++++----------- src/apps/miscapps/h3ToGeoBoundaryHier.c | 3 ++- src/apps/miscapps/h3ToGeoHier.c | 3 ++- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/apps/applib/include/args.h b/src/apps/applib/include/args.h index 0b5bbb737..07a16530c 100644 --- a/src/apps/applib/include/args.h +++ b/src/apps/applib/include/args.h @@ -91,19 +91,22 @@ int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], { .names = {"-h", "--help"}, .helpText = "Show this help message." } #define ARG_KML \ { .names = {"-k", "--kml"}, .helpText = "Print output in KML format." } -#define DEFINE_KML_NAME_ARG(varName, argName) \ - char varName[BUFF_SIZE] = {0}; \ - Arg argName = {.names = {"--kn", "--kml-name"}, \ - .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ - .valueName = "name", \ - .value = &varName, \ - .helpText = "Text for the KML name tag, if --kml is specified."} -#define DEFINE_KML_DESC_ARG(varName, argName) \ - char varName[BUFF_SIZE] = {0}; \ - Arg argName = {.names = {"--kd", "--kml-description"}, \ - .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ - .valueName = "description", \ - .value = &varName, \ - .helpText = "Text for the KML description tag, if --kml is specified."} +#define DEFINE_KML_NAME_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = { \ + .names = {"--kn", "--kml-name"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "name", \ + .value = &varName, \ + .helpText = "Text for the KML name tag, if --kml is specified."} +#define DEFINE_KML_DESC_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = { \ + .names = {"--kd", "--kml-description"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "description", \ + .value = &varName, \ + .helpText = \ + "Text for the KML description tag, if --kml is specified."} #endif diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c index c5faa02a9..af872ee0d 100644 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ b/src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -105,7 +105,8 @@ int main(int argc, char *argv[]) { .value = &res, .helpText = "Resolution, if less than the resolution of the parent " - "only the parent is printed. Default the resolution of the parent."}; + "only the parent is printed. Default the resolution of " + "the parent."}; Arg parentArg = { .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c index 42a7dcdb2..599f5227c 100644 --- a/src/apps/miscapps/h3ToGeoHier.c +++ b/src/apps/miscapps/h3ToGeoHier.c @@ -105,7 +105,8 @@ int main(int argc, char *argv[]) { .value = &res, .helpText = "Resolution, if less than the resolution of the parent " - "only the parent is printed. Default the resolution of the parent."}; + "only the parent is printed. Default the resolution of " + "the parent."}; Arg parentArg = { .names = {"-p", "--parent"}, .scanFormat = "%" PRIx64, From 1d7b920bb140406698d58c35369386eb971c89a8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 30 May 2019 16:42:55 -0700 Subject: [PATCH 089/771] Version 3.4.4 --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 997a81661..74dcf9213 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.4.4] - 2019-05-30 ### Changed - Local coordinate spaces cannot cross more than one icosahedron edge. (#234) - All dynamic internal memory allocations happen on the heap instead of the stack. (#235) diff --git a/VERSION b/VERSION index 6cb9d3dd0..f9892605c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.3 +3.4.4 From e9a432fcc3c6407090b6a5286507a82bebf36487 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 31 May 2019 12:20:05 -0700 Subject: [PATCH 090/771] Add missing changelog entry for argument parsing change in some filters --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74dcf9213..b9c205479 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The public API of this library consists of the functions declared in file ### Changed - Local coordinate spaces cannot cross more than one icosahedron edge. (#234) - All dynamic internal memory allocations happen on the heap instead of the stack. (#235) +- Argument parsing for `h3ToGeo`, `geoToH3`, and `h3ToGeoBoundary` is more flexible. (#227) ## [3.4.3] - 2019-05-02 ### Added From 0b49139e475fcbfd24dd5b4ae25d302843d35eae Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 7 Jun 2019 11:07:47 -0700 Subject: [PATCH 091/771] Add release script to prompt for changelog entries before updating version --- RELEASE.md | 3 ++- scripts/update_version.sh | 49 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100755 scripts/update_version.sh diff --git a/RELEASE.md b/RELEASE.md index ff471ffcf..aa5a6249b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,8 +1,9 @@ # Release Process 1. Create a PR "Preparing for release X.Y.Z" against master branch - * Update VERSION to `X.Y.Z` * Alter CHANGELOG.md from `[Unreleased]` to `[X.Y.Z] YYYY-MM-DD` + * Run `scripts/update_version.sh` and give `X.Y.Z` when prompted + * Check that all merges that need to be in the changelog are present 2. Create a release "Release X.Y.Z" on Github * Create Tag `vX.Y.Z` diff --git a/scripts/update_version.sh b/scripts/update_version.sh new file mode 100755 index 000000000..be79f4208 --- /dev/null +++ b/scripts/update_version.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Copyright 2019 Uber Technologies, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script is used interactively as part of the H3 release process +# (RELEASE.md) to update the version number in the VERSION file. Before +# writing the new version to the file, changelog information is presented +# for verification. + +set -eo pipefail + +CURRENT_VERSION=$( /dev/null 2>&1; then + echo "Could not locate $CURRENT_TAG as a Git revision." + exit 1 +fi + +REVISION_RANGE="$CURRENT_TAG..HEAD" + +read -p "Next version: " NEXT_VERSION + +echo -e "\n * Changelog entries *" +git diff $REVISION_RANGE -- CHANGELOG.md +echo -e "\n * Committed merges *" +git log --merges --oneline $REVISION_RANGE + +echo +read -p "Are all changes in the changelog [y/N]? " CHANGELOG_OK +if [ "y" = "$CHANGELOG_OK" ] || [ "Y" = "$CHANGELOG_OK" ]; then + echo $NEXT_VERSION > VERSION + echo "Wrote $NEXT_VERSION to the VERSION file" +else + echo "Cancelled - did not write VERSION file" + exit 2 +fi From 921878c2d5913a8b61dd1f8aa2def4781910339b Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 10 Jun 2019 11:29:06 -0700 Subject: [PATCH 092/771] Add make target for running update_version --- CMakeLists.txt | 6 ++++++ RELEASE.md | 2 +- scripts/update_version.sh | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2afca59c3..7a3514f5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -282,6 +282,12 @@ else() ) endif() +# Release publishing +add_custom_target(update-version + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/update_version.sh + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + # Website publishing add_custom_target(publish-website COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/publish_website.sh diff --git a/RELEASE.md b/RELEASE.md index aa5a6249b..b22207535 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,7 +2,7 @@ 1. Create a PR "Preparing for release X.Y.Z" against master branch * Alter CHANGELOG.md from `[Unreleased]` to `[X.Y.Z] YYYY-MM-DD` - * Run `scripts/update_version.sh` and give `X.Y.Z` when prompted + * Run `make update-version` and give `X.Y.Z` when prompted * Check that all merges that need to be in the changelog are present 2. Create a release "Release X.Y.Z" on Github diff --git a/scripts/update_version.sh b/scripts/update_version.sh index be79f4208..4e937ecc2 100755 --- a/scripts/update_version.sh +++ b/scripts/update_version.sh @@ -16,7 +16,7 @@ # This script is used interactively as part of the H3 release process # (RELEASE.md) to update the version number in the VERSION file. Before # writing the new version to the file, changelog information is presented -# for verification. +# for verification. It is invoked by the make target `update-version`. set -eo pipefail @@ -45,5 +45,6 @@ if [ "y" = "$CHANGELOG_OK" ] || [ "Y" = "$CHANGELOG_OK" ]; then echo "Wrote $NEXT_VERSION to the VERSION file" else echo "Cancelled - did not write VERSION file" + echo "Please update the CHANGELOG with the appropriate entries before bumping the version." exit 2 fi From ff740c37990785e6e9dadba7d369ee7f0ff50a99 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 10 Jun 2019 11:44:21 -0700 Subject: [PATCH 093/771] Add BUILD_BENCHMARKS, BUILD_FILTERS to CMake --- CHANGELOG.md | 2 ++ CMakeLists.txt | 91 ++++++++++++++++++++++++++++---------------------- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9c205479..6d8b707ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Added +- CMake options for excluding filter applications or benchmarks from the build. ## [3.4.4] - 2019-05-30 ### Changed diff --git a/CMakeLists.txt b/CMakeLists.txt index 2afca59c3..9bc2216e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2017, 2018 Uber Technologies, Inc. +# Copyright 2017-2019 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -29,6 +29,8 @@ set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake" "Toolchain to use for building this project") option(ENABLE_COVERAGE "Enable compiling tests with coverage." ON) +option(BUILD_BENCHMARKS "Build benchmarking applications." ON) +option(BUILD_FILTERS "Build filter applications." ON) if(WIN32) set(SHELL PowerShell -Command) @@ -301,43 +303,45 @@ macro(add_h3_executable name) endif() endmacro() -add_h3_executable(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) -add_h3_executable(localIjToH3 src/apps/filters/localIjToH3.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) -add_h3_executable(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) -add_h3_executable(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) -add_h3_executable(generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c ${APP_SOURCE_FILES}) -add_h3_executable(generateNumHexagons src/apps/miscapps/generateNumHexagons.c ${APP_SOURCE_FILES}) -add_h3_executable(generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoBoundaryHier src/apps/miscapps/h3ToGeoBoundaryHier.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoHier src/apps/miscapps/h3ToGeoHier.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) - -# Generate KML files for visualizing the H3 grid -add_custom_target(create-kml-dir - COMMAND ${CMAKE_COMMAND} -E make_directory KML) -add_custom_target(kml) - -# Only the first 3 resolution grids are generated. The others can be generated, -# but the file sizes would be very, very large. -foreach(resolution RANGE 3) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}cells.kml") - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}centers.kml") - add_custom_target(kml_cells_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}cells.kml \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" - VERBATIM - DEPENDS create-kml-dir) - add_custom_target(kml_centers_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}centers.kml \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" - VERBATIM - DEPENDS create-kml-dir) - add_dependencies(kml - kml_cells_${resolution} - kml_centers_${resolution}) -endforeach() +if(BUILD_FILTERS) + add_h3_executable(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) + add_h3_executable(localIjToH3 src/apps/filters/localIjToH3.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) + add_h3_executable(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) + add_h3_executable(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) + add_h3_executable(generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c ${APP_SOURCE_FILES}) + add_h3_executable(generateNumHexagons src/apps/miscapps/generateNumHexagons.c ${APP_SOURCE_FILES}) + add_h3_executable(generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToGeoBoundaryHier src/apps/miscapps/h3ToGeoBoundaryHier.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToGeoHier src/apps/miscapps/h3ToGeoHier.c ${APP_SOURCE_FILES}) + add_h3_executable(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) + + # Generate KML files for visualizing the H3 grid + add_custom_target(create-kml-dir + COMMAND ${CMAKE_COMMAND} -E make_directory KML) + add_custom_target(kml) + + # Only the first 3 resolution grids are generated. The others can be generated, + # but the file sizes would be very, very large. + foreach(resolution RANGE 3) + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}cells.kml") + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}centers.kml") + add_custom_target(kml_cells_${resolution} + COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}cells.kml \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" + VERBATIM + DEPENDS create-kml-dir) + add_custom_target(kml_centers_${resolution} + COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}centers.kml \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" + VERBATIM + DEPENDS create-kml-dir) + add_dependencies(kml + kml_cells_${resolution} + kml_centers_${resolution}) + endforeach() +endif() if(BUILD_TESTING) option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) @@ -491,7 +495,9 @@ if(BUILD_TESTING) # Miscellaneous testing applications add_h3_executable(mkRandGeo src/apps/testapps/mkRandGeo.c ${APP_SOURCE_FILES}) add_h3_executable(mkRandGeoBoundary src/apps/testapps/mkRandGeoBoundary.c ${APP_SOURCE_FILES}) +endif() +if(BUILD_BENCHMARKS) # Benchmarks add_custom_target(benchmarks) @@ -551,9 +557,14 @@ configure_package_config_file( # * header location after install: /include/h3/h3api.h # * headers can be included by C++ code `#include

` # Installing the library and filters system-wide. +set(INSTALL_TARGETS h3) +if(BUILD_FILTERS) + list(APPEND INSTALL_TARGETS geoToH3 h3ToComponents h3ToGeo h3ToGeoBoundary hexRange + kRing h3ToGeoBoundaryHier h3ToGeoHier h3ToHier + ) +endif() install( - TARGETS h3 geoToH3 h3ToComponents h3ToGeo h3ToGeoBoundary hexRange - kRing h3ToGeoBoundaryHier h3ToGeoHier h3ToHier + TARGETS ${INSTALL_TARGETS} EXPORT "${TARGETS_EXPORT_NAME}" LIBRARY DESTINATION "lib" ARCHIVE DESTINATION "lib" From 18a31e8437f39801073d5d1a5606d90832bb775d Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 10 Jun 2019 16:58:23 -0700 Subject: [PATCH 094/771] Add PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d8b707ea..5e7165e4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added -- CMake options for excluding filter applications or benchmarks from the build. +- CMake options for excluding filter applications or benchmarks from the build. (#247) ## [3.4.4] - 2019-05-30 ### Changed From efb47c70300431971f842d38caf56edc85f0cbe4 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 10 Jun 2019 18:23:06 -0700 Subject: [PATCH 095/771] Add BUILD_GENERATORS and register all filters for install --- CMakeLists.txt | 54 ++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bc2216e8..157645d76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake" option(ENABLE_COVERAGE "Enable compiling tests with coverage." ON) option(BUILD_BENCHMARKS "Build benchmarking applications." ON) option(BUILD_FILTERS "Build filter applications." ON) +option(BUILD_GENERATORS "Build code generation applications." ON) if(WIN32) set(SHELL PowerShell -Command) @@ -188,6 +189,8 @@ set(UNCONFIGURED_API_HEADER src/h3lib/include/h3api.h.in) set(CONFIGURED_API_HEADER src/h3lib/include/h3api.h) configure_file(${UNCONFIGURED_API_HEADER} ${CONFIGURED_API_HEADER}) +set(INSTALL_TARGETS h3) + # Build the H3 library add_library(h3 ${LIB_SOURCE_FILES} ${CONFIGURED_API_HEADER}) @@ -304,20 +307,22 @@ macro(add_h3_executable name) endmacro() if(BUILD_FILTERS) - add_h3_executable(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) - add_h3_executable(localIjToH3 src/apps/filters/localIjToH3.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) - add_h3_executable(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) - add_h3_executable(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) - add_h3_executable(generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c ${APP_SOURCE_FILES}) - add_h3_executable(generateNumHexagons src/apps/miscapps/generateNumHexagons.c ${APP_SOURCE_FILES}) - add_h3_executable(generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToGeoBoundaryHier src/apps/miscapps/h3ToGeoBoundaryHier.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToGeoHier src/apps/miscapps/h3ToGeoHier.c ${APP_SOURCE_FILES}) - add_h3_executable(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) + macro(add_h3_filter name) + add_h3_executable(${ARGV}) + list(APPEND INSTALL_TARGETS ${name}) + endmacro() + + add_h3_filter(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) + add_h3_filter(localIjToH3 src/apps/filters/localIjToH3.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) + add_h3_filter(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) + add_h3_filter(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToGeoBoundaryHier src/apps/miscapps/h3ToGeoBoundaryHier.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToGeoHier src/apps/miscapps/h3ToGeoHier.c ${APP_SOURCE_FILES}) + add_h3_filter(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) # Generate KML files for visualizing the H3 grid add_custom_target(create-kml-dir @@ -343,6 +348,17 @@ if(BUILD_FILTERS) endforeach() endif() +if(BUILD_GENERATORS) + # Code generation + add_h3_executable(generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c ${APP_SOURCE_FILES}) + add_h3_executable(generateNumHexagons src/apps/miscapps/generateNumHexagons.c ${APP_SOURCE_FILES}) + add_h3_executable(generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c ${APP_SOURCE_FILES}) + + # Miscellaneous testing applications - generating random data + add_h3_executable(mkRandGeo src/apps/testapps/mkRandGeo.c ${APP_SOURCE_FILES}) + add_h3_executable(mkRandGeoBoundary src/apps/testapps/mkRandGeoBoundary.c ${APP_SOURCE_FILES}) +endif() + if(BUILD_TESTING) option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) @@ -491,10 +507,6 @@ if(BUILD_TESTING) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) - - # Miscellaneous testing applications - add_h3_executable(mkRandGeo src/apps/testapps/mkRandGeo.c ${APP_SOURCE_FILES}) - add_h3_executable(mkRandGeoBoundary src/apps/testapps/mkRandGeoBoundary.c ${APP_SOURCE_FILES}) endif() if(BUILD_BENCHMARKS) @@ -557,12 +569,6 @@ configure_package_config_file( # * header location after install: /include/h3/h3api.h # * headers can be included by C++ code `#include

` # Installing the library and filters system-wide. -set(INSTALL_TARGETS h3) -if(BUILD_FILTERS) - list(APPEND INSTALL_TARGETS geoToH3 h3ToComponents h3ToGeo h3ToGeoBoundary hexRange - kRing h3ToGeoBoundaryHier h3ToGeoHier h3ToHier - ) -endif() install( TARGETS ${INSTALL_TARGETS} EXPORT "${TARGETS_EXPORT_NAME}" From 6df0fbb739de2595e811bfc0772d3848be596840 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 11 Jun 2019 11:54:15 -0700 Subject: [PATCH 096/771] Add `DEFINE_INDEX_ARG` and consistently add `numArgs` --- src/apps/applib/include/args.h | 10 ++++++++++ src/apps/filters/h3ToComponents.c | 14 +++----------- src/apps/filters/h3ToGeo.c | 10 +--------- src/apps/filters/h3ToGeoBoundary.c | 10 +--------- src/apps/filters/h3ToLocalIj.c | 9 +-------- src/apps/filters/hexRange.c | 4 ++-- 6 files changed, 18 insertions(+), 39 deletions(-) diff --git a/src/apps/applib/include/args.h b/src/apps/applib/include/args.h index 07a16530c..35ead1903 100644 --- a/src/apps/applib/include/args.h +++ b/src/apps/applib/include/args.h @@ -20,6 +20,7 @@ #ifndef ARGS_H #define ARGS_H +#include #include #include #include "utility.h" @@ -89,6 +90,15 @@ int _parseArgsList(int argc, char* argv[], int numArgs, Arg* args[], #define ARG_HELP \ { .names = {"-h", "--help"}, .helpText = "Show this help message." } +#define DEFINE_INDEX_ARG(varName, argName) \ + H3Index varName = 0; \ + Arg argName = { \ + .names = {"-i", "--index"}, \ + .scanFormat = "%" PRIx64, \ + .valueName = "index", \ + .value = &varName, \ + .helpText = \ + "Index, or not specified to read indexes from standard input."} #define ARG_KML \ { .names = {"-k", "--kml"}, .helpText = "Print output in KML format." } #define DEFINE_KML_NAME_ARG(varName, argName) \ diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index f3ac99d3d..4dbb61d82 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -102,22 +102,14 @@ void doCell(H3Index h, bool verboseMode) { } int main(int argc, char* argv[]) { - H3Index index = 0; - Arg helpArg = ARG_HELP; Arg verboseArg = {.names = {"-v", "--verbose"}, .helpText = "Verbose output mode."}; - Arg indexArg = { - .names = {"-i", "--index"}, - .scanFormat = "%" PRIx64, - .valueName = "index", - .value = &index, - .helpText = - "Index, or not specified to read indexes from standard input."}; - + DEFINE_INDEX_ARG(index, indexArg); + const int numArgs = 3; Arg* args[] = {&helpArg, &verboseArg, &indexArg}; - if (parseArgs(argc, argv, 3, args, &helpArg, + if (parseArgs(argc, argv, numArgs, args, &helpArg, "Converts H3 indexes to component parts")) { return helpArg.found ? 0 : 1; } diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c index 4f2f7390a..3c1f6b6f1 100644 --- a/src/apps/filters/h3ToGeo.c +++ b/src/apps/filters/h3ToGeo.c @@ -63,16 +63,8 @@ void doCell(H3Index h, int isKmlOut) { } int main(int argc, char *argv[]) { - H3Index index = 0; - Arg helpArg = ARG_HELP; - Arg indexArg = { - .names = {"-i", "--index"}, - .scanFormat = "%" PRIx64, - .valueName = "index", - .value = &index, - .helpText = - "Index, or not specified to read indexes from standard input."}; + DEFINE_INDEX_ARG(index, indexArg); Arg kmlArg = ARG_KML; DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c index a2258d77c..cef5ecd83 100644 --- a/src/apps/filters/h3ToGeoBoundary.c +++ b/src/apps/filters/h3ToGeoBoundary.c @@ -64,16 +64,8 @@ void doCell(H3Index h, int isKmlOut) { } int main(int argc, char *argv[]) { - H3Index index = 0; - Arg helpArg = ARG_HELP; - Arg indexArg = { - .names = {"-i", "--index"}, - .scanFormat = "%" PRIx64, - .valueName = "index", - .value = &index, - .helpText = - "Index, or not specified to read indexes from standard input."}; + DEFINE_INDEX_ARG(index, indexArg); Arg kmlArg = ARG_KML; DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c index 079a9b858..ad9ad4f68 100644 --- a/src/apps/filters/h3ToLocalIj.c +++ b/src/apps/filters/h3ToLocalIj.c @@ -48,7 +48,6 @@ void doCell(H3Index h, H3Index origin) { int main(int argc, char* argv[]) { H3Index origin = 0; - H3Index index = 0; Arg helpArg = ARG_HELP; Arg originArg = { @@ -59,13 +58,7 @@ int main(int argc, char* argv[]) { .required = true, .helpText = "Origin (anchoring index) for the local coordinate system."}; - Arg indexArg = {.names = {"-i", "--index"}, - .scanFormat = "%" PRIx64, - .valueName = "index", - .value = &index, - .helpText = - "Index to convert to IJ coordinates, or not specified " - "to read from standard input."}; + DEFINE_INDEX_ARG(index, indexArg); Arg* args[] = {&helpArg, &originArg, &indexArg}; const int numArgs = 3; diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c index 5193a5675..c0faf424d 100644 --- a/src/apps/filters/hexRange.c +++ b/src/apps/filters/hexRange.c @@ -68,10 +68,10 @@ int main(int argc, char* argv[]) { .value = &origin, .helpText = "Origin, or not specified to read origins from standard input."}; - + const int numArgs = 3; Arg* args[] = {&helpArg, &kArg, &originArg}; - if (parseArgs(argc, argv, 3, args, &helpArg, + if (parseArgs(argc, argv, numArgs, args, &helpArg, "Print indexes k distance away from the origin")) { return helpArg.found ? 0 : 1; } From 01a9c7dadf713a18345013dd2763bbfc4e366a0e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 11 Jun 2019 11:56:46 -0700 Subject: [PATCH 097/771] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9c205479..88a0097ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Changed +- Argument parsing for all filter applications is more flexible. (#238) ## [3.4.4] - 2019-05-30 ### Changed From 3bf38f5929ffacb5886c7a6ea9294ed0dcde45c0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 27 Jun 2019 16:56:36 -0700 Subject: [PATCH 098/771] Add a list of videos about H3 on the docs site --- docs/community/tutorials.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/community/tutorials.md b/docs/community/tutorials.md index f213b824e..260ff5752 100644 --- a/docs/community/tutorials.md +++ b/docs/community/tutorials.md @@ -2,6 +2,18 @@ This page lists further learning materials and code walkthroughs for the H3 library and bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/tutorials.md). +## Videos + +- [Introduction to H3](https://www.youtube.com/watch?v=wDuKeUkNLkQ) (June 2019) +- [Engineering an H3-based Geospatial Data Platform at Uber](https://www.youtube.com/watch?v=aCj-YVZ0mlE) +- [Building City Cores with H3](https://www.youtube.com/watch?v=PutOhe8HVNU) +- [H3-js: Hexagons in the Browser](https://www.youtube.com/watch?v=BsMIrBHLfLE&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=16&t=0s) +- [Hexagon Convolution for Data Smoothing & Forecasting](https://www.youtube.com/watch?v=z3PaGIQTFSE&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=14&t=0s) +- [Spatial Intelligence Using Hex](https://www.youtube.com/watch?v=0OlIpNAqokQ&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=18&t=0s) +- [Hierarchical Hexagons in Depth](https://www.youtube.com/watch?v=UILoSqvIM2w&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=15&t=0s) +- [H3: Tiling the Earth with Hexagons](https://www.youtube.com/watch?v=_-265mfMzl4&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=22&t=0s) (Introduction to H3, November 2018) +- [H3: Tiling the Earth with Hexagons](https://www.youtube.com/watch?v=ay2uwtRO3QE) (Introduction to H3, January 2018) + ## Java - [H3 Measurements](https://github.com/isaacbrodsky/h3measurements): Measurements of average cell area, average cell perimeter length, truncation error, and so on. From 3856c5891aa85dd40dcb90340f9c7114cf921019 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 28 Jun 2019 11:04:00 -0700 Subject: [PATCH 099/771] Commit package-lock.json to not have uncommited changes when building --- website/package-lock.json | 9871 +++++++++++++++++++++++++++++++++++++ 1 file changed, 9871 insertions(+) create mode 100644 website/package-lock.json diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 000000000..4794f662d --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,9871 @@ +{ + "name": "h3-website", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://unpm.uberinternal.com/@babel%2fruntime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://unpm.uberinternal.com/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://unpm.uberinternal.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://unpm.uberinternal.com/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://unpm.uberinternal.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://unpm.uberinternal.com/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://unpm.uberinternal.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://unpm.uberinternal.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://unpm.uberinternal.com/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.13.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://unpm.uberinternal.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.find": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.13.0" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://unpm.uberinternal.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://unpm.uberinternal.com/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://unpm.uberinternal.com/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://unpm.uberinternal.com/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://unpm.uberinternal.com/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.2", + "resolved": "https://unpm.uberinternal.com/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://unpm.uberinternal.com/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://unpm.uberinternal.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://unpm.uberinternal.com/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000978", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "autoprefixer-loader": { + "version": "3.2.0", + "resolved": "https://unpm.uberinternal.com/autoprefixer-loader/-/autoprefixer-loader-3.2.0.tgz", + "integrity": "sha1-Oae2ZGqCaYZQc9lYyX9IYVLCyEo=", + "requires": { + "autoprefixer": "6.7.7", + "loader-utils": "0.2.17", + "postcss": "5.2.18", + "postcss-safe-parser": "1.0.7" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://unpm.uberinternal.com/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://unpm.uberinternal.com/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://unpm.uberinternal.com/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.6.0", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://unpm.uberinternal.com/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://unpm.uberinternal.com/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.11", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://unpm.uberinternal.com/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "requires": { + "find-cache-dir": "1.0.0", + "loader-utils": "1.2.3", + "mkdirp": "0.5.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://unpm.uberinternal.com/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=" + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-module-resolver": { + "version": "2.7.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz", + "integrity": "sha1-GL48Qt31n3pFbJ4FEs2ROU9uS+E=", + "requires": { + "find-babel-config": "1.2.0", + "glob": "7.1.4", + "resolve": "1.11.1" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "requires": { + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.6.9", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://unpm.uberinternal.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://unpm.uberinternal.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.6.9", + "home-or-tmp": "2.0.0", + "lodash": "4.17.11", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.6.9", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.11" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.11" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://unpm.uberinternal.com/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.11", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://unpm.uberinternal.com/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://unpm.uberinternal.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "0.14.5" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://unpm.uberinternal.com/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://unpm.uberinternal.com/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.4" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://unpm.uberinternal.com/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://unpm.uberinternal.com/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://unpm.uberinternal.com/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "1.6.18" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://unpm.uberinternal.com/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "2.1.2", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://unpm.uberinternal.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://unpm.uberinternal.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.1.0" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://unpm.uberinternal.com/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.5.0", + "inherits": "2.0.4", + "parse-asn1": "5.1.4" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.10" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://unpm.uberinternal.com/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "1.0.30000978", + "electron-to-chromium": "1.3.175" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://unpm.uberinternal.com/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.13", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://unpm.uberinternal.com/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "requires": { + "bluebird": "3.5.5", + "chownr": "1.1.1", + "glob": "7.1.4", + "graceful-fs": "4.2.0", + "lru-cache": "4.1.5", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.3", + "ssri": "5.3.0", + "unique-filename": "1.1.1", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://unpm.uberinternal.com/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://unpm.uberinternal.com/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000978", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000978", + "resolved": "https://unpm.uberinternal.com/caniuse-db/-/caniuse-db-1.0.30000978.tgz", + "integrity": "sha512-UTzb0WomXxeqhAn3HgygItnkQeiLujN/O4D6hhB4ccSgktBysAbO/duUBJiNsPyxn/DsV8OnIn45jNeuvmUcPQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://unpm.uberinternal.com/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://unpm.uberinternal.com/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://unpm.uberinternal.com/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://unpm.uberinternal.com/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.3", + "braces": "2.3.2", + "fsevents": "1.2.9", + "glob-parent": "3.1.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "4.0.1", + "normalize-path": "3.0.0", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.2" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://unpm.uberinternal.com/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "clap": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "requires": { + "chalk": "1.1.3" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://unpm.uberinternal.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://unpm.uberinternal.com/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://unpm.uberinternal.com/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "optional": true, + "requires": { + "good-listener": "1.2.2", + "select": "1.1.2", + "tiny-emitter": "2.1.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://unpm.uberinternal.com/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "6.0.2", + "shallow-clone": "1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://unpm.uberinternal.com/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "requires": { + "q": "1.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://unpm.uberinternal.com/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "requires": { + "clone": "1.0.4", + "color-convert": "1.9.3", + "color-string": "0.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://unpm.uberinternal.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "requires": { + "color-name": "1.1.3" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "requires": { + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.3" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://unpm.uberinternal.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://unpm.uberinternal.com/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://unpm.uberinternal.com/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": "1.40.0" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://unpm.uberinternal.com/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "1.3.7", + "bytes": "3.0.0", + "compressible": "2.0.17", + "debug": "2.6.9", + "on-headers": "1.0.2", + "safe-buffer": "5.1.2", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://unpm.uberinternal.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://unpm.uberinternal.com/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://unpm.uberinternal.com/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://unpm.uberinternal.com/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://unpm.uberinternal.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://unpm.uberinternal.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.3", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://unpm.uberinternal.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.1", + "loader-utils": "1.2.3", + "minimatch": "3.0.4", + "p-limit": "1.3.0", + "serialize-javascript": "1.7.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://unpm.uberinternal.com/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://unpm.uberinternal.com/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.5.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.4", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://unpm.uberinternal.com/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.4", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://unpm.uberinternal.com/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://unpm.uberinternal.com/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.5", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://unpm.uberinternal.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.4", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.1.0", + "randomfill": "1.0.4" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://unpm.uberinternal.com/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://unpm.uberinternal.com/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "requires": { + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.1", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.2.3", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.2.1", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.1", + "source-list-map": "2.0.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.3", + "domutils": "1.5.1", + "nth-check": "1.0.2" + } + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://unpm.uberinternal.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.2", + "regexpu-core": "1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://unpm.uberinternal.com/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://unpm.uberinternal.com/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://unpm.uberinternal.com/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "requires": { + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.3", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.3", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.1", + "postcss-zindex": "2.2.0" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://unpm.uberinternal.com/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "requires": { + "clap": "1.2.3", + "source-map": "0.5.7" + } + }, + "csv-loader": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/csv-loader/-/csv-loader-2.1.1.tgz", + "integrity": "sha1-9x1GCAzIy8C0Fwcg4pkvLx4tfEY=", + "requires": { + "loader-utils": "1.2.3", + "papaparse": "4.6.3" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://unpm.uberinternal.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://unpm.uberinternal.com/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "0.10.50", + "type": "1.0.1" + } + }, + "d3-color": { + "version": "1.2.6", + "resolved": "https://unpm.uberinternal.com/d3-color/-/d3-color-1.2.6.tgz", + "integrity": "sha512-zrNnW58EhyghtNb879peaeiIQ7yW/rw86VUR/h+OXfNiURrwCXPLxuU0hOm+yxwqH6JGzVGQ77hdZ8gknC3NZA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://unpm.uberinternal.com/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://unpm.uberinternal.com/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://unpm.uberinternal.com/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://unpm.uberinternal.com/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://unpm.uberinternal.com/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://unpm.uberinternal.com/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.4", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://unpm.uberinternal.com/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://unpm.uberinternal.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.1.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://unpm.uberinternal.com/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://unpm.uberinternal.com/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.2" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "0.4.0" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "1.3.1", + "entities": "1.1.2" + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://unpm.uberinternal.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1.3.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://unpm.uberinternal.com/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0.1.1", + "domelementtype": "1.3.1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://unpm.uberinternal.com/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://unpm.uberinternal.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.2", + "resolved": "https://unpm.uberinternal.com/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" + }, + "electron-to-chromium": { + "version": "1.3.175", + "resolved": "https://unpm.uberinternal.com/electron-to-chromium/-/electron-to-chromium-1.3.175.tgz", + "integrity": "sha512-cQ0o7phcPA0EYkN4juZy/rq4XVxl/1ywQnytDT9hZTC0cHfaOBqWK2XlWp9Mk8xRGntgnmxlHTOux4HLb2ZNnA==" + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://unpm.uberinternal.com/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://unpm.uberinternal.com/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://unpm.uberinternal.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "4.2.0", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.9" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://unpm.uberinternal.com/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://unpm.uberinternal.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://unpm.uberinternal.com/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "requires": { + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4", + "object-keys": "1.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.2" + } + }, + "es5-ext": { + "version": "0.10.50", + "resolved": "https://unpm.uberinternal.com/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://unpm.uberinternal.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://unpm.uberinternal.com/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://unpm.uberinternal.com/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-regexp-component": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz", + "integrity": "sha1-nGO20LJf8qiMOtvRjFthrMO5+qI=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://unpm.uberinternal.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://unpm.uberinternal.com/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.3", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://unpm.uberinternal.com/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.2", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.2.6", + "doctrine": "2.1.0", + "eslint-scope": "3.7.3", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.4", + "globals": "11.12.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.13.1", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.3", + "regexpp": "1.1.0", + "require-uncached": "1.0.3", + "semver": "5.7.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "2.1.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "globals": { + "version": "11.12.0", + "resolved": "https://unpm.uberinternal.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://unpm.uberinternal.com/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "2.10.0", + "resolved": "https://unpm.uberinternal.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", + "integrity": "sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==", + "requires": { + "get-stdin": "5.0.1" + } + }, + "eslint-config-uber-es2015": { + "version": "3.1.2", + "resolved": "https://unpm.uberinternal.com/eslint-config-uber-es2015/-/eslint-config-uber-es2015-3.1.2.tgz", + "integrity": "sha1-d6zYgAFB913emXqHu0UeNJCwflQ=", + "requires": { + "eslint-config-uber-es5": "2.0.3" + } + }, + "eslint-config-uber-es5": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/eslint-config-uber-es5/-/eslint-config-uber-es5-2.0.3.tgz", + "integrity": "sha512-lHdjmCumgT72R6t4ZAvjErmOB1l9d6fg1IoX+MZ11F/7CFLMinmsMQW/r9aFWKPMdTkP+rR5NBpSTDnRE20oEw==" + }, + "eslint-config-uber-jsx": { + "version": "3.3.3", + "resolved": "https://unpm.uberinternal.com/eslint-config-uber-jsx/-/eslint-config-uber-jsx-3.3.3.tgz", + "integrity": "sha1-mC2457w9AEUXwN8pjzfKkNAr0TI=", + "requires": { + "eslint-config-uber-es5": "2.0.3", + "eslint-plugin-react": "6.10.3" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://unpm.uberinternal.com/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://unpm.uberinternal.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "requires": { + "array.prototype.find": "2.1.0", + "doctrine": "1.5.0", + "has": "1.0.3", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.1.0" + } + } + } + }, + "eslint-plugin-babel": { + "version": "4.1.2", + "resolved": "https://unpm.uberinternal.com/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz", + "integrity": "sha1-eSAqDjV1fdkngJGbIzbx+i/lPB4=" + }, + "eslint-plugin-react": { + "version": "7.14.2", + "resolved": "https://unpm.uberinternal.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz", + "integrity": "sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA==", + "requires": { + "array-includes": "3.0.3", + "doctrine": "2.1.0", + "has": "1.0.3", + "jsx-ast-utils": "2.2.0", + "object.entries": "1.1.0", + "object.fromentries": "2.0.0", + "object.values": "1.1.0", + "prop-types": "15.7.2", + "resolve": "1.11.1" + }, + "dependencies": { + "jsx-ast-utils": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/jsx-ast-utils/-/jsx-ast-utils-2.2.0.tgz", + "integrity": "sha512-yAmhGSzR7TsD0OQpu1AGLz8Bx84cxMqtgoJrufomY6BlveEDlREhvu1rea21936xbe5tlUh7IPda82m5ae0H8Q==", + "requires": { + "array-includes": "3.0.3", + "object.assign": "4.1.0" + } + } + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://unpm.uberinternal.com/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + }, + "espree": { + "version": "3.5.4", + "resolved": "https://unpm.uberinternal.com/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "requires": { + "acorn": "5.7.3", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://unpm.uberinternal.com/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://unpm.uberinternal.com/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://unpm.uberinternal.com/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://unpm.uberinternal.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://unpm.uberinternal.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.50" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://unpm.uberinternal.com/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://unpm.uberinternal.com/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "requires": { + "original": "1.0.2" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.5", + "safe-buffer": "5.1.2" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://unpm.uberinternal.com/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://unpm.uberinternal.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://unpm.uberinternal.com/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.5", + "qs": "6.7.0", + "range-parser": "1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "1.5.0", + "type-is": "1.6.18", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://unpm.uberinternal.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.24", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "requires": { + "async": "2.6.2", + "loader-utils": "1.2.3", + "schema-utils": "0.3.0", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://unpm.uberinternal.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://unpm.uberinternal.com/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": "0.7.3" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://unpm.uberinternal.com/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.20" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://unpm.uberinternal.com/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "1.3.4", + "object-assign": "4.1.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://unpm.uberinternal.com/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "requires": { + "loader-utils": "1.2.3", + "schema-utils": "0.4.7" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://unpm.uberinternal.com/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "requires": { + "ajv": "6.10.0", + "ajv-keywords": "3.4.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", + "unpipe": "1.0.0" + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "requires": { + "json5": "0.5.1", + "path-exists": "3.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://unpm.uberinternal.com/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "requires": { + "circular-json": "0.3.3", + "graceful-fs": "4.2.0", + "rimraf": "2.6.3", + "write": "0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://unpm.uberinternal.com/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "requires": { + "debug": "3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://unpm.uberinternal.com/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.24" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://unpm.uberinternal.com/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://unpm.uberinternal.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://unpm.uberinternal.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "4.2.0", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://unpm.uberinternal.com/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "optional": true, + "requires": { + "ms": "2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "optional": true + }, + "needle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "optional": true, + "requires": { + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.3.0", + "nopt": "4.0.1", + "npm-packlist": "1.4.1", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.7.0", + "tar": "4.4.8" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "optional": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "optional": true, + "requires": { + "chownr": "1.1.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.5", + "minizlib": "1.2.1", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://unpm.uberinternal.com/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "4.2.0", + "inherits": "2.0.4", + "mkdirp": "0.5.1", + "rimraf": "2.6.3" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://unpm.uberinternal.com/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "1.2.1" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://unpm.uberinternal.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://unpm.uberinternal.com/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://unpm.uberinternal.com/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://unpm.uberinternal.com/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "2.19.0", + "process": "0.11.10" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://unpm.uberinternal.com/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "7.1.1", + "resolved": "https://unpm.uberinternal.com/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.2.2", + "glob": "7.1.4", + "ignore": "3.3.10", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://unpm.uberinternal.com/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "7.1.4", + "lodash": "4.17.11", + "minimatch": "3.0.4" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://unpm.uberinternal.com/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "3.2.0" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://unpm.uberinternal.com/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://unpm.uberinternal.com/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "6.10.0", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://unpm.uberinternal.com/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://unpm.uberinternal.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "history": { + "version": "4.9.0", + "resolved": "https://unpm.uberinternal.com/history/-/history-4.9.0.tgz", + "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "requires": { + "@babel/runtime": "7.4.5", + "loose-envify": "1.4.0", + "resolve-pathname": "2.2.0", + "tiny-invariant": "1.0.4", + "tiny-warning": "1.0.2", + "value-equal": "0.4.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://unpm.uberinternal.com/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://unpm.uberinternal.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://unpm.uberinternal.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://unpm.uberinternal.com/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "2.0.4", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" + } + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://unpm.uberinternal.com/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://unpm.uberinternal.com/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.2.1", + "commander": "2.17.1", + "he": "1.2.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.4.10" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://unpm.uberinternal.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "requires": { + "bluebird": "3.5.5", + "html-minifier": "3.5.21", + "loader-utils": "0.2.17", + "lodash": "4.17.11", + "pretty-error": "2.1.1", + "toposort": "1.0.7" + } + }, + "html-webpack-template": { + "version": "5.6.2", + "resolved": "https://unpm.uberinternal.com/html-webpack-template/-/html-webpack-template-5.6.2.tgz", + "integrity": "sha1-CYDfKiXjbPioXXSV4joOACl0tqI=" + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://unpm.uberinternal.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://unpm.uberinternal.com/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://unpm.uberinternal.com/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": "1.5.0", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://unpm.uberinternal.com/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://unpm.uberinternal.com/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "requires": { + "eventemitter3": "3.1.2", + "follow-redirects": "1.7.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://unpm.uberinternal.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "1.17.0", + "is-glob": "4.0.1", + "lodash": "4.17.11", + "micromatch": "3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://unpm.uberinternal.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://unpm.uberinternal.com/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://unpm.uberinternal.com/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://unpm.uberinternal.com/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://unpm.uberinternal.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "2.0.1" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://unpm.uberinternal.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://unpm.uberinternal.com/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "3.2.0", + "chalk": "2.4.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.11", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "requires": { + "meow": "3.7.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://unpm.uberinternal.com/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "1.4.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://unpm.uberinternal.com/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://unpm.uberinternal.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.13.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://unpm.uberinternal.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://unpm.uberinternal.com/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "requires": { + "html-comment-regex": "1.1.2" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://unpm.uberinternal.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://unpm.uberinternal.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://unpm.uberinternal.com/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://unpm.uberinternal.com/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://unpm.uberinternal.com/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "requires": { + "argparse": "1.0.10", + "esprima": "2.7.3" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://unpm.uberinternal.com/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://unpm.uberinternal.com/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://unpm.uberinternal.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://unpm.uberinternal.com/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" + }, + "just-curry-it": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/just-curry-it/-/just-curry-it-3.1.0.tgz", + "integrity": "sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg==" + }, + "killable": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.2.0", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://unpm.uberinternal.com/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://unpm.uberinternal.com/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash-es": { + "version": "4.17.11", + "resolved": "https://unpm.uberinternal.com/lodash-es/-/lodash-es-4.17.11.tgz", + "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://unpm.uberinternal.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://unpm.uberinternal.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://unpm.uberinternal.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://unpm.uberinternal.com/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://unpm.uberinternal.com/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://unpm.uberinternal.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://unpm.uberinternal.com/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://unpm.uberinternal.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://unpm.uberinternal.com/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://unpm.uberinternal.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://unpm.uberinternal.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "1.0.1" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://unpm.uberinternal.com/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://unpm.uberinternal.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://unpm.uberinternal.com/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://unpm.uberinternal.com/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://unpm.uberinternal.com/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://unpm.uberinternal.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://unpm.uberinternal.com/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://unpm.uberinternal.com/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://unpm.uberinternal.com/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "0.1.1" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://unpm.uberinternal.com/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.7.1", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.1.1", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.5" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://unpm.uberinternal.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://unpm.uberinternal.com/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.3", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://unpm.uberinternal.com/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.3" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://unpm.uberinternal.com/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://unpm.uberinternal.com/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://unpm.uberinternal.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://unpm.uberinternal.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://unpm.uberinternal.com/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://unpm.uberinternal.com/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://unpm.uberinternal.com/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "1.1.4" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://unpm.uberinternal.com/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://unpm.uberinternal.com/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://unpm.uberinternal.com/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "1.0.12", + "glob": "7.1.4", + "graceful-fs": "4.2.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.0", + "rimraf": "2.6.3", + "semver": "5.3.0", + "tar": "2.2.2", + "which": "1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://unpm.uberinternal.com/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://unpm.uberinternal.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "1.5.0", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "3.0.0", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.1", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.2", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.11.1", + "vm-browserify": "1.1.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://unpm.uberinternal.com/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.3", + "get-stdin": "4.0.1", + "glob": "7.1.4", + "in-publish": "2.0.0", + "lodash": "4.17.11", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.14.0", + "node-gyp": "3.8.0", + "npmlog": "4.1.2", + "request": "2.88.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.1", + "true-case-path": "1.0.3" + }, + "dependencies": { + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://unpm.uberinternal.com/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "4.1.5", + "which": "1.3.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://unpm.uberinternal.com/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://unpm.uberinternal.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "2.7.1", + "resolve": "1.11.1", + "semver": "5.7.0", + "validate-npm-package-license": "3.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://unpm.uberinternal.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://unpm.uberinternal.com/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://unpm.uberinternal.com/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://unpm.uberinternal.com/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://unpm.uberinternal.com/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://unpm.uberinternal.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://unpm.uberinternal.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "3.0.1" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://unpm.uberinternal.com/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "1.1.3", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.1.1" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.13.0", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/object.fromentries/-/object.fromentries-2.0.0.tgz", + "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.13.0", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.13.0", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "ocular": { + "version": "0.5.5", + "resolved": "https://unpm.uberinternal.com/ocular/-/ocular-0.5.5.tgz", + "integrity": "sha512-MxLQCQ+Ee2piHF1Z4xgKlANx8CZE2tKFStvmYDWLxVetxMm67dHmG6PMcDYyH2pk+Ej/i1Cjz4x+6a9SuB4Ztw==", + "requires": { + "autoprefixer-loader": "3.2.0", + "babel-core": "6.26.3", + "babel-eslint": "7.2.3", + "babel-loader": "7.1.5", + "babel-plugin-add-module-exports": "0.2.1", + "babel-plugin-module-resolver": "2.7.1", + "babel-plugin-transform-decorators-legacy": "1.3.5", + "babel-polyfill": "6.26.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", + "babel-preset-stage-2": "6.24.1", + "classnames": "2.2.6", + "copy-webpack-plugin": "4.6.0", + "css-loader": "0.28.11", + "csv-loader": "2.1.1", + "d3-color": "1.2.6", + "deepmerge": "1.5.2", + "eslint": "4.19.1", + "eslint-config-prettier": "2.10.0", + "eslint-config-uber-es2015": "3.1.2", + "eslint-config-uber-jsx": "3.3.3", + "eslint-plugin-babel": "4.1.2", + "eslint-plugin-react": "7.14.2", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.11", + "hoek": "4.2.1", + "html-webpack-plugin": "2.30.1", + "html-webpack-template": "5.6.2", + "inquirer": "3.3.0", + "lodash.debounce": "4.0.8", + "marked": "0.3.19", + "node-sass": "4.12.0", + "offline-plugin": "4.9.1", + "prismjs": "1.16.0", + "progress-bar-webpack-plugin": "1.12.1", + "raw-loader": "0.5.1", + "react": "15.6.2", + "react-dom": "15.6.2", + "react-ga": "2.6.0", + "react-hot-loader": "4.5.3", + "react-icons": "2.2.7", + "react-redux": "5.1.1", + "react-router": "4.3.1", + "react-router-dom": "4.3.1", + "react-router-redux": "5.0.0-alpha.9", + "redux": "3.7.2", + "redux-actions": "2.6.5", + "redux-thunk": "2.3.0", + "sass-loader": "6.0.7", + "slug": "0.9.4", + "style-loader": "0.18.2", + "to-case": "2.0.0", + "url-loader": "0.5.9", + "webpack": "3.12.0", + "webpack-dev-server": "2.11.5", + "webpack-hot-middleware": "2.25.0", + "whatwg-fetch": "2.0.4" + } + }, + "offline-plugin": { + "version": "4.9.1", + "resolved": "https://unpm.uberinternal.com/offline-plugin/-/offline-plugin-4.9.1.tgz", + "integrity": "sha1-6Xpr4xGLTcNg4G7UvEc/EPLec7Y=", + "requires": { + "deep-extend": "0.4.2", + "ejs": "2.6.2", + "loader-utils": "0.2.17", + "minimatch": "3.0.4", + "slash": "1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://unpm.uberinternal.com/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://unpm.uberinternal.com/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "1.4.7" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://unpm.uberinternal.com/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://unpm.uberinternal.com/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.3.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://unpm.uberinternal.com/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "papaparse": { + "version": "4.6.3", + "resolved": "https://unpm.uberinternal.com/papaparse/-/papaparse-4.6.3.tgz", + "integrity": "sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.4", + "readable-stream": "2.3.6" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://unpm.uberinternal.com/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17", + "safe-buffer": "5.1.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://unpm.uberinternal.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://unpm.uberinternal.com/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://unpm.uberinternal.com/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://unpm.uberinternal.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://unpm.uberinternal.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://unpm.uberinternal.com/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://unpm.uberinternal.com/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://unpm.uberinternal.com/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://unpm.uberinternal.com/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.5.1", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://unpm.uberinternal.com/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "requires": { + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://unpm.uberinternal.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "requires": { + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://unpm.uberinternal.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://unpm.uberinternal.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://unpm.uberinternal.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "requires": { + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://unpm.uberinternal.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "requires": { + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.3" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://unpm.uberinternal.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "requires": { + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://unpm.uberinternal.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://unpm.uberinternal.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://unpm.uberinternal.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "requires": { + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://unpm.uberinternal.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://unpm.uberinternal.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://unpm.uberinternal.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-safe-parser": { + "version": "1.0.7", + "resolved": "https://unpm.uberinternal.com/postcss-safe-parser/-/postcss-safe-parser-1.0.7.tgz", + "integrity": "sha1-Q70MjITV99hHTeglxpnk2ryscqg=", + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://unpm.uberinternal.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://unpm.uberinternal.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "requires": { + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "svgo": "0.7.2" + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://unpm.uberinternal.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "2.0.3", + "utila": "0.4.0" + } + }, + "prismjs": { + "version": "1.16.0", + "resolved": "https://unpm.uberinternal.com/prismjs/-/prismjs-1.16.0.tgz", + "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", + "requires": { + "clipboard": "2.0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://unpm.uberinternal.com/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://unpm.uberinternal.com/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "progress-bar-webpack-plugin": { + "version": "1.12.1", + "resolved": "https://unpm.uberinternal.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.12.1.tgz", + "integrity": "sha512-tVbPB5xBbqNwdH3mwcxzjL1r1Vrm/xGu93OsqVSAbCaXGoKFvfWIh0gpMDpn2kYsPVRSAIK0pBkP9Vfs+JJibQ==", + "requires": { + "chalk": "1.1.3", + "object.assign": "4.1.0", + "progress": "1.1.8" + }, + "dependencies": { + "progress": { + "version": "1.1.8", + "resolved": "https://unpm.uberinternal.com/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + } + } + }, + "promise": { + "version": "7.3.1", + "resolved": "https://unpm.uberinternal.com/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://unpm.uberinternal.com/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "react-is": "16.8.6" + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://unpm.uberinternal.com/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.33", + "resolved": "https://unpm.uberinternal.com/psl/-/psl-1.1.33.tgz", + "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://unpm.uberinternal.com/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.4", + "randombytes": "2.1.0", + "safe-buffer": "5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://unpm.uberinternal.com/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "3.7.1", + "inherits": "2.0.4", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://unpm.uberinternal.com/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://unpm.uberinternal.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "2.1.0", + "safe-buffer": "5.1.2" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://unpm.uberinternal.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://unpm.uberinternal.com/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://unpm.uberinternal.com/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" + }, + "react": { + "version": "15.6.2", + "resolved": "https://unpm.uberinternal.com/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "15.6.3", + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "prop-types": "15.7.2" + } + }, + "react-dom": { + "version": "15.6.2", + "resolved": "https://unpm.uberinternal.com/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "requires": { + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "prop-types": "15.7.2" + } + }, + "react-ga": { + "version": "2.6.0", + "resolved": "https://unpm.uberinternal.com/react-ga/-/react-ga-2.6.0.tgz", + "integrity": "sha512-GWHBWZDFjDGMkIk1LzroIn0mNTygKw3adXuqvGvheFZvlbpqMPbHsQsTdQBIxRRdXGQM/Zq+dQLRPKbwIHMTaw==" + }, + "react-hot-loader": { + "version": "4.5.3", + "resolved": "https://unpm.uberinternal.com/react-hot-loader/-/react-hot-loader-4.5.3.tgz", + "integrity": "sha512-3meh550Cagzdqaci2R0wdCYDNy5hZFF4/ej2iiOXjRX5BRI30kTNJtzDFdXXIqipIjLhEPUpPLSsdR16ExDzfA==", + "requires": { + "fast-levenshtein": "2.0.6", + "global": "4.4.0", + "hoist-non-react-statics": "2.5.5", + "loader-utils": "1.2.3", + "lodash.merge": "4.6.1", + "prop-types": "15.7.2", + "react-lifecycles-compat": "3.0.4", + "shallowequal": "1.1.0", + "source-map": "0.7.3" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "react-icon-base": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/react-icon-base/-/react-icon-base-2.1.0.tgz", + "integrity": "sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50=" + }, + "react-icons": { + "version": "2.2.7", + "resolved": "https://unpm.uberinternal.com/react-icons/-/react-icons-2.2.7.tgz", + "integrity": "sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg==", + "requires": { + "react-icon-base": "2.1.0" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://unpm.uberinternal.com/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://unpm.uberinternal.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-redux": { + "version": "5.1.1", + "resolved": "https://unpm.uberinternal.com/react-redux/-/react-redux-5.1.1.tgz", + "integrity": "sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg==", + "requires": { + "@babel/runtime": "7.4.5", + "hoist-non-react-statics": "3.3.0", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-is": "16.8.6", + "react-lifecycles-compat": "3.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://unpm.uberinternal.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "16.8.6" + } + } + } + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://unpm.uberinternal.com/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "4.9.0", + "hoist-non-react-statics": "2.5.5", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "path-to-regexp": "1.7.0", + "prop-types": "15.7.2", + "warning": "4.0.3" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://unpm.uberinternal.com/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "4.9.0", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-router": "4.3.1", + "warning": "4.0.3" + } + }, + "react-router-redux": { + "version": "5.0.0-alpha.9", + "resolved": "https://unpm.uberinternal.com/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz", + "integrity": "sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==", + "requires": { + "history": "4.9.0", + "prop-types": "15.7.2", + "react-router": "4.3.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://unpm.uberinternal.com/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "4.2.0", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "requires": { + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "requires": { + "balanced-match": "0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + } + } + }, + "reduce-reducers": { + "version": "0.4.3", + "resolved": "https://unpm.uberinternal.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz", + "integrity": "sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw==" + }, + "redux": { + "version": "3.7.2", + "resolved": "https://unpm.uberinternal.com/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.11", + "lodash-es": "4.17.11", + "loose-envify": "1.4.0", + "symbol-observable": "1.2.0" + } + }, + "redux-actions": { + "version": "2.6.5", + "resolved": "https://unpm.uberinternal.com/redux-actions/-/redux-actions-2.6.5.tgz", + "integrity": "sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw==", + "requires": { + "invariant": "2.2.4", + "just-curry-it": "3.1.0", + "loose-envify": "1.4.0", + "reduce-reducers": "0.4.3", + "to-camel-case": "1.0.0" + } + }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://unpm.uberinternal.com/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://unpm.uberinternal.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://unpm.uberinternal.com/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://unpm.uberinternal.com/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://unpm.uberinternal.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.2.0", + "htmlparser2": "3.10.1", + "strip-ansi": "3.0.1", + "utila": "0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://unpm.uberinternal.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://unpm.uberinternal.com/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.24", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://unpm.uberinternal.com/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "requires": { + "path-parse": "1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://unpm.uberinternal.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://unpm.uberinternal.com/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://unpm.uberinternal.com/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "7.1.4" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.4" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "1.2.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://unpm.uberinternal.com/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://unpm.uberinternal.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://unpm.uberinternal.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://unpm.uberinternal.com/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "7.1.4", + "lodash": "4.17.11", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://unpm.uberinternal.com/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.2.3", + "lodash.tail": "4.1.1", + "neo-async": "2.6.1", + "pify": "3.0.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://unpm.uberinternal.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "5.5.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://unpm.uberinternal.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "2.5.1", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://unpm.uberinternal.com/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://unpm.uberinternal.com/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://unpm.uberinternal.com/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "2.3.0", + "range-parser": "1.2.1", + "statuses": "1.5.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://unpm.uberinternal.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://unpm.uberinternal.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "1.3.7", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.24", + "parseurl": "1.3.3" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://unpm.uberinternal.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.5.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://unpm.uberinternal.com/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://unpm.uberinternal.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://unpm.uberinternal.com/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "slug": { + "version": "0.9.4", + "resolved": "https://unpm.uberinternal.com/slug/-/slug-0.9.4.tgz", + "integrity": "sha512-3YHq0TeJ4+AIFbJm+4UWSQs5A1mmeWOTQqydW3OoPmQfNKxlO96NDRTIrp+TBkmvEsEFrd+Z/LXw8OD/6OlZ5g==", + "requires": { + "unicode": "11.0.1" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://unpm.uberinternal.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://unpm.uberinternal.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://unpm.uberinternal.com/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.3.2" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://unpm.uberinternal.com/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.3", + "inherits": "2.0.4", + "json3": "3.3.3", + "url-parse": "1.4.7" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://unpm.uberinternal.com/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": "0.7.3" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://unpm.uberinternal.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://unpm.uberinternal.com/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://unpm.uberinternal.com/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.4" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.4" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://unpm.uberinternal.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "requires": { + "debug": "4.1.1", + "handle-thing": "2.0.0", + "http-deceiver": "1.2.7", + "select-hose": "2.0.0", + "spdy-transport": "3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "4.1.1", + "detect-node": "2.0.4", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "3.4.0", + "wbuf": "1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://unpm.uberinternal.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://unpm.uberinternal.com/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://unpm.uberinternal.com/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://unpm.uberinternal.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://unpm.uberinternal.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "2.3.6" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://unpm.uberinternal.com/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + } + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-loader": { + "version": "0.18.2", + "resolved": "https://unpm.uberinternal.com/style-loader/-/style-loader-0.18.2.tgz", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "requires": { + "loader-utils": "1.2.3", + "schema-utils": "0.3.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://unpm.uberinternal.com/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "table": { + "version": "4.0.2", + "resolved": "https://unpm.uberinternal.com/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.2", + "lodash": "4.17.11", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://unpm.uberinternal.com/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://unpm.uberinternal.com/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.12", + "inherits": "2.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://unpm.uberinternal.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://unpm.uberinternal.com/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://unpm.uberinternal.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://unpm.uberinternal.com/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==" + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://unpm.uberinternal.com/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "requires": { + "setimmediate": "1.0.5" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "tiny-invariant": { + "version": "1.0.4", + "resolved": "https://unpm.uberinternal.com/tiny-invariant/-/tiny-invariant-1.0.4.tgz", + "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" + }, + "tiny-warning": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/tiny-warning/-/tiny-warning-1.0.2.tgz", + "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + }, + "title-case-minors": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/title-case-minors/-/title-case-minors-1.0.0.tgz", + "integrity": "sha1-UfFwN8KUdHodHNpCS1AEyG2OsRU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://unpm.uberinternal.com/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-camel-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-camel-case/-/to-camel-case-1.0.0.tgz", + "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-capital-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-capital-case/-/to-capital-case-1.0.0.tgz", + "integrity": "sha1-pXxQFP1aNyF88FCZ/4pCG7+cm38=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-case": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/to-case/-/to-case-2.0.0.tgz", + "integrity": "sha1-aQHtkM2/rb96FtBol7+0Evo8Dwo=", + "requires": { + "to-camel-case": "1.0.0", + "to-capital-case": "1.0.0", + "to-constant-case": "1.0.0", + "to-dot-case": "1.0.0", + "to-no-case": "1.0.2", + "to-pascal-case": "1.0.0", + "to-sentence-case": "1.0.0", + "to-slug-case": "1.0.0", + "to-snake-case": "1.0.0", + "to-space-case": "1.0.0", + "to-title-case": "1.0.0" + } + }, + "to-constant-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-constant-case/-/to-constant-case-1.0.0.tgz", + "integrity": "sha1-Y/UnKbAOhRiL5+DjYXieXquqCBs=", + "requires": { + "to-snake-case": "1.0.0" + } + }, + "to-dot-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-dot-case/-/to-dot-case-1.0.0.tgz", + "integrity": "sha1-5ojxGjybpRHqwN0PASyVzJMW7Ds=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-no-case": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/to-no-case/-/to-no-case-1.0.2.tgz", + "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://unpm.uberinternal.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-pascal-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-pascal-case/-/to-pascal-case-1.0.0.tgz", + "integrity": "sha1-C73I30SIhroBU15UMycEjQqhzng=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://unpm.uberinternal.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://unpm.uberinternal.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "to-sentence-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-sentence-case/-/to-sentence-case-1.0.0.tgz", + "integrity": "sha1-xIO/NkdzflxzjvcAb+Ng1fmcVy4=", + "requires": { + "to-no-case": "1.0.2" + } + }, + "to-slug-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-slug-case/-/to-slug-case-1.0.0.tgz", + "integrity": "sha1-kqzeU0cQVaM8gwcZ6Ot4OHIG2BM=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-snake-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-snake-case/-/to-snake-case-1.0.0.tgz", + "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", + "requires": { + "to-space-case": "1.0.0" + } + }, + "to-space-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-space-case/-/to-space-case-1.0.0.tgz", + "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", + "requires": { + "to-no-case": "1.0.2" + } + }, + "to-title-case": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/to-title-case/-/to-title-case-1.0.0.tgz", + "integrity": "sha1-rKiPidYGTeUBCKl86g20SCfoAGE=", + "requires": { + "escape-regexp-component": "1.0.2", + "title-case-minors": "1.0.0", + "to-capital-case": "1.0.0", + "to-sentence-case": "1.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://unpm.uberinternal.com/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://unpm.uberinternal.com/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "1.1.33", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "7.1.4" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://unpm.uberinternal.com/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://unpm.uberinternal.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://unpm.uberinternal.com/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/type/-/type-1.0.1.tgz", + "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://unpm.uberinternal.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://unpm.uberinternal.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://unpm.uberinternal.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "0.7.20", + "resolved": "https://unpm.uberinternal.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://unpm.uberinternal.com/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "2.19.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://unpm.uberinternal.com/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://unpm.uberinternal.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://unpm.uberinternal.com/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "unicode": { + "version": "11.0.1", + "resolved": "https://unpm.uberinternal.com/unicode/-/unicode-11.0.1.tgz", + "integrity": "sha512-+cHtykLb+eF1yrSLWTwcYBrqJkTfX7Quoyg7Juhe6uylF43ZbMdxMuSHNYlnyLT8T7POAvavgBthzUF9AIaQvQ==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://unpm.uberinternal.com/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "2.0.2" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://unpm.uberinternal.com/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://unpm.uberinternal.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://unpm.uberinternal.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://unpm.uberinternal.com/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://unpm.uberinternal.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://unpm.uberinternal.com/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "0.5.9", + "resolved": "https://unpm.uberinternal.com/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "requires": { + "loader-utils": "1.2.3", + "mime": "1.3.6" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://unpm.uberinternal.com/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "2.1.1", + "requires-port": "1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://unpm.uberinternal.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://unpm.uberinternal.com/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://unpm.uberinternal.com/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://unpm.uberinternal.com/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://unpm.uberinternal.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://unpm.uberinternal.com/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://unpm.uberinternal.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://unpm.uberinternal.com/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://unpm.uberinternal.com/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://unpm.uberinternal.com/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://unpm.uberinternal.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "1.4.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "2.1.6", + "graceful-fs": "4.2.0", + "neo-async": "2.6.1" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://unpm.uberinternal.com/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "1.0.1" + } + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://unpm.uberinternal.com/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "requires": { + "acorn": "5.7.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "6.10.0", + "ajv-keywords": "3.4.0", + "async": "2.6.2", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.2.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.4.0", + "loader-utils": "1.2.3", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.2.1", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.9", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.6.0", + "webpack-sources": "1.3.0", + "yargs": "8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "4.2.0", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.5.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://unpm.uberinternal.com/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://unpm.uberinternal.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.1", + "time-stamp": "2.2.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + } + } + }, + "webpack-dev-server": { + "version": "2.11.5", + "resolved": "https://unpm.uberinternal.com/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "2.1.6", + "compression": "1.7.4", + "connect-history-api-fallback": "1.6.0", + "debug": "3.2.6", + "del": "3.0.0", + "express": "4.17.1", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "1.0.0", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.1", + "loglevel": "1.6.3", + "opn": "5.5.0", + "portfinder": "1.0.20", + "selfsigned": "1.10.4", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "4.0.0", + "strip-ansi": "3.0.1", + "supports-color": "5.5.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "2.1.2" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://unpm.uberinternal.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "requires": { + "ansi-html": "0.0.7", + "html-entities": "1.2.1", + "querystring": "0.2.0", + "strip-ansi": "3.0.1" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://unpm.uberinternal.com/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "requires": { + "source-list-map": "2.0.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://unpm.uberinternal.com/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": "0.4.10", + "safe-buffer": "5.1.2", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://unpm.uberinternal.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://unpm.uberinternal.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://unpm.uberinternal.com/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://unpm.uberinternal.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://unpm.uberinternal.com/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "2.1.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://unpm.uberinternal.com/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://unpm.uberinternal.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://unpm.uberinternal.com/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://unpm.uberinternal.com/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://unpm.uberinternal.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} From b03ee29ba98b20cdcc744ceb9c78d148936b978a Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Mon, 1 Jul 2019 17:39:05 +0300 Subject: [PATCH 100/771] Added link to ClickHouse to the list of bindings --- docs/community/bindings.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index 2e17b303a..f94309c4d 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -44,6 +44,10 @@ As a C library, bindings can be made to call H3 functions from different program - [dlr-eoc/pgh3](https://github.com/dlr-eoc/pgh3) - [bytesandbrains/h3-pg](https://github.com/bytesandbrains/h3-pg) +## ClickHouse + +- [geoToH3 function, since version 19.11](https://github.com/yandex/ClickHouse/blob/master/dbms/src/Functions/geoToH3.cpp#L35) + ## Python - [uber/h3-py](https://github.com/uber/h3-py) From a342eb2872b6b0b7648c88c18bf23ff256b1dded Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Mon, 1 Jul 2019 22:44:40 +0300 Subject: [PATCH 101/771] Update bindings.md --- docs/community/bindings.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index f94309c4d..ac434b2ef 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -6,6 +6,10 @@ As a C library, bindings can be made to call H3 functions from different program - [entrepreneur-interet-general/h3.standard](https://github.com/entrepreneur-interet-general/H3.Standard) +## ClickHouse + +- [geoToH3 function, since version 19.11](https://github.com/yandex/ClickHouse/blob/master/dbms/src/Functions/geoToH3.cpp#L35) + ## ECL - [hpcc-systems/HPCC-Platform](https://github.com/hpcc-systems/HPCC-Platform/tree/master/plugins/h3) @@ -44,10 +48,6 @@ As a C library, bindings can be made to call H3 functions from different program - [dlr-eoc/pgh3](https://github.com/dlr-eoc/pgh3) - [bytesandbrains/h3-pg](https://github.com/bytesandbrains/h3-pg) -## ClickHouse - -- [geoToH3 function, since version 19.11](https://github.com/yandex/ClickHouse/blob/master/dbms/src/Functions/geoToH3.cpp#L35) - ## Python - [uber/h3-py](https://github.com/uber/h3-py) From 015bd355aeaaaf9bf120c06f9647687698275bc8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 16 Jul 2019 10:33:18 -0700 Subject: [PATCH 102/771] Use `argv[0]` for the program name in h3ToHier --- src/apps/miscapps/h3ToHier.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 091448242..b7c03a009 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -84,13 +84,13 @@ int main(int argc, char *argv[]) { } if (res > MAX_H3_RES) { - printHelp(stderr, argv[1], helpText, numArgs, args, + printHelp(stderr, argv[0], helpText, numArgs, args, "Resolution exceeds maximum resolution.", NULL); return 1; } if (parentArg.found && !H3_EXPORT(h3IsValid)(parentIndex)) { - printHelp(stderr, argv[1], helpText, numArgs, args, + printHelp(stderr, argv[0], helpText, numArgs, args, "Parent index is invalid.", NULL); return 1; } From bdc43db4dd14df833c0590b55dfc431066032ce2 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 16 Jul 2019 10:40:38 -0700 Subject: [PATCH 103/771] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88a0097ad..b41ea0656 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Changed - Argument parsing for all filter applications is more flexible. (#238) +### Fixed +- Fix printing program name in `h3ToHier` error messages. (#254) ## [3.4.4] - 2019-05-30 ### Changed From 8c9e916114fbc4e98510e6200cd9fb57f084115b Mon Sep 17 00:00:00 2001 From: AJ Friend Date: Thu, 18 Jul 2019 16:44:26 -0700 Subject: [PATCH 104/771] changes to hexRing description (#256) changes to hexRing description based on #252 --- src/h3lib/lib/algos.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 0b1787686..90b58de23 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -539,12 +539,17 @@ int H3_EXPORT(hexRanges)(H3Index* h3Set, int length, int k, H3Index* out) { } /** - * Returns the hollow hexagonal ring centered at origin with sides of length k. + * Returns the "hollow" ring of hexagons at exactly grid distance k from + * the origin hexagon. In particular, k=0 returns just the origin hexagon. + * + * A nonzero failure code may be returned in some cases, for example, + * if a pentagon is encountered. + * Failure cases may be fixed in future versions. * * @param origin Origin location. * @param k k >= 0 * @param out Array which must be of size 6 * k (or 1 if k == 0) - * @return 0 if no pentagonal distortion was encountered. + * @return 0 if successful; nonzero otherwise. */ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { // Short-circuit on 'identity' ring From 3a46d43e65ea1c65903520ca3a1b8d2f5cae9ac7 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Thu, 11 Jul 2019 08:09:38 -0500 Subject: [PATCH 105/771] Moving fijk vert logic to separate functions --- src/h3lib/include/faceijk.h | 3 + src/h3lib/lib/faceijk.c | 229 +++++++++++++++++++++--------------- 2 files changed, 136 insertions(+), 96 deletions(-) diff --git a/src/h3lib/include/faceijk.h b/src/h3lib/include/faceijk.h index 4224b51f2..76ef57718 100644 --- a/src/h3lib/include/faceijk.h +++ b/src/h3lib/include/faceijk.h @@ -69,8 +69,11 @@ void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g); void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, GeoBoundary* g); void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g); +void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts); +void _faceIjkPentToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts); void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, GeoCoord* g); int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, int substrate); +int _adjustPentVertOverage(FaceIJK* fijk, int res); #endif diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 27dc37cd0..1b0102248 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -502,60 +502,10 @@ void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g) { * @param g The spherical coordinates of the cell boundary. */ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { - // the vertexes of an origin-centered pentagon in a Class II resolution on a - // substrate grid with aperture sequence 33r. The aperture 3 gets us the - // vertices, and the 3r gets us back to Class II. - // vertices listed ccw from the i-axes - CoordIJK vertsCII[NUM_PENT_VERTS] = { - {2, 1, 0}, // 0 - {1, 2, 0}, // 1 - {0, 2, 1}, // 2 - {0, 1, 2}, // 3 - {1, 0, 2}, // 4 - }; - - // the vertexes of an origin-centered pentagon in a Class III resolution on - // a substrate grid with aperture sequence 33r7r. The aperture 3 gets us the - // vertices, and the 3r7r gets us to Class II. vertices listed ccw from the - // i-axes - CoordIJK vertsCIII[NUM_PENT_VERTS] = { - {5, 4, 0}, // 0 - {1, 5, 0}, // 1 - {0, 5, 4}, // 2 - {0, 1, 5}, // 3 - {4, 0, 5}, // 4 - }; - - // get the correct set of substrate vertices for this resolution - CoordIJK* verts; - if (isResClassIII(res)) - verts = vertsCIII; - else - verts = vertsCII; - - // adjust the center point to be in an aperture 33r substrate grid - // these should be composed for speed - FaceIJK centerIJK = *h; - _downAp3(¢erIJK.coord); - _downAp3r(¢erIJK.coord); - - // if res is Class III we need to add a cw aperture 7 to get to - // icosahedral Class II int adjRes = res; - if (isResClassIII(res)) { - _downAp7r(¢erIJK.coord); - adjRes++; - } - - // The center point is now in the same substrate grid as the origin - // cell vertices. Add the center point substate coordinates - // to each vertex to translate the vertices to that cell. + FaceIJK centerIJK = *h; FaceIJK fijkVerts[NUM_PENT_VERTS]; - for (int v = 0; v < NUM_PENT_VERTS; v++) { - fijkVerts[v].face = centerIJK.face; - _ijkAdd(¢erIJK.coord, &verts[v], &fijkVerts[v].coord); - _ijkNormalize(&fijkVerts[v].coord); - } + _faceIjkPentToVerts(¢erIJK, &adjRes, fijkVerts); // convert each vertex to lat/lon // adjust the face of each vertex as appropriate and introduce @@ -567,16 +517,7 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { FaceIJK fijk = fijkVerts[v]; - int pentLeading4 = 0; - int overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); - if (overage == 2) // in a different triangle - { - while (1) { - overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); - if (overage != 2) // not in a different triangle - break; - } - } + _adjustPentVertOverage(&fijk, adjRes); // all Class III pentagon edges cross icosa edges // note that Class II pentagons have vertices on the edge, @@ -656,77 +597,87 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { } /** - * Generates the cell boundary in spherical coordinates for a cell given by a - * FaceIJK address at a specified resolution. + * Get the vertices of a pentagon cell as substrate FaceIJK addresses * - * @param h The FaceIJK address of the cell. - * @param res The H3 resolution of the cell. - * @param isPentagon Whether or not the cell is a pentagon. - * @param g The spherical coordinates of the cell boundary. + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. This may be adjusted if + * necessary for the substrate grid resolution. + * @param fijkVerts Output array for the vertices */ -void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, - GeoBoundary* g) { - if (isPentagon) { - _faceIjkPentToGeoBoundary(h, res, g); - return; - } - - // the vertexes of an origin-centered cell in a Class II resolution on a +void _faceIjkPentToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts) { + // the vertexes of an origin-centered pentagon in a Class II resolution on a // substrate grid with aperture sequence 33r. The aperture 3 gets us the // vertices, and the 3r gets us back to Class II. // vertices listed ccw from the i-axes - CoordIJK vertsCII[NUM_HEX_VERTS] = { + CoordIJK vertsCII[NUM_PENT_VERTS] = { {2, 1, 0}, // 0 {1, 2, 0}, // 1 {0, 2, 1}, // 2 {0, 1, 2}, // 3 {1, 0, 2}, // 4 - {2, 0, 1} // 5 }; - // the vertexes of an origin-centered cell in a Class III resolution on a - // substrate grid with aperture sequence 33r7r. The aperture 3 gets us the - // vertices, and the 3r7r gets us to Class II. - // vertices listed ccw from the i-axes - CoordIJK vertsCIII[NUM_HEX_VERTS] = { + // the vertexes of an origin-centered pentagon in a Class III resolution on + // a substrate grid with aperture sequence 33r7r. The aperture 3 gets us the + // vertices, and the 3r7r gets us to Class II. vertices listed ccw from the + // i-axes + CoordIJK vertsCIII[NUM_PENT_VERTS] = { {5, 4, 0}, // 0 {1, 5, 0}, // 1 {0, 5, 4}, // 2 {0, 1, 5}, // 3 {4, 0, 5}, // 4 - {5, 0, 1} // 5 }; // get the correct set of substrate vertices for this resolution CoordIJK* verts; - if (isResClassIII(res)) + if (isResClassIII(*res)) verts = vertsCIII; else verts = vertsCII; // adjust the center point to be in an aperture 33r substrate grid // these should be composed for speed - FaceIJK centerIJK = *h; - _downAp3(¢erIJK.coord); - _downAp3r(¢erIJK.coord); + _downAp3(&fijk->coord); + _downAp3r(&fijk->coord); // if res is Class III we need to add a cw aperture 7 to get to // icosahedral Class II - int adjRes = res; - if (isResClassIII(res)) { - _downAp7r(¢erIJK.coord); - adjRes++; + if (isResClassIII(*res)) { + _downAp7r(&fijk->coord); + *res += 1; } // The center point is now in the same substrate grid as the origin // cell vertices. Add the center point substate coordinates // to each vertex to translate the vertices to that cell. - FaceIJK fijkVerts[NUM_HEX_VERTS]; - for (int v = 0; v < NUM_HEX_VERTS; v++) { - fijkVerts[v].face = centerIJK.face; - _ijkAdd(¢erIJK.coord, &verts[v], &fijkVerts[v].coord); + for (int v = 0; v < NUM_PENT_VERTS; v++) { + fijkVerts[v].face = fijk->face; + _ijkAdd(&fijk->coord, &verts[v], &fijkVerts[v].coord); _ijkNormalize(&fijkVerts[v].coord); } +} + +/** + * Generates the cell boundary in spherical coordinates for a cell given by a + * FaceIJK address at a specified resolution. + * + * @param h The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. + * @param isPentagon Whether or not the cell is a pentagon. + * @param g The spherical coordinates of the cell boundary. + */ +void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, + GeoBoundary* g) { + if (isPentagon) { + _faceIjkPentToGeoBoundary(h, res, g); + return; + } + + int adjRes = res; + FaceIJK centerIJK = *h; + FaceIJK fijkVerts[NUM_HEX_VERTS]; + _faceIjkToVerts(¢erIJK, &adjRes, fijkVerts); // convert each vertex to lat/lon // adjust the face of each vertex as appropriate and introduce @@ -819,6 +770,70 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, } } +/** + * Get the vertices of a cell as substrate FaceIJK addresses + * + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. This may be adjusted if + * necessary for the substrate grid resolution. + * @param fijkVerts Output array for the vertices + */ +void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts) { + // the vertexes of an origin-centered cell in a Class II resolution on a + // substrate grid with aperture sequence 33r. The aperture 3 gets us the + // vertices, and the 3r gets us back to Class II. + // vertices listed ccw from the i-axes + CoordIJK vertsCII[NUM_HEX_VERTS] = { + {2, 1, 0}, // 0 + {1, 2, 0}, // 1 + {0, 2, 1}, // 2 + {0, 1, 2}, // 3 + {1, 0, 2}, // 4 + {2, 0, 1} // 5 + }; + + // the vertexes of an origin-centered cell in a Class III resolution on a + // substrate grid with aperture sequence 33r7r. The aperture 3 gets us the + // vertices, and the 3r7r gets us to Class II. + // vertices listed ccw from the i-axes + CoordIJK vertsCIII[NUM_HEX_VERTS] = { + {5, 4, 0}, // 0 + {1, 5, 0}, // 1 + {0, 5, 4}, // 2 + {0, 1, 5}, // 3 + {4, 0, 5}, // 4 + {5, 0, 1} // 5 + }; + + // get the correct set of substrate vertices for this resolution + CoordIJK* verts; + if (isResClassIII(*res)) + verts = vertsCIII; + else + verts = vertsCII; + + // adjust the center point to be in an aperture 33r substrate grid + // these should be composed for speed + _downAp3(&fijk->coord); + _downAp3r(&fijk->coord); + + // if res is Class III we need to add a cw aperture 7 to get to + // icosahedral Class II + if (isResClassIII(*res)) { + _downAp7r(&fijk->coord); + *res += 1; + } + + // The center point is now in the same substrate grid as the origin + // cell vertices. Add the center point substate coordinates + // to each vertex to translate the vertices to that cell. + for (int v = 0; v < NUM_HEX_VERTS; v++) { + fijkVerts[v].face = fijk->face; + _ijkAdd(&fijk->coord, &verts[v], &fijkVerts[v].coord); + _ijkNormalize(&fijkVerts[v].coord); + } +} + /** * Adjusts a FaceIJK address in place so that the resulting cell address is * relative to the correct icosahedral face. @@ -891,3 +906,25 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, return overage; } + +/** + * Adjusts a FaceIJK address for a pentagon vertex in a substrate grid in + * place so that the resulting cell address is relative to the correct + * icosahedral face. + * + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. + */ +int _adjustPentVertOverage(FaceIJK* fijk, int res) { + int pentLeading4 = 0; + int overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); + if (overage == 2) { + // in a different triangle + while (1) { + overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); + if (overage != 2) // not in a different triangle + break; + } + } + return overage; +} From c19e64119b32beee58e05cd8c1e070ddcb428b4b Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Thu, 11 Jul 2019 10:46:25 -0500 Subject: [PATCH 106/771] Initial implementation of maxFaceCount and h3GetFaces --- src/h3lib/include/faceijk.h | 7 ++--- src/h3lib/include/h3api.h.in | 11 +++++++ src/h3lib/lib/h3Index.c | 61 ++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/h3lib/include/faceijk.h b/src/h3lib/include/faceijk.h index 76ef57718..161760f82 100644 --- a/src/h3lib/include/faceijk.h +++ b/src/h3lib/include/faceijk.h @@ -50,10 +50,6 @@ typedef struct { extern const GeoCoord faceCenterGeo[NUM_ICOSA_FACES]; // indexes for faceNeighbors table -/** Invalid faceNeighbors table direction */ -#define INVALID -1 -/** Center faceNeighbors table direction */ -#define CENTER 0 /** IJ quadrant faceNeighbors table direction */ #define IJ 1 /** KI quadrant faceNeighbors table direction */ @@ -61,6 +57,9 @@ extern const GeoCoord faceCenterGeo[NUM_ICOSA_FACES]; /** JK quadrant faceNeighbors table direction */ #define JK 3 +/** Invalid face index */ +#define INVALID_FACE -1 + // Internal functions void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h); diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 8db158c9d..8c9ca54fc 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -394,6 +394,17 @@ int H3_EXPORT(h3IsResClassIII)(H3Index h); int H3_EXPORT(h3IsPentagon)(H3Index h); /** @} */ +/** @defgroup h3GetFaces h3GetFaces + * Functions for h3GetFaces + * @{ + */ +/** @brief Max number of icosahedron faces intersected by an index */ +int H3_EXPORT(maxFaceCount)(H3Index h3); + +/** @brief Find all icosahedron faces intersected by a given H3 index */ +void H3_EXPORT(h3GetFaces)(H3Index h3, int *out); +/** @} */ + /** @defgroup h3IndexesAreNeighbors h3IndexesAreNeighbors * Functions for h3IndexesAreNeighbors * @{ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index fe8194d55..8e7476dec 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -779,6 +779,67 @@ void H3_EXPORT(h3ToGeoBoundary)(H3Index h3, GeoBoundary* gb) { H3_EXPORT(h3IsPentagon)(h3), gb); } +/** + * Returns the max number of possible icosahedron faces an H3 index + * may intersect. + * + * @return int count of faces + */ +int H3_EXPORT(maxFaceCount)(H3Index h3) { + // a pentagon always intersects 5 faces, a hexagon never intersects more + // than 2 (but may only intersect 1) + return H3_EXPORT(h3IsPentagon)(h3) ? 5 : 2; +} + +/** + * Find all icosahedron faces intersected by a given H3 index, represented + * as integers from 0-19. The array is sparse; since 0 is a valid value, + * invalid array values are represented as -1. It is the responsibility of + * the caller to filter out invalid values. + * + * @param h3 The H3 index + * @param out Output array. Must be of size maxFaceCount(h3). + */ +void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { + // convert to FaceIJK + FaceIJK fijk; + _h3ToFaceIjk(h3, &fijk); + + int faceCount = maxFaceCount(h3); + int res = H3_GET_RESOLUTION(h3); + + // Get all vertices as FaceIJK addresses. For simplicity, always + // initialize the array with 6 verts, ignoring the last one for pentagons + FaceIJK fijkVerts[NUM_HEX_VERTS]; + int vertexCount; + + if (H3_EXPORT(h3IsPentagon)(h3)) { + // Pentagon case + vertexCount = NUM_PENT_VERTS; + _faceIjkPentToVerts(&fijk, &res, fijkVerts); + } else { + // Hexagon case + vertexCount = NUM_HEX_VERTS; + _faceIjkToVerts(&fijk, &res, fijkVerts); + } + + // We may not use all of the slots in the output array, + // so fill with invalid values to indicate unused slots + for (int i = 0; i < faceCount; i++) { + out[i] = INVALID_FACE; + } + + // add each vertex face, using the output array as a hash set + for (int i = 0; i < vertexCount; i++) { + int face = fijkVerts[i].face; + int pos = face % faceCount; + while (out[pos] != INVALID_FACE && out[pos] != face) { + pos = (pos + 1) % faceCount; + } + out[pos] = face; + } +} + /** * Returns whether or not a resolution is a Class III grid. Note that odd * resolutions are Class III and even resolutions are Class II. From c97f403311d85b26a6349b1807ee64a103af2c1c Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 12 Jul 2019 12:09:47 -0500 Subject: [PATCH 107/771] Tests and fixes for implementation, class II pentagons failing --- CMakeLists.txt | 2 + src/apps/applib/include/utility.h | 2 + src/apps/applib/lib/utility.c | 33 ++++--- src/apps/testapps/testH3GetFaces.c | 139 +++++++++++++++++++++++++++++ src/h3lib/lib/faceijk.c | 8 +- src/h3lib/lib/h3Index.c | 16 +++- 6 files changed, 179 insertions(+), 21 deletions(-) create mode 100644 src/apps/testapps/testH3GetFaces.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3154e73bd..619fe8512 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testHexRanges.c src/apps/testapps/testH3ToGeo.c src/apps/testapps/testH3ToChildren.c + src/apps/testapps/testH3GetFaces.c src/apps/testapps/testGeoCoord.c src/apps/testapps/testHexRing.c src/apps/testapps/testH3SetToVertexGraph.c @@ -491,6 +492,7 @@ if(BUILD_TESTING) add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) + add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) add_h3_test(testH3Index src/apps/testapps/testH3Index.c) add_h3_test(testH3Api src/apps/testapps/testH3Api.c) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 4ce01e94f..2734698e3 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -52,5 +52,7 @@ void randomGeo(GeoCoord* p); void iterateAllIndexesAtRes(int res, void (*callback)(H3Index)); void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int maxBaseCell); +void iterateBaseCellIndexesAtRes(int res, void (*callback)(H3Index), + int baseCell); #endif diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index e9f441319..8cb73c2ce 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -190,22 +190,31 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int baseCells) { assert(baseCells <= NUM_BASE_CELLS); for (int i = 0; i < baseCells; i++) { - H3Index bc; - setH3Index(&bc, 0, i, 0); - int childrenSz = H3_EXPORT(maxUncompactSize)(&bc, 1, res); - H3Index* children = calloc(childrenSz, sizeof(H3Index)); - H3_EXPORT(uncompact)(&bc, 1, children, childrenSz, res); - - for (int j = 0; j < childrenSz; j++) { - if (children[j] == 0) { - continue; - } + iterateBaseCellIndexesAtRes(res, callback, i); + } +} - (*callback)(children[j]); +/** + * Call the callback for every index at the given resolution in a + * specific base cell + */ +void iterateBaseCellIndexesAtRes(int res, void (*callback)(H3Index), + int baseCell) { + H3Index bc; + setH3Index(&bc, 0, baseCell, 0); + int childrenSz = H3_EXPORT(maxUncompactSize)(&bc, 1, res); + H3Index* children = calloc(childrenSz, sizeof(H3Index)); + H3_EXPORT(uncompact)(&bc, 1, children, childrenSz, res); + + for (int j = 0; j < childrenSz; j++) { + if (children[j] == 0) { + continue; } - free(children); + (*callback)(children[j]); } + + free(children); } /** diff --git a/src/apps/testapps/testH3GetFaces.c b/src/apps/testapps/testH3GetFaces.c new file mode 100644 index 000000000..f884b05a3 --- /dev/null +++ b/src/apps/testapps/testH3GetFaces.c @@ -0,0 +1,139 @@ +/* + * Copyright 2018 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function. + * + * usage: `testH3Distance` + */ + +#include +#include +#include "baseCells.h" +#include "h3Index.h" +#include "h3api.h" +#include "test.h" +#include "utility.h" + +static int countFaces(h3, expectedMax) { + int sz = H3_EXPORT(maxFaceCount)(h3); + t_assert(sz == expectedMax, "got expected max face count"); + int *faces = calloc(sz, sizeof(int)); + + H3_EXPORT(h3GetFaces)(h3, faces); + + int validCount = 0; + for (int i = 0; i < sz; i++) { + if (faces[i] >= 0 && faces[i] <= 19) validCount++; + } + + free(faces); + return validCount; +} + +static void assertSingleHexFace(H3Index h3) { + int validCount = countFaces(h3, 2); + t_assert(validCount == 1, "got a single valid face"); +} + +static void assertMultipleHexFaces(H3Index h3) { + int validCount = countFaces(h3, 2); + t_assert(validCount == 2, "got multiple valid faces for a hexagon"); +} + +static void assertPentagonFaces(H3Index h3) { + int validCount = countFaces(h3, 5); + t_assert(validCount == 5, "got 5 valid faces for a pentagon"); +} + +SUITE(h3GetFaces) { + TEST(singleFaceHexes) { + // base cell 16 is at the center of an icosahedron face, + // so all children should have the same face + iterateBaseCellIndexesAtRes(2, assertSingleHexFace, 16); + iterateBaseCellIndexesAtRes(3, assertSingleHexFace, 16); + } + + TEST(hexagonWithEdgeVertices) { + // Class II pentagon neighbor - one face, two adjacent vertices on edge + H3Index h3 = 0x821c37fffffffff; + assertSingleHexFace(h3); + } + + TEST(hexagonWithDistortion) { + // Class III pentagon neighbor + H3Index h3 = 0x831c06fffffffff; + assertMultipleHexFaces(h3); + } + + TEST(hexagonCrossingFaces) { + // Class II hex with two non-adjacent vertices on edge + H3Index h3 = 0x821ce7fffffffff; + assertMultipleHexFaces(h3); + } + + TEST(hexagonCrossingFaces) { + // Class II hex with two vertices on edge + H3Index h3 = 0x821ce7fffffffff; + assertMultipleHexFaces(h3); + } + + TEST(classIIIPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 1, 4, 0); + assertPentagonFaces(pentagon); + } + + // TEST(classIIPentagon) { + // H3Index pentagon; + // setH3Index(&pentagon, 2, 4, 0); + // assertPentagonFaces(pentagon); + // } + + TEST(baseCellHexagons) { + int singleCount = 0; + int multipleCount = 0; + for (int i = 0; i < NUM_BASE_CELLS; i++) { + if (!_isBaseCellPentagon(i)) { + // Make the base cell index + H3Index baseCell = H3_INIT; + H3_SET_MODE(baseCell, H3_HEXAGON_MODE); + H3_SET_BASE_CELL(baseCell, i); + int validCount = countFaces(baseCell, 2); + t_assert(validCount > 0, "got at least one face"); + if (validCount == 1) + singleCount++; + else + multipleCount++; + } + } + t_assert(singleCount == 4 * 20, + "got single face for 4 face-aligned hex base cells"); + t_assert(multipleCount == 1.5 * 20, + "got multiple faces for non-face-aligned hex base cells"); + } + + // TEST(baseCellPentagons) { + // for (int i = 0; i < NUM_BASE_CELLS; i++) { + // if (_isBaseCellPentagon(i)) { + // // Make the base cell index + // H3Index baseCell = H3_INIT; + // H3_SET_MODE(baseCell, H3_HEXAGON_MODE); + // H3_SET_BASE_CELL(baseCell, i); + // assertPentagonFaces(baseCell); + // } + // } + // } +} diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 1b0102248..66a51ba71 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -918,13 +918,9 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, int _adjustPentVertOverage(FaceIJK* fijk, int res) { int pentLeading4 = 0; int overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); - if (overage == 2) { + while (overage == 2) { // in a different triangle - while (1) { - overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); - if (overage != 2) // not in a different triangle - break; - } + overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); } return overage; } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 8e7476dec..9b5c7abb9 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -810,11 +810,11 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons + int isPentagon = H3_EXPORT(h3IsPentagon)(h3); FaceIJK fijkVerts[NUM_HEX_VERTS]; int vertexCount; - if (H3_EXPORT(h3IsPentagon)(h3)) { - // Pentagon case + if (isPentagon) { vertexCount = NUM_PENT_VERTS; _faceIjkPentToVerts(&fijk, &res, fijkVerts); } else { @@ -831,7 +831,17 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // add each vertex face, using the output array as a hash set for (int i = 0; i < vertexCount; i++) { - int face = fijkVerts[i].face; + FaceIJK vert = fijkVerts[i]; + + // Adjust overage (i.e. whether this vertex is on another face) + if (isPentagon) { + _adjustPentVertOverage(&vert, res); + } else { + _adjustOverageClassII(&vert, res, 0, 1); + } + + // Save the face to the output array + int face = vert.face; int pos = face % faceCount; while (out[pos] != INVALID_FACE && out[pos] != face) { pos = (pos + 1) % faceCount; From 58b7488e25448ae5b2402ede1681440bcf482f56 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 12 Jul 2019 23:19:29 -0500 Subject: [PATCH 108/771] Fix assertion helpers, fix class II pentagon case --- src/apps/testapps/testH3GetFaces.c | 47 +++++++++++++----------------- src/h3lib/lib/h3Index.c | 21 +++++++++---- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/apps/testapps/testH3GetFaces.c b/src/apps/testapps/testH3GetFaces.c index f884b05a3..2fa580518 100644 --- a/src/apps/testapps/testH3GetFaces.c +++ b/src/apps/testapps/testH3GetFaces.c @@ -27,7 +27,7 @@ #include "test.h" #include "utility.h" -static int countFaces(h3, expectedMax) { +static int countFaces(H3Index h3, int expectedMax) { int sz = H3_EXPORT(maxFaceCount)(h3); t_assert(sz == expectedMax, "got expected max face count"); int *faces = calloc(sz, sizeof(int)); @@ -54,6 +54,7 @@ static void assertMultipleHexFaces(H3Index h3) { } static void assertPentagonFaces(H3Index h3) { + t_assert(H3_EXPORT(h3IsPentagon)(h3), "got a pentagon"); int validCount = countFaces(h3, 5); t_assert(validCount == 5, "got 5 valid faces for a pentagon"); } @@ -73,17 +74,11 @@ SUITE(h3GetFaces) { } TEST(hexagonWithDistortion) { - // Class III pentagon neighbor + // Class III pentagon neighbor, distortion across faces H3Index h3 = 0x831c06fffffffff; assertMultipleHexFaces(h3); } - TEST(hexagonCrossingFaces) { - // Class II hex with two non-adjacent vertices on edge - H3Index h3 = 0x821ce7fffffffff; - assertMultipleHexFaces(h3); - } - TEST(hexagonCrossingFaces) { // Class II hex with two vertices on edge H3Index h3 = 0x821ce7fffffffff; @@ -96,11 +91,11 @@ SUITE(h3GetFaces) { assertPentagonFaces(pentagon); } - // TEST(classIIPentagon) { - // H3Index pentagon; - // setH3Index(&pentagon, 2, 4, 0); - // assertPentagonFaces(pentagon); - // } + TEST(classIIPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 2, 4, 0); + assertPentagonFaces(pentagon); + } TEST(baseCellHexagons) { int singleCount = 0; @@ -120,20 +115,20 @@ SUITE(h3GetFaces) { } } t_assert(singleCount == 4 * 20, - "got single face for 4 face-aligned hex base cells"); + "got single face for 4 aligned hex base cells per face"); t_assert(multipleCount == 1.5 * 20, - "got multiple faces for non-face-aligned hex base cells"); + "got multiple faces for non-aligned hex base cells"); } - // TEST(baseCellPentagons) { - // for (int i = 0; i < NUM_BASE_CELLS; i++) { - // if (_isBaseCellPentagon(i)) { - // // Make the base cell index - // H3Index baseCell = H3_INIT; - // H3_SET_MODE(baseCell, H3_HEXAGON_MODE); - // H3_SET_BASE_CELL(baseCell, i); - // assertPentagonFaces(baseCell); - // } - // } - // } + TEST(baseCellPentagons) { + for (int i = 0; i < NUM_BASE_CELLS; i++) { + if (_isBaseCellPentagon(i)) { + // Make the base cell index + H3Index baseCell = H3_INIT; + H3_SET_MODE(baseCell, H3_HEXAGON_MODE); + H3_SET_BASE_CELL(baseCell, i); + assertPentagonFaces(baseCell); + } + } + } } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 9b5c7abb9..a6d39cf49 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -801,16 +801,24 @@ int H3_EXPORT(maxFaceCount)(H3Index h3) { * @param out Output array. Must be of size maxFaceCount(h3). */ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { + int res = H3_GET_RESOLUTION(h3); + int isPentagon = H3_EXPORT(h3IsPentagon)(h3); + + // We can't use the vertex-based approach here for class II pentagons, + // because all their vertices are on the icosahedron edges. Their + // direct child pentagons cross the same faces, so use those instead. + if (isPentagon && !isResClassIII(res)) { + H3Index childPentagon = makeDirectChild(h3, 0); + H3_EXPORT(h3GetFaces)(childPentagon, out); + return; + } + // convert to FaceIJK FaceIJK fijk; _h3ToFaceIjk(h3, &fijk); - int faceCount = maxFaceCount(h3); - int res = H3_GET_RESOLUTION(h3); - // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons - int isPentagon = H3_EXPORT(h3IsPentagon)(h3); FaceIJK fijkVerts[NUM_HEX_VERTS]; int vertexCount; @@ -818,13 +826,13 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { vertexCount = NUM_PENT_VERTS; _faceIjkPentToVerts(&fijk, &res, fijkVerts); } else { - // Hexagon case vertexCount = NUM_HEX_VERTS; _faceIjkToVerts(&fijk, &res, fijkVerts); } // We may not use all of the slots in the output array, // so fill with invalid values to indicate unused slots + int faceCount = H3_EXPORT(maxFaceCount)(h3); for (int i = 0; i < faceCount; i++) { out[i] = INVALID_FACE; } @@ -833,7 +841,8 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { for (int i = 0; i < vertexCount; i++) { FaceIJK vert = fijkVerts[i]; - // Adjust overage (i.e. whether this vertex is on another face) + // Adjust overage, determining whether this vertex is + // on another face if (isPentagon) { _adjustPentVertOverage(&vert, res); } else { From 1df5c3473ad4ce585ecca5278088189612c98cee Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 15 Jul 2019 09:50:41 -0700 Subject: [PATCH 109/771] Update copyright years --- src/apps/testapps/testH3GetFaces.c | 2 +- src/h3lib/include/faceijk.h | 2 +- src/h3lib/include/h3api.h.in | 2 +- src/h3lib/lib/faceijk.c | 2 +- src/h3lib/lib/h3Index.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/testapps/testH3GetFaces.c b/src/apps/testapps/testH3GetFaces.c index 2fa580518..202fbc848 100644 --- a/src/apps/testapps/testH3GetFaces.c +++ b/src/apps/testapps/testH3GetFaces.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/h3lib/include/faceijk.h b/src/h3lib/include/faceijk.h index 161760f82..300fe4268 100644 --- a/src/h3lib/include/faceijk.h +++ b/src/h3lib/include/faceijk.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 8c9ca54fc..1659008a2 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 66a51ba71..7bc0cfbe6 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index a6d39cf49..df07d0544 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 3adcacb95f2e41f971cb8378b0db53ccc07fa03f Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 15 Jul 2019 14:48:56 -0700 Subject: [PATCH 110/771] Fix memory allocation --- src/h3lib/lib/h3Index.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index df07d0544..cb37f0e34 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -819,7 +819,7 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons - FaceIJK fijkVerts[NUM_HEX_VERTS]; + FaceIJK* fijkVerts = malloc(NUM_HEX_VERTS * sizeof(FaceIJK)); int vertexCount; if (isPentagon) { @@ -839,24 +839,26 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // add each vertex face, using the output array as a hash set for (int i = 0; i < vertexCount; i++) { - FaceIJK vert = fijkVerts[i]; + FaceIJK* vert = &fijkVerts[i]; // Adjust overage, determining whether this vertex is // on another face if (isPentagon) { - _adjustPentVertOverage(&vert, res); + _adjustPentVertOverage(vert, res); } else { - _adjustOverageClassII(&vert, res, 0, 1); + _adjustOverageClassII(vert, res, 0, 1); } // Save the face to the output array - int face = vert.face; + int face = vert->face; int pos = face % faceCount; while (out[pos] != INVALID_FACE && out[pos] != face) { pos = (pos + 1) % faceCount; } out[pos] = face; } + + free(fijkVerts); } /** From 488cccb4e396ba971b550830498b30cb73fdfc38 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Tue, 16 Jul 2019 15:23:26 -0700 Subject: [PATCH 111/771] Add test for res 15 pentagon --- src/apps/testapps/testH3GetFaces.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/apps/testapps/testH3GetFaces.c b/src/apps/testapps/testH3GetFaces.c index 202fbc848..fd0e1f547 100644 --- a/src/apps/testapps/testH3GetFaces.c +++ b/src/apps/testapps/testH3GetFaces.c @@ -97,6 +97,12 @@ SUITE(h3GetFaces) { assertPentagonFaces(pentagon); } + TEST(res15Pentagon) { + H3Index pentagon; + setH3Index(&pentagon, 15, 4, 0); + assertPentagonFaces(pentagon); + } + TEST(baseCellHexagons) { int singleCount = 0; int multipleCount = 0; From 01758b5da2a396ac266ba2d1d1911aa59cfa24b3 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Tue, 16 Jul 2019 15:23:50 -0700 Subject: [PATCH 112/771] Add enum for overage values --- src/h3lib/include/faceijk.h | 16 +++++++++++++--- src/h3lib/lib/faceijk.c | 18 +++++++++--------- src/h3lib/lib/h3Index.c | 4 ++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/h3lib/include/faceijk.h b/src/h3lib/include/faceijk.h index 300fe4268..052c70f15 100644 --- a/src/h3lib/include/faceijk.h +++ b/src/h3lib/include/faceijk.h @@ -60,6 +60,16 @@ extern const GeoCoord faceCenterGeo[NUM_ICOSA_FACES]; /** Invalid face index */ #define INVALID_FACE -1 +/** Digit representing overage type */ +typedef enum { + /** No overage (on original face) */ + NO_OVERAGE = 0, + /** On face edge (only occurs on substrate grids) */ + FACE_EDGE = 1, + /** Overage on new face interior */ + NEW_FACE = 2 +} Overage; + // Internal functions void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h); @@ -71,8 +81,8 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g); void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts); void _faceIjkPentToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts); void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, GeoCoord* g); -int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, - int substrate); -int _adjustPentVertOverage(FaceIJK* fijk, int res); +Overage _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, + int substrate); +Overage _adjustPentVertOverage(FaceIJK* fijk, int res); #endif diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 7bc0cfbe6..92cf2e899 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -846,9 +846,9 @@ void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts) { * @return 0 if on original face (no overage); 1 if on face edge (only occurs * on substrate grids); 2 if overage on new face interior */ -int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, - int substrate) { - int overage = 0; +Overage _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, + int substrate) { + Overage overage = NO_OVERAGE; CoordIJK* ijk = &fijk->coord; @@ -858,10 +858,10 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, // check for overage if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge - overage = 1; + overage = FACE_EDGE; else if (ijk->i + ijk->j + ijk->k > maxDim) // overage { - overage = 2; + overage = NEW_FACE; const FaceOrientIJK* fijkOrient; if (ijk->k > 0) { @@ -901,7 +901,7 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, // overage points on pentagon boundaries can end up on edges if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge - overage = 1; + overage = FACE_EDGE; } return overage; @@ -915,10 +915,10 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, * @param fijk The FaceIJK address of the cell. * @param res The H3 resolution of the cell. */ -int _adjustPentVertOverage(FaceIJK* fijk, int res) { +Overage _adjustPentVertOverage(FaceIJK* fijk, int res) { int pentLeading4 = 0; - int overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); - while (overage == 2) { + Overage overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); + while (overage == NEW_FACE) { // in a different triangle overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index cb37f0e34..6789c486d 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -739,12 +739,12 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { // a pentagon base cell with a leading 4 digit requires special handling int pentLeading4 = (_isBaseCellPentagon(baseCell) && _h3LeadingNonZeroDigit(h) == 4); - if (_adjustOverageClassII(fijk, res, pentLeading4, 0)) { + if (_adjustOverageClassII(fijk, res, pentLeading4, 0) != NO_OVERAGE) { // if the base cell is a pentagon we have the potential for secondary // overages if (_isBaseCellPentagon(baseCell)) { while (1) { - if (!_adjustOverageClassII(fijk, res, 0, 0)) break; + if (_adjustOverageClassII(fijk, res, 0, 0) == NO_OVERAGE) break; } } From ec62b84c5b2147f09d48b08a846f85a384ffa724 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Wed, 17 Jul 2019 10:56:43 -0700 Subject: [PATCH 113/771] Simplify output set logic --- src/h3lib/lib/h3Index.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 6789c486d..bc2f6ae94 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -851,10 +851,10 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Save the face to the output array int face = vert->face; - int pos = face % faceCount; - while (out[pos] != INVALID_FACE && out[pos] != face) { - pos = (pos + 1) % faceCount; - } + int pos = 0; + // Find the first empty output position, or the first position + // matching the current face + while (out[pos] != INVALID_FACE && out[pos] != face) pos++; out[pos] = face; } From d15eeb9ddffe4055f711e98bc98aafdf0d210d09 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Wed, 17 Jul 2019 10:59:40 -0700 Subject: [PATCH 114/771] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70cec8a88..3a8bd284f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added - CMake options for excluding filter applications or benchmarks from the build. (#247) +- `h3GetFaces` function to find icosahedron faces for an index, and helper function `maxFaceCount` (#253) ### Changed - Argument parsing for all filter applications is more flexible. (#238) ### Fixed From 23e4fc2de69a2b161c15bec99182b2d84848cbfe Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 19 Jul 2019 15:45:16 -0700 Subject: [PATCH 115/771] Fix @brief, use setH3Index for base cells --- src/apps/testapps/testH3GetFaces.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/apps/testapps/testH3GetFaces.c b/src/apps/testapps/testH3GetFaces.c index fd0e1f547..7c8cdc206 100644 --- a/src/apps/testapps/testH3GetFaces.c +++ b/src/apps/testapps/testH3GetFaces.c @@ -14,9 +14,7 @@ * limitations under the License. */ /** @file - * @brief tests H3 distance function. - * - * usage: `testH3Distance` + * @brief tests the h3GetFaces function */ #include @@ -109,9 +107,8 @@ SUITE(h3GetFaces) { for (int i = 0; i < NUM_BASE_CELLS; i++) { if (!_isBaseCellPentagon(i)) { // Make the base cell index - H3Index baseCell = H3_INIT; - H3_SET_MODE(baseCell, H3_HEXAGON_MODE); - H3_SET_BASE_CELL(baseCell, i); + H3Index baseCell; + setH3Index(&baseCell, 0, i, 0); int validCount = countFaces(baseCell, 2); t_assert(validCount > 0, "got at least one face"); if (validCount == 1) @@ -130,9 +127,8 @@ SUITE(h3GetFaces) { for (int i = 0; i < NUM_BASE_CELLS; i++) { if (_isBaseCellPentagon(i)) { // Make the base cell index - H3Index baseCell = H3_INIT; - H3_SET_MODE(baseCell, H3_HEXAGON_MODE); - H3_SET_BASE_CELL(baseCell, i); + H3Index baseCell; + setH3Index(&baseCell, 0, i, 0); assertPentagonFaces(baseCell); } } From ab415abb468724c5f452df4eaa298132474d03f9 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 19 Jul 2019 15:56:42 -0700 Subject: [PATCH 116/771] Clean up while loops --- src/h3lib/lib/faceijk.c | 7 +++---- src/h3lib/lib/h3Index.c | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 92cf2e899..b994767ab 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -917,10 +917,9 @@ Overage _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, */ Overage _adjustPentVertOverage(FaceIJK* fijk, int res) { int pentLeading4 = 0; - Overage overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); - while (overage == NEW_FACE) { - // in a different triangle + Overage overage; + do { overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); - } + } while (overage == NEW_FACE); return overage; } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index bc2f6ae94..4216a1fca 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -743,9 +743,8 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { // if the base cell is a pentagon we have the potential for secondary // overages if (_isBaseCellPentagon(baseCell)) { - while (1) { - if (_adjustOverageClassII(fijk, res, 0, 0) == NO_OVERAGE) break; - } + while (_adjustOverageClassII(fijk, res, 0, 0) != NO_OVERAGE) + continue; } if (res != H3_GET_RESOLUTION(h)) _upAp7r(&fijk->coord); From 13c9eb28dda8bd8df3b4e39dee5eb2aa1b18a3e5 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 19 Jul 2019 17:06:01 -0700 Subject: [PATCH 117/771] Use stack allocation for fijkVerts --- src/h3lib/lib/h3Index.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 4216a1fca..ee309b18e 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -818,7 +818,7 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons - FaceIJK* fijkVerts = malloc(NUM_HEX_VERTS * sizeof(FaceIJK)); + FaceIJK fijkVerts[NUM_HEX_VERTS] = {0}; int vertexCount; if (isPentagon) { @@ -856,8 +856,6 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { while (out[pos] != INVALID_FACE && out[pos] != face) pos++; out[pos] = face; } - - free(fijkVerts); } /** From 496f9c30c4abacd9d42ce7e5804c49d33c03e193 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 19 Jul 2019 17:32:43 -0700 Subject: [PATCH 118/771] Update array initialization syntax --- src/h3lib/lib/h3Index.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index ee309b18e..6cbee1d53 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -818,7 +818,7 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons - FaceIJK fijkVerts[NUM_HEX_VERTS] = {0}; + FaceIJK fijkVerts[NUM_HEX_VERTS] = {}; int vertexCount; if (isPentagon) { From 7f01d78974575d2a0067d0c90d9bbe635415a5a5 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 19 Jul 2019 17:38:33 -0700 Subject: [PATCH 119/771] Revert to array initialization with no expression --- src/h3lib/lib/h3Index.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 6cbee1d53..d76b7440e 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -818,7 +818,7 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // Get all vertices as FaceIJK addresses. For simplicity, always // initialize the array with 6 verts, ignoring the last one for pentagons - FaceIJK fijkVerts[NUM_HEX_VERTS] = {}; + FaceIJK fijkVerts[NUM_HEX_VERTS]; int vertexCount; if (isPentagon) { From eb178d796670d0cd1a6eaf13c67a5c826fca1e74 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 22 Jul 2019 10:07:28 -0700 Subject: [PATCH 120/771] Add comment about makeDirectChild/res 15 --- src/h3lib/lib/h3Index.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index d76b7440e..c99b2e796 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -807,6 +807,8 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { // because all their vertices are on the icosahedron edges. Their // direct child pentagons cross the same faces, so use those instead. if (isPentagon && !isResClassIII(res)) { + // Note that this would not work for res 15, but this is only run on + // Class II pentagons, it should never be invoked for a res 15 index. H3Index childPentagon = makeDirectChild(h3, 0); H3_EXPORT(h3GetFaces)(childPentagon, out); return; From 5d732e6420b56339c019de1d8f3feb3317b11f4c Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 22 Jul 2019 10:46:26 -0700 Subject: [PATCH 121/771] Preparing for release 3.5.0 --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a8bd284f..66701a4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.5.0] - 2019-07-22 ### Added - CMake options for excluding filter applications or benchmarks from the build. (#247) - `h3GetFaces` function to find icosahedron faces for an index, and helper function `maxFaceCount` (#253) diff --git a/VERSION b/VERSION index f9892605c..1545d9665 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.4 +3.5.0 From c41111a97c781012cc561777897b0d0fdd4aba87 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 23 Jul 2019 14:29:44 -0700 Subject: [PATCH 122/771] Add docs entry for h3GetFaces and add summary to API pages --- docs/api/hierarchy.md | 2 ++ docs/api/indexing.md | 4 +++- docs/api/inspection.md | 20 ++++++++++++++++++++ docs/api/misc.md | 2 ++ docs/api/regions.md | 2 ++ docs/api/traversal.md | 2 ++ docs/api/uniedge.md | 2 ++ src/h3lib/include/h3api.h.in | 2 +- src/h3lib/lib/h3Index.c | 2 +- 9 files changed, 35 insertions(+), 3 deletions(-) diff --git a/docs/api/hierarchy.md b/docs/api/hierarchy.md index 45cca8f1c..cbb365d83 100644 --- a/docs/api/hierarchy.md +++ b/docs/api/hierarchy.md @@ -1,5 +1,7 @@ # Hierarchical grid functions +These functions permit moving between resolutions in the H3 grid system. The functions produce parent (coarser) or children (finer) cells. + ## h3ToParent ``` diff --git a/docs/api/indexing.md b/docs/api/indexing.md index 5d60164e0..8245c1ed7 100644 --- a/docs/api/indexing.md +++ b/docs/api/indexing.md @@ -1,12 +1,14 @@ # Indexing functions +These function are used for finding the H3 index containing coordinates, and for finding the center and boundary of H3 indexes. + ## geoToH3 ``` H3Index geoToH3(const GeoCoord *g, int res); ``` -Indexes the location at the specified resolution. +Indexes the location at the specified resolution, returning the index of the cell containing the location. Returns 0 on error. diff --git a/docs/api/inspection.md b/docs/api/inspection.md index 5a04cd017..1906dd49b 100644 --- a/docs/api/inspection.md +++ b/docs/api/inspection.md @@ -1,5 +1,7 @@ # Index inspection functions +These functions provide metadata about an H3 index, such as its resolution or base cell, and provide utilities for converting into and out of the 64-bit representation of an H3 index. + ## h3GetResolution ``` @@ -57,3 +59,21 @@ int h3IsPentagon(H3Index h); ``` Returns non-zero if this index represents a pentagonal cell. + +## h3GetFaces + +``` +void h3GetFaces(H3Index h, int* out); +``` + +Find all icosahedron faces intersected by a given H3 index and places them in the array `out`. `out` must be at least of length `maxFaceCount(h)`. + +Faces are represented as integers from 0-19, inclusive. The array is sparse, and empty (no intersection) array values are represented by -1. + +### maxFaceCount + +``` +int maxFaceCount(H3Index h3); +``` + +Returns the maximum number of icosahedron faces the given H3 index may intersect. diff --git a/docs/api/misc.md b/docs/api/misc.md index 8b197e02a..6914b5943 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -1,5 +1,7 @@ # Miscellaneous H3 functions +These functions include descriptions of the H3 grid system. + ## degsToRads ``` diff --git a/docs/api/regions.md b/docs/api/regions.md index d0df25cdf..e40ae53a6 100644 --- a/docs/api/regions.md +++ b/docs/api/regions.md @@ -1,5 +1,7 @@ # Region functions +These functions convert H3 indexes to and from polygonal areas. + ## polyfill ``` diff --git a/docs/api/traversal.md b/docs/api/traversal.md index 429d44c24..86cc07e24 100644 --- a/docs/api/traversal.md +++ b/docs/api/traversal.md @@ -1,5 +1,7 @@ # Grid traversal functions +Grid traversal allows finding cells in the vicinity of an origin cell, and determining how to traverse the grid from one cell to another. + ## kRing ``` diff --git a/docs/api/uniedge.md b/docs/api/uniedge.md index 72a3ff6c5..5cecceb7e 100644 --- a/docs/api/uniedge.md +++ b/docs/api/uniedge.md @@ -1,5 +1,7 @@ # Unidirectional edge functions +Unidirectional edges allow encoding the directed edge from one cell to a neighboring cell. + ## h3IndexesAreNeighbors ``` diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 1659008a2..070524dde 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -401,7 +401,7 @@ int H3_EXPORT(h3IsPentagon)(H3Index h); /** @brief Max number of icosahedron faces intersected by an index */ int H3_EXPORT(maxFaceCount)(H3Index h3); -/** @brief Find all icosahedron faces intersected by a given H3 index */ +/** @brief Find all icosahedron faces intersected by a given H3 index */ void H3_EXPORT(h3GetFaces)(H3Index h3, int *out); /** @} */ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index c99b2e796..e942253e8 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -791,7 +791,7 @@ int H3_EXPORT(maxFaceCount)(H3Index h3) { } /** - * Find all icosahedron faces intersected by a given H3 index, represented + * Find all icosahedron faces intersected by a given H3 index, represented * as integers from 0-19. The array is sparse; since 0 is a valid value, * invalid array values are represented as -1. It is the responsibility of * the caller to filter out invalid values. From 6efec621cf55a6c4fec1d88b99e7d96cc3369316 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 24 Jul 2019 10:47:19 -0700 Subject: [PATCH 123/771] Just ignore the package-lock.json in website Apply the alternative solution from #250 and remove package-lock.json --- .gitignore | 3 +- website/package-lock.json | 9871 ------------------------------------- 2 files changed, 2 insertions(+), 9872 deletions(-) delete mode 100644 website/package-lock.json diff --git a/.gitignore b/.gitignore index 9c09ec1f8..63e2d9679 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ dev-docs/_build/ env_docs/ node_modules/ website/dist/ +website/package-lock.json # Generated Doxyfile dev-docs/Doxyfile @@ -98,4 +99,4 @@ KML/res*cells.kml KML/res*centers.kml # Generated files -src/h3lib/include/h3api.h \ No newline at end of file +src/h3lib/include/h3api.h diff --git a/website/package-lock.json b/website/package-lock.json deleted file mode 100644 index 4794f662d..000000000 --- a/website/package-lock.json +++ /dev/null @@ -1,9871 +0,0 @@ -{ - "name": "h3-website", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://unpm.uberinternal.com/@babel%2fruntime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "requires": { - "regenerator-runtime": "0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - } - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://unpm.uberinternal.com/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://unpm.uberinternal.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://unpm.uberinternal.com/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://unpm.uberinternal.com/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://unpm.uberinternal.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://unpm.uberinternal.com/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.1.0" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://unpm.uberinternal.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://unpm.uberinternal.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://unpm.uberinternal.com/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://unpm.uberinternal.com/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://unpm.uberinternal.com/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://unpm.uberinternal.com/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://unpm.uberinternal.com/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://unpm.uberinternal.com/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://unpm.uberinternal.com/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async": { - "version": "2.6.2", - "resolved": "https://unpm.uberinternal.com/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "requires": { - "lodash": "4.17.11" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://unpm.uberinternal.com/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://unpm.uberinternal.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://unpm.uberinternal.com/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000978", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "autoprefixer-loader": { - "version": "3.2.0", - "resolved": "https://unpm.uberinternal.com/autoprefixer-loader/-/autoprefixer-loader-3.2.0.tgz", - "integrity": "sha1-Oae2ZGqCaYZQc9lYyX9IYVLCyEo=", - "requires": { - "autoprefixer": "6.7.7", - "loader-utils": "0.2.17", - "postcss": "5.2.18", - "postcss-safe-parser": "1.0.7" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://unpm.uberinternal.com/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://unpm.uberinternal.com/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://unpm.uberinternal.com/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.6.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-eslint": { - "version": "7.2.3", - "resolved": "https://unpm.uberinternal.com/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://unpm.uberinternal.com/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.11", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.11" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.11" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://unpm.uberinternal.com/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.2.3", - "mkdirp": "0.5.1" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://unpm.uberinternal.com/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-add-module-exports": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", - "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=" - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-module-resolver": { - "version": "2.7.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz", - "integrity": "sha1-GL48Qt31n3pFbJ4FEs2ROU9uS+E=", - "requires": { - "find-babel-config": "1.2.0", - "glob": "7.1.4", - "resolve": "1.11.1" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-decorators-legacy": { - "version": "1.3.5", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", - "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", - "requires": { - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.11" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.6.9", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://unpm.uberinternal.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://unpm.uberinternal.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.6.9", - "home-or-tmp": "2.0.0", - "lodash": "4.17.11", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.6.9", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.11" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.11" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://unpm.uberinternal.com/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://unpm.uberinternal.com/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://unpm.uberinternal.com/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.2", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://unpm.uberinternal.com/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://unpm.uberinternal.com/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.4" - } - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://unpm.uberinternal.com/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://unpm.uberinternal.com/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://unpm.uberinternal.com/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "1.6.18" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://unpm.uberinternal.com/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "2.1.2", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://unpm.uberinternal.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://unpm.uberinternal.com/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.1.0" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://unpm.uberinternal.com/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.0", - "inherits": "2.0.4", - "parse-asn1": "5.1.4" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "1.0.10" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://unpm.uberinternal.com/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "1.0.30000978", - "electron-to-chromium": "1.3.175" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://unpm.uberinternal.com/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.13", - "isarray": "1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://unpm.uberinternal.com/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "requires": { - "bluebird": "3.5.5", - "chownr": "1.1.1", - "glob": "7.1.4", - "graceful-fs": "4.2.0", - "lru-cache": "4.1.5", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.3", - "ssri": "5.3.0", - "unique-filename": "1.1.1", - "y18n": "4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.3.0", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.1", - "to-object-path": "0.3.0", - "union-value": "1.0.1", - "unset-value": "1.0.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://unpm.uberinternal.com/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://unpm.uberinternal.com/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000978", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } - }, - "caniuse-db": { - "version": "1.0.30000978", - "resolved": "https://unpm.uberinternal.com/caniuse-db/-/caniuse-db-1.0.30000978.tgz", - "integrity": "sha512-UTzb0WomXxeqhAn3HgygItnkQeiLujN/O4D6hhB4ccSgktBysAbO/duUBJiNsPyxn/DsV8OnIn45jNeuvmUcPQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://unpm.uberinternal.com/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://unpm.uberinternal.com/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://unpm.uberinternal.com/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://unpm.uberinternal.com/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.2" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://unpm.uberinternal.com/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "clap": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "1.1.3" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://unpm.uberinternal.com/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://unpm.uberinternal.com/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://unpm.uberinternal.com/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "optional": true, - "requires": { - "good-listener": "1.2.2", - "select": "1.1.2", - "tiny-emitter": "2.1.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://unpm.uberinternal.com/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", - "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "1.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://unpm.uberinternal.com/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "1.5.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color": { - "version": "0.11.4", - "resolved": "https://unpm.uberinternal.com/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "1.0.4", - "color-convert": "1.9.3", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://unpm.uberinternal.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.3" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://unpm.uberinternal.com/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://unpm.uberinternal.com/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compressible": { - "version": "2.0.17", - "resolved": "https://unpm.uberinternal.com/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "requires": { - "mime-db": "1.40.0" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://unpm.uberinternal.com/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "1.3.7", - "bytes": "3.0.0", - "compressible": "2.0.17", - "debug": "2.6.9", - "on-headers": "1.0.2", - "safe-buffer": "5.1.2", - "vary": "1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://unpm.uberinternal.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://unpm.uberinternal.com/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://unpm.uberinternal.com/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://unpm.uberinternal.com/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://unpm.uberinternal.com/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://unpm.uberinternal.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.3", - "run-queue": "1.0.3" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://unpm.uberinternal.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "globby": "7.1.1", - "is-glob": "4.0.1", - "loader-utils": "1.2.3", - "minimatch": "3.0.4", - "p-limit": "1.3.0", - "serialize-javascript": "1.7.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "core-js": { - "version": "2.6.9", - "resolved": "https://unpm.uberinternal.com/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://unpm.uberinternal.com/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.5.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.4", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://unpm.uberinternal.com/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.4", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://unpm.uberinternal.com/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "0.8.17", - "loose-envify": "1.4.0", - "object-assign": "4.1.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://unpm.uberinternal.com/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://unpm.uberinternal.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.4", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.1.0", - "randomfill": "1.0.4" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://unpm.uberinternal.com/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://unpm.uberinternal.com/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.1", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.2.3", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.2.1", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.1", - "source-list-map": "2.0.1" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", - "domutils": "1.5.1", - "nth-check": "1.0.2" - } - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://unpm.uberinternal.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.2", - "regexpu-core": "1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - } - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://unpm.uberinternal.com/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://unpm.uberinternal.com/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://unpm.uberinternal.com/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.3", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.3", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.1", - "postcss-zindex": "2.2.0" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://unpm.uberinternal.com/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" - } - }, - "csv-loader": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/csv-loader/-/csv-loader-2.1.1.tgz", - "integrity": "sha1-9x1GCAzIy8C0Fwcg4pkvLx4tfEY=", - "requires": { - "loader-utils": "1.2.3", - "papaparse": "4.6.3" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://unpm.uberinternal.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "1.0.2" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://unpm.uberinternal.com/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "0.10.50", - "type": "1.0.1" - } - }, - "d3-color": { - "version": "1.2.6", - "resolved": "https://unpm.uberinternal.com/d3-color/-/d3-color-1.2.6.tgz", - "integrity": "sha512-zrNnW58EhyghtNb879peaeiIQ7yW/rw86VUR/h+OXfNiURrwCXPLxuU0hOm+yxwqH6JGzVGQ77hdZ8gknC3NZA==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://unpm.uberinternal.com/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://unpm.uberinternal.com/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://unpm.uberinternal.com/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://unpm.uberinternal.com/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://unpm.uberinternal.com/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://unpm.uberinternal.com/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "1.0.2", - "glob": "7.1.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://unpm.uberinternal.com/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "2.0.1" - } - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://unpm.uberinternal.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.1.0" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://unpm.uberinternal.com/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "requires": { - "path-type": "3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://unpm.uberinternal.com/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "1.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "0.4.0" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "1.3.1", - "entities": "1.1.2" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://unpm.uberinternal.com/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1.3.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://unpm.uberinternal.com/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0.1.1", - "domelementtype": "1.3.1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://unpm.uberinternal.com/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://unpm.uberinternal.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.6.2", - "resolved": "https://unpm.uberinternal.com/ejs/-/ejs-2.6.2.tgz", - "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" - }, - "electron-to-chromium": { - "version": "1.3.175", - "resolved": "https://unpm.uberinternal.com/electron-to-chromium/-/electron-to-chromium-1.3.175.tgz", - "integrity": "sha512-cQ0o7phcPA0EYkN4juZy/rq4XVxl/1ywQnytDT9hZTC0cHfaOBqWK2XlWp9Mk8xRGntgnmxlHTOux4HLb2ZNnA==" - }, - "elliptic": { - "version": "6.5.0", - "resolved": "https://unpm.uberinternal.com/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://unpm.uberinternal.com/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://unpm.uberinternal.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "requires": { - "graceful-fs": "4.2.0", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.9" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://unpm.uberinternal.com/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://unpm.uberinternal.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://unpm.uberinternal.com/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4", - "object-keys": "1.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://unpm.uberinternal.com/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://unpm.uberinternal.com/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://unpm.uberinternal.com/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://unpm.uberinternal.com/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-regexp-component": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz", - "integrity": "sha1-nGO20LJf8qiMOtvRjFthrMO5+qI=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://unpm.uberinternal.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escope": { - "version": "3.6.0", - "resolved": "https://unpm.uberinternal.com/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.3", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://unpm.uberinternal.com/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.2", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.2.6", - "doctrine": "2.1.0", - "eslint-scope": "3.7.3", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.4", - "globals": "11.12.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.13.1", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.3", - "regexpp": "1.1.0", - "require-uncached": "1.0.3", - "semver": "5.7.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.2" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "globals": { - "version": "11.12.0", - "resolved": "https://unpm.uberinternal.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://unpm.uberinternal.com/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "2.10.0", - "resolved": "https://unpm.uberinternal.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", - "integrity": "sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==", - "requires": { - "get-stdin": "5.0.1" - } - }, - "eslint-config-uber-es2015": { - "version": "3.1.2", - "resolved": "https://unpm.uberinternal.com/eslint-config-uber-es2015/-/eslint-config-uber-es2015-3.1.2.tgz", - "integrity": "sha1-d6zYgAFB913emXqHu0UeNJCwflQ=", - "requires": { - "eslint-config-uber-es5": "2.0.3" - } - }, - "eslint-config-uber-es5": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/eslint-config-uber-es5/-/eslint-config-uber-es5-2.0.3.tgz", - "integrity": "sha512-lHdjmCumgT72R6t4ZAvjErmOB1l9d6fg1IoX+MZ11F/7CFLMinmsMQW/r9aFWKPMdTkP+rR5NBpSTDnRE20oEw==" - }, - "eslint-config-uber-jsx": { - "version": "3.3.3", - "resolved": "https://unpm.uberinternal.com/eslint-config-uber-jsx/-/eslint-config-uber-jsx-3.3.3.tgz", - "integrity": "sha1-mC2457w9AEUXwN8pjzfKkNAr0TI=", - "requires": { - "eslint-config-uber-es5": "2.0.3", - "eslint-plugin-react": "6.10.3" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://unpm.uberinternal.com/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "eslint-plugin-react": { - "version": "6.10.3", - "resolved": "https://unpm.uberinternal.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", - "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", - "requires": { - "array.prototype.find": "2.1.0", - "doctrine": "1.5.0", - "has": "1.0.3", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.1.0" - } - } - } - }, - "eslint-plugin-babel": { - "version": "4.1.2", - "resolved": "https://unpm.uberinternal.com/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz", - "integrity": "sha1-eSAqDjV1fdkngJGbIzbx+i/lPB4=" - }, - "eslint-plugin-react": { - "version": "7.14.2", - "resolved": "https://unpm.uberinternal.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz", - "integrity": "sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA==", - "requires": { - "array-includes": "3.0.3", - "doctrine": "2.1.0", - "has": "1.0.3", - "jsx-ast-utils": "2.2.0", - "object.entries": "1.1.0", - "object.fromentries": "2.0.0", - "object.values": "1.1.0", - "prop-types": "15.7.2", - "resolve": "1.11.1" - }, - "dependencies": { - "jsx-ast-utils": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/jsx-ast-utils/-/jsx-ast-utils-2.2.0.tgz", - "integrity": "sha512-yAmhGSzR7TsD0OQpu1AGLz8Bx84cxMqtgoJrufomY6BlveEDlREhvu1rea21936xbe5tlUh7IPda82m5ae0H8Q==", - "requires": { - "array-includes": "3.0.3", - "object.assign": "4.1.0" - } - } - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://unpm.uberinternal.com/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" - }, - "espree": { - "version": "3.5.4", - "resolved": "https://unpm.uberinternal.com/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "requires": { - "acorn": "5.7.3", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://unpm.uberinternal.com/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://unpm.uberinternal.com/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://unpm.uberinternal.com/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://unpm.uberinternal.com/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://unpm.uberinternal.com/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1.0.1", - "es5-ext": "0.10.50" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://unpm.uberinternal.com/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://unpm.uberinternal.com/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "requires": { - "original": "1.0.2" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://unpm.uberinternal.com/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://unpm.uberinternal.com/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://unpm.uberinternal.com/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.5", - "qs": "6.7.0", - "range-parser": "1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "type-is": "1.6.18", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://unpm.uberinternal.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "requires": { - "async": "2.6.2", - "loader-utils": "1.2.3", - "schema-utils": "0.3.0", - "webpack-sources": "1.3.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://unpm.uberinternal.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://unpm.uberinternal.com/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": "0.7.3" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://unpm.uberinternal.com/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.20" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://unpm.uberinternal.com/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "requires": { - "flat-cache": "1.3.4", - "object-assign": "4.1.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://unpm.uberinternal.com/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "requires": { - "loader-utils": "1.2.3", - "schema-utils": "0.4.7" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://unpm.uberinternal.com/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "6.10.0", - "ajv-keywords": "3.4.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "statuses": "1.5.0", - "unpipe": "1.0.0" - } - }, - "find-babel-config": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/find-babel-config/-/find-babel-config-1.2.0.tgz", - "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", - "requires": { - "json5": "0.5.1", - "path-exists": "3.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://unpm.uberinternal.com/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "requires": { - "circular-json": "0.3.3", - "graceful-fs": "4.2.0", - "rimraf": "2.6.3", - "write": "0.2.1" - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" - } - }, - "follow-redirects": { - "version": "1.7.0", - "resolved": "https://unpm.uberinternal.com/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "requires": { - "debug": "3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://unpm.uberinternal.com/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://unpm.uberinternal.com/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://unpm.uberinternal.com/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://unpm.uberinternal.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "4.2.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://unpm.uberinternal.com/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "optional": true, - "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "optional": true, - "requires": { - "ms": "2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "optional": true, - "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "optional": true, - "requires": { - "glob": "7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "optional": true, - "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://unpm.uberinternal.com/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "4.2.0", - "inherits": "2.0.4", - "mkdirp": "0.5.1", - "rimraf": "2.6.3" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://unpm.uberinternal.com/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "1.2.1" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://unpm.uberinternal.com/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://unpm.uberinternal.com/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://unpm.uberinternal.com/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://unpm.uberinternal.com/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "2.19.0", - "process": "0.11.10" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://unpm.uberinternal.com/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "globby": { - "version": "7.1.1", - "resolved": "https://unpm.uberinternal.com/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "glob": "7.1.4", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://unpm.uberinternal.com/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "requires": { - "glob": "7.1.4", - "lodash": "4.17.11", - "minimatch": "3.0.4" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://unpm.uberinternal.com/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "optional": true, - "requires": { - "delegate": "3.2.0" - } - }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://unpm.uberinternal.com/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://unpm.uberinternal.com/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "6.10.0", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://unpm.uberinternal.com/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://unpm.uberinternal.com/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "history": { - "version": "4.9.0", - "resolved": "https://unpm.uberinternal.com/history/-/history-4.9.0.tgz", - "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", - "requires": { - "@babel/runtime": "7.4.5", - "loose-envify": "1.4.0", - "resolve-pathname": "2.2.0", - "tiny-invariant": "1.0.4", - "tiny-warning": "1.0.2", - "value-equal": "0.4.0" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://unpm.uberinternal.com/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://unpm.uberinternal.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://unpm.uberinternal.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://unpm.uberinternal.com/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "2.0.4", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" - } - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://unpm.uberinternal.com/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://unpm.uberinternal.com/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.1", - "commander": "2.17.1", - "he": "1.2.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.10" - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://unpm.uberinternal.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "requires": { - "bluebird": "3.5.5", - "html-minifier": "3.5.21", - "loader-utils": "0.2.17", - "lodash": "4.17.11", - "pretty-error": "2.1.1", - "toposort": "1.0.7" - } - }, - "html-webpack-template": { - "version": "5.6.2", - "resolved": "https://unpm.uberinternal.com/html-webpack-template/-/html-webpack-template-5.6.2.tgz", - "integrity": "sha1-CYDfKiXjbPioXXSV4joOACl0tqI=" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://unpm.uberinternal.com/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.2", - "inherits": "2.0.4", - "readable-stream": "3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://unpm.uberinternal.com/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://unpm.uberinternal.com/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://unpm.uberinternal.com/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://unpm.uberinternal.com/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "requires": { - "eventemitter3": "3.1.2", - "follow-redirects": "1.7.0", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://unpm.uberinternal.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "requires": { - "http-proxy": "1.17.0", - "is-glob": "4.0.1", - "lodash": "4.17.11", - "micromatch": "3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://unpm.uberinternal.com/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "6.0.23" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://unpm.uberinternal.com/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://unpm.uberinternal.com/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://unpm.uberinternal.com/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://unpm.uberinternal.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://unpm.uberinternal.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://unpm.uberinternal.com/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.11", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "requires": { - "meow": "3.7.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://unpm.uberinternal.com/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "1.4.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://unpm.uberinternal.com/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://unpm.uberinternal.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "1.13.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://unpm.uberinternal.com/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://unpm.uberinternal.com/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "1.0.3" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "1.1.2" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://unpm.uberinternal.com/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://unpm.uberinternal.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.4" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://unpm.uberinternal.com/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://unpm.uberinternal.com/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://unpm.uberinternal.com/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://unpm.uberinternal.com/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://unpm.uberinternal.com/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://unpm.uberinternal.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://unpm.uberinternal.com/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" - }, - "just-curry-it": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/just-curry-it/-/just-curry-it-3.1.0.tgz", - "integrity": "sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg==" - }, - "killable": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.2.0", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://unpm.uberinternal.com/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://unpm.uberinternal.com/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash-es": { - "version": "4.17.11", - "resolved": "https://unpm.uberinternal.com/lodash-es/-/lodash-es-4.17.11.tgz", - "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://unpm.uberinternal.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://unpm.uberinternal.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://unpm.uberinternal.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://unpm.uberinternal.com/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://unpm.uberinternal.com/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://unpm.uberinternal.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loglevel": { - "version": "1.6.3", - "resolved": "https://unpm.uberinternal.com/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://unpm.uberinternal.com/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://unpm.uberinternal.com/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://unpm.uberinternal.com/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://unpm.uberinternal.com/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "1.0.1" - } - }, - "marked": { - "version": "0.3.19", - "resolved": "https://unpm.uberinternal.com/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://unpm.uberinternal.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://unpm.uberinternal.com/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://unpm.uberinternal.com/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://unpm.uberinternal.com/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.5.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://unpm.uberinternal.com/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.3.6", - "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://unpm.uberinternal.com/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://unpm.uberinternal.com/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://unpm.uberinternal.com/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://unpm.uberinternal.com/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://unpm.uberinternal.com/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://unpm.uberinternal.com/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.3", - "run-queue": "1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://unpm.uberinternal.com/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.3" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://unpm.uberinternal.com/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://unpm.uberinternal.com/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://unpm.uberinternal.com/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://unpm.uberinternal.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://unpm.uberinternal.com/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://unpm.uberinternal.com/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://unpm.uberinternal.com/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "1.1.4" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://unpm.uberinternal.com/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://unpm.uberinternal.com/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://unpm.uberinternal.com/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "requires": { - "fstream": "1.0.12", - "glob": "7.1.4", - "graceful-fs": "4.2.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.88.0", - "rimraf": "2.6.3", - "semver": "5.3.0", - "tar": "2.2.2", - "which": "1.3.1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://unpm.uberinternal.com/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://unpm.uberinternal.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "1.5.0", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.0.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.1", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.11.1", - "vm-browserify": "1.1.0" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "node-sass": { - "version": "4.12.0", - "resolved": "https://unpm.uberinternal.com/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.4", - "in-publish": "2.0.0", - "lodash": "4.17.11", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.14.0", - "node-gyp": "3.8.0", - "npmlog": "4.1.2", - "request": "2.88.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.1", - "true-case-path": "1.0.3" - }, - "dependencies": { - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://unpm.uberinternal.com/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "4.1.5", - "which": "1.3.1" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://unpm.uberinternal.com/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://unpm.uberinternal.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "2.7.1", - "resolve": "1.11.1", - "semver": "5.7.0", - "validate-npm-package-license": "3.0.4" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://unpm.uberinternal.com/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://unpm.uberinternal.com/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://unpm.uberinternal.com/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://unpm.uberinternal.com/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://unpm.uberinternal.com/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://unpm.uberinternal.com/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://unpm.uberinternal.com/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "3.0.1" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://unpm.uberinternal.com/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.1.1" - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0", - "function-bind": "1.1.1", - "has": "1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/object.fromentries/-/object.fromentries-2.0.0.tgz", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0", - "function-bind": "1.1.1", - "has": "1.0.3" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "3.0.1" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0", - "function-bind": "1.1.1", - "has": "1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "ocular": { - "version": "0.5.5", - "resolved": "https://unpm.uberinternal.com/ocular/-/ocular-0.5.5.tgz", - "integrity": "sha512-MxLQCQ+Ee2piHF1Z4xgKlANx8CZE2tKFStvmYDWLxVetxMm67dHmG6PMcDYyH2pk+Ej/i1Cjz4x+6a9SuB4Ztw==", - "requires": { - "autoprefixer-loader": "3.2.0", - "babel-core": "6.26.3", - "babel-eslint": "7.2.3", - "babel-loader": "7.1.5", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-module-resolver": "2.7.1", - "babel-plugin-transform-decorators-legacy": "1.3.5", - "babel-polyfill": "6.26.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-react": "6.24.1", - "babel-preset-stage-2": "6.24.1", - "classnames": "2.2.6", - "copy-webpack-plugin": "4.6.0", - "css-loader": "0.28.11", - "csv-loader": "2.1.1", - "d3-color": "1.2.6", - "deepmerge": "1.5.2", - "eslint": "4.19.1", - "eslint-config-prettier": "2.10.0", - "eslint-config-uber-es2015": "3.1.2", - "eslint-config-uber-jsx": "3.3.3", - "eslint-plugin-babel": "4.1.2", - "eslint-plugin-react": "7.14.2", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.11", - "hoek": "4.2.1", - "html-webpack-plugin": "2.30.1", - "html-webpack-template": "5.6.2", - "inquirer": "3.3.0", - "lodash.debounce": "4.0.8", - "marked": "0.3.19", - "node-sass": "4.12.0", - "offline-plugin": "4.9.1", - "prismjs": "1.16.0", - "progress-bar-webpack-plugin": "1.12.1", - "raw-loader": "0.5.1", - "react": "15.6.2", - "react-dom": "15.6.2", - "react-ga": "2.6.0", - "react-hot-loader": "4.5.3", - "react-icons": "2.2.7", - "react-redux": "5.1.1", - "react-router": "4.3.1", - "react-router-dom": "4.3.1", - "react-router-redux": "5.0.0-alpha.9", - "redux": "3.7.2", - "redux-actions": "2.6.5", - "redux-thunk": "2.3.0", - "sass-loader": "6.0.7", - "slug": "0.9.4", - "style-loader": "0.18.2", - "to-case": "2.0.0", - "url-loader": "0.5.9", - "webpack": "3.12.0", - "webpack-dev-server": "2.11.5", - "webpack-hot-middleware": "2.25.0", - "whatwg-fetch": "2.0.4" - } - }, - "offline-plugin": { - "version": "4.9.1", - "resolved": "https://unpm.uberinternal.com/offline-plugin/-/offline-plugin-4.9.1.tgz", - "integrity": "sha1-6Xpr4xGLTcNg4G7UvEc/EPLec7Y=", - "requires": { - "deep-extend": "0.4.2", - "ejs": "2.6.2", - "loader-utils": "0.2.17", - "minimatch": "3.0.4", - "slash": "1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://unpm.uberinternal.com/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "1.1.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://unpm.uberinternal.com/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "1.4.7" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://unpm.uberinternal.com/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://unpm.uberinternal.com/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.3.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://unpm.uberinternal.com/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" - }, - "papaparse": { - "version": "4.6.3", - "resolved": "https://unpm.uberinternal.com/papaparse/-/papaparse-4.6.3.tgz", - "integrity": "sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ==" - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.4", - "readable-stream": "2.3.6" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "requires": { - "no-case": "2.3.2" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://unpm.uberinternal.com/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.1.2" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.2" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://unpm.uberinternal.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://unpm.uberinternal.com/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://unpm.uberinternal.com/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://unpm.uberinternal.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://unpm.uberinternal.com/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "3.0.0" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://unpm.uberinternal.com/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://unpm.uberinternal.com/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://unpm.uberinternal.com/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://unpm.uberinternal.com/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "1.1.3", - "js-base64": "2.5.1", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://unpm.uberinternal.com/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://unpm.uberinternal.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://unpm.uberinternal.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://unpm.uberinternal.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://unpm.uberinternal.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://unpm.uberinternal.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.3" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://unpm.uberinternal.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://unpm.uberinternal.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://unpm.uberinternal.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://unpm.uberinternal.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "requires": { - "postcss": "6.0.23" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.23" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://unpm.uberinternal.com/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://unpm.uberinternal.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://unpm.uberinternal.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://unpm.uberinternal.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-safe-parser": { - "version": "1.0.7", - "resolved": "https://unpm.uberinternal.com/postcss-safe-parser/-/postcss-safe-parser-1.0.7.tgz", - "integrity": "sha1-Q70MjITV99hHTeglxpnk2ryscqg=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://unpm.uberinternal.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://unpm.uberinternal.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "svgo": "0.7.2" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://unpm.uberinternal.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "requires": { - "renderkid": "2.0.3", - "utila": "0.4.0" - } - }, - "prismjs": { - "version": "1.16.0", - "resolved": "https://unpm.uberinternal.com/prismjs/-/prismjs-1.16.0.tgz", - "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", - "requires": { - "clipboard": "2.0.4" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://unpm.uberinternal.com/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://unpm.uberinternal.com/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "progress-bar-webpack-plugin": { - "version": "1.12.1", - "resolved": "https://unpm.uberinternal.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.12.1.tgz", - "integrity": "sha512-tVbPB5xBbqNwdH3mwcxzjL1r1Vrm/xGu93OsqVSAbCaXGoKFvfWIh0gpMDpn2kYsPVRSAIK0pBkP9Vfs+JJibQ==", - "requires": { - "chalk": "1.1.3", - "object.assign": "4.1.0", - "progress": "1.1.8" - }, - "dependencies": { - "progress": { - "version": "1.1.8", - "resolved": "https://unpm.uberinternal.com/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - } - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://unpm.uberinternal.com/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "2.0.6" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://unpm.uberinternal.com/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "react-is": "16.8.6" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://unpm.uberinternal.com/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.1.33", - "resolved": "https://unpm.uberinternal.com/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://unpm.uberinternal.com/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.4", - "randombytes": "2.1.0", - "safe-buffer": "5.1.2" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://unpm.uberinternal.com/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.4", - "pump": "2.0.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://unpm.uberinternal.com/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://unpm.uberinternal.com/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://unpm.uberinternal.com/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "2.1.0", - "safe-buffer": "5.1.2" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://unpm.uberinternal.com/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://unpm.uberinternal.com/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://unpm.uberinternal.com/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" - }, - "react": { - "version": "15.6.2", - "resolved": "https://unpm.uberinternal.com/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "requires": { - "create-react-class": "15.6.3", - "fbjs": "0.8.17", - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.7.2" - } - }, - "react-dom": { - "version": "15.6.2", - "resolved": "https://unpm.uberinternal.com/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "0.8.17", - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.7.2" - } - }, - "react-ga": { - "version": "2.6.0", - "resolved": "https://unpm.uberinternal.com/react-ga/-/react-ga-2.6.0.tgz", - "integrity": "sha512-GWHBWZDFjDGMkIk1LzroIn0mNTygKw3adXuqvGvheFZvlbpqMPbHsQsTdQBIxRRdXGQM/Zq+dQLRPKbwIHMTaw==" - }, - "react-hot-loader": { - "version": "4.5.3", - "resolved": "https://unpm.uberinternal.com/react-hot-loader/-/react-hot-loader-4.5.3.tgz", - "integrity": "sha512-3meh550Cagzdqaci2R0wdCYDNy5hZFF4/ej2iiOXjRX5BRI30kTNJtzDFdXXIqipIjLhEPUpPLSsdR16ExDzfA==", - "requires": { - "fast-levenshtein": "2.0.6", - "global": "4.4.0", - "hoist-non-react-statics": "2.5.5", - "loader-utils": "1.2.3", - "lodash.merge": "4.6.1", - "prop-types": "15.7.2", - "react-lifecycles-compat": "3.0.4", - "shallowequal": "1.1.0", - "source-map": "0.7.3" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "react-icon-base": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/react-icon-base/-/react-icon-base-2.1.0.tgz", - "integrity": "sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50=" - }, - "react-icons": { - "version": "2.2.7", - "resolved": "https://unpm.uberinternal.com/react-icons/-/react-icons-2.2.7.tgz", - "integrity": "sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg==", - "requires": { - "react-icon-base": "2.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://unpm.uberinternal.com/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://unpm.uberinternal.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-redux": { - "version": "5.1.1", - "resolved": "https://unpm.uberinternal.com/react-redux/-/react-redux-5.1.1.tgz", - "integrity": "sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg==", - "requires": { - "@babel/runtime": "7.4.5", - "hoist-non-react-statics": "3.3.0", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-is": "16.8.6", - "react-lifecycles-compat": "3.0.4" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://unpm.uberinternal.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "16.8.6" - } - } - } - }, - "react-router": { - "version": "4.3.1", - "resolved": "https://unpm.uberinternal.com/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "4.9.0", - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "path-to-regexp": "1.7.0", - "prop-types": "15.7.2", - "warning": "4.0.3" - } - }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://unpm.uberinternal.com/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "requires": { - "history": "4.9.0", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-router": "4.3.1", - "warning": "4.0.3" - } - }, - "react-router-redux": { - "version": "5.0.0-alpha.9", - "resolved": "https://unpm.uberinternal.com/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz", - "integrity": "sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==", - "requires": { - "history": "4.9.0", - "prop-types": "15.7.2", - "react-router": "4.3.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://unpm.uberinternal.com/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "4.2.0", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-reducers": { - "version": "0.4.3", - "resolved": "https://unpm.uberinternal.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz", - "integrity": "sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw==" - }, - "redux": { - "version": "3.7.2", - "resolved": "https://unpm.uberinternal.com/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "4.17.11", - "lodash-es": "4.17.11", - "loose-envify": "1.4.0", - "symbol-observable": "1.2.0" - } - }, - "redux-actions": { - "version": "2.6.5", - "resolved": "https://unpm.uberinternal.com/redux-actions/-/redux-actions-2.6.5.tgz", - "integrity": "sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw==", - "requires": { - "invariant": "2.2.4", - "just-curry-it": "3.1.0", - "loose-envify": "1.4.0", - "reduce-reducers": "0.4.3", - "to-camel-case": "1.0.0" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://unpm.uberinternal.com/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://unpm.uberinternal.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://unpm.uberinternal.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://unpm.uberinternal.com/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://unpm.uberinternal.com/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://unpm.uberinternal.com/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.2.0", - "htmlparser2": "3.10.1", - "strip-ansi": "3.0.1", - "utila": "0.4.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://unpm.uberinternal.com/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://unpm.uberinternal.com/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://unpm.uberinternal.com/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "requires": { - "path-parse": "1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://unpm.uberinternal.com/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://unpm.uberinternal.com/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://unpm.uberinternal.com/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "7.1.4" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "1.2.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://unpm.uberinternal.com/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://unpm.uberinternal.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "4.0.8" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://unpm.uberinternal.com/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "0.1.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://unpm.uberinternal.com/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "requires": { - "glob": "7.1.4", - "lodash": "4.17.11", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - } - }, - "sass-loader": { - "version": "6.0.7", - "resolved": "https://unpm.uberinternal.com/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", - "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.2.3", - "lodash.tail": "4.1.1", - "neo-async": "2.6.1", - "pify": "3.0.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://unpm.uberinternal.com/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "requires": { - "ajv": "5.5.2" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://unpm.uberinternal.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "2.5.1", - "source-map": "0.4.4" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "optional": true - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://unpm.uberinternal.com/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://unpm.uberinternal.com/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://unpm.uberinternal.com/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "2.3.0", - "range-parser": "1.2.1", - "statuses": "1.5.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://unpm.uberinternal.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://unpm.uberinternal.com/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "1.3.7", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.24", - "parseurl": "1.3.3" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://unpm.uberinternal.com/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.5.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://unpm.uberinternal.com/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://unpm.uberinternal.com/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://unpm.uberinternal.com/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" - } - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", - "requires": { - "is-extendable": "0.1.1", - "kind-of": "5.1.0", - "mixin-object": "2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "slug": { - "version": "0.9.4", - "resolved": "https://unpm.uberinternal.com/slug/-/slug-0.9.4.tgz", - "integrity": "sha512-3YHq0TeJ4+AIFbJm+4UWSQs5A1mmeWOTQqydW3OoPmQfNKxlO96NDRTIrp+TBkmvEsEFrd+Z/LXw8OD/6OlZ5g==", - "requires": { - "unicode": "11.0.1" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://unpm.uberinternal.com/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://unpm.uberinternal.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://unpm.uberinternal.com/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.2" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://unpm.uberinternal.com/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.3", - "inherits": "2.0.4", - "json3": "3.3.3", - "url-parse": "1.4.7" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://unpm.uberinternal.com/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "requires": { - "websocket-driver": "0.7.3" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://unpm.uberinternal.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://unpm.uberinternal.com/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "0.5.7" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://unpm.uberinternal.com/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.4" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.4" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://unpm.uberinternal.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" - }, - "spdy": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", - "requires": { - "debug": "4.1.1", - "handle-thing": "2.0.0", - "http-deceiver": "1.2.7", - "select-hose": "2.0.0", - "spdy-transport": "3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "4.1.1", - "detect-node": "2.0.4", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "3.4.0", - "wbuf": "1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://unpm.uberinternal.com/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://unpm.uberinternal.com/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "3.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://unpm.uberinternal.com/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://unpm.uberinternal.com/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://unpm.uberinternal.com/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://unpm.uberinternal.com/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://unpm.uberinternal.com/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "requires": { - "readable-stream": "2.3.6" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://unpm.uberinternal.com/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-loader": { - "version": "0.18.2", - "resolved": "https://unpm.uberinternal.com/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", - "requires": { - "loader-utils": "1.2.3", - "schema-utils": "0.3.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://unpm.uberinternal.com/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "table": { - "version": "4.0.2", - "resolved": "https://unpm.uberinternal.com/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.4.2", - "lodash": "4.17.11", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "tapable": { - "version": "0.2.9", - "resolved": "https://unpm.uberinternal.com/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" - }, - "tar": { - "version": "2.2.2", - "resolved": "https://unpm.uberinternal.com/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.12", - "inherits": "2.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://unpm.uberinternal.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://unpm.uberinternal.com/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://unpm.uberinternal.com/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" - }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://unpm.uberinternal.com/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==" - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://unpm.uberinternal.com/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "requires": { - "setimmediate": "1.0.5" - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "optional": true - }, - "tiny-invariant": { - "version": "1.0.4", - "resolved": "https://unpm.uberinternal.com/tiny-invariant/-/tiny-invariant-1.0.4.tgz", - "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" - }, - "tiny-warning": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/tiny-warning/-/tiny-warning-1.0.2.tgz", - "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" - }, - "title-case-minors": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/title-case-minors/-/title-case-minors-1.0.0.tgz", - "integrity": "sha1-UfFwN8KUdHodHNpCS1AEyG2OsRU=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://unpm.uberinternal.com/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-camel-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-camel-case/-/to-camel-case-1.0.0.tgz", - "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-capital-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-capital-case/-/to-capital-case-1.0.0.tgz", - "integrity": "sha1-pXxQFP1aNyF88FCZ/4pCG7+cm38=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-case": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/to-case/-/to-case-2.0.0.tgz", - "integrity": "sha1-aQHtkM2/rb96FtBol7+0Evo8Dwo=", - "requires": { - "to-camel-case": "1.0.0", - "to-capital-case": "1.0.0", - "to-constant-case": "1.0.0", - "to-dot-case": "1.0.0", - "to-no-case": "1.0.2", - "to-pascal-case": "1.0.0", - "to-sentence-case": "1.0.0", - "to-slug-case": "1.0.0", - "to-snake-case": "1.0.0", - "to-space-case": "1.0.0", - "to-title-case": "1.0.0" - } - }, - "to-constant-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-constant-case/-/to-constant-case-1.0.0.tgz", - "integrity": "sha1-Y/UnKbAOhRiL5+DjYXieXquqCBs=", - "requires": { - "to-snake-case": "1.0.0" - } - }, - "to-dot-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-dot-case/-/to-dot-case-1.0.0.tgz", - "integrity": "sha1-5ojxGjybpRHqwN0PASyVzJMW7Ds=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-no-case": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://unpm.uberinternal.com/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "to-pascal-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-pascal-case/-/to-pascal-case-1.0.0.tgz", - "integrity": "sha1-C73I30SIhroBU15UMycEjQqhzng=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://unpm.uberinternal.com/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://unpm.uberinternal.com/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } - }, - "to-sentence-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-sentence-case/-/to-sentence-case-1.0.0.tgz", - "integrity": "sha1-xIO/NkdzflxzjvcAb+Ng1fmcVy4=", - "requires": { - "to-no-case": "1.0.2" - } - }, - "to-slug-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-slug-case/-/to-slug-case-1.0.0.tgz", - "integrity": "sha1-kqzeU0cQVaM8gwcZ6Ot4OHIG2BM=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-snake-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-snake-case/-/to-snake-case-1.0.0.tgz", - "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", - "requires": { - "to-space-case": "1.0.0" - } - }, - "to-space-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "requires": { - "to-no-case": "1.0.2" - } - }, - "to-title-case": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/to-title-case/-/to-title-case-1.0.0.tgz", - "integrity": "sha1-rKiPidYGTeUBCKl86g20SCfoAGE=", - "requires": { - "escape-regexp-component": "1.0.2", - "title-case-minors": "1.0.0", - "to-capital-case": "1.0.0", - "to-sentence-case": "1.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://unpm.uberinternal.com/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://unpm.uberinternal.com/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "1.1.33", - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "requires": { - "glob": "7.1.4" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://unpm.uberinternal.com/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://unpm.uberinternal.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://unpm.uberinternal.com/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://unpm.uberinternal.com/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://unpm.uberinternal.com/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://unpm.uberinternal.com/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.20", - "resolved": "https://unpm.uberinternal.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://unpm.uberinternal.com/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "requires": { - "commander": "2.19.0", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://unpm.uberinternal.com/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://unpm.uberinternal.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.3.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://unpm.uberinternal.com/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "unicode": { - "version": "11.0.1", - "resolved": "https://unpm.uberinternal.com/unicode/-/unicode-11.0.1.tgz", - "integrity": "sha512-+cHtykLb+eF1yrSLWTwcYBrqJkTfX7Quoyg7Juhe6uylF43ZbMdxMuSHNYlnyLT8T7POAvavgBthzUF9AIaQvQ==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://unpm.uberinternal.com/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "2.0.2" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://unpm.uberinternal.com/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://unpm.uberinternal.com/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://unpm.uberinternal.com/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://unpm.uberinternal.com/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "2.1.1" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://unpm.uberinternal.com/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://unpm.uberinternal.com/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://unpm.uberinternal.com/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "0.5.9", - "resolved": "https://unpm.uberinternal.com/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", - "requires": { - "loader-utils": "1.2.3", - "mime": "1.3.6" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://unpm.uberinternal.com/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "requires": { - "querystringify": "2.1.1", - "requires-port": "1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://unpm.uberinternal.com/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.11.1", - "resolved": "https://unpm.uberinternal.com/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://unpm.uberinternal.com/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://unpm.uberinternal.com/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://unpm.uberinternal.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" - } - }, - "value-equal": { - "version": "0.4.0", - "resolved": "https://unpm.uberinternal.com/value-equal/-/value-equal-0.4.0.tgz", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://unpm.uberinternal.com/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.3", - "resolved": "https://unpm.uberinternal.com/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://unpm.uberinternal.com/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://unpm.uberinternal.com/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" - }, - "warning": { - "version": "4.0.3", - "resolved": "https://unpm.uberinternal.com/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "1.4.0" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "requires": { - "chokidar": "2.1.6", - "graceful-fs": "4.2.0", - "neo-async": "2.6.1" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://unpm.uberinternal.com/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "1.0.1" - } - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://unpm.uberinternal.com/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "requires": { - "acorn": "5.7.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.10.0", - "ajv-keywords": "3.4.0", - "async": "2.6.2", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.2.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.4.0", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.2.1", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.9", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0", - "yargs": "8.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://unpm.uberinternal.com/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://unpm.uberinternal.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://unpm.uberinternal.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://unpm.uberinternal.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://unpm.uberinternal.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "4.2.0", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://unpm.uberinternal.com/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://unpm.uberinternal.com/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.5.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://unpm.uberinternal.com/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://unpm.uberinternal.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.1", - "time-stamp": "2.2.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } - } - }, - "webpack-dev-server": { - "version": "2.11.5", - "resolved": "https://unpm.uberinternal.com/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", - "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", - "requires": { - "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "2.1.6", - "compression": "1.7.4", - "connect-history-api-fallback": "1.6.0", - "debug": "3.2.6", - "del": "3.0.0", - "express": "4.17.1", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "1.0.0", - "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.1", - "loglevel": "1.6.3", - "opn": "5.5.0", - "portfinder": "1.0.20", - "selfsigned": "1.10.4", - "serve-index": "1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "4.0.0", - "strip-ansi": "3.0.1", - "supports-color": "5.5.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://unpm.uberinternal.com/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.2" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://unpm.uberinternal.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", - "requires": { - "ansi-html": "0.0.7", - "html-entities": "1.2.1", - "querystring": "0.2.0", - "strip-ansi": "3.0.1" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://unpm.uberinternal.com/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://unpm.uberinternal.com/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "requires": { - "http-parser-js": "0.4.10", - "safe-buffer": "5.1.2", - "websocket-extensions": "0.1.3" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://unpm.uberinternal.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://unpm.uberinternal.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://unpm.uberinternal.com/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://unpm.uberinternal.com/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://unpm.uberinternal.com/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "2.1.1" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://unpm.uberinternal.com/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://unpm.uberinternal.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://unpm.uberinternal.com/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://unpm.uberinternal.com/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://unpm.uberinternal.com/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://unpm.uberinternal.com/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - } - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://unpm.uberinternal.com/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } - } - } -} From 88309e89582742603fd4cc51b86791bcc2c2e1ad Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Mon, 29 Jul 2019 11:58:42 +0200 Subject: [PATCH 124/771] Add H3GetCenterChild --- CHANGELOG.md | 2 ++ CMakeLists.txt | 2 ++ src/apps/testapps/testH3ToCenterChild.c | 47 +++++++++++++++++++++++++ src/h3lib/include/h3api.h.in | 9 +++++ src/h3lib/lib/h3Index.c | 25 +++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 src/apps/testapps/testH3ToCenterChild.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 66701a4d5..925fe44a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Added +- `h3ToCenterChild` function to find center child at given resolution (#263) ## [3.5.0] - 2019-07-22 ### Added diff --git a/CMakeLists.txt b/CMakeLists.txt index 619fe8512..5bf943cea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,6 +153,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testMaxH3ToChildrenSize.c src/apps/testapps/testHexRanges.c src/apps/testapps/testH3ToGeo.c + src/apps/testapps/testH3ToCenterChild.c src/apps/testapps/testH3ToChildren.c src/apps/testapps/testH3GetFaces.c src/apps/testapps/testGeoCoord.c @@ -491,6 +492,7 @@ if(BUILD_TESTING) add_h3_test(testHexRing src/apps/testapps/testHexRing.c) add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) + add_h3_test(testH3ToCenterChild src/apps/testapps/testH3ToCenterChild.c) add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) diff --git a/src/apps/testapps/testH3ToCenterChild.c b/src/apps/testapps/testH3ToCenterChild.c new file mode 100644 index 000000000..acba1e9a9 --- /dev/null +++ b/src/apps/testapps/testH3ToCenterChild.c @@ -0,0 +1,47 @@ +/* + * Copyright 2017-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "h3Index.h" +#include "test.h" + +SUITE(h3ToCenterChild) { + H3Index hex8; + GeoCoord centroid; + setH3Index(&hex8, 8, 4, 2); + H3_EXPORT(h3ToGeo)(hex8, ¢roid); + + TEST(twoStepRes) { + H3Index centerChild = H3_EXPORT(h3ToCenterChild)(hex8, 10); + H3Index geoChild = H3_EXPORT(geoToH3)(¢roid, 10); + + t_assert(centerChild == geoChild, "Found expected center child"); + } + + TEST(sameRes) { + t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 8) == hex8, + "Same resolution returns self"); + } + + TEST(invalidInputs) { + t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 6) == 0, + "Lower resolution fails"); + t_assert(H3_EXPORT(h3ToCenterChild)(hex8, -1) == 0, + "Invalid resolution fails"); + t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 16) == 0, + "Invalid resolution fails"); + } +} diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 070524dde..cb0d4f427 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -355,6 +355,15 @@ int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes); void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index *children); /** @} */ +/** @defgroup h3ToCenterChild h3ToCenterChild + * Functions for h3ToCenterChild + * @{ + */ +/** @brief returns the center child of the given hexagon at the specified + * resolution */ +H3Index H3_EXPORT(h3ToCenterChild)(H3Index h, int childRes); +/** @} */ + /** @defgroup compact compact * Functions for compact * @{ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index e942253e8..09e74f740 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -214,6 +214,31 @@ void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index* children) { } } +/** + * h3ToCenterChild produces the center child index for a given H3 index at + * the specified resolution + * + * @param h H3Index to find center child of + * @param childRes The resolution to switch to + * + * @return H3Index of the center child, or 0 if you actually asked for a parent + */ +H3Index H3_EXPORT(h3ToCenterChild)(H3Index parentH, int childRes) { + int parentRes = H3_GET_RESOLUTION(parentH); + if (childRes < parentRes) { + return H3_INVALID_INDEX; + } else if (childRes == parentRes) { + return parentH; + } else if (childRes < 0 || childRes > MAX_H3_RES) { + return H3_INVALID_INDEX; + } + H3Index childH = H3_SET_RESOLUTION(parentH, childRes); + for (int i = parentRes + 1; i <= childRes; i++) { + H3_SET_INDEX_DIGIT(childH, i, 0); + } + return childH; +} + /** * compact takes a set of hexagons all at the same resolution and compresses * them by pruning full child branches to the parent level. This is also done From 2ca6a11e09850757d535ce3da2c69470d5759e07 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 1 Aug 2019 13:08:37 +0200 Subject: [PATCH 125/771] Add getPentagonsAtRes --- CHANGELOG.md | 1 + CMakeLists.txt | 2 ++ src/apps/testapps/testPentagonsAtRes.c | 46 ++++++++++++++++++++++++++ src/h3lib/include/h3api.h.in | 11 ++++++ src/h3lib/lib/h3Index.c | 23 +++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 src/apps/testapps/testPentagonsAtRes.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 925fe44a6..0a5fef75d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added - `h3ToCenterChild` function to find center child at given resolution (#263) +- `getPentagonsAtRes` function to find pentagons at given resolution (#263) ## [3.5.0] - 2019-07-22 ### Added diff --git a/CMakeLists.txt b/CMakeLists.txt index 5bf943cea..85154b8d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testVertexGraph.c src/apps/testapps/testCompact.c src/apps/testapps/testPolyfill.c + src/apps/testapps/testPentagonsAtRes.c src/apps/testapps/testKRing.c src/apps/testapps/testH3ToGeoBoundary.c src/apps/testapps/testH3ToParent.c @@ -515,6 +516,7 @@ if(BUILD_TESTING) add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) + add_h3_test(testPentagonsAtRes src/apps/testapps/testPentagonsAtRes.c) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) diff --git a/src/apps/testapps/testPentagonsAtRes.c b/src/apps/testapps/testPentagonsAtRes.c new file mode 100644 index 000000000..3919b6315 --- /dev/null +++ b/src/apps/testapps/testPentagonsAtRes.c @@ -0,0 +1,46 @@ +/* + * Copyright 2017-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "h3api.h" +#include "test.h" + +#define PADDED_COUNT 16 + +SUITE(getPentagonsAtRes) { + TEST(allResolutions) { + int expectedCount = H3_EXPORT(pentagonIndexCount)(); + + for (int res = 0; res <= 15; res++) { + H3Index indexes[PADDED_COUNT] = {0}; + H3_EXPORT(getPentagonsAtRes)(res, indexes); + + int numFound = 0; + + for (int i = 0; i < PADDED_COUNT; i++) { + H3Index h = indexes[i]; + if (H3_EXPORT(h3IsValid)(h)) { + t_assert(h3IsPentagon(h), "only pentagons"); + t_assert(h3GetResolution(h) == res, + "only correct resolution"); + numFound++; + } + } + + t_assert(numFound == expectedCount, "exactly 12 pentagons"); + } + } +} diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index cb0d4f427..7ab622e8b 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -293,6 +293,17 @@ int H3_EXPORT(res0IndexCount)(); void H3_EXPORT(getRes0Indexes)(H3Index *out); /** @} */ +/** @defgroup getPentagonsAtRes getPentagonsAtRes + * Functions for getPentagonsAtRes + * @{ + */ +/** @brief returns the number of resolution 0 indexes */ +int H3_EXPORT(pentagonIndexCount)(); + +/** @brief generates all pentagons at the specified resolution */ +void H3_EXPORT(getPentagonsAtRes)(int res, H3Index *out); +/** @} */ + /** @defgroup h3GetResolution h3GetResolution * Functions for h3GetResolution * @{ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 09e74f740..cbae86263 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -885,6 +885,29 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { } } +/** + * pentagonIndexCount returns the number of pentagons (same at any resolution) + * + * @return int count of pentagon indexes + */ +int H3_EXPORT(pentagonIndexCount)() { return 12; } + +/** + * Generates all pentagons at the specified resolution + * + * @param res The resolution to produce pentagons at + */ +void H3_EXPORT(getPentagonsAtRes)(int res, H3Index* out) { + int i = 0; + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + if (_isBaseCellPentagon(bc)) { + H3Index pentagonH; + setH3Index(&pentagonH, res, bc, 0); + out[i++] = pentagonH; + } + } +} + /** * Returns whether or not a resolution is a Class III grid. Note that odd * resolutions are Class III and even resolutions are Class II. From 6b9d69c59420575074a6ee856e146d80f437ea03 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Thu, 1 Aug 2019 13:20:04 +0200 Subject: [PATCH 126/771] Add docs for getPentagonsAtRes and h3ToCenterChild --- docs/api/hierarchy.md | 16 ++++++++++++++++ docs/api/misc.md | 16 ++++++++++++++++ src/apps/testapps/testPentagonsAtRes.c | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/api/hierarchy.md b/docs/api/hierarchy.md index cbb365d83..538523d9d 100644 --- a/docs/api/hierarchy.md +++ b/docs/api/hierarchy.md @@ -26,6 +26,22 @@ int maxH3ToChildrenSize(H3Index h, int childRes); Returns the size of the array needed by `h3ToChildren` for these inputs. +## h3ToChildren + +``` +void h3ToChildren(H3Index h, int childRes, H3Index *children); +``` + +Populates `children` with the indexes contained by `h` at resolution `childRes`. `children` must be an array of at least size `maxH3ToChildrenSize(h, childRes)`. + +## h3ToCenterChild + +``` +H3Index h3ToCenterChild(H3Index h, int childRes); +``` + +Returns the center child (finer) index containing `h` at resolution `childRes`. + ## compact ``` diff --git a/docs/api/misc.md b/docs/api/misc.md index 6914b5943..964e326f8 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -73,3 +73,19 @@ int res0IndexCount(); ``` Number of resolution 0 **H3** indexes. + +## getPentagonsAtRes + +``` +void getPentagonsAtRes(int res, H3Index *out); +``` + +All the pentagon **H3** indexes at specified resolution. + +## pentagonIndexCount + +``` +int pentagonIndexCount(); +``` + +Number of pentagon **H3** indexes. diff --git a/src/apps/testapps/testPentagonsAtRes.c b/src/apps/testapps/testPentagonsAtRes.c index 3919b6315..6731764e9 100644 --- a/src/apps/testapps/testPentagonsAtRes.c +++ b/src/apps/testapps/testPentagonsAtRes.c @@ -33,8 +33,8 @@ SUITE(getPentagonsAtRes) { for (int i = 0; i < PADDED_COUNT; i++) { H3Index h = indexes[i]; if (H3_EXPORT(h3IsValid)(h)) { - t_assert(h3IsPentagon(h), "only pentagons"); - t_assert(h3GetResolution(h) == res, + t_assert(H3_EXPORT(h3IsPentagon(h)), "only pentagons"); + t_assert(H3_EXPORT(h3GetResolution(h)) == res, "only correct resolution"); numFound++; } From a7da07600f4f908cf62dee184d714309bb5279d6 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:07:09 +0200 Subject: [PATCH 127/771] Fix nits on center child tests --- src/apps/testapps/testH3ToCenterChild.c | 54 +++++++++++++++++-------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/apps/testapps/testH3ToCenterChild.c b/src/apps/testapps/testH3ToCenterChild.c index acba1e9a9..094a24d19 100644 --- a/src/apps/testapps/testH3ToCenterChild.c +++ b/src/apps/testapps/testH3ToCenterChild.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 Uber Technologies, Inc. + * Copyright 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,34 +14,54 @@ * limitations under the License. */ +#include #include #include "h3Index.h" #include "test.h" SUITE(h3ToCenterChild) { - H3Index hex8; - GeoCoord centroid; - setH3Index(&hex8, 8, 4, 2); - H3_EXPORT(h3ToGeo)(hex8, ¢roid); + H3Index baseHex; + GeoCoord baseCentroid; + setH3Index(&baseHex, 8, 4, 2); + H3_EXPORT(h3ToGeo)(baseHex, &baseCentroid); - TEST(twoStepRes) { - H3Index centerChild = H3_EXPORT(h3ToCenterChild)(hex8, 10); - H3Index geoChild = H3_EXPORT(geoToH3)(¢roid, 10); + TEST(propertyTests) { + for (int res = 0; res <= MAX_H3_RES - 1; res++) { + for (int childRes = res + 1; childRes <= MAX_H3_RES; childRes++) { + GeoCoord centroid; + H3Index h3Index = H3_EXPORT(geoToH3)(&baseCentroid, res); + H3_EXPORT(h3ToGeo)(h3Index, ¢roid); - t_assert(centerChild == geoChild, "Found expected center child"); + H3Index geoChild = H3_EXPORT(geoToH3)(¢roid, childRes); + H3Index centerChild = + H3_EXPORT(h3ToCenterChild)(h3Index, childRes); + + t_assert( + centerChild == geoChild, + "center child should be same as indexed centroid at child " + "resolution"); + t_assert(H3_EXPORT(h3GetResolution)(centerChild) == childRes, + "center child should have correct resolution"); + t_assert( + H3_EXPORT(h3ToParent)(centerChild, res) == h3Index, + "parent at original resolution should be initial index"); + } + } } TEST(sameRes) { - t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 8) == hex8, - "Same resolution returns self"); + int res = H3_EXPORT(h3GetResolution)(baseHex); + t_assert(H3_EXPORT(h3ToCenterChild)(baseHex, res) == baseHex, + "center child at same resolution should return self"); } TEST(invalidInputs) { - t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 6) == 0, - "Lower resolution fails"); - t_assert(H3_EXPORT(h3ToCenterChild)(hex8, -1) == 0, - "Invalid resolution fails"); - t_assert(H3_EXPORT(h3ToCenterChild)(hex8, 16) == 0, - "Invalid resolution fails"); + int res = H3_EXPORT(h3GetResolution)(baseHex); + t_assert(H3_EXPORT(h3ToCenterChild)(baseHex, res - 1) == 0, + "should fail at coarser resolution"); + t_assert(H3_EXPORT(h3ToCenterChild)(baseHex, -1) == 0, + "should fail for negative resolution"); + t_assert(H3_EXPORT(h3ToCenterChild)(baseHex, MAX_H3_RES + 1) == 0, + "should fail beyond finest resolution"); } } From 65351ca457ecd36c88372d1bc12fd7dd96c5379c Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:07:41 +0200 Subject: [PATCH 128/771] Fix nits for pentagonsAtRes tests --- src/apps/testapps/testPentagonsAtRes.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/apps/testapps/testPentagonsAtRes.c b/src/apps/testapps/testPentagonsAtRes.c index 6731764e9..a6e5590bd 100644 --- a/src/apps/testapps/testPentagonsAtRes.c +++ b/src/apps/testapps/testPentagonsAtRes.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 Uber Technologies, Inc. + * Copyright 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,26 +21,30 @@ #define PADDED_COUNT 16 SUITE(getPentagonsAtRes) { - TEST(allResolutions) { + TEST(propertyTests) { int expectedCount = H3_EXPORT(pentagonIndexCount)(); for (int res = 0; res <= 15; res++) { - H3Index indexes[PADDED_COUNT] = {0}; - H3_EXPORT(getPentagonsAtRes)(res, indexes); + H3Index h3Indexes[PADDED_COUNT] = {0}; + H3_EXPORT(getPentagonsAtRes)(res, h3Indexes); int numFound = 0; for (int i = 0; i < PADDED_COUNT; i++) { - H3Index h = indexes[i]; - if (H3_EXPORT(h3IsValid)(h)) { - t_assert(H3_EXPORT(h3IsPentagon(h)), "only pentagons"); - t_assert(H3_EXPORT(h3GetResolution(h)) == res, - "only correct resolution"); + H3Index h3Index = h3Indexes[i]; + if (h3Index) { + t_assert(H3_EXPORT(h3IsValid(h3Index)), + "index should be valid"); + t_assert(H3_EXPORT(h3IsPentagon(h3Index)), + "index should be pentagon"); + t_assert(H3_EXPORT(h3GetResolution(h3Index)) == res, + "index should have correct resolution"); numFound++; } } - t_assert(numFound == expectedCount, "exactly 12 pentagons"); + t_assert(numFound == expectedCount, + "there should be exactly 12 pentagons"); } } } From db5558e888662785834d4a594c0c2c526befbf22 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:08:25 +0200 Subject: [PATCH 129/771] Add test for resolutions beyond max to h3ToChildren tests --- src/apps/testapps/testH3ToChildren.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/apps/testapps/testH3ToChildren.c b/src/apps/testapps/testH3ToChildren.c index 6d9cb6454..65028c72f 100644 --- a/src/apps/testapps/testH3ToChildren.c +++ b/src/apps/testapps/testH3ToChildren.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,7 +109,7 @@ SUITE(h3ToChildren) { free(children); } - TEST(childResTooHigh) { + TEST(childResTooCoarse) { const int expectedCount = 0; const int paddedCount = 7; @@ -120,6 +120,18 @@ SUITE(h3ToChildren) { free(children); } + TEST(childResTooFine) { + const int expectedCount = 0; + const int paddedCount = 7; + H3Index sfHexMax = H3_EXPORT(geoToH3)(&sf, MAX_H3_RES); + + H3Index* children = calloc(paddedCount, sizeof(H3Index)); + H3_EXPORT(h3ToChildren)(sfHexMax, MAX_H3_RES + 1, children); + + verifyCountAndUniqueness(children, paddedCount, expectedCount); + free(children); + } + TEST(pentagonChildren) { H3Index pentagon; setH3Index(&pentagon, 1, 4, 0); From 94334a0fb5971521b313b83f3a98a5ab0c6e0141 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:08:43 +0200 Subject: [PATCH 130/771] Remove duplicated markdown --- docs/api/hierarchy.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/api/hierarchy.md b/docs/api/hierarchy.md index 538523d9d..480129f0e 100644 --- a/docs/api/hierarchy.md +++ b/docs/api/hierarchy.md @@ -26,14 +26,6 @@ int maxH3ToChildrenSize(H3Index h, int childRes); Returns the size of the array needed by `h3ToChildren` for these inputs. -## h3ToChildren - -``` -void h3ToChildren(H3Index h, int childRes, H3Index *children); -``` - -Populates `children` with the indexes contained by `h` at resolution `childRes`. `children` must be an array of at least size `maxH3ToChildrenSize(h, childRes)`. - ## h3ToCenterChild ``` From 7a435e1d0b6e81b6346ac89b96d05645bfad4f24 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:10:34 +0200 Subject: [PATCH 131/771] Improve naming and conditionals for h3ToCenterChild --- src/h3lib/lib/h3Index.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index cbae86263..366dd6502 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -223,20 +223,18 @@ void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index* children) { * * @return H3Index of the center child, or 0 if you actually asked for a parent */ -H3Index H3_EXPORT(h3ToCenterChild)(H3Index parentH, int childRes) { - int parentRes = H3_GET_RESOLUTION(parentH); - if (childRes < parentRes) { +H3Index H3_EXPORT(h3ToCenterChild)(H3Index h, int childRes) { + int parentRes = H3_GET_RESOLUTION(h); + if (childRes < parentRes || childRes > MAX_H3_RES) { return H3_INVALID_INDEX; } else if (childRes == parentRes) { - return parentH; - } else if (childRes < 0 || childRes > MAX_H3_RES) { - return H3_INVALID_INDEX; + return h; } - H3Index childH = H3_SET_RESOLUTION(parentH, childRes); + H3Index child = H3_SET_RESOLUTION(h, childRes); for (int i = parentRes + 1; i <= childRes; i++) { - H3_SET_INDEX_DIGIT(childH, i, 0); + H3_SET_INDEX_DIGIT(child, i, 0); } - return childH; + return child; } /** From ac223a5e70d19dc3aa50cfc9829a7fdf73366e78 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:15:11 +0200 Subject: [PATCH 132/771] Rename getPentagonsAtRes to getPentagonIndexes (similar to getRes0Indexes) --- CHANGELOG.md | 2 +- CMakeLists.txt | 4 ++-- docs/api/misc.md | 4 ++-- .../{testPentagonsAtRes.c => testPentagonIndexes.c} | 4 ++-- src/h3lib/include/h3api.h.in | 6 +++--- src/h3lib/lib/h3Index.c | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) rename src/apps/testapps/{testPentagonsAtRes.c => testPentagonIndexes.c} (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a5fef75d..caeca65b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Added - `h3ToCenterChild` function to find center child at given resolution (#263) -- `getPentagonsAtRes` function to find pentagons at given resolution (#263) +- `getPentagonIndexes` (and `pentagonIndexCount`) function to find pentagons at given resolution (#263) ## [3.5.0] - 2019-07-22 ### Added diff --git a/CMakeLists.txt b/CMakeLists.txt index 85154b8d0..c0da9034e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,7 +143,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testVertexGraph.c src/apps/testapps/testCompact.c src/apps/testapps/testPolyfill.c - src/apps/testapps/testPentagonsAtRes.c + src/apps/testapps/testPentagonIndexes.c src/apps/testapps/testKRing.c src/apps/testapps/testH3ToGeoBoundary.c src/apps/testapps/testH3ToParent.c @@ -516,7 +516,7 @@ if(BUILD_TESTING) add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) - add_h3_test(testPentagonsAtRes src/apps/testapps/testPentagonsAtRes.c) + add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) diff --git a/docs/api/misc.md b/docs/api/misc.md index 964e326f8..f4c70c03a 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -74,10 +74,10 @@ int res0IndexCount(); Number of resolution 0 **H3** indexes. -## getPentagonsAtRes +## getPentagonIndexes ``` -void getPentagonsAtRes(int res, H3Index *out); +void getPentagonIndexes(int res, H3Index *out); ``` All the pentagon **H3** indexes at specified resolution. diff --git a/src/apps/testapps/testPentagonsAtRes.c b/src/apps/testapps/testPentagonIndexes.c similarity index 94% rename from src/apps/testapps/testPentagonsAtRes.c rename to src/apps/testapps/testPentagonIndexes.c index a6e5590bd..2a6817c15 100644 --- a/src/apps/testapps/testPentagonsAtRes.c +++ b/src/apps/testapps/testPentagonIndexes.c @@ -20,13 +20,13 @@ #define PADDED_COUNT 16 -SUITE(getPentagonsAtRes) { +SUITE(getPentagonIndexes) { TEST(propertyTests) { int expectedCount = H3_EXPORT(pentagonIndexCount)(); for (int res = 0; res <= 15; res++) { H3Index h3Indexes[PADDED_COUNT] = {0}; - H3_EXPORT(getPentagonsAtRes)(res, h3Indexes); + H3_EXPORT(getPentagonIndexes)(res, h3Indexes); int numFound = 0; diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 7ab622e8b..3893be190 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -293,15 +293,15 @@ int H3_EXPORT(res0IndexCount)(); void H3_EXPORT(getRes0Indexes)(H3Index *out); /** @} */ -/** @defgroup getPentagonsAtRes getPentagonsAtRes - * Functions for getPentagonsAtRes +/** @defgroup getPentagonIndexes getPentagonIndexes + * Functions for getPentagonIndexes * @{ */ /** @brief returns the number of resolution 0 indexes */ int H3_EXPORT(pentagonIndexCount)(); /** @brief generates all pentagons at the specified resolution */ -void H3_EXPORT(getPentagonsAtRes)(int res, H3Index *out); +void H3_EXPORT(getPentagonIndexes)(int res, H3Index *out); /** @} */ /** @defgroup h3GetResolution h3GetResolution diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 366dd6502..e1bfef99c 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -895,7 +895,7 @@ int H3_EXPORT(pentagonIndexCount)() { return 12; } * * @param res The resolution to produce pentagons at */ -void H3_EXPORT(getPentagonsAtRes)(int res, H3Index* out) { +void H3_EXPORT(getPentagonIndexes)(int res, H3Index* out) { int i = 0; for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { if (_isBaseCellPentagon(bc)) { From 4f26f521f54eaa08f4f65e10fc337b5609d03296 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:41:03 +0200 Subject: [PATCH 133/771] Add (failing) uncompact tests for resolutions beyond max --- src/apps/testapps/testCompact.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index 0e0339eec..8a766c354 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -165,6 +165,10 @@ SUITE(compact) { sizeResult = H3_EXPORT(maxUncompactSize)(someHexagons, numHex, -1); t_assert(sizeResult < 0, "maxUncompactSize fails when given illegal resolutions"); + sizeResult = + H3_EXPORT(maxUncompactSize)(someHexagons, numHex, MAX_H3_RES + 1); + t_assert(sizeResult < 0, + "maxUncompactSize fails when given resolutions beyond max"); H3Index uncompressed[] = {0, 0, 0}; int uncompactResult = @@ -180,6 +184,15 @@ SUITE(compact) { t_assert( uncompactResult != 0, "uncompact fails when given too little buffer (same resolution)"); + + for (int i = 0; i < numHex; i++) { + setH3Index(&someHexagons[i], MAX_H3_RES, i, 0); + } + uncompactResult = H3_EXPORT(uncompact)( + someHexagons, numHex, uncompressed, numHex * 7, MAX_H3_RES + 1); + fprintf(stderr, "@@\n%d\n", uncompactResult); + t_assert(uncompactResult != 0, + "uncompact fails when given resolutions beyond max"); } TEST(someHexagon) { From 61a3a0272733fc40bda19f8ceef7bc56ba0cbb44 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:42:14 +0200 Subject: [PATCH 134/771] Add static helper for child res validity, use for uncompact and child functions --- src/h3lib/lib/h3Index.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index e1bfef99c..2ef631e2b 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -180,6 +180,21 @@ H3Index makeDirectChild(H3Index h, int cellNumber) { return childH; } +/** + * Determines whether a one resolution is a valid child resolution of another + * + * @param parentRes int resolution of the parent + * @param childRes int resolution of the child + * + * @return The validity of the child resolution + */ +static bool _isValidChildRes(int parentRes, int childRes) { + if (childRes < parentRes || childRes > MAX_H3_RES) { + return false; + } + return true; +} + /** * h3ToChildren takes the given hexagon id and generates all of the children * at the specified resolution storing them into the provided memory pointer. @@ -191,7 +206,7 @@ H3Index makeDirectChild(H3Index h, int cellNumber) { */ void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index* children) { int parentRes = H3_GET_RESOLUTION(h); - if (parentRes > childRes) { + if (!_isValidChildRes(parentRes, childRes)) { return; } else if (parentRes == childRes) { *children = h; @@ -225,7 +240,7 @@ void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index* children) { */ H3Index H3_EXPORT(h3ToCenterChild)(H3Index h, int childRes) { int parentRes = H3_GET_RESOLUTION(h); - if (childRes < parentRes || childRes > MAX_H3_RES) { + if (!_isValidChildRes(parentRes, childRes)) { return H3_INVALID_INDEX; } else if (childRes == parentRes) { return h; @@ -416,7 +431,7 @@ int H3_EXPORT(uncompact)(const H3Index* compactedSet, const int numHexes, return -1; } int currentRes = H3_GET_RESOLUTION(compactedSet[i]); - if (currentRes > res) { + if (!_isValidChildRes(currentRes, res)) { // Nonsensical. Abort. return -2; } @@ -454,7 +469,7 @@ int H3_EXPORT(maxUncompactSize)(const H3Index* compactedSet, const int numHexes, for (int i = 0; i < numHexes; i++) { if (compactedSet[i] == 0) continue; int currentRes = H3_GET_RESOLUTION(compactedSet[i]); - if (currentRes > res) { + if (!_isValidChildRes(currentRes, res)) { // Nonsensical. Abort. return -1; } From c0f9e186b02847b33f562f04a2a90a9744934eab Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 14:47:53 +0200 Subject: [PATCH 135/771] Fix naming and docs nits --- docs/api/hierarchy.md | 2 +- docs/api/misc.md | 6 ++++-- src/h3lib/include/h3api.h.in | 2 +- src/h3lib/lib/h3Index.c | 6 +++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/api/hierarchy.md b/docs/api/hierarchy.md index 480129f0e..0eca8264b 100644 --- a/docs/api/hierarchy.md +++ b/docs/api/hierarchy.md @@ -32,7 +32,7 @@ Returns the size of the array needed by `h3ToChildren` for these inputs. H3Index h3ToCenterChild(H3Index h, int childRes); ``` -Returns the center child (finer) index containing `h` at resolution `childRes`. +Returns the center child (finer) index contained by `h` at resolution `childRes`. ## compact diff --git a/docs/api/misc.md b/docs/api/misc.md index f4c70c03a..a4a6e801c 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -65,6 +65,7 @@ void getRes0Indexes(H3Index *out); ``` All the resolution 0 **H3** indexes. +`out` must be an array of at least size `res0IndexCount()`. ## res0IndexCount @@ -80,7 +81,8 @@ Number of resolution 0 **H3** indexes. void getPentagonIndexes(int res, H3Index *out); ``` -All the pentagon **H3** indexes at specified resolution. +All the pentagon **H3** indexes at the specified resolution. +`out` must be an array of at least size `pentagonIndexCount()`. ## pentagonIndexCount @@ -88,4 +90,4 @@ All the pentagon **H3** indexes at specified resolution. int pentagonIndexCount(); ``` -Number of pentagon **H3** indexes. +Number of pentagon **H3** indexes per resolution. diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 3893be190..9956fe858 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -297,7 +297,7 @@ void H3_EXPORT(getRes0Indexes)(H3Index *out); * Functions for getPentagonIndexes * @{ */ -/** @brief returns the number of resolution 0 indexes */ +/** @brief returns the number of pentagons per resolution */ int H3_EXPORT(pentagonIndexCount)(); /** @brief generates all pentagons at the specified resolution */ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 2ef631e2b..ff342c6f5 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -914,9 +914,9 @@ void H3_EXPORT(getPentagonIndexes)(int res, H3Index* out) { int i = 0; for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { if (_isBaseCellPentagon(bc)) { - H3Index pentagonH; - setH3Index(&pentagonH, res, bc, 0); - out[i++] = pentagonH; + H3Index pentagon; + setH3Index(&pentagon, res, bc, 0); + out[i++] = pentagon; } } } From 32858a09f7a985aa9832797108bb3deab97f0da7 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 15:00:10 +0200 Subject: [PATCH 136/771] Also check pentagons are unique in test --- src/apps/testapps/testPentagonIndexes.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/apps/testapps/testPentagonIndexes.c b/src/apps/testapps/testPentagonIndexes.c index 2a6817c15..edb5085e1 100644 --- a/src/apps/testapps/testPentagonIndexes.c +++ b/src/apps/testapps/testPentagonIndexes.c @@ -33,13 +33,22 @@ SUITE(getPentagonIndexes) { for (int i = 0; i < PADDED_COUNT; i++) { H3Index h3Index = h3Indexes[i]; if (h3Index) { + numFound++; t_assert(H3_EXPORT(h3IsValid(h3Index)), "index should be valid"); t_assert(H3_EXPORT(h3IsPentagon(h3Index)), "index should be pentagon"); t_assert(H3_EXPORT(h3GetResolution(h3Index)) == res, "index should have correct resolution"); - numFound++; + + // verify uniqueness + int indexSeen = 0; + for (int j = i + 1; j < PADDED_COUNT; j++) { + if (h3Indexes[j] == h3Index) { + indexSeen++; + } + } + t_assert(indexSeen == 0, "index should be seen only once"); } } From 26503241fedf66002140ce4bad0f69687b098b92 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 15:01:36 +0200 Subject: [PATCH 137/771] Move NUM_PENTAGONS to constants.h --- src/apps/miscapps/generateNumHexagons.c | 2 -- src/h3lib/include/constants.h | 2 ++ src/h3lib/lib/h3Index.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/miscapps/generateNumHexagons.c b/src/apps/miscapps/generateNumHexagons.c index 41326dc29..1f28a913e 100644 --- a/src/apps/miscapps/generateNumHexagons.c +++ b/src/apps/miscapps/generateNumHexagons.c @@ -28,8 +28,6 @@ #include #include "constants.h" -#define NUM_PENTAGONS 12 - /** * Generates and prints the numHexagons table. */ diff --git a/src/h3lib/include/constants.h b/src/h3lib/include/constants.h index d6ef3ae02..9328c7786 100644 --- a/src/h3lib/include/constants.h +++ b/src/h3lib/include/constants.h @@ -74,6 +74,8 @@ #define NUM_HEX_VERTS 6 /** The number of vertices in a pentagon */ #define NUM_PENT_VERTS 5 +/** The number of pentagons per resolution **/ +#define NUM_PENTAGONS 12 /** H3 index modes */ #define H3_HEXAGON_MODE 1 diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index ff342c6f5..1109e14fe 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -903,7 +903,7 @@ void H3_EXPORT(h3GetFaces)(H3Index h3, int* out) { * * @return int count of pentagon indexes */ -int H3_EXPORT(pentagonIndexCount)() { return 12; } +int H3_EXPORT(pentagonIndexCount)() { return NUM_PENTAGONS; } /** * Generates all pentagons at the specified resolution From 2b68770453fc332ed137500e49687299a002f5e5 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 15:11:39 +0200 Subject: [PATCH 138/771] Also use _isValidChildRes in maxH3ToChildrenSize --- src/h3lib/lib/h3Index.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 1109e14fe..892f75cd0 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -145,6 +145,21 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes) { return parentH; } +/** + * Determines whether a one resolution is a valid child resolution of another + * + * @param parentRes int resolution of the parent + * @param childRes int resolution of the child + * + * @return The validity of the child resolution + */ +static bool _isValidChildRes(int parentRes, int childRes) { + if (childRes < parentRes || childRes > MAX_H3_RES) { + return false; + } + return true; +} + /** * maxH3ToChildrenSize returns the maximum number of children possible for a * given child level. @@ -157,7 +172,7 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes) { */ int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes) { int parentRes = H3_GET_RESOLUTION(h); - if (parentRes > childRes) { + if (!_isValidChildRes(parentRes, childRes)) { return 0; } return _ipow(7, (childRes - parentRes)); @@ -180,21 +195,6 @@ H3Index makeDirectChild(H3Index h, int cellNumber) { return childH; } -/** - * Determines whether a one resolution is a valid child resolution of another - * - * @param parentRes int resolution of the parent - * @param childRes int resolution of the child - * - * @return The validity of the child resolution - */ -static bool _isValidChildRes(int parentRes, int childRes) { - if (childRes < parentRes || childRes > MAX_H3_RES) { - return false; - } - return true; -} - /** * h3ToChildren takes the given hexagon id and generates all of the children * at the specified resolution storing them into the provided memory pointer. From e036d6645e6a84dac1f52f021a481a23a4ea3f30 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Fri, 2 Aug 2019 15:13:36 +0200 Subject: [PATCH 139/771] Document out param for getPentagonIndexes --- src/h3lib/lib/h3Index.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 892f75cd0..72a62fd79 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -908,7 +908,8 @@ int H3_EXPORT(pentagonIndexCount)() { return NUM_PENTAGONS; } /** * Generates all pentagons at the specified resolution * - * @param res The resolution to produce pentagons at + * @param res The resolution to produce pentagons at. + * @param out Output array. Must be of size pentagonIndexCount(). */ void H3_EXPORT(getPentagonIndexes)(int res, H3Index* out) { int i = 0; From 5d9b4b6bc148513a1db8ab6e288a3ded333d04db Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 6 Aug 2019 09:58:18 +0200 Subject: [PATCH 140/771] Remove debug output --- src/apps/testapps/testCompact.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index 8a766c354..bbc811a8a 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -190,7 +190,6 @@ SUITE(compact) { } uncompactResult = H3_EXPORT(uncompact)( someHexagons, numHex, uncompressed, numHex * 7, MAX_H3_RES + 1); - fprintf(stderr, "@@\n%d\n", uncompactResult); t_assert(uncompactResult != 0, "uncompact fails when given resolutions beyond max"); } From a04cf076bc42272020d404b18a861ec9f74c6911 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 6 Aug 2019 10:00:45 +0200 Subject: [PATCH 141/771] Resolve nits --- src/apps/testapps/testPentagonIndexes.c | 3 +-- src/h3lib/lib/h3Index.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps/testapps/testPentagonIndexes.c b/src/apps/testapps/testPentagonIndexes.c index edb5085e1..5a5a77a7d 100644 --- a/src/apps/testapps/testPentagonIndexes.c +++ b/src/apps/testapps/testPentagonIndexes.c @@ -45,10 +45,9 @@ SUITE(getPentagonIndexes) { int indexSeen = 0; for (int j = i + 1; j < PADDED_COUNT; j++) { if (h3Indexes[j] == h3Index) { - indexSeen++; + t_assert(false, "index should be seen only once"); } } - t_assert(indexSeen == 0, "index should be seen only once"); } } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 72a62fd79..2b4a862fe 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -146,7 +146,7 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes) { } /** - * Determines whether a one resolution is a valid child resolution of another + * Determines whether one resolution is a valid child resolution of another * * @param parentRes int resolution of the parent * @param childRes int resolution of the child From 022c402e14d11f5faba62e7c913acdd3788ad340 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 6 Aug 2019 10:02:36 +0200 Subject: [PATCH 142/771] Docs nits --- docs/api/misc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/misc.md b/docs/api/misc.md index a4a6e801c..c607a8105 100644 --- a/docs/api/misc.md +++ b/docs/api/misc.md @@ -90,4 +90,4 @@ All the pentagon **H3** indexes at the specified resolution. int pentagonIndexCount(); ``` -Number of pentagon **H3** indexes per resolution. +Number of pentagon **H3** indexes per resolution. This is always 12, but provided as a convenience. From 713dc725fb5998bdb8db9ee9f0de76c2ed6580a7 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Tue, 6 Aug 2019 10:19:29 +0200 Subject: [PATCH 143/771] Remove unused variable --- src/apps/testapps/testPentagonIndexes.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/testapps/testPentagonIndexes.c b/src/apps/testapps/testPentagonIndexes.c index 5a5a77a7d..4826386ec 100644 --- a/src/apps/testapps/testPentagonIndexes.c +++ b/src/apps/testapps/testPentagonIndexes.c @@ -42,7 +42,6 @@ SUITE(getPentagonIndexes) { "index should have correct resolution"); // verify uniqueness - int indexSeen = 0; for (int j = i + 1; j < PADDED_COUNT; j++) { if (h3Indexes[j] == h3Index) { t_assert(false, "index should be seen only once"); From b96c369f2d2cb60cffe5c2d6cd394e15823abd1c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 6 Aug 2019 15:39:58 -0700 Subject: [PATCH 144/771] Add logo to README.md, correct text for running filters --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 220ef41bb..3f996b9e6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +H3 Logo + # H3: A Hexagonal Hierarchical Geospatial Indexing System [![Build Status](https://travis-ci.com/uber/h3.svg?branch=master)](https://travis-ci.com/uber/h3) @@ -92,8 +94,7 @@ To build the documentation website, see the [website/](./website/) directory. To get the H3 index for some location: ``` -./bin/geoToH3 10 -40.689167 -74.044444 +./bin/geoToH3 --resolution 10 --latitude 40.689167 --longitude -74.044444 ``` 10 is the H3 resolution, between 0 (coarsest) and 15 (finest). The coordinates entered are the latitude and longitude, in degrees, you want the index for (these coordinates are the Statue of Liberty). You should get an H3 index as output, like `8a2a1072b59ffff`. @@ -101,8 +102,7 @@ To get the H3 index for some location: You can then take this index and get some information about it, for example: ``` -./bin/h3ToGeoBoundary -8a2a1072b59ffff +./bin/h3ToGeoBoundary --index 8a2a1072b59ffff ``` This will produce the vertices of the hexagon at this location: @@ -122,8 +122,7 @@ This will produce the vertices of the hexagon at this location: You can get the center coordinate of the hexagon like so: ``` -./bin/h3ToGeo -8a2a1072b59ffff +./bin/h3ToGeo --index 8a2a1072b59ffff ``` This will produce some coordinate: From 4a4ad44a354c3860f922cb88a66e2c9073753ce5 Mon Sep 17 00:00:00 2001 From: Zacharias Knudsen Date: Wed, 7 Aug 2019 10:05:46 +0200 Subject: [PATCH 145/771] Note that child being the same as parent is considered valid in _isValidChildRes --- src/h3lib/lib/h3Index.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 2b4a862fe..24fab1f9a 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -146,7 +146,8 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes) { } /** - * Determines whether one resolution is a valid child resolution of another + * Determines whether one resolution is a valid child resolution of another. + * Each resolution is considered a valid child resolution of itself. * * @param parentRes int resolution of the parent * @param childRes int resolution of the child From 122b15581054354d73db20bc2398c1150eb568bf Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 25 Jul 2019 17:09:16 -0700 Subject: [PATCH 146/771] Add a test that runs Valgrind in Travis CI --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.travis.yml b/.travis.yml index c5db67596..47cf46c07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,6 +55,17 @@ matrix: - make && make coverage after_success: - coveralls --lcov-file coverage.cleaned.info --verbose + - env: NAME="Valgrind test" + compiler: gcc + addons: + apt: + packages: + - valgrind + before_script: + - cmake -DCMAKE_BUILD_TYPE=Debug -DWRAP_VALGRIND=ON . + script: + - make + - make test - env: NAME="Mac OSX (Xcode 8)" os: osx - env: NAME="binding-functions target" From b1f707dda00d628e959b67d72eef8ee30b6ecb2d Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 29 Jul 2019 09:31:36 -0700 Subject: [PATCH 147/771] Add separate "Exhaustive" tests that are excluded from Valgrind --- .travis.yml | 2 +- CMakeLists.txt | 9 + src/apps/testapps/testH3Line.c | 85 +----- src/apps/testapps/testH3LineExhaustive.c | 114 ++++++++ src/apps/testapps/testH3ToLocalIj.c | 230 +-------------- src/apps/testapps/testH3ToLocalIjExhaustive.c | 264 ++++++++++++++++++ 6 files changed, 390 insertions(+), 314 deletions(-) create mode 100644 src/apps/testapps/testH3LineExhaustive.c create mode 100644 src/apps/testapps/testH3ToLocalIjExhaustive.c diff --git a/.travis.yml b/.travis.yml index 47cf46c07..bf28946f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,7 +65,7 @@ matrix: - cmake -DCMAKE_BUILD_TYPE=Debug -DWRAP_VALGRIND=ON . script: - make - - make test + - make test-fast - env: NAME="Mac OSX (Xcode 8)" os: osx - env: NAME="binding-functions target" diff --git a/CMakeLists.txt b/CMakeLists.txt index c0da9034e..1a6c65073 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,8 +170,10 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testH3Api.c src/apps/testapps/testH3SetToLinkedGeo.c src/apps/testapps/testH3ToLocalIj.c + src/apps/testapps/testH3ToLocalIjExhaustive.c src/apps/testapps/testH3Distance.c src/apps/testapps/testH3Line.c + src/apps/testapps/testH3LineExhaustive.c src/apps/testapps/testCoordIj.c src/apps/testapps/testCoordIjk.c src/apps/miscapps/h3ToGeoBoundaryHier.c @@ -521,6 +523,13 @@ if(BUILD_TESTING) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) + + # The "Exhaustive" part of the test name is used by the Valgrind CI test to exclude + # these files in .travis.yml. + add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) + add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) + + add_custom_target(test-fast COMMAND ctest -E Exhaustive) endif() if(BUILD_BENCHMARKS) diff --git a/src/apps/testapps/testH3Line.c b/src/apps/testapps/testH3Line.c index a16d88ed4..87d1d52f8 100644 --- a/src/apps/testapps/testH3Line.c +++ b/src/apps/testapps/testH3Line.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,90 +28,7 @@ #include "test.h" #include "utility.h" -static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; - -/** - * Property-based testing of h3Line output - */ -static void h3Line_assertions(H3Index start, H3Index end) { - int sz = H3_EXPORT(h3LineSize)(start, end); - t_assert(sz > 0, "got valid size"); - H3Index *line = calloc(sz, sizeof(H3Index)); - - int err = H3_EXPORT(h3Line)(start, end, line); - - t_assert(err == 0, "no error on line"); - t_assert(line[0] == start, "line starts with start index"); - t_assert(line[sz - 1] == end, "line ends with end index"); - - for (int i = 1; i < sz; i++) { - t_assert(H3_EXPORT(h3IsValid)(line[i]), "index is valid"); - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 1]), - "index is a neighbor of the previous index"); - if (i > 1) { - t_assert( - !H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 2]), - "index is not a neighbor of the index before the previous"); - } - } - - free(line); -} - -/** - * Tests for invalid h3Line input - */ -static void h3Line_invalid_assertions(H3Index start, H3Index end) { - int sz = H3_EXPORT(h3LineSize)(start, end); - t_assert(sz < 0, "line size marked as invalid"); - - H3Index *line = {0}; - int err = H3_EXPORT(h3Line)(start, end, line); - t_assert(err != 0, "line marked as invalid"); -} - -/** - * Test for lines from an index to all neighbors within a kRing - */ -static void h3Line_kRing_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); - int maxK = MAX_DISTANCES[r]; - - int sz = H3_EXPORT(maxKringSize)(maxK); - - if (H3_EXPORT(h3IsPentagon)(h3)) { - return; - } - - H3Index *neighbors = calloc(sz, sizeof(H3Index)); - H3_EXPORT(kRing)(h3, maxK, neighbors); - - for (int i = 0; i < sz; i++) { - if (neighbors[i] == 0) { - continue; - } - int distance = H3_EXPORT(h3Distance)(h3, neighbors[i]); - if (distance >= 0) { - h3Line_assertions(h3, neighbors[i]); - } else { - h3Line_invalid_assertions(h3, neighbors[i]); - } - } - - free(neighbors); -} - SUITE(h3Line) { - TEST(h3Line_kRing) { - iterateAllIndexesAtRes(0, h3Line_kRing_assertions); - iterateAllIndexesAtRes(1, h3Line_kRing_assertions); - iterateAllIndexesAtRes(2, h3Line_kRing_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, h3Line_kRing_assertions, 6); - // Further resolutions aren't tested to save time. - } - TEST(h3Line_acrossMultipleFaces) { H3Index start = 0x85285aa7fffffff; H3Index end = 0x851d9b1bfffffff; diff --git a/src/apps/testapps/testH3LineExhaustive.c b/src/apps/testapps/testH3LineExhaustive.c new file mode 100644 index 000000000..0a5051252 --- /dev/null +++ b/src/apps/testapps/testH3LineExhaustive.c @@ -0,0 +1,114 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function using tests over a large number of indexes. + * + * usage: `testH3Distance` + */ + +#include +#include +#include +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; + +/** + * Property-based testing of h3Line output + */ +static void h3Line_assertions(H3Index start, H3Index end) { + int sz = H3_EXPORT(h3LineSize)(start, end); + t_assert(sz > 0, "got valid size"); + H3Index *line = calloc(sz, sizeof(H3Index)); + + int err = H3_EXPORT(h3Line)(start, end, line); + + t_assert(err == 0, "no error on line"); + t_assert(line[0] == start, "line starts with start index"); + t_assert(line[sz - 1] == end, "line ends with end index"); + + for (int i = 1; i < sz; i++) { + t_assert(H3_EXPORT(h3IsValid)(line[i]), "index is valid"); + t_assert(H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 1]), + "index is a neighbor of the previous index"); + if (i > 1) { + t_assert( + !H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 2]), + "index is not a neighbor of the index before the previous"); + } + } + + free(line); +} + +/** + * Tests for invalid h3Line input + */ +static void h3Line_invalid_assertions(H3Index start, H3Index end) { + int sz = H3_EXPORT(h3LineSize)(start, end); + t_assert(sz < 0, "line size marked as invalid"); + + H3Index *line = {0}; + int err = H3_EXPORT(h3Line)(start, end, line); + t_assert(err != 0, "line marked as invalid"); +} + +/** + * Test for lines from an index to all neighbors within a kRing + */ +static void h3Line_kRing_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (kRing)"); + int maxK = MAX_DISTANCES[r]; + + int sz = H3_EXPORT(maxKringSize)(maxK); + + if (H3_EXPORT(h3IsPentagon)(h3)) { + return; + } + + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + H3_EXPORT(kRing)(h3, maxK, neighbors); + + for (int i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + int distance = H3_EXPORT(h3Distance)(h3, neighbors[i]); + if (distance >= 0) { + h3Line_assertions(h3, neighbors[i]); + } else { + h3Line_invalid_assertions(h3, neighbors[i]); + } + } + + free(neighbors); +} + +SUITE(h3Line) { + TEST(h3Line_kRing) { + iterateAllIndexesAtRes(0, h3Line_kRing_assertions); + iterateAllIndexesAtRes(1, h3Line_kRing_assertions); + iterateAllIndexesAtRes(2, h3Line_kRing_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, h3Line_kRing_assertions, 6); + // Further resolutions aren't tested to save time. + } +} diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testH3ToLocalIj.c index 1d088f448..62b5e5f11 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testH3ToLocalIj.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,198 +32,6 @@ #include "test.h" #include "utility.h" -static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; - -// The same traversal constants from algos.c (for hexRange) here reused as local -// IJ vectors. -static const CoordIJ DIRECTIONS[6] = {{0, 1}, {-1, 0}, {-1, -1}, - {0, -1}, {1, 0}, {1, 1}}; - -static const CoordIJ NEXT_RING_DIRECTION = {1, 0}; - -/** - * Test that the local coordinates for an index map to itself. - */ -void localIjToH3_identity_assertions(H3Index h3) { - CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, - "able to setup localIjToH3 test"); - - H3Index retrieved; - t_assert(H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, - "got an index back from localIjTOh3"); - t_assert(h3 == retrieved, "round trip through local IJ space works"); -} - -/** - * Test that coordinates for an index match some simple rules about index - * digits, when using the index as its own origin. That is, that the IJ - * coordinates are in the coordinate space of the origin's base cell. - */ -void h3ToLocalIj_coordinates_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - - CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, - "get ij for origin"); - CoordIJK ijk; - ijToIjk(&ij, &ijk); - if (r == 0) { - t_assert(_ijkMatches(&ijk, &UNIT_VECS[0]) == 1, "res 0 cell at 0,0,0"); - } else if (r == 1) { - t_assert(_ijkMatches(&ijk, &UNIT_VECS[H3_GET_INDEX_DIGIT(h3, 1)]) == 1, - "res 1 cell at expected coordinates"); - } else if (r == 2) { - CoordIJK expected = UNIT_VECS[H3_GET_INDEX_DIGIT(h3, 1)]; - _downAp7r(&expected); - _neighbor(&expected, H3_GET_INDEX_DIGIT(h3, 2)); - t_assert(_ijkMatches(&ijk, &expected) == 1, - "res 2 cell at expected coordinates"); - } else { - t_assert(0, "resolution supported by test function (coordinates)"); - } -} - -/** - * Test the the immediate neighbors of an index are at the expected locations in - * the local IJ coordinate space. - */ -void h3ToLocalIj_neighbors_assertions(H3Index h3) { - CoordIJ origin = {0}; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &origin) == 0, - "got ij for origin"); - CoordIJK originIjk; - ijToIjk(&origin, &originIjk); - - for (Direction d = K_AXES_DIGIT; d < INVALID_DIGIT; d++) { - if (d == K_AXES_DIGIT && H3_EXPORT(h3IsPentagon)(h3)) { - continue; - } - - int rotations = 0; - H3Index offset = h3NeighborRotations(h3, d, &rotations); - - CoordIJ ij = {0}; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, offset, &ij) == 0, - "got ij for destination"); - CoordIJK ijk; - ijToIjk(&ij, &ijk); - CoordIJK invertedIjk = {0}; - _neighbor(&invertedIjk, d); - for (int i = 0; i < 3; i++) { - _ijkRotate60ccw(&invertedIjk); - } - _ijkAdd(&invertedIjk, &ijk, &ijk); - _ijkNormalize(&ijk); - - t_assert(_ijkMatches(&ijk, &originIjk), "back to origin"); - } -} - -/** - * Test that the neighbors (k-ring), if they can be found in the local IJ - * coordinate space, can be converted back to indexes. - */ -void localIjToH3_kRing_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); - int maxK = MAX_DISTANCES[r]; - - int sz = H3_EXPORT(maxKringSize)(maxK); - H3Index *neighbors = calloc(sz, sizeof(H3Index)); - int *distances = calloc(sz, sizeof(int)); - - H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); - - for (int i = 0; i < sz; i++) { - if (neighbors[i] == 0) { - continue; - } - - CoordIJ ij; - // Don't consider indexes which we can't unfold in the first place - if (H3_EXPORT(experimentalH3ToLocalIj)(h3, neighbors[i], &ij) == 0) { - H3Index retrieved; - t_assert( - H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, - "retrieved index for unfolded coordinates"); - t_assert(retrieved == neighbors[i], - "round trip neighboring index matches expected"); - } - } - - free(distances); - free(neighbors); -} - -void localIjToH3_traverse_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (traverse)"); - int k = MAX_DISTANCES[r]; - - CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, - "Got origin coordinates"); - - // This logic is from hexRangeDistances. - // 0 < ring <= k, current ring - int ring = 1; - // 0 <= direction < 6, current side of the ring - int direction = 0; - // 0 <= i < ring, current position on the side of the ring - int i = 0; - - while (ring <= k) { - if (direction == 0 && i == 0) { - ij.i += NEXT_RING_DIRECTION.i; - ij.j += NEXT_RING_DIRECTION.j; - } - - ij.i += DIRECTIONS[direction].i; - ij.j += DIRECTIONS[direction].j; - - H3Index testH3; - - int failed = H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &testH3); - if (!failed) { - t_assert(H3_EXPORT(h3IsValid)(testH3), - "test coordinates result in valid index"); - - CoordIJ expectedIj; - int reverseFailed = - H3_EXPORT(experimentalH3ToLocalIj)(h3, testH3, &expectedIj); - // If it doesn't give a coordinate for this origin,index pair that's - // OK. - if (!reverseFailed) { - if (expectedIj.i != ij.i || expectedIj.j != ij.j) { - // Multiple coordinates for the same index can happen due to - // pentagon distortion. In that case, the other coordinates - // should also belong to the same index. - H3Index testTestH3; - t_assert(H3_EXPORT(experimentalLocalIjToH3)( - h3, &expectedIj, &testTestH3) == 0, - "converted coordinates again"); - t_assert(testH3 == testTestH3, - "index has normalizable coordinates in " - "local IJ"); - } - } - } - - i++; - // Check if end of this side of the k-ring - if (i == ring) { - i = 0; - direction++; - // Check if end of this ring. - if (direction == 6) { - direction = 0; - ring++; - } - } - } -} - SUITE(h3ToLocalIj) { // Some indexes that represent base cells. Base cells // are hexagons except for `pent1`. @@ -239,42 +47,6 @@ SUITE(h3ToLocalIj) { H3Index pent1 = H3_INIT; setH3Index(&pent1, 0, 4, 0); - TEST(localIjToH3_identity) { - iterateAllIndexesAtRes(0, localIjToH3_identity_assertions); - iterateAllIndexesAtRes(1, localIjToH3_identity_assertions); - iterateAllIndexesAtRes(2, localIjToH3_identity_assertions); - } - - TEST(h3ToLocalIj_coordinates) { - iterateAllIndexesAtRes(0, h3ToLocalIj_coordinates_assertions); - iterateAllIndexesAtRes(1, h3ToLocalIj_coordinates_assertions); - iterateAllIndexesAtRes(2, h3ToLocalIj_coordinates_assertions); - } - - TEST(h3ToLocalIj_neighbors) { - iterateAllIndexesAtRes(0, h3ToLocalIj_neighbors_assertions); - iterateAllIndexesAtRes(1, h3ToLocalIj_neighbors_assertions); - iterateAllIndexesAtRes(2, h3ToLocalIj_neighbors_assertions); - } - - TEST(localIjToH3_kRing) { - iterateAllIndexesAtRes(0, localIjToH3_kRing_assertions); - iterateAllIndexesAtRes(1, localIjToH3_kRing_assertions); - iterateAllIndexesAtRes(2, localIjToH3_kRing_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, localIjToH3_kRing_assertions, 27); - // Further resolutions aren't tested to save time. - } - - TEST(localIjToH3_traverse) { - iterateAllIndexesAtRes(0, localIjToH3_traverse_assertions); - iterateAllIndexesAtRes(1, localIjToH3_traverse_assertions); - iterateAllIndexesAtRes(2, localIjToH3_traverse_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, localIjToH3_traverse_assertions, 27); - // Further resolutions aren't tested to save time. - } - TEST(ijkBaseCells) { CoordIJK ijk; t_assert(h3ToLocalIjk(pent1, bc1, &ijk) == 0, diff --git a/src/apps/testapps/testH3ToLocalIjExhaustive.c b/src/apps/testapps/testH3ToLocalIjExhaustive.c new file mode 100644 index 000000000..f77a94eb3 --- /dev/null +++ b/src/apps/testapps/testH3ToLocalIjExhaustive.c @@ -0,0 +1,264 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 index to local IJ and IJK+ grid functions using + * tests over a large number of indexes. + * + * usage: `testH3ToLocalIjExhaustive` + */ + +#include +#include +#include +#include +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; + +// The same traversal constants from algos.c (for hexRange) here reused as local +// IJ vectors. +static const CoordIJ DIRECTIONS[6] = {{0, 1}, {-1, 0}, {-1, -1}, + {0, -1}, {1, 0}, {1, 1}}; + +static const CoordIJ NEXT_RING_DIRECTION = {1, 0}; + +/** + * Test that the local coordinates for an index map to itself. + */ +void localIjToH3_identity_assertions(H3Index h3) { + CoordIJ ij; + t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + "able to setup localIjToH3 test"); + + H3Index retrieved; + t_assert(H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, + "got an index back from localIjTOh3"); + t_assert(h3 == retrieved, "round trip through local IJ space works"); +} + +/** + * Test that coordinates for an index match some simple rules about index + * digits, when using the index as its own origin. That is, that the IJ + * coordinates are in the coordinate space of the origin's base cell. + */ +void h3ToLocalIj_coordinates_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + + CoordIJ ij; + t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + "get ij for origin"); + CoordIJK ijk; + ijToIjk(&ij, &ijk); + if (r == 0) { + t_assert(_ijkMatches(&ijk, &UNIT_VECS[0]) == 1, "res 0 cell at 0,0,0"); + } else if (r == 1) { + t_assert(_ijkMatches(&ijk, &UNIT_VECS[H3_GET_INDEX_DIGIT(h3, 1)]) == 1, + "res 1 cell at expected coordinates"); + } else if (r == 2) { + CoordIJK expected = UNIT_VECS[H3_GET_INDEX_DIGIT(h3, 1)]; + _downAp7r(&expected); + _neighbor(&expected, H3_GET_INDEX_DIGIT(h3, 2)); + t_assert(_ijkMatches(&ijk, &expected) == 1, + "res 2 cell at expected coordinates"); + } else { + t_assert(0, "resolution supported by test function (coordinates)"); + } +} + +/** + * Test the the immediate neighbors of an index are at the expected locations in + * the local IJ coordinate space. + */ +void h3ToLocalIj_neighbors_assertions(H3Index h3) { + CoordIJ origin = {0}; + t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &origin) == 0, + "got ij for origin"); + CoordIJK originIjk; + ijToIjk(&origin, &originIjk); + + for (Direction d = K_AXES_DIGIT; d < INVALID_DIGIT; d++) { + if (d == K_AXES_DIGIT && H3_EXPORT(h3IsPentagon)(h3)) { + continue; + } + + int rotations = 0; + H3Index offset = h3NeighborRotations(h3, d, &rotations); + + CoordIJ ij = {0}; + t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, offset, &ij) == 0, + "got ij for destination"); + CoordIJK ijk; + ijToIjk(&ij, &ijk); + CoordIJK invertedIjk = {0}; + _neighbor(&invertedIjk, d); + for (int i = 0; i < 3; i++) { + _ijkRotate60ccw(&invertedIjk); + } + _ijkAdd(&invertedIjk, &ijk, &ijk); + _ijkNormalize(&ijk); + + t_assert(_ijkMatches(&ijk, &originIjk), "back to origin"); + } +} + +/** + * Test that the neighbors (k-ring), if they can be found in the local IJ + * coordinate space, can be converted back to indexes. + */ +void localIjToH3_kRing_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (kRing)"); + int maxK = MAX_DISTANCES[r]; + + int sz = H3_EXPORT(maxKringSize)(maxK); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); + + H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); + + for (int i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + + CoordIJ ij; + // Don't consider indexes which we can't unfold in the first place + if (H3_EXPORT(experimentalH3ToLocalIj)(h3, neighbors[i], &ij) == 0) { + H3Index retrieved; + t_assert( + H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, + "retrieved index for unfolded coordinates"); + t_assert(retrieved == neighbors[i], + "round trip neighboring index matches expected"); + } + } + + free(distances); + free(neighbors); +} + +void localIjToH3_traverse_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (traverse)"); + int k = MAX_DISTANCES[r]; + + CoordIJ ij; + t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + "Got origin coordinates"); + + // This logic is from hexRangeDistances. + // 0 < ring <= k, current ring + int ring = 1; + // 0 <= direction < 6, current side of the ring + int direction = 0; + // 0 <= i < ring, current position on the side of the ring + int i = 0; + + while (ring <= k) { + if (direction == 0 && i == 0) { + ij.i += NEXT_RING_DIRECTION.i; + ij.j += NEXT_RING_DIRECTION.j; + } + + ij.i += DIRECTIONS[direction].i; + ij.j += DIRECTIONS[direction].j; + + H3Index testH3; + + int failed = H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &testH3); + if (!failed) { + t_assert(H3_EXPORT(h3IsValid)(testH3), + "test coordinates result in valid index"); + + CoordIJ expectedIj; + int reverseFailed = + H3_EXPORT(experimentalH3ToLocalIj)(h3, testH3, &expectedIj); + // If it doesn't give a coordinate for this origin,index pair that's + // OK. + if (!reverseFailed) { + if (expectedIj.i != ij.i || expectedIj.j != ij.j) { + // Multiple coordinates for the same index can happen due to + // pentagon distortion. In that case, the other coordinates + // should also belong to the same index. + H3Index testTestH3; + t_assert(H3_EXPORT(experimentalLocalIjToH3)( + h3, &expectedIj, &testTestH3) == 0, + "converted coordinates again"); + t_assert(testH3 == testTestH3, + "index has normalizable coordinates in " + "local IJ"); + } + } + } + + i++; + // Check if end of this side of the k-ring + if (i == ring) { + i = 0; + direction++; + // Check if end of this ring. + if (direction == 6) { + direction = 0; + ring++; + } + } + } +} + +SUITE(h3ToLocalIj) { + TEST(localIjToH3_identity) { + iterateAllIndexesAtRes(0, localIjToH3_identity_assertions); + iterateAllIndexesAtRes(1, localIjToH3_identity_assertions); + iterateAllIndexesAtRes(2, localIjToH3_identity_assertions); + } + + TEST(h3ToLocalIj_coordinates) { + iterateAllIndexesAtRes(0, h3ToLocalIj_coordinates_assertions); + iterateAllIndexesAtRes(1, h3ToLocalIj_coordinates_assertions); + iterateAllIndexesAtRes(2, h3ToLocalIj_coordinates_assertions); + } + + TEST(h3ToLocalIj_neighbors) { + iterateAllIndexesAtRes(0, h3ToLocalIj_neighbors_assertions); + iterateAllIndexesAtRes(1, h3ToLocalIj_neighbors_assertions); + iterateAllIndexesAtRes(2, h3ToLocalIj_neighbors_assertions); + } + + TEST(localIjToH3_kRing) { + iterateAllIndexesAtRes(0, localIjToH3_kRing_assertions); + iterateAllIndexesAtRes(1, localIjToH3_kRing_assertions); + iterateAllIndexesAtRes(2, localIjToH3_kRing_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, localIjToH3_kRing_assertions, 27); + // Further resolutions aren't tested to save time. + } + + TEST(localIjToH3_traverse) { + iterateAllIndexesAtRes(0, localIjToH3_traverse_assertions); + iterateAllIndexesAtRes(1, localIjToH3_traverse_assertions); + iterateAllIndexesAtRes(2, localIjToH3_traverse_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, localIjToH3_traverse_assertions, 27); + // Further resolutions aren't tested to save time. + } +} From 8d5c1c62230cdcc14cd5ed342accc3f3f27308ed Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 29 Jul 2019 09:57:05 -0700 Subject: [PATCH 148/771] Add testH3DistanceExhaustive --- src/apps/testapps/testH3DistanceExhaustive.c | 190 +++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 src/apps/testapps/testH3DistanceExhaustive.c diff --git a/src/apps/testapps/testH3DistanceExhaustive.c b/src/apps/testapps/testH3DistanceExhaustive.c new file mode 100644 index 000000000..fd6e0ccbb --- /dev/null +++ b/src/apps/testapps/testH3DistanceExhaustive.c @@ -0,0 +1,190 @@ +/* + * Copyright 2018-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function. + * + * usage: `testH3Distance` + */ + +#include +#include +#include +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; + +static void h3Distance_identity_assertions(H3Index h3) { + t_assert(H3_EXPORT(h3Distance)(h3, h3) == 0, "distance to self is 0"); +} + +static void h3Distance_kRing_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (kRing)"); + int maxK = MAX_DISTANCES[r]; + + int sz = H3_EXPORT(maxKringSize)(maxK); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); + + H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); + + for (int i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + + int calculatedDistance = H3_EXPORT(h3Distance)(h3, neighbors[i]); + + // Don't consider indexes where h3Distance reports failure to + // generate + t_assert(calculatedDistance == distances[i] || calculatedDistance == -1, + "kRingDistances matches h3Distance"); + } + + free(distances); + free(neighbors); +} + +SUITE(h3Distance) { + // Some indexes that represent base cells. Base cells + // are hexagons except for `pent1`. + H3Index bc1 = H3_INIT; + setH3Index(&bc1, 0, 15, 0); + + H3Index bc2 = H3_INIT; + setH3Index(&bc2, 0, 8, 0); + + H3Index bc3 = H3_INIT; + setH3Index(&bc3, 0, 31, 0); + + H3Index pent1 = H3_INIT; + setH3Index(&pent1, 0, 4, 0); + + TEST(testIndexDistance) { + H3Index bc = 0; + setH3Index(&bc, 1, 17, 0); + H3Index p = 0; + setH3Index(&p, 1, 14, 0); + H3Index p2; + setH3Index(&p2, 1, 14, 2); + H3Index p3; + setH3Index(&p3, 1, 14, 3); + H3Index p4; + setH3Index(&p4, 1, 14, 4); + H3Index p5; + setH3Index(&p5, 1, 14, 5); + H3Index p6; + setH3Index(&p6, 1, 14, 6); + + t_assert(H3_EXPORT(h3Distance)(bc, p) == 3, "distance onto pentagon"); + t_assert(H3_EXPORT(h3Distance)(bc, p2) == 2, "distance onto p2"); + t_assert(H3_EXPORT(h3Distance)(bc, p3) == 3, "distance onto p3"); + // TODO works correctly but is rejected due to possible pentagon + // distortion. + // t_assert(H3_EXPORT(h3Distance)(bc, p4) == 3, "distance onto p4"); + // t_assert(H3_EXPORT(h3Distance)(bc, p5) == 4, "distance onto p5"); + t_assert(H3_EXPORT(h3Distance)(bc, p6) == 2, "distance onto p6"); + } + + TEST(testIndexDistance2) { + H3Index origin = 0x820c4ffffffffffL; + // Destination is on the other side of the pentagon + H3Index destination = 0x821ce7fffffffffL; + + // TODO doesn't work because of pentagon distortion. Both should be 5. + t_assert(H3_EXPORT(h3Distance)(destination, origin) == -1, + "distance in res 2 across pentagon"); + t_assert(H3_EXPORT(h3Distance)(origin, destination) == -1, + "distance in res 2 across pentagon (reversed)"); + } + + TEST(h3Distance_identity) { + iterateAllIndexesAtRes(0, h3Distance_identity_assertions); + iterateAllIndexesAtRes(1, h3Distance_identity_assertions); + iterateAllIndexesAtRes(2, h3Distance_identity_assertions); + } + + TEST(h3Distance_kRing) { + iterateAllIndexesAtRes(0, h3Distance_kRing_assertions); + iterateAllIndexesAtRes(1, h3Distance_kRing_assertions); + iterateAllIndexesAtRes(2, h3Distance_kRing_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, h3Distance_kRing_assertions, 27); + // Further resolutions aren't tested to save time. + } + + TEST(h3DistanceBaseCells) { + t_assert(H3_EXPORT(h3Distance)(bc1, pent1) == 1, + "distance to neighbor is 1 (15, 4)"); + t_assert(H3_EXPORT(h3Distance)(bc1, bc2) == 1, + "distance to neighbor is 1 (15, 8)"); + t_assert(H3_EXPORT(h3Distance)(bc1, bc3) == 1, + "distance to neighbor is 1 (15, 31)"); + t_assert(H3_EXPORT(h3Distance)(pent1, bc3) == -1, + "distance to neighbor is invalid"); + } + + TEST(ijkDistance) { + CoordIJK z = {0, 0, 0}; + CoordIJK i = {1, 0, 0}; + CoordIJK ik = {1, 0, 1}; + CoordIJK ij = {1, 1, 0}; + CoordIJK j2 = {0, 2, 0}; + + t_assert(ijkDistance(&z, &z) == 0, "identity distance 0,0,0"); + t_assert(ijkDistance(&i, &i) == 0, "identity distance 1,0,0"); + t_assert(ijkDistance(&ik, &ik) == 0, "identity distance 1,0,1"); + t_assert(ijkDistance(&ij, &ij) == 0, "identity distance 1,1,0"); + t_assert(ijkDistance(&j2, &j2) == 0, "identity distance 0,2,0"); + + t_assert(ijkDistance(&z, &i) == 1, "0,0,0 to 1,0,0"); + t_assert(ijkDistance(&z, &j2) == 2, "0,0,0 to 0,2,0"); + t_assert(ijkDistance(&z, &ik) == 1, "0,0,0 to 1,0,1"); + t_assert(ijkDistance(&i, &ik) == 1, "1,0,0 to 1,0,1"); + t_assert(ijkDistance(&ik, &j2) == 3, "1,0,1 to 0,2,0"); + t_assert(ijkDistance(&ij, &ik) == 2, "1,0,1 to 1,1,0"); + } + + TEST(h3DistanceResolutionMismatch) { + t_assert( + H3_EXPORT(h3Distance)(0x832830fffffffffL, 0x822837fffffffffL) == -1, + "cannot compare at different resolutions"); + } + + TEST(h3DistanceEdge) { + H3Index origin = 0x832830fffffffffL; + H3Index dest = 0x832834fffffffffL; + H3Index edge = H3_EXPORT(getH3UnidirectionalEdge(origin, dest)); + + t_assert(0 != edge, "test edge is valid"); + t_assert(H3_EXPORT(h3Distance)(edge, origin) == 0, + "edge has zero distance to origin"); + t_assert(H3_EXPORT(h3Distance)(origin, edge) == 0, + "origin has zero distance to edge"); + + t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, + "edge has distance to destination"); + t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, + "destination has distance to edge"); + } +} From 5b18e192f48ca2aad005a6c4b31d6f5052cdbe98 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 31 Jul 2019 11:16:10 -0700 Subject: [PATCH 149/771] Move distance tests to an exhaustive file also --- CMakeLists.txt | 2 + src/apps/testapps/testH3Distance.c | 51 +-------- src/apps/testapps/testH3DistanceExhaustive.c | 113 +------------------ 3 files changed, 6 insertions(+), 160 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a6c65073..e7aa9a67e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,6 +172,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testH3ToLocalIj.c src/apps/testapps/testH3ToLocalIjExhaustive.c src/apps/testapps/testH3Distance.c + src/apps/testapps/testH3DistanceExhaustive.c src/apps/testapps/testH3Line.c src/apps/testapps/testH3LineExhaustive.c src/apps/testapps/testCoordIj.c @@ -528,6 +529,7 @@ if(BUILD_TESTING) # these files in .travis.yml. add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) + add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) add_custom_target(test-fast COMMAND ctest -E Exhaustive) endif() diff --git a/src/apps/testapps/testH3Distance.c b/src/apps/testapps/testH3Distance.c index 055ed8d0d..8e967800e 100644 --- a/src/apps/testapps/testH3Distance.c +++ b/src/apps/testapps/testH3Distance.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,40 +31,6 @@ #include "test.h" #include "utility.h" -static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; - -static void h3Distance_identity_assertions(H3Index h3) { - t_assert(H3_EXPORT(h3Distance)(h3, h3) == 0, "distance to self is 0"); -} - -static void h3Distance_kRing_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); - int maxK = MAX_DISTANCES[r]; - - int sz = H3_EXPORT(maxKringSize)(maxK); - H3Index *neighbors = calloc(sz, sizeof(H3Index)); - int *distances = calloc(sz, sizeof(int)); - - H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); - - for (int i = 0; i < sz; i++) { - if (neighbors[i] == 0) { - continue; - } - - int calculatedDistance = H3_EXPORT(h3Distance)(h3, neighbors[i]); - - // Don't consider indexes where h3Distance reports failure to - // generate - t_assert(calculatedDistance == distances[i] || calculatedDistance == -1, - "kRingDistances matches h3Distance"); - } - - free(distances); - free(neighbors); -} - SUITE(h3Distance) { // Some indexes that represent base cells. Base cells // are hexagons except for `pent1`. @@ -118,21 +84,6 @@ SUITE(h3Distance) { "distance in res 2 across pentagon (reversed)"); } - TEST(h3Distance_identity) { - iterateAllIndexesAtRes(0, h3Distance_identity_assertions); - iterateAllIndexesAtRes(1, h3Distance_identity_assertions); - iterateAllIndexesAtRes(2, h3Distance_identity_assertions); - } - - TEST(h3Distance_kRing) { - iterateAllIndexesAtRes(0, h3Distance_kRing_assertions); - iterateAllIndexesAtRes(1, h3Distance_kRing_assertions); - iterateAllIndexesAtRes(2, h3Distance_kRing_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, h3Distance_kRing_assertions, 27); - // Further resolutions aren't tested to save time. - } - TEST(h3DistanceBaseCells) { t_assert(H3_EXPORT(h3Distance)(bc1, pent1) == 1, "distance to neighbor is 1 (15, 4)"); diff --git a/src/apps/testapps/testH3DistanceExhaustive.c b/src/apps/testapps/testH3DistanceExhaustive.c index fd6e0ccbb..ef32a7867 100644 --- a/src/apps/testapps/testH3DistanceExhaustive.c +++ b/src/apps/testapps/testH3DistanceExhaustive.c @@ -1,5 +1,5 @@ /* - * Copyright 2018-2019 Uber Technologies, Inc. + * Copyright 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ /** @file - * @brief tests H3 distance function. + * @brief tests H3 distance function using tests over a large number of indexes. * - * usage: `testH3Distance` + * usage: `testH3DistanceExhaustive` */ #include @@ -66,58 +66,6 @@ static void h3Distance_kRing_assertions(H3Index h3) { } SUITE(h3Distance) { - // Some indexes that represent base cells. Base cells - // are hexagons except for `pent1`. - H3Index bc1 = H3_INIT; - setH3Index(&bc1, 0, 15, 0); - - H3Index bc2 = H3_INIT; - setH3Index(&bc2, 0, 8, 0); - - H3Index bc3 = H3_INIT; - setH3Index(&bc3, 0, 31, 0); - - H3Index pent1 = H3_INIT; - setH3Index(&pent1, 0, 4, 0); - - TEST(testIndexDistance) { - H3Index bc = 0; - setH3Index(&bc, 1, 17, 0); - H3Index p = 0; - setH3Index(&p, 1, 14, 0); - H3Index p2; - setH3Index(&p2, 1, 14, 2); - H3Index p3; - setH3Index(&p3, 1, 14, 3); - H3Index p4; - setH3Index(&p4, 1, 14, 4); - H3Index p5; - setH3Index(&p5, 1, 14, 5); - H3Index p6; - setH3Index(&p6, 1, 14, 6); - - t_assert(H3_EXPORT(h3Distance)(bc, p) == 3, "distance onto pentagon"); - t_assert(H3_EXPORT(h3Distance)(bc, p2) == 2, "distance onto p2"); - t_assert(H3_EXPORT(h3Distance)(bc, p3) == 3, "distance onto p3"); - // TODO works correctly but is rejected due to possible pentagon - // distortion. - // t_assert(H3_EXPORT(h3Distance)(bc, p4) == 3, "distance onto p4"); - // t_assert(H3_EXPORT(h3Distance)(bc, p5) == 4, "distance onto p5"); - t_assert(H3_EXPORT(h3Distance)(bc, p6) == 2, "distance onto p6"); - } - - TEST(testIndexDistance2) { - H3Index origin = 0x820c4ffffffffffL; - // Destination is on the other side of the pentagon - H3Index destination = 0x821ce7fffffffffL; - - // TODO doesn't work because of pentagon distortion. Both should be 5. - t_assert(H3_EXPORT(h3Distance)(destination, origin) == -1, - "distance in res 2 across pentagon"); - t_assert(H3_EXPORT(h3Distance)(origin, destination) == -1, - "distance in res 2 across pentagon (reversed)"); - } - TEST(h3Distance_identity) { iterateAllIndexesAtRes(0, h3Distance_identity_assertions); iterateAllIndexesAtRes(1, h3Distance_identity_assertions); @@ -132,59 +80,4 @@ SUITE(h3Distance) { iterateAllIndexesAtResPartial(3, h3Distance_kRing_assertions, 27); // Further resolutions aren't tested to save time. } - - TEST(h3DistanceBaseCells) { - t_assert(H3_EXPORT(h3Distance)(bc1, pent1) == 1, - "distance to neighbor is 1 (15, 4)"); - t_assert(H3_EXPORT(h3Distance)(bc1, bc2) == 1, - "distance to neighbor is 1 (15, 8)"); - t_assert(H3_EXPORT(h3Distance)(bc1, bc3) == 1, - "distance to neighbor is 1 (15, 31)"); - t_assert(H3_EXPORT(h3Distance)(pent1, bc3) == -1, - "distance to neighbor is invalid"); - } - - TEST(ijkDistance) { - CoordIJK z = {0, 0, 0}; - CoordIJK i = {1, 0, 0}; - CoordIJK ik = {1, 0, 1}; - CoordIJK ij = {1, 1, 0}; - CoordIJK j2 = {0, 2, 0}; - - t_assert(ijkDistance(&z, &z) == 0, "identity distance 0,0,0"); - t_assert(ijkDistance(&i, &i) == 0, "identity distance 1,0,0"); - t_assert(ijkDistance(&ik, &ik) == 0, "identity distance 1,0,1"); - t_assert(ijkDistance(&ij, &ij) == 0, "identity distance 1,1,0"); - t_assert(ijkDistance(&j2, &j2) == 0, "identity distance 0,2,0"); - - t_assert(ijkDistance(&z, &i) == 1, "0,0,0 to 1,0,0"); - t_assert(ijkDistance(&z, &j2) == 2, "0,0,0 to 0,2,0"); - t_assert(ijkDistance(&z, &ik) == 1, "0,0,0 to 1,0,1"); - t_assert(ijkDistance(&i, &ik) == 1, "1,0,0 to 1,0,1"); - t_assert(ijkDistance(&ik, &j2) == 3, "1,0,1 to 0,2,0"); - t_assert(ijkDistance(&ij, &ik) == 2, "1,0,1 to 1,1,0"); - } - - TEST(h3DistanceResolutionMismatch) { - t_assert( - H3_EXPORT(h3Distance)(0x832830fffffffffL, 0x822837fffffffffL) == -1, - "cannot compare at different resolutions"); - } - - TEST(h3DistanceEdge) { - H3Index origin = 0x832830fffffffffL; - H3Index dest = 0x832834fffffffffL; - H3Index edge = H3_EXPORT(getH3UnidirectionalEdge(origin, dest)); - - t_assert(0 != edge, "test edge is valid"); - t_assert(H3_EXPORT(h3Distance)(edge, origin) == 0, - "edge has zero distance to origin"); - t_assert(H3_EXPORT(h3Distance)(origin, edge) == 0, - "origin has zero distance to edge"); - - t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, - "edge has distance to destination"); - t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, - "destination has distance to edge"); - } } From 4a0b09888d12f3cc308ed17aea214e2ab8e8f534 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 1 Aug 2019 11:29:35 -0700 Subject: [PATCH 150/771] Adjust comment about Exhaustive and test-fast --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7aa9a67e..68beac0f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -525,8 +525,8 @@ if(BUILD_TESTING) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) - # The "Exhaustive" part of the test name is used by the Valgrind CI test to exclude - # these files in .travis.yml. + # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. + # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) From c529284c7a92b4fe7ac9bd31de51861fae574691 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 1 Aug 2019 15:45:16 -0700 Subject: [PATCH 151/771] Set CTEST_OUTPUT_ON_FAILURE for Valgrind --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bf28946f0..8a520b018 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,7 +65,7 @@ matrix: - cmake -DCMAKE_BUILD_TYPE=Debug -DWRAP_VALGRIND=ON . script: - make - - make test-fast + - CTEST_OUTPUT_ON_FAILURE=1 make test-fast - env: NAME="Mac OSX (Xcode 8)" os: osx - env: NAME="binding-functions target" From cdb1cb1afd0d0b16975561f00dc926e987e14ca0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 7 Aug 2019 12:12:27 -0700 Subject: [PATCH 152/771] Exclude assertions from branch coverage --- scripts/coverage.sh.in | 10 +++++++--- src/apps/miscapps/generateBaseCellNeighbors.c | 4 ++-- src/h3lib/lib/algos.c | 10 +++++----- src/h3lib/lib/faceijk.c | 6 +++--- src/h3lib/lib/h3Index.c | 4 ++-- src/h3lib/lib/localij.c | 6 +++--- src/h3lib/lib/polygon.c | 3 +-- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/scripts/coverage.sh.in b/scripts/coverage.sh.in index 3ddb12cce..5d7ebbe85 100755 --- a/scripts/coverage.sh.in +++ b/scripts/coverage.sh.in @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 Uber Technologies, Inc. +# Copyright 2018-2019 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -44,7 +44,11 @@ fi src_dir=${1:-"Missing source directory"} binary_dir=${2:-"Missing binary directory"} +# Exclude the usual LCOV exclusion comment, and also +# do not require branch coverage for assertions. +br_exclusion='LCOV_EXCL_BR_LINE|assert\(' + cd "${binary_dir}" -lcov --rc lcov_branch_coverage=1 --directory . --capture --output-file coverage.info -lcov --rc lcov_branch_coverage=1 --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info +lcov --rc lcov_branch_coverage=1 --rc "lcov_excl_br_line=$br_exclusion" --directory . --capture --output-file coverage.info +lcov --rc lcov_branch_coverage=1 --rc "lcov_excl_br_line=$br_exclusion" --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info genhtml --branch-coverage -o coverage coverage.cleaned.info --title 'h3 coverage' diff --git a/src/apps/miscapps/generateBaseCellNeighbors.c b/src/apps/miscapps/generateBaseCellNeighbors.c index 2ad38b3a0..f8581f419 100644 --- a/src/apps/miscapps/generateBaseCellNeighbors.c +++ b/src/apps/miscapps/generateBaseCellNeighbors.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,7 +87,7 @@ static void generate() { for (int i = 0; i < NUM_BASE_CELLS; i++) { if (!_isBaseCellPentagon(i)) { - for (int dir = 0; dir <= NUM_DIRS; dir++) { + for (int dir = CENTER_DIGIT; dir <= NUM_DIRS; dir++) { FaceIJK fijk; _baseCellToFaceIjk(i, &fijk); _neighbor(&fijk.coord, dir); diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 90b58de23..d41b086b9 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -469,7 +469,7 @@ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, // the end of this ring. origin = h3NeighborRotations(origin, NEXT_RING_DIRECTION, &rotations); - if (origin == 0) { + if (origin == 0) { // LCOV_EXCL_BR_LINE // Should not be possible because `origin` would have to be a // pentagon return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE @@ -482,7 +482,7 @@ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, } origin = h3NeighborRotations(origin, DIRECTIONS[direction], &rotations); - if (origin == 0) { + if (origin == 0) { // LCOV_EXCL_BR_LINE // Should not be possible because `origin` would have to be a // pentagon return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE @@ -569,7 +569,7 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { for (int ring = 0; ring < k; ring++) { origin = h3NeighborRotations(origin, NEXT_RING_DIRECTION, &rotations); - if (origin == 0) { + if (origin == 0) { // LCOV_EXCL_BR_LINE // Should not be possible because `origin` would have to be a // pentagon return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE @@ -589,7 +589,7 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { for (int pos = 0; pos < k; pos++) { origin = h3NeighborRotations(origin, DIRECTIONS[direction], &rotations); - if (origin == 0) { + if (origin == 0) { // LCOV_EXCL_BR_LINE // Should not be possible because `origin` would have to be a // pentagon return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index b994767ab..8569d1433 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -684,14 +684,14 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, // edge-crossing vertices as needed g->numVerts = 0; int lastFace = -1; - int lastOverage = 0; // 0: none; 1: edge; 2: overage + Overage lastOverage = NO_OVERAGE; for (int vert = 0; vert < NUM_HEX_VERTS + 1; vert++) { int v = vert % NUM_HEX_VERTS; FaceIJK fijk = fijkVerts[v]; int pentLeading4 = 0; - int overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); + Overage overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); /* Check for edge-crossing. Each face of the underlying icosahedron is a @@ -703,7 +703,7 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, edge, with no edge line intersections. */ if (isResClassIII(res) && vert > 0 && fijk.face != lastFace && - lastOverage != 1) { + lastOverage != FACE_EDGE) { // find hex2d of the two vertexes on original face int lastV = (v + 5) % NUM_HEX_VERTS; Vec2d orig2d0; diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 24fab1f9a..54517ddd4 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -293,7 +293,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, int loc = (int)(parent % numRemainingHexes); int loopCount = 0; while (hashSetArray[loc] != 0) { - if (loopCount > numRemainingHexes) { + if (loopCount > numRemainingHexes) { // LCOV_EXCL_BR_LINE // LCOV_EXCL_START // This case should not be possible because at most one // index is placed into hashSetArray per @@ -369,7 +369,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, int loopCount = 0; bool isUncompactable = true; do { - if (loopCount > numRemainingHexes) { + if (loopCount > numRemainingHexes) { // LCOV_EXCL_BR_LINE // LCOV_EXCL_START // This case should not be possible because at most one // index is placed into hashSetArray per input hexagon. diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 70da2f2cc..504153680 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -139,8 +139,8 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int baseCell = H3_GET_BASE_CELL(h3); // Direction from origin base cell to index base cell - Direction dir = 0; - Direction revDir = 0; + Direction dir = CENTER_DIGIT; + Direction revDir = CENTER_DIGIT; if (originBaseCell != baseCell) { dir = _getBaseCellDirection(originBaseCell, baseCell); if (dir == INVALID_DIGIT) { diff --git a/src/h3lib/lib/polygon.c b/src/h3lib/lib/polygon.c index ad462d5fa..6591e337a 100644 --- a/src/h3lib/lib/polygon.c +++ b/src/h3lib/lib/polygon.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ */ #include "polygon.h" -#include #include #include #include From d4b7cd75fdc94f60bf266d4c4b0b4b251fec1eef Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 7 Aug 2019 13:29:23 -0700 Subject: [PATCH 153/771] Switch to coveralls-lcov --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c5db67596..4acb293ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,13 +48,13 @@ matrix: packages: - lcov install: - - pip install --user cpp-coveralls + - gem install coveralls-lcov before_script: - cmake -DCMAKE_BUILD_TYPE=Debug -DWARNINGS_AS_ERRORS=ON -DH3_PREFIX=testprefix_ . script: - make && make coverage after_success: - - coveralls --lcov-file coverage.cleaned.info --verbose + - coveralls-lcov coverage.cleaned.info - env: NAME="Mac OSX (Xcode 8)" os: osx - env: NAME="binding-functions target" From 77883fd1e3965f3f560d5317d0a8025052f54896 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 7 Aug 2019 15:56:33 -0700 Subject: [PATCH 154/771] Upgrade Travis CI job to Ubuntu Xenial --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4acb293ea..888dd4e96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -# Copyright 2018 Uber Technologies, Inc. +# Copyright 2018-2019 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ language: c os: linux -dist: trusty +dist: xenial compiler: - gcc From 70b79d3fcc41dfab4e00645377be08e732d8c27a Mon Sep 17 00:00:00 2001 From: Aleksandr Saprykin Date: Fri, 9 Aug 2019 00:02:34 +0200 Subject: [PATCH 155/771] Fix validity check for IJK+ coordinates --- src/h3lib/lib/localij.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 70da2f2cc..f26977960 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -290,7 +290,7 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { // check for res 0/base cell if (res == 0) { - if (ijk->i > 1 || ijk->i > 1 || ijk->i > 1) { + if (ijk->i > 1 || ijk->j > 1 || ijk->k > 1) { // out of range input return 1; } From 607640e72880ff43e4060cf694bbf5c13414aa53 Mon Sep 17 00:00:00 2001 From: Aleksandr Saprykin Date: Fri, 9 Aug 2019 11:46:57 +0200 Subject: [PATCH 156/771] Test all IJK+ components for out of range when transforming to H3 --- src/apps/testapps/testH3ToLocalIj.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testH3ToLocalIj.c index 62b5e5f11..591de702b 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testH3ToLocalIj.c @@ -72,7 +72,17 @@ SUITE(h3ToLocalIj) { ij.i = 2; t_assert( H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) != 0, - "out of range base cell"); + "out of range base cell (1)"); + ij.i = 0; + ij.j = 2; + t_assert( + H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) != 0, + "out of range base cell (2)"); + ij.i = -2; + ij.j = -2; + t_assert( + H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) != 0, + "out of range base cell (3)"); } TEST(ijOutOfRange) { From 2de2ba4b864e120d5143c46e86ca6de1d7456f88 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 12 Aug 2019 10:30:45 -0700 Subject: [PATCH 157/771] Version 3.5.1, add CHANGELOG for #271, update to point to #267 (the PR instead of issue) --- CHANGELOG.md | 8 ++++++-- VERSION | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caeca65b7..03b21761b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,13 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.5.1] - 2019-08-12 ### Added -- `h3ToCenterChild` function to find center child at given resolution (#263) -- `getPentagonIndexes` (and `pentagonIndexCount`) function to find pentagons at given resolution (#263) +- `h3ToCenterChild` function to find center child at given resolution (#267) +- `getPentagonIndexes` (and `pentagonIndexCount`) function to find pentagons at given resolution (#267) +### Fixed +- Fix bounds check for local IJ coordinates (#271) ## [3.5.0] - 2019-07-22 ### Added diff --git a/VERSION b/VERSION index 1545d9665..d5c0c9914 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.5.0 +3.5.1 From 4123a7ab2707d8a3d9cdecf9d35e417c37eb162a Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 12 Aug 2019 13:54:22 -0700 Subject: [PATCH 158/771] Version 3.6.0 --- CHANGELOG.md | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b21761b..cc1930c6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] -## [3.5.1] - 2019-08-12 +## [3.6.0] - 2019-08-12 ### Added - `h3ToCenterChild` function to find center child at given resolution (#267) - `getPentagonIndexes` (and `pentagonIndexCount`) function to find pentagons at given resolution (#267) diff --git a/VERSION b/VERSION index d5c0c9914..40c341bdc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.5.1 +3.6.0 From 8bb19b3371c552876334e2da49a1e4155fc83bff Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 27 Aug 2019 15:59:29 -0700 Subject: [PATCH 159/771] Handle empty (zero length) input to `compact` `compact`, `maxUncompactSize`, and `uncompact` should handle the case where empty input is provided. In this case the arrays should not be dereferenced, since the first index is already out of range. This also adds tests for some uncovered branches. --- CHANGELOG.md | 2 ++ src/apps/testapps/testCompact.c | 36 +++++++++++++++++++++++++++-- src/apps/testapps/testGeoCoord.c | 14 ++++++++++- src/apps/testapps/testH3ToLocalIj.c | 6 +++-- src/apps/testapps/testPolygon.c | 32 ++++++++++++++++++++++++- src/h3lib/lib/h3Index.c | 3 +++ 6 files changed, 87 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc1930c6f..cc19ae546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +### Fixed +- `compact` handles zero length input correctly. ## [3.6.0] - 2019-08-12 ### Added diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index bbc811a8a..cd2ddc096 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -152,6 +152,31 @@ SUITE(compact) { "compact fails on duplicate input"); } + TEST(compact_empty) { + t_assert(H3_EXPORT(compact)(NULL, NULL, 0) == 0, + "compact succeeds on empty input"); + } + + TEST(compact_disparate) { + // Exercises a case where compaction needs to be tested but none is + // possible + const int numHex = 7; + H3Index disparate[numHex] = {0}; + for (int i = 0; i < numHex; i++) { + setH3Index(&disparate[i], 1, i, CENTER_DIGIT); + } + H3Index output[numHex] = {0}; + + t_assert(H3_EXPORT(compact)(disparate, output, numHex) == 0, + "compact succeeds on disparate input"); + + // Assumes that `output` is an exact copy of `disparate`, including + // the ordering (which may not necessarily be the case) + for (int i = 0; i < numHex; i++) { + t_assert(disparate[i] == output[i], "output set equals input set"); + } + } + TEST(uncompact_wrongRes) { int numHex = 3; H3Index someHexagons[] = {0, 0, 0}; @@ -221,6 +246,13 @@ SUITE(compact) { free(result); } + TEST(uncompact_empty) { + int uncompactSz = H3_EXPORT(maxUncompactSize)(NULL, 0, 0); + t_assert(uncompactSz == 0, "maxUncompactSize accepts empty input"); + t_assert(H3_EXPORT(uncompact)(NULL, 0, NULL, 0, 0) == 0, + "uncompact accepts empty input"); + } + TEST(uncompact_onlyZero) { // maxUncompactSize and uncompact both permit 0 indexes // in the input array, and skip them. When only a zero is @@ -237,7 +269,7 @@ SUITE(compact) { free(children); } - TEST(uncompactZero) { + TEST(uncompact_withZero) { // maxUncompactSize and uncompact both permit 0 indexes // in the input array, and skip them. diff --git a/src/apps/testapps/testGeoCoord.c b/src/apps/testapps/testGeoCoord.c index 34e4efc5d..1623fbdec 100644 --- a/src/apps/testapps/testGeoCoord.c +++ b/src/apps/testapps/testGeoCoord.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -168,6 +168,18 @@ SUITE(geoCoord) { t_assert(_geoDistRads(&start, &out) < 0.01, "moved back to origin"); } + TEST(_geoDistRads_wrappedLongitude) { + const GeoCoord negativeLongitude = {.lat = 0, .lon = -(M_PI + M_PI_2)}; + const GeoCoord zero = {.lat = 0, .lon = 0}; + + t_assert(fabs(M_PI_2 - _geoDistRads(&negativeLongitude, &zero)) < + EPSILON_RAD, + "Distance with wrapped longitude"); + t_assert(fabs(M_PI_2 - _geoDistRads(&zero, &negativeLongitude)) < + EPSILON_RAD, + "Distance with wrapped longitude and swapped arguments"); + } + TEST(doubleConstants) { // Simple checks for ordering of values testDecreasingFunction(H3_EXPORT(hexAreaKm2), "hexAreaKm2 ordering"); diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testH3ToLocalIj.c index 591de702b..3f8fb6310 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testH3ToLocalIj.c @@ -86,10 +86,12 @@ SUITE(h3ToLocalIj) { } TEST(ijOutOfRange) { - const int numCoords = 5; - const CoordIJ coords[] = {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}; + const int numCoords = 7; + const CoordIJ coords[] = {{0, 0}, {1, 0}, {2, 0}, {3, 0}, + {4, 0}, {-4, 0}, {0, 4}}; const H3Index expected[] = {0x81283ffffffffff, 0x81293ffffffffff, 0x8150bffffffffff, 0x8151bffffffffff, + H3_INVALID_INDEX, H3_INVALID_INDEX, H3_INVALID_INDEX}; for (int i = 0; i < numCoords; i++) { diff --git a/src/apps/testapps/testPolygon.c b/src/apps/testapps/testPolygon.c index e8fd51bd6..98ec9a1ff 100644 --- a/src/apps/testapps/testPolygon.c +++ b/src/apps/testapps/testPolygon.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -553,4 +553,34 @@ SUITE(polygon) { H3_EXPORT(destroyLinkedPolygon)(&polygon); } + + TEST(normalizeMultiPolygon_unassignedHole) { + GeoCoord verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + + LinkedGeoLoop* outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + GeoCoord verts2[] = {{2, 2}, {3, 3}, {2, 3}}; + + LinkedGeoLoop* inner = malloc(sizeof(*inner)); + assert(inner != NULL); + createLinkedLoop(inner, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner); + addLinkedLoop(&polygon, outer); + + int result = normalizeMultiPolygon(&polygon); + + t_assert(result == NORMALIZATION_ERR_UNASSIGNED_HOLES, + "Expected error code returned"); + + t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 1, + "Loop count on first polygon correct"); + t_assert(polygon.first == outer, "Got expected outer loop"); + + H3_EXPORT(destroyLinkedPolygon)(&polygon); + } } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 54517ddd4..aa60e948b 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -266,6 +266,9 @@ H3Index H3_EXPORT(h3ToCenterChild)(H3Index h, int childRes) { */ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, const int numHexes) { + if (numHexes == 0) { + return 0; + } int res = H3_GET_RESOLUTION(h3Set[0]); if (res == 0) { // No compaction possible, just copy the set to output From 61ebcaf1273759d1fe77f2e4372d99732a31f9ac Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 3 Sep 2019 16:40:41 -0700 Subject: [PATCH 160/771] Add PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc19ae546..c486b16a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Fixed -- `compact` handles zero length input correctly. +- `compact` handles zero length input correctly. (#278) ## [3.6.0] - 2019-08-12 ### Added From 5d4b6c36b5d458c55b2fc1166fdef77c212e6cf8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 3 Sep 2019 16:52:45 -0700 Subject: [PATCH 161/771] Correct use of variable length array in test --- src/apps/testapps/testCompact.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index cd2ddc096..d71fb4619 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -161,11 +161,11 @@ SUITE(compact) { // Exercises a case where compaction needs to be tested but none is // possible const int numHex = 7; - H3Index disparate[numHex] = {0}; + H3Index disparate[] = {0, 0, 0, 0, 0, 0, 0}; for (int i = 0; i < numHex; i++) { setH3Index(&disparate[i], 1, i, CENTER_DIGIT); } - H3Index output[numHex] = {0}; + H3Index output[] = {0, 0, 0, 0, 0, 0, 0}; t_assert(H3_EXPORT(compact)(disparate, output, numHex) == 0, "compact succeeds on disparate input"); From 8e649809ce6e881fe5269d25c900dad93ec18cc2 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 3 Sep 2019 17:30:54 -0700 Subject: [PATCH 162/771] Remove asserts on normalizeMultiPolygon test beyond the error code --- src/apps/testapps/testPolygon.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/apps/testapps/testPolygon.c b/src/apps/testapps/testPolygon.c index 98ec9a1ff..1ebb84269 100644 --- a/src/apps/testapps/testPolygon.c +++ b/src/apps/testapps/testPolygon.c @@ -576,11 +576,6 @@ SUITE(polygon) { t_assert(result == NORMALIZATION_ERR_UNASSIGNED_HOLES, "Expected error code returned"); - t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 1, - "Loop count on first polygon correct"); - t_assert(polygon.first == outer, "Got expected outer loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); } } From c27c737f4b7d67306bbf2c432538a325b655e246 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Wed, 11 Sep 2019 16:19:51 +0000 Subject: [PATCH 163/771] trivial fix to bboxHexRadius to guarantee containment --- src/h3lib/lib/bbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 90196b35d..19ed49dcb 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -117,5 +117,5 @@ int bboxHexRadius(const BBox* bbox, int res) { // any orientation of the GeoJSON encased in a circle defined by the // bounding box radius and center, it is guaranteed to fit in this k-ring // Rounded *up* to guarantee containment - return (int)ceil(bboxRadiusKm / (1.5 * centerHexRadiusKm)); + return (int)ceil(bboxRadiusKm / (1.0 * centerHexRadiusKm)); } From 83a39ccc94052e93fd0bde051ea9e8d8a46ecf2a Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Thu, 12 Sep 2019 13:11:09 +0000 Subject: [PATCH 164/771] fix failing test --- src/apps/testapps/testPolyfill.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index df9db2e90..7a303a0d0 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -64,10 +64,10 @@ SUITE(polyfill) { TEST(maxPolyfillSize) { int numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - t_assert(numHexagons == 3169, "got expected max polyfill size"); + t_assert(numHexagons == 7057, "got expected max polyfill size"); numHexagons = H3_EXPORT(maxPolyfillSize)(&holeGeoPolygon, 9); - t_assert(numHexagons == 3169, "got expected max polyfill size (hole)"); + t_assert(numHexagons == 7057, "got expected max polyfill size (hole)"); numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); t_assert(numHexagons == 1, "got expected max polyfill size (empty)"); From 56d2ff59e2698f1ac236f3e0f9756116df3f4cc8 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Fri, 13 Sep 2019 16:45:46 +0000 Subject: [PATCH 165/771] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c486b16a9..aeab10506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Fixed - `compact` handles zero length input correctly. (#278) +- `bboxHexRadius` scaling factor adjusted to guarantee containment for `polyfill`. (#279) ## [3.6.0] - 2019-08-12 ### Added From 9166882b53ade3cd524a7626b5a7b2bc440acb95 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Sat, 14 Sep 2019 16:04:24 -0500 Subject: [PATCH 166/771] simplify code and update comment based on #279 discussion. --- src/h3lib/lib/bbox.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 19ed49dcb..a54022a4b 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -112,10 +112,14 @@ int bboxHexRadius(const BBox* bbox, int res) { // Determine the radius of the center hexagon double centerHexRadiusKm = _hexRadiusKm(H3_EXPORT(geoToH3)(¢er, res)); - // The closest point along a hexagon drawn through the center points - // of a k-ring aggregation is exactly 1.5 radii of the hexagon. For - // any orientation of the GeoJSON encased in a circle defined by the - // bounding box radius and center, it is guaranteed to fit in this k-ring - // Rounded *up* to guarantee containment - return (int)ceil(bboxRadiusKm / (1.0 * centerHexRadiusKm)); + // We use centerHexRadiusKm un-scaled and rounded *up* to guarantee + // containment ot the bbox. Ideal, undistorted hexagons could scale + // centerHexRadiusKm by a factor of up to 1.5, reducing bboxHexRadius. + // This is because the closest point along an undistorted hexagon drawn + // through the center points of a k-ring aggregation is exactly 1.5 radii + // of the hexagon. But there is distortion near pentagons, and for those + // cases, the scaling needs to be less than 1.5. Using the un-scaled value + // conservatively guarantees containment for all cases, at the expense of a + // larger bboxHexRadius. + return (int)ceil(bboxRadiusKm / centerHexRadiusKm); } From fc93d829cac2fb4266243386596aa37b8989ddc3 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Sat, 14 Sep 2019 19:03:43 -0500 Subject: [PATCH 167/771] regression test for #136. --- CMakeLists.txt | 2 + src/apps/testapps/testPolyfill_GH136.c | 59 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/apps/testapps/testPolyfill_GH136.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 68beac0f5..e4f1c6f4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testVertexGraph.c src/apps/testapps/testCompact.c src/apps/testapps/testPolyfill.c + src/apps/testapps/testPolyfill_GH136.c src/apps/testapps/testPentagonIndexes.c src/apps/testapps/testKRing.c src/apps/testapps/testH3ToGeoBoundary.c @@ -506,6 +507,7 @@ if(BUILD_TESTING) add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) + add_h3_test(testPolyfill_GH136 src/apps/testapps/testPolyfill_GH136.c) add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) diff --git a/src/apps/testapps/testPolyfill_GH136.c b/src/apps/testapps/testPolyfill_GH136.c new file mode 100644 index 000000000..6d25276bd --- /dev/null +++ b/src/apps/testapps/testPolyfill_GH136.c @@ -0,0 +1,59 @@ +/* + * Copyright 2017-2018 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "algos.h" +#include "constants.h" +#include "geoCoord.h" +#include "h3Index.h" +#include "test.h" + +// https://github.com/uber/h3/issues/136 + +static GeoCoord testVerts[] = {{0.10068990369902957, 0.8920772174196191}, + {0.10032914690616246, 0.8915914753447348}, + {0.10033349237998787, 0.8915860128746426}, + {0.10069496685903621, 0.8920742194546231}}; +static Geofence testGeofence = {.numVerts = 4, .verts = testVerts}; +static GeoPolygon testPolygon; + +static int countActualHexagons(H3Index* hexagons, int numHexagons) { + int actualNumHexagons = 0; + for (int i = 0; i < numHexagons; i++) { + if (hexagons[i] != 0) { + actualNumHexagons++; + } + } + return actualNumHexagons; +} + +SUITE(polyfill_gh136) { + + testPolygon.geofence = testGeofence; + testPolygon.numHoles = 0; + + TEST(gh136) { + int res = 13; + int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res); + H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&testPolygon, res, hexagons); + int actualNumHexagons = countActualHexagons(hexagons, numHexagons); + + t_assert(actualNumHexagons == 4353, "got expected polyfill size"); + free(hexagons); + } +} From dcb5446e036531898242dd5af0b298e4f03533b3 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Sat, 14 Sep 2019 19:22:47 -0500 Subject: [PATCH 168/771] fix formatting --- src/apps/testapps/testPolyfill_GH136.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/testapps/testPolyfill_GH136.c b/src/apps/testapps/testPolyfill_GH136.c index 6d25276bd..08bae86cb 100644 --- a/src/apps/testapps/testPolyfill_GH136.c +++ b/src/apps/testapps/testPolyfill_GH136.c @@ -41,7 +41,6 @@ static int countActualHexagons(H3Index* hexagons, int numHexagons) { } SUITE(polyfill_gh136) { - testPolygon.geofence = testGeofence; testPolygon.numHoles = 0; From 2f5a7010cef2340125db8dd4b2d22945da03fe46 Mon Sep 17 00:00:00 2001 From: Kurt Smith Date: Mon, 16 Sep 2019 16:50:33 -0500 Subject: [PATCH 169/771] update copyright date --- src/apps/testapps/testPolyfill_GH136.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/testapps/testPolyfill_GH136.c b/src/apps/testapps/testPolyfill_GH136.c index 08bae86cb..9c6504ce1 100644 --- a/src/apps/testapps/testPolyfill_GH136.c +++ b/src/apps/testapps/testPolyfill_GH136.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 7e5f0a5ad88ce76cc2d3c897efd2cddf7f209851 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 19 Sep 2019 20:49:50 -0700 Subject: [PATCH 170/771] Improved breadth-first 'spidering' polyfill algorithm --- src/apps/testapps/testPolyfill.c | 4 +- src/h3lib/include/bbox.h | 2 +- src/h3lib/include/h3api.h.in | 2 +- src/h3lib/lib/algos.c | 184 +++++++++++++++++++++++++------ src/h3lib/lib/bbox.c | 55 ++++----- 5 files changed, 178 insertions(+), 69 deletions(-) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 7a303a0d0..b3c4d97d7 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -64,10 +64,10 @@ SUITE(polyfill) { TEST(maxPolyfillSize) { int numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - t_assert(numHexagons == 7057, "got expected max polyfill size"); + t_assert(numHexagons == 3457, "got expected max polyfill size"); numHexagons = H3_EXPORT(maxPolyfillSize)(&holeGeoPolygon, 9); - t_assert(numHexagons == 7057, "got expected max polyfill size (hole)"); + t_assert(numHexagons == 3457, "got expected max polyfill size (hole)"); numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); t_assert(numHexagons == 1, "got expected max polyfill size (empty)"); diff --git a/src/h3lib/include/bbox.h b/src/h3lib/include/bbox.h index c5f918cb2..e0fe9ddb1 100644 --- a/src/h3lib/include/bbox.h +++ b/src/h3lib/include/bbox.h @@ -37,6 +37,6 @@ bool bboxIsTransmeridian(const BBox* bbox); void bboxCenter(const BBox* bbox, GeoCoord* center); bool bboxContains(const BBox* bbox, const GeoCoord* point); bool bboxEquals(const BBox* b1, const BBox* b2); -int bboxHexRadius(const BBox* bbox, int res); +int bboxHexEstimate(const BBox* bbox, int res); #endif diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 9956fe858..df27d3589 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -221,7 +221,7 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index *out); int H3_EXPORT(maxPolyfillSize)(const GeoPolygon *geoPolygon, int res); /** @brief hexagons within the given geofence */ -void H3_EXPORT(polyfill)(const GeoPolygon *geoPolygon, int res, H3Index *out); +int H3_EXPORT(polyfill)(const GeoPolygon *geoPolygon, int res, H3Index *out); /** @} */ /** @defgroup h3SetToMultiPolygon h3SetToMultiPolygon diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index d41b086b9..3440fa7a1 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -635,11 +635,7 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { // Get the bounding box for the GeoJSON-like struct BBox bbox; bboxFromGeofence(&geoPolygon->geofence, &bbox); - int minK = bboxHexRadius(&bbox, res); - - // The total number of hexagons to allocate can now be determined by - // the k-ring hex allocation helper function. - return H3_EXPORT(maxKringSize)(minK); + return bboxHexEstimate(&bbox, res); } /** @@ -655,7 +651,7 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * @param res The Hexagon resolution (0-15) * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ -void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { +int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // One of the goals of the polyfill algorithm is that two adjacent polygons // with zero overlap have zero overlapping hexagons. That the hexagons are // uniquely assigned. There are a few approaches to take here, such as @@ -677,36 +673,160 @@ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { BBox* bboxes = malloc((geoPolygon->numHoles + 1) * sizeof(BBox)); assert(bboxes != NULL); bboxesFromGeoPolygon(geoPolygon, bboxes); - int minK = bboxHexRadius(&bboxes[0], res); - int numHexagons = H3_EXPORT(maxKringSize)(minK); - - // Get the center hex - GeoCoord center; - bboxCenter(&bboxes[0], ¢er); - H3Index centerH3 = H3_EXPORT(geoToH3)(¢er, res); - - // From here on it works differently, first we get all potential - // hexagons inserted into the available memory - H3_EXPORT(kRing)(centerH3, minK, out); - - // Next we iterate through each hexagon, and test its center point to see if - // it's contained in the GeoJSON-like struct - for (int i = 0; i < numHexagons; i++) { - // Skip records that are already zeroed - if (out[i] == 0) { - continue; + + // Get the estimated number of hexagons and allocate some temporary memory + // for the hexagons + int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); + // This algorithm assumes that the number of vertices is usually less than + // the number of hexagons, but when it's wrong, this will keep it from + // failing + const Geofence geofence = geoPolygon->geofence; + int numVerts = geofence.numVerts; + for (int i = 0; i < geoPolygon->numHoles; i++) { + numVerts += geoPolygon->holes[i].numVerts; + } + if (numHexagons < numVerts) numHexagons = numVerts; + H3Index* search = calloc(numHexagons, sizeof(H3Index)); + H3Index* found = calloc(numHexagons, sizeof(H3Index)); + + // Some metadata for tracking the state of the search and found memory + // blocks + int numSearchHexes = 0; + int numFoundHexes = 0; + + // 1. Get all points of the main polygon, convert them to hexagons and add + // them to the search hash. The hexagon containing the geofence point may or + // may not be contained by the geofence (as the hexagon's center point may + // be outside of the boundary.) + for (int i = 0; i < geofence.numVerts; i++) { + H3Index pointHex = H3_EXPORT(geoToH3)(&(geofence.verts[i]), res); + // For the search buffer, the initial seeding is just going to put the + // hexagons in packed in the order they're found in this loop, and also + // update the metadata as needed. + search[numSearchHexes] = pointHex; + numSearchHexes++; + } + + // 2. Iterate over all holes, get all points of the holes, convert them to + // hexagons and add to only the search hash. We're going to temporarily use + // the `found` hash to use for dedupe purposes and then re-zero it once + // we're done here, otherwise we'd have to scan the whole set on each insert + // to make sure there's no duplicates, which is very inefficient. + for (int i = 0; i < geoPolygon->numHoles; i++) { + Geofence* hole = &(geoPolygon->holes[i]); + for (int j = 0; j < hole->numVerts; j++) { + H3Index pointHex = H3_EXPORT(geoToH3)(&(hole->verts[j]), res); + // A simple hash to store the hexagon, or move to another place if + // needed + int loc = (int)(pointHex % numHexagons); + int loopCount = 0; + while (found[loc] != 0) { + if (loopCount > numHexagons) { + free(search); + free(found); + free(bboxes); + return -1; + } + if (found[loc] == pointHex) + break; // At least two points of the geofence are identical + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (found[loc] == pointHex) + continue; // Skip this hex, already exists in the found hash + // Otherwise, set it in the found hash for now + found[loc] = pointHex; + + // Set the hexagon in the search hash, as well + search[numSearchHexes] = pointHex; + numSearchHexes++; } - // Check if hexagon is inside of polygon - GeoCoord hexCenter; - H3_EXPORT(h3ToGeo)(out[i], &hexCenter); - hexCenter.lat = constrainLat(hexCenter.lat); - hexCenter.lon = constrainLng(hexCenter.lon); - // And remove from list if not - if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { - out[i] = H3_INVALID_INDEX; + } + + // 3. Re-zero the found hash so it can be used in the main loop below + for (int i = 0; i < numHexagons; i++) found[i] = 0; + + // 4. Begin main loop. While the search hash is not empty do the following + while (numSearchHexes > 0) { + // Iterate through all hexagons in the current search hash, then loop + // through all neighbors and test Point-in-Poly, if point-in-poly + // succeeds, add to out and found hashes if not already there. + H3Index ring[7] = {0}; + int currentSearchNum = 0; + int i = 0; + while (currentSearchNum < numSearchHexes) { + H3Index searchHex = search[i]; + if (searchHex == 0) { // Gap, skip it + i++; + continue; + } + kRing(searchHex, 1, ring); + for (int j = 1; j < 7; j++) { + if (ring[j] == 0) { + continue; // Skip if this was a pentagon and only had 5 + // neighbors + } + + H3Index hex = ring[j]; + + // A simple hash to store the hexagon, or move to another place + // if needed. This MUST be done before the point-in-poly check + // since that's far more expensive + int loc = (int)(hex % numHexagons); + int loopCount = 0; + while (out[loc] != 0) { + if (loopCount > numHexagons) { + free(search); + free(found); + free(bboxes); + return -1; + } + if (out[loc] == hex) break; // Skip duplicates found + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (out[loc] == hex) + continue; // Skip this hex, already exists in the out hash + + // Check if the hexagon is in the polygon or not + GeoCoord hexCenter; + H3_EXPORT(h3ToGeo)(hex, &hexCenter); + hexCenter.lat = constrainLat(hexCenter.lat); + hexCenter.lon = constrainLng(hexCenter.lon); + + // If not, skip + if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { + continue; + } + + // Otherwise set it in the output array + out[loc] = hex; + + // Set the hexagon in the found hash + found[numFoundHexes] = hex; + numFoundHexes++; + // Wipe the current hex ring value back out + ring[j] = 0; + } + currentSearchNum++; + i++; } + + // Swap the search and found pointers, copy the found hex count to the + // search hex count, and zero everything related to the found memory. + H3Index* temp = search; + search = found; + found = temp; + for (int j = 0; j < numSearchHexes; j++) found[j] = 0; + numSearchHexes = numFoundHexes; + numFoundHexes = 0; + // Repeat until no new hexagons are found } + // The out memory structure should be complete, end it here free(bboxes); + free(search); + free(found); + return 0; } /** diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index a54022a4b..6d151f231 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -87,39 +87,28 @@ double _hexRadiusKm(H3Index h3Index) { return _geoDistKm(&h3Center, h3Boundary.verts); } -/** - * Get the radius of the bbox in hexagons - i.e. the radius of a k-ring centered - * on the bbox center and covering the entire bbox. - * @param bbox Bounding box to measure - * @param res Resolution of hexagons to use in measurement - * @return Radius in hexagons - */ -int bboxHexRadius(const BBox* bbox, int res) { - // Determine the center of the bounding box - GeoCoord center; - bboxCenter(bbox, ¢er); - - // Use a vertex on the side closest to the equator, to ensure the longest - // radius in cases with significant distortion. East/west is arbitrary. - double lat = - fabs(bbox->north) > fabs(bbox->south) ? bbox->south : bbox->north; - GeoCoord vertex = {lat, bbox->east}; - - // Determine the length of the bounding box "radius" to then use - // as a circle on the earth that the k-rings must be greater than - double bboxRadiusKm = _geoDistKm(¢er, &vertex); +int bboxHexEstimate(const BBox* bbox, int res) { + // Get the area of the pentagon as the maximally-distored area possible + H3Index pentagons[12] = {0}; + getPentagonIndexes(res, pentagons); + double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); + // Area of a regular hexagon is 3/2*sqrt(3) * r * r + double pentagonAreaKm2 = + 2.59807621135 * pentagonRadiusKm * pentagonRadiusKm; - // Determine the radius of the center hexagon - double centerHexRadiusKm = _hexRadiusKm(H3_EXPORT(geoToH3)(¢er, res)); + // Then get the area of the bounding box of the geofence in question + GeoCoord p1, p2; + p1.lat = bbox->north; + p1.lon = bbox->east; + p2.lat = bbox->south; + p2.lon = bbox->east; + double h = _geoDistKm(&p1, &p2); + p2.lat = bbox->north; + p2.lon = bbox->west; + double w = _geoDistKm(&p1, &p2); - // We use centerHexRadiusKm un-scaled and rounded *up* to guarantee - // containment ot the bbox. Ideal, undistorted hexagons could scale - // centerHexRadiusKm by a factor of up to 1.5, reducing bboxHexRadius. - // This is because the closest point along an undistorted hexagon drawn - // through the center points of a k-ring aggregation is exactly 1.5 radii - // of the hexagon. But there is distortion near pentagons, and for those - // cases, the scaling needs to be less than 1.5. Using the un-scaled value - // conservatively guarantees containment for all cases, at the expense of a - // larger bboxHexRadius. - return (int)ceil(bboxRadiusKm / centerHexRadiusKm); + // Divide the two to get an estimate of the number of hexagons needed + int estimate = (int)ceil(w * h / pentagonAreaKm2); + if (estimate == 0) estimate = 1; + return estimate; } From 26807c1422144f720e3b046687d13c846eca34be Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 19 Sep 2019 22:58:32 -0700 Subject: [PATCH 171/771] Add code to track rejected hexagons to not double-check them, and fix coverage report error --- src/h3lib/lib/algos.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 3440fa7a1..2dc7abb8d 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -688,6 +688,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (numHexagons < numVerts) numHexagons = numVerts; H3Index* search = calloc(numHexagons, sizeof(H3Index)); H3Index* found = calloc(numHexagons, sizeof(H3Index)); + H3Index* rejects = calloc(numHexagons, sizeof(H3Index)); // Some metadata for tracking the state of the search and found memory // blocks @@ -724,6 +725,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (loopCount > numHexagons) { free(search); free(found); + free(rejects); free(bboxes); return -1; } @@ -760,7 +762,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { i++; continue; } - kRing(searchHex, 1, ring); + H3_EXPORT(kRing)(searchHex, 1, ring); for (int j = 1; j < 7; j++) { if (ring[j] == 0) { continue; // Skip if this was a pentagon and only had 5 @@ -778,6 +780,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (loopCount > numHexagons) { free(search); free(found); + free(rejects); free(bboxes); return -1; } @@ -785,8 +788,26 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { loc = (loc + 1) % numHexagons; loopCount++; } - if (out[loc] == hex) + if (out[loc] == hex) { continue; // Skip this hex, already exists in the out hash + } + loopCount = 0; + int rloc = (int)(hex % numHexagons); + while (rejects[rloc] != 0) { + if (loopCount > numHexagons) { + free(search); + free(found); + free(rejects); + free(bboxes); + return -1; + } + if (rejects[rloc] == hex) break; // Skip duplicates found + rloc = (rloc + 1) % numHexagons; + loopCount++; + } + if (rejects[rloc] == hex) { + continue; // Skip this hex, already rejected + } // Check if the hexagon is in the polygon or not GeoCoord hexCenter; @@ -796,6 +817,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // If not, skip if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { + rejects[rloc] = hex; // Mark this hex as rejected continue; } @@ -826,6 +848,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { free(bboxes); free(search); free(found); + free(rejects); return 0; } From f47d1fbf579a31a4bac1081d9f85030e7b5e1155 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 19 Sep 2019 23:19:19 -0700 Subject: [PATCH 172/771] Remove the rejects tracking. There was some sort of bug in it and the added complexity didn't really bring about any huge perf gain --- src/h3lib/lib/algos.c | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 2dc7abb8d..362f62e0a 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -688,7 +688,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (numHexagons < numVerts) numHexagons = numVerts; H3Index* search = calloc(numHexagons, sizeof(H3Index)); H3Index* found = calloc(numHexagons, sizeof(H3Index)); - H3Index* rejects = calloc(numHexagons, sizeof(H3Index)); // Some metadata for tracking the state of the search and found memory // blocks @@ -725,7 +724,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (loopCount > numHexagons) { free(search); free(found); - free(rejects); free(bboxes); return -1; } @@ -780,7 +778,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (loopCount > numHexagons) { free(search); free(found); - free(rejects); free(bboxes); return -1; } @@ -791,23 +788,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { if (out[loc] == hex) { continue; // Skip this hex, already exists in the out hash } - loopCount = 0; - int rloc = (int)(hex % numHexagons); - while (rejects[rloc] != 0) { - if (loopCount > numHexagons) { - free(search); - free(found); - free(rejects); - free(bboxes); - return -1; - } - if (rejects[rloc] == hex) break; // Skip duplicates found - rloc = (rloc + 1) % numHexagons; - loopCount++; - } - if (rejects[rloc] == hex) { - continue; // Skip this hex, already rejected - } // Check if the hexagon is in the polygon or not GeoCoord hexCenter; @@ -817,7 +797,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // If not, skip if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { - rejects[rloc] = hex; // Mark this hex as rejected continue; } @@ -830,6 +809,7 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Wipe the current hex ring value back out ring[j] = 0; } + ring[0] = 0; currentSearchNum++; i++; } @@ -848,7 +828,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { free(bboxes); free(search); free(found); - free(rejects); return 0; } From f124eda24a4a20eb74c26f52c9d8003c6b9532cb Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 19 Sep 2019 23:29:15 -0700 Subject: [PATCH 173/771] Fix another H3_EXPORT error --- src/h3lib/lib/bbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 6d151f231..5e5a1ae64 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -90,7 +90,7 @@ double _hexRadiusKm(H3Index h3Index) { int bboxHexEstimate(const BBox* bbox, int res) { // Get the area of the pentagon as the maximally-distored area possible H3Index pentagons[12] = {0}; - getPentagonIndexes(res, pentagons); + H3_EXPORT(getPentagonIndexes)(res, pentagons); double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); // Area of a regular hexagon is 3/2*sqrt(3) * r * r double pentagonAreaKm2 = From 3145d3885c4b5d9c4473bb624791c1a2b550cce2 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Fri, 20 Sep 2019 16:19:48 -0700 Subject: [PATCH 174/771] Fix logo URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f996b9e6..6dd3b6f3d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -H3 Logo +H3 Logo # H3: A Hexagonal Hierarchical Geospatial Indexing System From 3113c5385f66304bcacb69021da47cc63738fd83 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Wed, 2 Oct 2019 16:26:10 -0700 Subject: [PATCH 175/771] Get all hexagons in a trace around the polygon to avoid certain edge cases --- src/h3lib/include/bbox.h | 2 + src/h3lib/lib/algos.c | 89 ++++++++++++++++++++++++++++++---------- src/h3lib/lib/bbox.c | 13 ++++++ 3 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/h3lib/include/bbox.h b/src/h3lib/include/bbox.h index e0fe9ddb1..8840328a8 100644 --- a/src/h3lib/include/bbox.h +++ b/src/h3lib/include/bbox.h @@ -38,5 +38,7 @@ void bboxCenter(const BBox* bbox, GeoCoord* center); bool bboxContains(const BBox* bbox, const GeoCoord* point); bool bboxEquals(const BBox* b1, const BBox* b2); int bboxHexEstimate(const BBox* bbox, int res); +int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, + int res); #endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 362f62e0a..da71c784b 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -699,23 +699,21 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // may not be contained by the geofence (as the hexagon's center point may // be outside of the boundary.) for (int i = 0; i < geofence.numVerts; i++) { - H3Index pointHex = H3_EXPORT(geoToH3)(&(geofence.verts[i]), res); - // For the search buffer, the initial seeding is just going to put the - // hexagons in packed in the order they're found in this loop, and also - // update the metadata as needed. - search[numSearchHexes] = pointHex; - numSearchHexes++; - } - - // 2. Iterate over all holes, get all points of the holes, convert them to - // hexagons and add to only the search hash. We're going to temporarily use - // the `found` hash to use for dedupe purposes and then re-zero it once - // we're done here, otherwise we'd have to scan the whole set on each insert - // to make sure there's no duplicates, which is very inefficient. - for (int i = 0; i < geoPolygon->numHoles; i++) { - Geofence* hole = &(geoPolygon->holes[i]); - for (int j = 0; j < hole->numVerts; j++) { - H3Index pointHex = H3_EXPORT(geoToH3)(&(hole->verts[j]), res); + GeoCoord origin, destination; + origin = geofence.verts[i]; + destination = i == geofence.numVerts - 1 ? geofence.verts[0] + : geofence.verts[i + 1]; + const int numHexesEstimate = + lineHexEstimate(&origin, &destination, res); + for (int j = 0; j < numHexesEstimate; j++) { + GeoCoord interpolate; + interpolate.lat = + (origin.lat * (numHexesEstimate - j) / numHexesEstimate) + + (destination.lat * j / numHexesEstimate); + interpolate.lon = + (origin.lon * (numHexesEstimate - j) / numHexesEstimate) + + (destination.lon * j / numHexesEstimate); + H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); // A simple hash to store the hexagon, or move to another place if // needed int loc = (int)(pointHex % numHexagons); @@ -737,12 +735,63 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Otherwise, set it in the found hash for now found[loc] = pointHex; - // Set the hexagon in the search hash, as well search[numSearchHexes] = pointHex; numSearchHexes++; } } + // 2. Iterate over all holes, get all points of the holes, convert them to + // hexagons and add to only the search hash. We're going to temporarily use + // the `found` hash to use for dedupe purposes and then re-zero it once + // we're done here, otherwise we'd have to scan the whole set on each insert + // to make sure there's no duplicates, which is very inefficient. + for (int i = 0; i < geoPolygon->numHoles; i++) { + Geofence* hole = &(geoPolygon->holes[i]); + for (int j = 0; j < hole->numVerts; j++) { + GeoCoord origin, destination; + origin = hole->verts[j]; + destination = + j == hole->numVerts - 1 ? hole->verts[0] : hole->verts[j + 1]; + const int numHexesEstimate = + lineHexEstimate(&origin, &destination, res); + for (int k = 0; k < numHexesEstimate; k++) { + GeoCoord interpolate; + interpolate.lat = + (origin.lat * (numHexesEstimate - k) / numHexesEstimate) + + (destination.lat * k / numHexesEstimate); + interpolate.lon = + (origin.lon * (numHexesEstimate - k) / numHexesEstimate) + + (destination.lon * k / numHexesEstimate); + H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); + // A simple hash to store the hexagon, or move to another place + // if needed + int loc = (int)(pointHex % numHexagons); + int loopCount = 0; + while (found[loc] != 0) { + if (loopCount > numHexagons) { + free(search); + free(found); + free(bboxes); + return -1; + } + if (found[loc] == pointHex) + break; // At least two points of the geofence are + // identical + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (found[loc] == pointHex) + continue; // Skip this hex, already exists in the found + // hash + // Otherwise, set it in the found hash for now + found[loc] = pointHex; + + search[numSearchHexes] = pointHex; + numSearchHexes++; + } + } + } + // 3. Re-zero the found hash so it can be used in the main loop below for (int i = 0; i < numHexagons; i++) found[i] = 0; @@ -756,10 +805,6 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { int i = 0; while (currentSearchNum < numSearchHexes) { H3Index searchHex = search[i]; - if (searchHex == 0) { // Gap, skip it - i++; - continue; - } H3_EXPORT(kRing)(searchHex, 1, ring); for (int j = 1; j < 7; j++) { if (ring[j] == 0) { diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 5e5a1ae64..7cc0ea2e4 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -112,3 +112,16 @@ int bboxHexEstimate(const BBox* bbox, int res) { if (estimate == 0) estimate = 1; return estimate; } + +int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, + int res) { + // Get the area of the pentagon as the maximally-distored area possible + H3Index pentagons[12] = {0}; + H3_EXPORT(getPentagonIndexes)(res, pentagons); + double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); + + double dist = _geoDistKm(origin, destination); + int estimate = (int)ceil(dist / (2 * pentagonRadiusKm)); + if (estimate == 0) estimate = 1; + return estimate; +} From 00edc2064e2ec84c0f10179d52e80242daff7acb Mon Sep 17 00:00:00 2001 From: Javier de la Torre Date: Sat, 19 Oct 2019 09:27:47 -0400 Subject: [PATCH 176/771] Added functions for usage with BigQuery --- docs/community/bindings.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index ac434b2ef..2d08ff297 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -2,6 +2,10 @@ As a C library, bindings can be made to call H3 functions from different programming languages. This page lists different bindings currently available. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/bindings.md). +## BigQuery + +- [cartodb/bigquery-jslibs](https://github.com/CartoDB/bigquery-jslibs) + ## C# - [entrepreneur-interet-general/h3.standard](https://github.com/entrepreneur-interet-general/H3.Standard) From cb12f338382a6ec9fde1e804fb12b89b98ff314b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Wed, 23 Oct 2019 15:32:03 -0700 Subject: [PATCH 177/771] Restore API back compat and DRY code a bit as suggested by @nrabinowitz --- src/h3lib/include/h3api.h.in | 2 +- src/h3lib/lib/algos.c | 149 ++++++++++++++++------------------- 2 files changed, 67 insertions(+), 84 deletions(-) diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index df27d3589..9956fe858 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -221,7 +221,7 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index *out); int H3_EXPORT(maxPolyfillSize)(const GeoPolygon *geoPolygon, int res); /** @brief hexagons within the given geofence */ -int H3_EXPORT(polyfill)(const GeoPolygon *geoPolygon, int res, H3Index *out); +void H3_EXPORT(polyfill)(const GeoPolygon *geoPolygon, int res, H3Index *out); /** @} */ /** @defgroup h3SetToMultiPolygon h3SetToMultiPolygon diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index da71c784b..e151e103f 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -651,7 +651,58 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * @param res The Hexagon resolution (0-15) * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ -int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { +void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { + int failure = _polyfill_internal(geoPolygon, res, out); + if (failure) { + int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); + for (int i = 0; i < numHexagons; i++) out[i] = 0; + } +} + +int _get_edge_hexagons(const Geofence* geofence, int numHexagons, int res, + int* numSearchHexes, H3Index* search, H3Index* found) { + for (int i = 0; i < geofence->numVerts; i++) { + GeoCoord origin, destination; + origin = geofence->verts[i]; + destination = i == geofence->numVerts - 1 ? geofence->verts[0] + : geofence->verts[i + 1]; + const int numHexesEstimate = + lineHexEstimate(&origin, &destination, res); + for (int j = 0; j < numHexesEstimate; j++) { + GeoCoord interpolate; + interpolate.lat = + (origin.lat * (numHexesEstimate - j) / numHexesEstimate) + + (destination.lat * j / numHexesEstimate); + interpolate.lon = + (origin.lon * (numHexesEstimate - j) / numHexesEstimate) + + (destination.lon * j / numHexesEstimate); + H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); + // A simple hash to store the hexagon, or move to another place if + // needed + int loc = (int)(pointHex % numHexagons); + int loopCount = 0; + while (found[loc] != 0) { + if (loopCount > numHexagons) { + return -1; + } + if (found[loc] == pointHex) + break; // At least two points of the geofence are identical + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (found[loc] == pointHex) + continue; // Skip this hex, already exists in the found hash + // Otherwise, set it in the found hash for now + found[loc] = pointHex; + + search[*numSearchHexes] = pointHex; + (*numSearchHexes)++; + } + } + return 0; +} + +int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // One of the goals of the polyfill algorithm is that two adjacent polygons // with zero overlap have zero overlapping hexagons. That the hexagons are // uniquely assigned. There are a few approaches to take here, such as @@ -698,46 +749,13 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // them to the search hash. The hexagon containing the geofence point may or // may not be contained by the geofence (as the hexagon's center point may // be outside of the boundary.) - for (int i = 0; i < geofence.numVerts; i++) { - GeoCoord origin, destination; - origin = geofence.verts[i]; - destination = i == geofence.numVerts - 1 ? geofence.verts[0] - : geofence.verts[i + 1]; - const int numHexesEstimate = - lineHexEstimate(&origin, &destination, res); - for (int j = 0; j < numHexesEstimate; j++) { - GeoCoord interpolate; - interpolate.lat = - (origin.lat * (numHexesEstimate - j) / numHexesEstimate) + - (destination.lat * j / numHexesEstimate); - interpolate.lon = - (origin.lon * (numHexesEstimate - j) / numHexesEstimate) + - (destination.lon * j / numHexesEstimate); - H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); - // A simple hash to store the hexagon, or move to another place if - // needed - int loc = (int)(pointHex % numHexagons); - int loopCount = 0; - while (found[loc] != 0) { - if (loopCount > numHexagons) { - free(search); - free(found); - free(bboxes); - return -1; - } - if (found[loc] == pointHex) - break; // At least two points of the geofence are identical - loc = (loc + 1) % numHexagons; - loopCount++; - } - if (found[loc] == pointHex) - continue; // Skip this hex, already exists in the found hash - // Otherwise, set it in the found hash for now - found[loc] = pointHex; - - search[numSearchHexes] = pointHex; - numSearchHexes++; - } + int failure = _get_edge_hexagons(&geofence, numHexagons, res, + &numSearchHexes, search, found); + if (failure) { + free(search); + free(found); + free(bboxes); + return failure; } // 2. Iterate over all holes, get all points of the holes, convert them to @@ -747,48 +765,13 @@ int H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // to make sure there's no duplicates, which is very inefficient. for (int i = 0; i < geoPolygon->numHoles; i++) { Geofence* hole = &(geoPolygon->holes[i]); - for (int j = 0; j < hole->numVerts; j++) { - GeoCoord origin, destination; - origin = hole->verts[j]; - destination = - j == hole->numVerts - 1 ? hole->verts[0] : hole->verts[j + 1]; - const int numHexesEstimate = - lineHexEstimate(&origin, &destination, res); - for (int k = 0; k < numHexesEstimate; k++) { - GeoCoord interpolate; - interpolate.lat = - (origin.lat * (numHexesEstimate - k) / numHexesEstimate) + - (destination.lat * k / numHexesEstimate); - interpolate.lon = - (origin.lon * (numHexesEstimate - k) / numHexesEstimate) + - (destination.lon * k / numHexesEstimate); - H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); - // A simple hash to store the hexagon, or move to another place - // if needed - int loc = (int)(pointHex % numHexagons); - int loopCount = 0; - while (found[loc] != 0) { - if (loopCount > numHexagons) { - free(search); - free(found); - free(bboxes); - return -1; - } - if (found[loc] == pointHex) - break; // At least two points of the geofence are - // identical - loc = (loc + 1) % numHexagons; - loopCount++; - } - if (found[loc] == pointHex) - continue; // Skip this hex, already exists in the found - // hash - // Otherwise, set it in the found hash for now - found[loc] = pointHex; - - search[numSearchHexes] = pointHex; - numSearchHexes++; - } + failure = _get_edge_hexagons(hole, numHexagons, res, &numSearchHexes, + search, found); + if (failure) { + free(search); + free(found); + free(bboxes); + return failure; } } From a044c73bc7c8f1b1acce2c6405d8fb718c457d09 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Wed, 23 Oct 2019 15:46:58 -0700 Subject: [PATCH 178/771] Declare the internal polyfill functions. Apparently GCC is more strict than CLANG on this. --- src/h3lib/include/algos.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/h3lib/include/algos.h b/src/h3lib/include/algos.h index 029800dcc..d75e7ed43 100644 --- a/src/h3lib/include/algos.h +++ b/src/h3lib/include/algos.h @@ -40,4 +40,10 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, // Create a LinkedGeoPolygon from a vertex graph void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out); +// Internal functions for polyfill +int _get_edge_hexagons(const Geofence* geofence, int numHexagons, int res, + int* numSearchHexes, H3Index* search, H3Index* found); + +int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out); + #endif From 7cf5239d15dd633760b3b5af6780229bd75d1420 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 24 Oct 2019 11:21:43 -0700 Subject: [PATCH 179/771] Attempt to solve valgrind issue and also address function naming concern --- src/h3lib/lib/algos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index e151e103f..5bf5ce809 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -800,7 +800,7 @@ int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // A simple hash to store the hexagon, or move to another place // if needed. This MUST be done before the point-in-poly check // since that's far more expensive - int loc = (int)(hex % numHexagons); + int loc = (int)(hex % (numHexagons - 1)); int loopCount = 0; while (out[loc] != 0) { if (loopCount > numHexagons) { From 46d0266467c5648705ea8bf53d15fceb087bc03b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 24 Oct 2019 11:56:27 -0700 Subject: [PATCH 180/771] Didn't actually include my intended changes --- src/h3lib/include/algos.h | 6 +++--- src/h3lib/lib/algos.c | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/h3lib/include/algos.h b/src/h3lib/include/algos.h index d75e7ed43..03587b434 100644 --- a/src/h3lib/include/algos.h +++ b/src/h3lib/include/algos.h @@ -41,9 +41,9 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out); // Internal functions for polyfill -int _get_edge_hexagons(const Geofence* geofence, int numHexagons, int res, - int* numSearchHexes, H3Index* search, H3Index* found); +int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, + int* numSearchHexes, H3Index* search, H3Index* found); -int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out); +int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out); #endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 5bf5ce809..040afdccb 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -652,15 +652,15 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { - int failure = _polyfill_internal(geoPolygon, res, out); + int failure = _polyfillInternal(geoPolygon, res, out); if (failure) { int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); for (int i = 0; i < numHexagons; i++) out[i] = 0; } } -int _get_edge_hexagons(const Geofence* geofence, int numHexagons, int res, - int* numSearchHexes, H3Index* search, H3Index* found) { +int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, + int* numSearchHexes, H3Index* search, H3Index* found) { for (int i = 0; i < geofence->numVerts; i++) { GeoCoord origin, destination; origin = geofence->verts[i]; @@ -702,7 +702,7 @@ int _get_edge_hexagons(const Geofence* geofence, int numHexagons, int res, return 0; } -int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { +int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // One of the goals of the polyfill algorithm is that two adjacent polygons // with zero overlap have zero overlapping hexagons. That the hexagons are // uniquely assigned. There are a few approaches to take here, such as @@ -737,8 +737,8 @@ int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { numVerts += geoPolygon->holes[i].numVerts; } if (numHexagons < numVerts) numHexagons = numVerts; - H3Index* search = calloc(numHexagons, sizeof(H3Index)); - H3Index* found = calloc(numHexagons, sizeof(H3Index)); + H3Index* search = calloc(numHexagons + 1, sizeof(H3Index)); + H3Index* found = calloc(numHexagons + 1, sizeof(H3Index)); // Some metadata for tracking the state of the search and found memory // blocks @@ -749,8 +749,8 @@ int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // them to the search hash. The hexagon containing the geofence point may or // may not be contained by the geofence (as the hexagon's center point may // be outside of the boundary.) - int failure = _get_edge_hexagons(&geofence, numHexagons, res, - &numSearchHexes, search, found); + int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, + search, found); if (failure) { free(search); free(found); @@ -765,8 +765,8 @@ int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // to make sure there's no duplicates, which is very inefficient. for (int i = 0; i < geoPolygon->numHoles; i++) { Geofence* hole = &(geoPolygon->holes[i]); - failure = _get_edge_hexagons(hole, numHexagons, res, &numSearchHexes, - search, found); + failure = _getEdgeHexagons(hole, numHexagons, res, &numSearchHexes, + search, found); if (failure) { free(search); free(found); @@ -800,7 +800,7 @@ int _polyfill_internal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // A simple hash to store the hexagon, or move to another place // if needed. This MUST be done before the point-in-poly check // since that's far more expensive - int loc = (int)(hex % (numHexagons - 1)); + int loc = (int)(hex % numHexagons); int loopCount = 0; while (out[loc] != 0) { if (loopCount > numHexagons) { From eb024cdf120abe6beab32f2794cd75ab899cfca6 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Fri, 25 Oct 2019 09:45:46 -0700 Subject: [PATCH 181/771] Fix memory issue found by valgrind --- src/apps/testapps/testPolyfill.c | 2 +- src/h3lib/lib/algos.c | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index b3c4d97d7..27fbb8a2e 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -70,7 +70,7 @@ SUITE(polyfill) { t_assert(numHexagons == 3457, "got expected max polyfill size (hole)"); numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); - t_assert(numHexagons == 1, "got expected max polyfill size (empty)"); + t_assert(numHexagons == 3, "got expected max polyfill size (empty)"); } TEST(polyfill) { diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 040afdccb..c38fa5ffa 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -634,8 +634,18 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { // Get the bounding box for the GeoJSON-like struct BBox bbox; - bboxFromGeofence(&geoPolygon->geofence, &bbox); - return bboxHexEstimate(&bbox, res); + const Geofence geofence = geoPolygon->geofence; + bboxFromGeofence(&geofence, &bbox); + int numHexagons = bboxHexEstimate(&bbox, res); + // This algorithm assumes that the number of vertices is usually less than + // the number of hexagons, but when it's wrong, this will keep it from + // failing + int numVerts = geofence.numVerts; + for (int i = 0; i < geoPolygon->numHoles; i++) { + numVerts += geoPolygon->holes[i].numVerts; + } + if (numHexagons < numVerts) numHexagons = numVerts; + return numHexagons; } /** @@ -728,17 +738,8 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Get the estimated number of hexagons and allocate some temporary memory // for the hexagons int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); - // This algorithm assumes that the number of vertices is usually less than - // the number of hexagons, but when it's wrong, this will keep it from - // failing - const Geofence geofence = geoPolygon->geofence; - int numVerts = geofence.numVerts; - for (int i = 0; i < geoPolygon->numHoles; i++) { - numVerts += geoPolygon->holes[i].numVerts; - } - if (numHexagons < numVerts) numHexagons = numVerts; - H3Index* search = calloc(numHexagons + 1, sizeof(H3Index)); - H3Index* found = calloc(numHexagons + 1, sizeof(H3Index)); + H3Index* search = calloc(numHexagons, sizeof(H3Index)); + H3Index* found = calloc(numHexagons, sizeof(H3Index)); // Some metadata for tracking the state of the search and found memory // blocks @@ -749,6 +750,7 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // them to the search hash. The hexagon containing the geofence point may or // may not be contained by the geofence (as the hexagon's center point may // be outside of the boundary.) + const Geofence geofence = geoPolygon->geofence; int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, search, found); if (failure) { From 3cbf7bc00eeb840defacf6de08c1b22e4c30b106 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Fri, 25 Oct 2019 11:58:28 -0700 Subject: [PATCH 182/771] Add/update comments (in code) and address some comments (in PR) --- src/h3lib/lib/algos.c | 75 +++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index c38fa5ffa..26ed29361 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -623,9 +623,8 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { * maxPolyfillSize returns the number of hexagons to allocate space for when * performing a polyfill on the given GeoJSON-like data structure. * - * Currently a laughably padded response, being a k-ring that wholly contains - * a bounding box of the GeoJSON, but still less wasted memory than initializing - * a Python application? ;) + * The size is the maximum of either the number of points in the geofence or the + * number of hexagons in the bounding box of the geofence. * * @param geoPolygon A GeoJSON-like data structure indicating the poly to fill * @param res Hexagon resolution (0-15) @@ -653,29 +652,48 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * zeroed memory, and fills it with the hexagons that are contained by * the GeoJSON-like data structure. * - * The current implementation is very primitive and slow, but correct, - * performing a point-in-poly operation on every hexagon in a k-ring defined - * around the given geofence. + * This implementation traces the GeoJSON geofence(s) with hexagons, tests + * them and their neighbors to be contained by the geofence(s), and then any + * newly found hexagons are used to test again until no new hexagons are found. * * @param geoPolygon The geofence and holes defining the relevant area * @param res The Hexagon resolution (0-15) * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { + // TODO: Eliminate this wrapper with the H3 4.0.0 release int failure = _polyfillInternal(geoPolygon, res, out); if (failure) { int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); - for (int i = 0; i < numHexagons; i++) out[i] = 0; + for (int i = 0; i < numHexagons; i++) out[i] = H3_INVALID_INDEX; } } +/** + * _getEdgeHexagons takes a given geofence ring (either the main geofence or + * one of the holes) and traces it with hexagons and updates the search and + * found memory blocks. This is used for determining the initial hexagon set + * for the polyfill algorithm to execute on. + * + * @param geofence The geofence (or hole) to be traced + * @param numHexagons The maximum number of hexagons possible for the geofence + * (also the bounds of the search and found arrays) + * @param res The hexagon resolution (0-15) + * @param numSearchHexes The number of hexagons found so far to be searched + * @param search The block of memory containing the hexagons to search from + * @param found The block of memory containing the hexagons found from the + * search + * + * @return An error code if the hash function cannot insert a found hexagon + * into the found array. + */ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, int* numSearchHexes, H3Index* search, H3Index* found) { for (int i = 0; i < geofence->numVerts; i++) { - GeoCoord origin, destination; - origin = geofence->verts[i]; - destination = i == geofence->numVerts - 1 ? geofence->verts[0] - : geofence->verts[i + 1]; + GeoCoord origin = geofence->verts[i]; + GeoCoord destination = i == geofence->numVerts - 1 + ? geofence->verts[0] + : geofence->verts[i + 1]; const int numHexesEstimate = lineHexEstimate(&origin, &destination, res); for (int j = 0; j < numHexesEstimate; j++) { @@ -696,7 +714,8 @@ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, return -1; } if (found[loc] == pointHex) - break; // At least two points of the geofence are identical + break; // At least two points of the geofence index to the + // same cell loc = (loc + 1) % numHexagons; loopCount++; } @@ -712,6 +731,22 @@ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, return 0; } +/** + * _polyfillInternal traces the provided geoPolygon data structure with hexagons + * and then iteratively searches through these hexagons and their immediate + * neighbors to see if they are contained within the polygon or not. Those that + * are found are added to the out array as well as the found array. Once all + * hexagons to search are checked, the found hexagons become the new search + * array and the found array is wiped and the process repeats until no new + * hexagons can be found. + * + * @param geoPolygon The geofence and holes defining the relevant area + * @param res The Hexagon resolution (0-15) + * @param out The slab of zeroed memory to write to. Assumed to be big enough. + * + * @return An error code if any of the hash operations fails to insert a hexagon + * into an array of memory. + */ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // One of the goals of the polyfill algorithm is that two adjacent polygons // with zero overlap have zero overlapping hexagons. That the hexagons are @@ -746,10 +781,10 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { int numSearchHexes = 0; int numFoundHexes = 0; - // 1. Get all points of the main polygon, convert them to hexagons and add - // them to the search hash. The hexagon containing the geofence point may or - // may not be contained by the geofence (as the hexagon's center point may - // be outside of the boundary.) + // 1. Trace the hexagons along the polygon defining the outer geofence and + // add them to the search hash. The hexagon containing the geofence point + // may or may not be contained by the geofence (as the hexagon's center + // point may be outside of the boundary.) const Geofence geofence = geoPolygon->geofence; int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, search, found); @@ -760,7 +795,7 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { return failure; } - // 2. Iterate over all holes, get all points of the holes, convert them to + // 2. Iterate over all holes, trace the polygons defining the holes with // hexagons and add to only the search hash. We're going to temporarily use // the `found` hash to use for dedupe purposes and then re-zero it once // we're done here, otherwise we'd have to scan the whole set on each insert @@ -791,8 +826,8 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { while (currentSearchNum < numSearchHexes) { H3Index searchHex = search[i]; H3_EXPORT(kRing)(searchHex, 1, ring); - for (int j = 1; j < 7; j++) { - if (ring[j] == 0) { + for (int j = 0; j < 7; j++) { + if (ring[j] == H3_INVALID_INDEX) { continue; // Skip if this was a pentagon and only had 5 // neighbors } @@ -822,8 +857,6 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Check if the hexagon is in the polygon or not GeoCoord hexCenter; H3_EXPORT(h3ToGeo)(hex, &hexCenter); - hexCenter.lat = constrainLat(hexCenter.lat); - hexCenter.lon = constrainLng(hexCenter.lon); // If not, skip if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { From bdffe6c769e62c7e87ceb476c485869e9eed1567 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Fri, 25 Oct 2019 12:25:53 -0700 Subject: [PATCH 183/771] Add LCOV directives to ignore the lines handling code paths we don't think are reachable --- src/h3lib/lib/algos.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 26ed29361..4211bf067 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -663,10 +663,12 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // TODO: Eliminate this wrapper with the H3 4.0.0 release int failure = _polyfillInternal(geoPolygon, res, out); + // LCOV_EXCL_START if (failure) { int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); for (int i = 0; i < numHexagons; i++) out[i] = H3_INVALID_INDEX; } + // LCOV_EXCL_STOP } /** @@ -710,9 +712,7 @@ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, int loc = (int)(pointHex % numHexagons); int loopCount = 0; while (found[loc] != 0) { - if (loopCount > numHexagons) { - return -1; - } + if (loopCount > numHexagons) return -1; // LCOV_EXCL_LINE if (found[loc] == pointHex) break; // At least two points of the geofence index to the // same cell @@ -788,12 +788,14 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { const Geofence geofence = geoPolygon->geofence; int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, search, found); + // LCOV_EXCL_START if (failure) { free(search); free(found); free(bboxes); return failure; } + // LCOV_EXCL_STOP // 2. Iterate over all holes, trace the polygons defining the holes with // hexagons and add to only the search hash. We're going to temporarily use @@ -804,12 +806,14 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { Geofence* hole = &(geoPolygon->holes[i]); failure = _getEdgeHexagons(hole, numHexagons, res, &numSearchHexes, search, found); + // LCOV_EXCL_START if (failure) { free(search); free(found); free(bboxes); return failure; } + // LCOV_EXCL_STOP } // 3. Re-zero the found hash so it can be used in the main loop below @@ -840,12 +844,14 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { int loc = (int)(hex % numHexagons); int loopCount = 0; while (out[loc] != 0) { + // LCOV_EXCL_START if (loopCount > numHexagons) { free(search); free(found); free(bboxes); return -1; } + // LCOV_EXCL_STOP if (out[loc] == hex) break; // Skip duplicates found loc = (loc + 1) % numHexagons; loopCount++; From d7d3cb515df32cdd56aa19ee975aa98c83ab29e0 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Fri, 25 Oct 2019 20:16:33 -0700 Subject: [PATCH 184/771] Address more comments --- src/h3lib/include/algos.h | 4 +++- src/h3lib/lib/algos.c | 6 +++--- src/h3lib/lib/bbox.c | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/h3lib/include/algos.h b/src/h3lib/include/algos.h index 03587b434..f2d9e1754 100644 --- a/src/h3lib/include/algos.h +++ b/src/h3lib/include/algos.h @@ -40,10 +40,12 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, // Create a LinkedGeoPolygon from a vertex graph void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out); -// Internal functions for polyfill +// Internal function for polyfill that traces a geofence with hexagons of a +// specific size int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, int* numSearchHexes, H3Index* search, H3Index* found); +// The new polyfill algorithm. Separated out because it can theoretically fail int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out); #endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 4211bf067..a3f6d2ee9 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -41,6 +41,7 @@ #define HEX_RANGE_SUCCESS 0 #define HEX_RANGE_PENTAGON 1 #define HEX_RANGE_K_SUBSEQUENCE 2 +#define MAX_ONE_RING_SIZE 7 /** * Directions used for traversing a hexagonal ring counterclockwise around @@ -824,13 +825,13 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Iterate through all hexagons in the current search hash, then loop // through all neighbors and test Point-in-Poly, if point-in-poly // succeeds, add to out and found hashes if not already there. - H3Index ring[7] = {0}; int currentSearchNum = 0; int i = 0; while (currentSearchNum < numSearchHexes) { + H3Index ring[MAX_ONE_RING_SIZE] = {0}; H3Index searchHex = search[i]; H3_EXPORT(kRing)(searchHex, 1, ring); - for (int j = 0; j < 7; j++) { + for (int j = 0; j < MAX_ONE_RING_SIZE; j++) { if (ring[j] == H3_INVALID_INDEX) { continue; // Skip if this was a pentagon and only had 5 // neighbors @@ -878,7 +879,6 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Wipe the current hex ring value back out ring[j] = 0; } - ring[0] = 0; currentSearchNum++; i++; } diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 7cc0ea2e4..9a2dd4632 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -88,11 +88,13 @@ double _hexRadiusKm(H3Index h3Index) { } int bboxHexEstimate(const BBox* bbox, int res) { - // Get the area of the pentagon as the maximally-distored area possible + // Get the area of the pentagon as the maximally-distorted area possible H3Index pentagons[12] = {0}; H3_EXPORT(getPentagonIndexes)(res, pentagons); double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); // Area of a regular hexagon is 3/2*sqrt(3) * r * r + // The pentagon has the most distortion (smallest edges) and shares its + // edges with hexagons, so the most-distored hexagons have this area double pentagonAreaKm2 = 2.59807621135 * pentagonRadiusKm * pentagonRadiusKm; From e4848b27470c88eb0b8cd531932ab9a560151805 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 28 Oct 2019 21:56:48 -0700 Subject: [PATCH 185/771] Address more comments by @isaacbrodsky --- src/h3lib/lib/algos.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index a3f6d2ee9..20c323315 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -664,6 +664,9 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // TODO: Eliminate this wrapper with the H3 4.0.0 release int failure = _polyfillInternal(geoPolygon, res, out); + // The polyfill algorithm can theoretically fail if the allocated memory is + // not large enough for the polygon, but this should be impossible given the + // conservative overestimation of the number of hexagons possible. // LCOV_EXCL_START if (failure) { int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); @@ -713,6 +716,8 @@ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, int loc = (int)(pointHex % numHexagons); int loopCount = 0; while (found[loc] != 0) { + // If this conditional is reached, the `found` memory block is + // too small for the given polygon. This should not happen. if (loopCount > numHexagons) return -1; // LCOV_EXCL_LINE if (found[loc] == pointHex) break; // At least two points of the geofence index to the @@ -789,6 +794,8 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { const Geofence geofence = geoPolygon->geofence; int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, search, found); + // If this branch is reached, we have exceeded the maximum number of + // hexagons possible and need to clean up the allocated memory. // LCOV_EXCL_START if (failure) { free(search); @@ -807,6 +814,8 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { Geofence* hole = &(geoPolygon->holes[i]); failure = _getEdgeHexagons(hole, numHexagons, res, &numSearchHexes, search, found); + // If this branch is reached, we have exceeded the maximum number of + // hexagons possible and need to clean up the allocated memory. // LCOV_EXCL_START if (failure) { free(search); @@ -845,6 +854,9 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { int loc = (int)(hex % numHexagons); int loopCount = 0; while (out[loc] != 0) { + // If this branch is reached, we have exceeded the maximum + // number of hexagons possible and need to clean up the + // allocated memory. // LCOV_EXCL_START if (loopCount > numHexagons) { free(search); @@ -876,8 +888,6 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // Set the hexagon in the found hash found[numFoundHexes] = hex; numFoundHexes++; - // Wipe the current hex ring value back out - ring[j] = 0; } currentSearchNum++; i++; From b06665aa227a6a4d2ed5bf2a093d821e30da1cc7 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Tue, 29 Oct 2019 10:09:11 -0700 Subject: [PATCH 186/771] Address @nrabinowitz comments on comments --- src/h3lib/lib/algos.c | 7 ++++--- src/h3lib/lib/bbox.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 20c323315..8d3ed2f2d 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -653,9 +653,10 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * zeroed memory, and fills it with the hexagons that are contained by * the GeoJSON-like data structure. * - * This implementation traces the GeoJSON geofence(s) with hexagons, tests - * them and their neighbors to be contained by the geofence(s), and then any - * newly found hexagons are used to test again until no new hexagons are found. + * This implementation traces the GeoJSON geofence(s) in cartesian space with + * hexagons, tests them and their neighbors to be contained by the geofence(s), + * and then any newly found hexagons are used to test again until no new hexagons + * are found. * * @param geoPolygon The geofence and holes defining the relevant area * @param res The Hexagon resolution (0-15) diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 9a2dd4632..72275b4ae 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -94,7 +94,7 @@ int bboxHexEstimate(const BBox* bbox, int res) { double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); // Area of a regular hexagon is 3/2*sqrt(3) * r * r // The pentagon has the most distortion (smallest edges) and shares its - // edges with hexagons, so the most-distored hexagons have this area + // edges with hexagons, so the most-distorted hexagons have this area double pentagonAreaKm2 = 2.59807621135 * pentagonRadiusKm * pentagonRadiusKm; @@ -117,7 +117,7 @@ int bboxHexEstimate(const BBox* bbox, int res) { int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, int res) { - // Get the area of the pentagon as the maximally-distored area possible + // Get the area of the pentagon as the maximally-distorted area possible H3Index pentagons[12] = {0}; H3_EXPORT(getPentagonIndexes)(res, pentagons); double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); From 9d9516ef77fffa2a42e551575a98d9d43bfc4ec8 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Tue, 29 Oct 2019 11:16:46 -0700 Subject: [PATCH 187/771] Fix formatting issue --- src/h3lib/lib/algos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 8d3ed2f2d..a53010b75 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -655,8 +655,8 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * * This implementation traces the GeoJSON geofence(s) in cartesian space with * hexagons, tests them and their neighbors to be contained by the geofence(s), - * and then any newly found hexagons are used to test again until no new hexagons - * are found. + * and then any newly found hexagons are used to test again until no new + * hexagons are found. * * @param geoPolygon The geofence and holes defining the relevant area * @param res The Hexagon resolution (0-15) From c9316d08fcc7a6b0203277b0202287e41d60d5ad Mon Sep 17 00:00:00 2001 From: Emin Tasgetiren Date: Wed, 30 Oct 2019 11:10:09 +0300 Subject: [PATCH 188/771] fix make kml --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4f1c6f4a..cb697d0ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,11 +350,11 @@ if(BUILD_FILTERS) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}cells.kml") set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}centers.kml") add_custom_target(kml_cells_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}cells.kml \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" + COMMAND ${SHELL} "$ -r ${resolution} | $ --kml --kml-name res${resolution}cells.kml --kml-description \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" VERBATIM DEPENDS create-kml-dir) add_custom_target(kml_centers_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}centers.kml \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" + COMMAND ${SHELL} "$ -r ${resolution} | $ --kml --kml-name res${resolution}centers.kml --kml-description \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" VERBATIM DEPENDS create-kml-dir) add_dependencies(kml From 6eed88343f158592288bf36b681b9e8cc1e08027 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 3 Nov 2019 11:11:45 -0800 Subject: [PATCH 189/771] Address comments by @isaacbrodsky --- src/h3lib/lib/algos.c | 6 +++--- src/h3lib/lib/bbox.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index a53010b75..112c58926 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -640,11 +640,11 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { // This algorithm assumes that the number of vertices is usually less than // the number of hexagons, but when it's wrong, this will keep it from // failing - int numVerts = geofence.numVerts; + int totalVerts = geofence.numVerts; for (int i = 0; i < geoPolygon->numHoles; i++) { - numVerts += geoPolygon->holes[i].numVerts; + totalVerts += geoPolygon->holes[i].numVerts; } - if (numHexagons < numVerts) numHexagons = numVerts; + if (numHexagons < totalVerts) numHexagons = totalVerts; return numHexagons; } diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 72275b4ae..6d37b051a 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -87,6 +87,14 @@ double _hexRadiusKm(H3Index h3Index) { return _geoDistKm(&h3Center, h3Boundary.verts); } +/** + * bboxHexEstimate returns an estimated number of hexagons that fit + * within the cartesian-projected bounding box + * + * @param bbox the bounding box to estimate the hexagon fill level + * @param res the resolution of the H3 hexagons to fill the bounding box + * @return the estimated number of hexagons to fill the bounding box + */ int bboxHexEstimate(const BBox* bbox, int res) { // Get the area of the pentagon as the maximally-distorted area possible H3Index pentagons[12] = {0}; @@ -115,6 +123,15 @@ int bboxHexEstimate(const BBox* bbox, int res) { return estimate; } +/** + * lineHexEstimate returns an estimated number of hexagons that trace + * the cartesian-projected line + * + * @param origin the origin coordinates + * @param destination the destination coordinates + * @param res the resolution of the H3 hexagons to trace the line + * @return the estimated number of hexagons required to trace the line + */ int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, int res) { // Get the area of the pentagon as the maximally-distorted area possible From 4f6ae50aa6dae45ca07d8bafdd2caa75ca75e9eb Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 3 Nov 2019 11:30:13 -0800 Subject: [PATCH 190/771] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeab10506..3718dede8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The public API of this library consists of the functions declared in file ### Fixed - `compact` handles zero length input correctly. (#278) - `bboxHexRadius` scaling factor adjusted to guarantee containment for `polyfill`. (#279) +- `polyfill` new algorithm for up to 3x perf boost. (#282) ## [3.6.0] - 2019-08-12 ### Added From d14cb77327cdaf9c0c26417eb08bc69d63232d57 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 11 Nov 2019 09:26:31 -0800 Subject: [PATCH 191/771] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3718dede8..bbce6fd55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,13 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.6.1] - 2019-11-11 ### Fixed - `compact` handles zero length input correctly. (#278) - `bboxHexRadius` scaling factor adjusted to guarantee containment for `polyfill`. (#279) - `polyfill` new algorithm for up to 3x perf boost. (#282) +- Fix CMake targets for KML generation. (#285) ## [3.6.0] - 2019-08-12 ### Added From f07975dad01c9bafd706955a965351c713060425 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 11 Nov 2019 09:27:06 -0800 Subject: [PATCH 192/771] Update version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 40c341bdc..9575d51ba 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.6.0 +3.6.1 From c178ade3393acceb8d24bb9cc5a1e9dc5d0a8414 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 27 Nov 2019 11:25:00 -0800 Subject: [PATCH 193/771] Add FOSSA step to Travis CI --- .travis.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 732df4e32..c05bf2d88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ addons: matrix: include: # Check that clang-format doesn't detect some files are not formatted. - - env: NAME="Formatting check" + - name: "Formatting check" compiler: clang addons: apt: @@ -41,7 +41,7 @@ matrix: - clang-format-5.0 script: make format && git diff --exit-code # Submit coverage report to Coveralls.io, also test that prefixing works. - - env: NAME="Coverage report" + - name: "Coverage and FOSSA report" compiler: gcc addons: apt: @@ -50,12 +50,14 @@ matrix: install: - gem install coveralls-lcov before_script: + - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash" - cmake -DCMAKE_BUILD_TYPE=Debug -DWARNINGS_AS_ERRORS=ON -DH3_PREFIX=testprefix_ . script: - make && make coverage + - 'if [ -n "$FOSSA_API_KEY" ]; then fossa; fi' after_success: - coveralls-lcov coverage.cleaned.info - - env: NAME="Valgrind test" + - name: "Valgrind test" compiler: gcc addons: apt: @@ -66,9 +68,9 @@ matrix: script: - make - CTEST_OUTPUT_ON_FAILURE=1 make test-fast - - env: NAME="Mac OSX (Xcode 8)" + - name: "Mac OSX (Xcode 8)" os: osx - - env: NAME="binding-functions target" + - name: "binding-functions target" script: - make binding-functions # Check that the file exists and has contents From f43372b0a13b167c125b2176b97a5344cba8e7d4 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Sun, 1 Dec 2019 14:55:15 -0800 Subject: [PATCH 194/771] Add website build to Travis CI --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c05bf2d88..9e8a89ce3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,7 +53,13 @@ matrix: - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash" - cmake -DCMAKE_BUILD_TYPE=Debug -DWARNINGS_AS_ERRORS=ON -DH3_PREFIX=testprefix_ . script: - - make && make coverage + - make + - make coverage + # Test building the website also - needed for FOSSA to pick up dependencies + - cd website + - npm install + - npm run build + - cd .. - 'if [ -n "$FOSSA_API_KEY" ]; then fossa; fi' after_success: - coveralls-lcov coverage.cleaned.info From dd742b9af5889104ff1aa9983f10b5d2edbe0390 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Thu, 5 Dec 2019 19:17:21 -0800 Subject: [PATCH 195/771] Revert "Merge pull request #282 from dfellis/improved-polyfill-algo" This reverts commit ac7bf47f2c85df59ff1b7a3494eb82a03d4c1924, reversing changes made to 74280af2912f667d04528ef0ec0b398d824d38f0. --- CHANGELOG.md | 1 + src/apps/testapps/testPolyfill.c | 6 +- src/h3lib/include/algos.h | 8 - src/h3lib/include/bbox.h | 4 +- src/h3lib/lib/algos.c | 278 +++++-------------------------- src/h3lib/lib/bbox.c | 79 ++++----- 6 files changed, 72 insertions(+), 304 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbce6fd55..74155a928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +- Revert new `polyfill` algorithm until reported issues are fixed. ## [3.6.1] - 2019-11-11 ### Fixed diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 27fbb8a2e..7a303a0d0 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -64,13 +64,13 @@ SUITE(polyfill) { TEST(maxPolyfillSize) { int numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - t_assert(numHexagons == 3457, "got expected max polyfill size"); + t_assert(numHexagons == 7057, "got expected max polyfill size"); numHexagons = H3_EXPORT(maxPolyfillSize)(&holeGeoPolygon, 9); - t_assert(numHexagons == 3457, "got expected max polyfill size (hole)"); + t_assert(numHexagons == 7057, "got expected max polyfill size (hole)"); numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); - t_assert(numHexagons == 3, "got expected max polyfill size (empty)"); + t_assert(numHexagons == 1, "got expected max polyfill size (empty)"); } TEST(polyfill) { diff --git a/src/h3lib/include/algos.h b/src/h3lib/include/algos.h index f2d9e1754..029800dcc 100644 --- a/src/h3lib/include/algos.h +++ b/src/h3lib/include/algos.h @@ -40,12 +40,4 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, // Create a LinkedGeoPolygon from a vertex graph void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out); -// Internal function for polyfill that traces a geofence with hexagons of a -// specific size -int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, - int* numSearchHexes, H3Index* search, H3Index* found); - -// The new polyfill algorithm. Separated out because it can theoretically fail -int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out); - #endif diff --git a/src/h3lib/include/bbox.h b/src/h3lib/include/bbox.h index 8840328a8..c5f918cb2 100644 --- a/src/h3lib/include/bbox.h +++ b/src/h3lib/include/bbox.h @@ -37,8 +37,6 @@ bool bboxIsTransmeridian(const BBox* bbox); void bboxCenter(const BBox* bbox, GeoCoord* center); bool bboxContains(const BBox* bbox, const GeoCoord* point); bool bboxEquals(const BBox* b1, const BBox* b2); -int bboxHexEstimate(const BBox* bbox, int res); -int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, - int res); +int bboxHexRadius(const BBox* bbox, int res); #endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 112c58926..d41b086b9 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -41,7 +41,6 @@ #define HEX_RANGE_SUCCESS 0 #define HEX_RANGE_PENTAGON 1 #define HEX_RANGE_K_SUBSEQUENCE 2 -#define MAX_ONE_RING_SIZE 7 /** * Directions used for traversing a hexagonal ring counterclockwise around @@ -624,8 +623,9 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { * maxPolyfillSize returns the number of hexagons to allocate space for when * performing a polyfill on the given GeoJSON-like data structure. * - * The size is the maximum of either the number of points in the geofence or the - * number of hexagons in the bounding box of the geofence. + * Currently a laughably padded response, being a k-ring that wholly contains + * a bounding box of the GeoJSON, but still less wasted memory than initializing + * a Python application? ;) * * @param geoPolygon A GeoJSON-like data structure indicating the poly to fill * @param res Hexagon resolution (0-15) @@ -634,18 +634,12 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { // Get the bounding box for the GeoJSON-like struct BBox bbox; - const Geofence geofence = geoPolygon->geofence; - bboxFromGeofence(&geofence, &bbox); - int numHexagons = bboxHexEstimate(&bbox, res); - // This algorithm assumes that the number of vertices is usually less than - // the number of hexagons, but when it's wrong, this will keep it from - // failing - int totalVerts = geofence.numVerts; - for (int i = 0; i < geoPolygon->numHoles; i++) { - totalVerts += geoPolygon->holes[i].numVerts; - } - if (numHexagons < totalVerts) numHexagons = totalVerts; - return numHexagons; + bboxFromGeofence(&geoPolygon->geofence, &bbox); + int minK = bboxHexRadius(&bbox, res); + + // The total number of hexagons to allocate can now be determined by + // the k-ring hex allocation helper function. + return H3_EXPORT(maxKringSize)(minK); } /** @@ -653,108 +647,15 @@ int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { * zeroed memory, and fills it with the hexagons that are contained by * the GeoJSON-like data structure. * - * This implementation traces the GeoJSON geofence(s) in cartesian space with - * hexagons, tests them and their neighbors to be contained by the geofence(s), - * and then any newly found hexagons are used to test again until no new - * hexagons are found. + * The current implementation is very primitive and slow, but correct, + * performing a point-in-poly operation on every hexagon in a k-ring defined + * around the given geofence. * * @param geoPolygon The geofence and holes defining the relevant area * @param res The Hexagon resolution (0-15) * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { - // TODO: Eliminate this wrapper with the H3 4.0.0 release - int failure = _polyfillInternal(geoPolygon, res, out); - // The polyfill algorithm can theoretically fail if the allocated memory is - // not large enough for the polygon, but this should be impossible given the - // conservative overestimation of the number of hexagons possible. - // LCOV_EXCL_START - if (failure) { - int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); - for (int i = 0; i < numHexagons; i++) out[i] = H3_INVALID_INDEX; - } - // LCOV_EXCL_STOP -} - -/** - * _getEdgeHexagons takes a given geofence ring (either the main geofence or - * one of the holes) and traces it with hexagons and updates the search and - * found memory blocks. This is used for determining the initial hexagon set - * for the polyfill algorithm to execute on. - * - * @param geofence The geofence (or hole) to be traced - * @param numHexagons The maximum number of hexagons possible for the geofence - * (also the bounds of the search and found arrays) - * @param res The hexagon resolution (0-15) - * @param numSearchHexes The number of hexagons found so far to be searched - * @param search The block of memory containing the hexagons to search from - * @param found The block of memory containing the hexagons found from the - * search - * - * @return An error code if the hash function cannot insert a found hexagon - * into the found array. - */ -int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res, - int* numSearchHexes, H3Index* search, H3Index* found) { - for (int i = 0; i < geofence->numVerts; i++) { - GeoCoord origin = geofence->verts[i]; - GeoCoord destination = i == geofence->numVerts - 1 - ? geofence->verts[0] - : geofence->verts[i + 1]; - const int numHexesEstimate = - lineHexEstimate(&origin, &destination, res); - for (int j = 0; j < numHexesEstimate; j++) { - GeoCoord interpolate; - interpolate.lat = - (origin.lat * (numHexesEstimate - j) / numHexesEstimate) + - (destination.lat * j / numHexesEstimate); - interpolate.lon = - (origin.lon * (numHexesEstimate - j) / numHexesEstimate) + - (destination.lon * j / numHexesEstimate); - H3Index pointHex = H3_EXPORT(geoToH3)(&interpolate, res); - // A simple hash to store the hexagon, or move to another place if - // needed - int loc = (int)(pointHex % numHexagons); - int loopCount = 0; - while (found[loc] != 0) { - // If this conditional is reached, the `found` memory block is - // too small for the given polygon. This should not happen. - if (loopCount > numHexagons) return -1; // LCOV_EXCL_LINE - if (found[loc] == pointHex) - break; // At least two points of the geofence index to the - // same cell - loc = (loc + 1) % numHexagons; - loopCount++; - } - if (found[loc] == pointHex) - continue; // Skip this hex, already exists in the found hash - // Otherwise, set it in the found hash for now - found[loc] = pointHex; - - search[*numSearchHexes] = pointHex; - (*numSearchHexes)++; - } - } - return 0; -} - -/** - * _polyfillInternal traces the provided geoPolygon data structure with hexagons - * and then iteratively searches through these hexagons and their immediate - * neighbors to see if they are contained within the polygon or not. Those that - * are found are added to the out array as well as the found array. Once all - * hexagons to search are checked, the found hexagons become the new search - * array and the found array is wiped and the process repeats until no new - * hexagons can be found. - * - * @param geoPolygon The geofence and holes defining the relevant area - * @param res The Hexagon resolution (0-15) - * @param out The slab of zeroed memory to write to. Assumed to be big enough. - * - * @return An error code if any of the hash operations fails to insert a hexagon - * into an array of memory. - */ -int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { // One of the goals of the polyfill algorithm is that two adjacent polygons // with zero overlap have zero overlapping hexagons. That the hexagons are // uniquely assigned. There are a few approaches to take here, such as @@ -776,139 +677,36 @@ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out) { BBox* bboxes = malloc((geoPolygon->numHoles + 1) * sizeof(BBox)); assert(bboxes != NULL); bboxesFromGeoPolygon(geoPolygon, bboxes); - - // Get the estimated number of hexagons and allocate some temporary memory - // for the hexagons - int numHexagons = H3_EXPORT(maxPolyfillSize)(geoPolygon, res); - H3Index* search = calloc(numHexagons, sizeof(H3Index)); - H3Index* found = calloc(numHexagons, sizeof(H3Index)); - - // Some metadata for tracking the state of the search and found memory - // blocks - int numSearchHexes = 0; - int numFoundHexes = 0; - - // 1. Trace the hexagons along the polygon defining the outer geofence and - // add them to the search hash. The hexagon containing the geofence point - // may or may not be contained by the geofence (as the hexagon's center - // point may be outside of the boundary.) - const Geofence geofence = geoPolygon->geofence; - int failure = _getEdgeHexagons(&geofence, numHexagons, res, &numSearchHexes, - search, found); - // If this branch is reached, we have exceeded the maximum number of - // hexagons possible and need to clean up the allocated memory. - // LCOV_EXCL_START - if (failure) { - free(search); - free(found); - free(bboxes); - return failure; - } - // LCOV_EXCL_STOP - - // 2. Iterate over all holes, trace the polygons defining the holes with - // hexagons and add to only the search hash. We're going to temporarily use - // the `found` hash to use for dedupe purposes and then re-zero it once - // we're done here, otherwise we'd have to scan the whole set on each insert - // to make sure there's no duplicates, which is very inefficient. - for (int i = 0; i < geoPolygon->numHoles; i++) { - Geofence* hole = &(geoPolygon->holes[i]); - failure = _getEdgeHexagons(hole, numHexagons, res, &numSearchHexes, - search, found); - // If this branch is reached, we have exceeded the maximum number of - // hexagons possible and need to clean up the allocated memory. - // LCOV_EXCL_START - if (failure) { - free(search); - free(found); - free(bboxes); - return failure; + int minK = bboxHexRadius(&bboxes[0], res); + int numHexagons = H3_EXPORT(maxKringSize)(minK); + + // Get the center hex + GeoCoord center; + bboxCenter(&bboxes[0], ¢er); + H3Index centerH3 = H3_EXPORT(geoToH3)(¢er, res); + + // From here on it works differently, first we get all potential + // hexagons inserted into the available memory + H3_EXPORT(kRing)(centerH3, minK, out); + + // Next we iterate through each hexagon, and test its center point to see if + // it's contained in the GeoJSON-like struct + for (int i = 0; i < numHexagons; i++) { + // Skip records that are already zeroed + if (out[i] == 0) { + continue; } - // LCOV_EXCL_STOP - } - - // 3. Re-zero the found hash so it can be used in the main loop below - for (int i = 0; i < numHexagons; i++) found[i] = 0; - - // 4. Begin main loop. While the search hash is not empty do the following - while (numSearchHexes > 0) { - // Iterate through all hexagons in the current search hash, then loop - // through all neighbors and test Point-in-Poly, if point-in-poly - // succeeds, add to out and found hashes if not already there. - int currentSearchNum = 0; - int i = 0; - while (currentSearchNum < numSearchHexes) { - H3Index ring[MAX_ONE_RING_SIZE] = {0}; - H3Index searchHex = search[i]; - H3_EXPORT(kRing)(searchHex, 1, ring); - for (int j = 0; j < MAX_ONE_RING_SIZE; j++) { - if (ring[j] == H3_INVALID_INDEX) { - continue; // Skip if this was a pentagon and only had 5 - // neighbors - } - - H3Index hex = ring[j]; - - // A simple hash to store the hexagon, or move to another place - // if needed. This MUST be done before the point-in-poly check - // since that's far more expensive - int loc = (int)(hex % numHexagons); - int loopCount = 0; - while (out[loc] != 0) { - // If this branch is reached, we have exceeded the maximum - // number of hexagons possible and need to clean up the - // allocated memory. - // LCOV_EXCL_START - if (loopCount > numHexagons) { - free(search); - free(found); - free(bboxes); - return -1; - } - // LCOV_EXCL_STOP - if (out[loc] == hex) break; // Skip duplicates found - loc = (loc + 1) % numHexagons; - loopCount++; - } - if (out[loc] == hex) { - continue; // Skip this hex, already exists in the out hash - } - - // Check if the hexagon is in the polygon or not - GeoCoord hexCenter; - H3_EXPORT(h3ToGeo)(hex, &hexCenter); - - // If not, skip - if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { - continue; - } - - // Otherwise set it in the output array - out[loc] = hex; - - // Set the hexagon in the found hash - found[numFoundHexes] = hex; - numFoundHexes++; - } - currentSearchNum++; - i++; + // Check if hexagon is inside of polygon + GeoCoord hexCenter; + H3_EXPORT(h3ToGeo)(out[i], &hexCenter); + hexCenter.lat = constrainLat(hexCenter.lat); + hexCenter.lon = constrainLng(hexCenter.lon); + // And remove from list if not + if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { + out[i] = H3_INVALID_INDEX; } - - // Swap the search and found pointers, copy the found hex count to the - // search hex count, and zero everything related to the found memory. - H3Index* temp = search; - search = found; - found = temp; - for (int j = 0; j < numSearchHexes; j++) found[j] = 0; - numSearchHexes = numFoundHexes; - numFoundHexes = 0; - // Repeat until no new hexagons are found } - // The out memory structure should be complete, end it here free(bboxes); - free(search); - free(found); - return 0; } /** diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 6d37b051a..a54022a4b 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -88,59 +88,38 @@ double _hexRadiusKm(H3Index h3Index) { } /** - * bboxHexEstimate returns an estimated number of hexagons that fit - * within the cartesian-projected bounding box - * - * @param bbox the bounding box to estimate the hexagon fill level - * @param res the resolution of the H3 hexagons to fill the bounding box - * @return the estimated number of hexagons to fill the bounding box + * Get the radius of the bbox in hexagons - i.e. the radius of a k-ring centered + * on the bbox center and covering the entire bbox. + * @param bbox Bounding box to measure + * @param res Resolution of hexagons to use in measurement + * @return Radius in hexagons */ -int bboxHexEstimate(const BBox* bbox, int res) { - // Get the area of the pentagon as the maximally-distorted area possible - H3Index pentagons[12] = {0}; - H3_EXPORT(getPentagonIndexes)(res, pentagons); - double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); - // Area of a regular hexagon is 3/2*sqrt(3) * r * r - // The pentagon has the most distortion (smallest edges) and shares its - // edges with hexagons, so the most-distorted hexagons have this area - double pentagonAreaKm2 = - 2.59807621135 * pentagonRadiusKm * pentagonRadiusKm; +int bboxHexRadius(const BBox* bbox, int res) { + // Determine the center of the bounding box + GeoCoord center; + bboxCenter(bbox, ¢er); - // Then get the area of the bounding box of the geofence in question - GeoCoord p1, p2; - p1.lat = bbox->north; - p1.lon = bbox->east; - p2.lat = bbox->south; - p2.lon = bbox->east; - double h = _geoDistKm(&p1, &p2); - p2.lat = bbox->north; - p2.lon = bbox->west; - double w = _geoDistKm(&p1, &p2); + // Use a vertex on the side closest to the equator, to ensure the longest + // radius in cases with significant distortion. East/west is arbitrary. + double lat = + fabs(bbox->north) > fabs(bbox->south) ? bbox->south : bbox->north; + GeoCoord vertex = {lat, bbox->east}; - // Divide the two to get an estimate of the number of hexagons needed - int estimate = (int)ceil(w * h / pentagonAreaKm2); - if (estimate == 0) estimate = 1; - return estimate; -} + // Determine the length of the bounding box "radius" to then use + // as a circle on the earth that the k-rings must be greater than + double bboxRadiusKm = _geoDistKm(¢er, &vertex); -/** - * lineHexEstimate returns an estimated number of hexagons that trace - * the cartesian-projected line - * - * @param origin the origin coordinates - * @param destination the destination coordinates - * @param res the resolution of the H3 hexagons to trace the line - * @return the estimated number of hexagons required to trace the line - */ -int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination, - int res) { - // Get the area of the pentagon as the maximally-distorted area possible - H3Index pentagons[12] = {0}; - H3_EXPORT(getPentagonIndexes)(res, pentagons); - double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); + // Determine the radius of the center hexagon + double centerHexRadiusKm = _hexRadiusKm(H3_EXPORT(geoToH3)(¢er, res)); - double dist = _geoDistKm(origin, destination); - int estimate = (int)ceil(dist / (2 * pentagonRadiusKm)); - if (estimate == 0) estimate = 1; - return estimate; + // We use centerHexRadiusKm un-scaled and rounded *up* to guarantee + // containment ot the bbox. Ideal, undistorted hexagons could scale + // centerHexRadiusKm by a factor of up to 1.5, reducing bboxHexRadius. + // This is because the closest point along an undistorted hexagon drawn + // through the center points of a k-ring aggregation is exactly 1.5 radii + // of the hexagon. But there is distortion near pentagons, and for those + // cases, the scaling needs to be less than 1.5. Using the un-scaled value + // conservatively guarantees containment for all cases, at the expense of a + // larger bboxHexRadius. + return (int)ceil(bboxRadiusKm / centerHexRadiusKm); } From 2edd7bbceadd09953c0db45f40c85106233cff59 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 6 Dec 2019 13:44:33 -0800 Subject: [PATCH 196/771] Additional tests for `polyfill` --- src/apps/testapps/testPolyfill.c | 91 ++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 7a303a0d0..6601b27ff 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -20,6 +20,7 @@ #include "geoCoord.h" #include "h3Index.h" #include "test.h" +#include "utility.h" // Fixtures static GeoCoord sfVerts[] = { @@ -51,6 +52,54 @@ static int countActualHexagons(H3Index* hexagons, int numHexagons) { return actualNumHexagons; } +static void fillIndex_assertions(H3Index h) { + int baseCell = H3_EXPORT(h3GetBaseCell)(h); + if (baseCell == 0 || baseCell == 1 || baseCell == 120 || baseCell == 121) { + // TODO These do not work correctly + return; + } + + int currentRes = H3_EXPORT(h3GetResolution)(h); + for (int nextRes = currentRes; nextRes <= currentRes + 1; nextRes++) { + GeoBoundary bndry; + H3_EXPORT(h3ToGeoBoundary)(h, &bndry); + GeoPolygon polygon = {0}; + polygon.geofence.numVerts = bndry.numVerts; + polygon.geofence.verts = &bndry.verts; + + int polyfillSize = H3_EXPORT(maxPolyfillSize)(&polygon, nextRes); + H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); + H3_EXPORT(polyfill)(&polygon, nextRes, polyfillOut); + + int polyfillCount = countActualHexagons(polyfillOut, polyfillSize); + + int childrenSize = H3_EXPORT(maxH3ToChildrenSize)(h, nextRes); + H3Index* children = calloc(childrenSize, sizeof(H3Index)); + H3_EXPORT(h3ToChildren)(h, nextRes, children); + + int h3ToChildrenCount = countActualHexagons(children, childrenSize); + + t_assert(polyfillCount == h3ToChildrenCount, + "Polyfill count matches h3ToChildren count"); + + for (int i = 0; i < childrenSize; i++) { + bool found = false; + if (children[i] == H3_INVALID_INDEX) continue; + for (int j = 0; j < polyfillSize; j++) { + if (polyfillOut[j] == children[i]) { + found = true; + break; + } + } + t_assert(found, + "All indexes match between polyfill and h3ToChildren"); + } + + free(polyfillOut); + free(children); + } +} + SUITE(polyfill) { sfGeoPolygon.geofence = sfGeofence; sfGeoPolygon.numHoles = 0; @@ -300,4 +349,46 @@ SUITE(polyfill) { t_assert(numPentagons == 1, "one pentagon found"); free(hexagons); } + + TEST(fillIndex) { + iterateAllIndexesAtRes(0, fillIndex_assertions); + iterateAllIndexesAtRes(1, fillIndex_assertions); + iterateAllIndexesAtRes(2, fillIndex_assertions); + } + + TEST(entireWorld) { + // TODO: Fails for a single worldwide polygon + // TODO: Fails at resolutions other than 0 + GeoCoord worldVerts[] = { + {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; + Geofence worldGeofence = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon = {.geofence = worldGeofence, .numHoles = 0}; + GeoCoord worldVerts2[] = { + {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; + Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence, + .numHoles = 0}; + + int res = 0; + + int polyfillSize = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res); + H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut); + int actualNumHexagons = countActualHexagons(polyfillOut, polyfillSize); + + int polyfillSize2 = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res); + H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2); + int actualNumHexagons2 = + countActualHexagons(polyfillOut2, polyfillSize2); + + t_assert(actualNumHexagons + actualNumHexagons2 == + H3_EXPORT(numHexagons)(res), + "got expected polyfill size (entire world)"); + + free(polyfillOut); + free(polyfillOut2); + } } From 9b772efc0100bd078c9d630c71735aec8a719a35 Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Mon, 9 Dec 2019 13:39:58 -0800 Subject: [PATCH 197/771] Preparing for release 3.6.2 --- CHANGELOG.md | 4 +++- VERSION | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74155a928..6f4046cad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,9 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] -- Revert new `polyfill` algorithm until reported issues are fixed. + +## [3.6.2] - 2019-12-9 +- Revert new `polyfill` algorithm until reported issues are fixed. (#293) ## [3.6.1] - 2019-11-11 ### Fixed diff --git a/VERSION b/VERSION index 9575d51ba..b72762837 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.6.1 +3.6.2 From 8440f315df70c425a245b2cf9f6ce20f4ec0cae0 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Sun, 22 Dec 2019 16:26:03 -0800 Subject: [PATCH 198/771] Exclude cases spanning more than 180degrees and include some specific test cases reported in issues. --- CMakeLists.txt | 4 +- src/apps/applib/include/utility.h | 2 + src/apps/applib/lib/utility.c | 13 +++ src/apps/testapps/testPolyfill.c | 60 +++------- src/apps/testapps/testPolyfillReported.c | 137 +++++++++++++++++++++++ src/apps/testapps/testPolyfill_GH136.c | 58 ---------- 6 files changed, 169 insertions(+), 105 deletions(-) create mode 100644 src/apps/testapps/testPolyfillReported.c delete mode 100644 src/apps/testapps/testPolyfill_GH136.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cb697d0ba..fecd10fcb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,7 +143,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testVertexGraph.c src/apps/testapps/testCompact.c src/apps/testapps/testPolyfill.c - src/apps/testapps/testPolyfill_GH136.c + src/apps/testapps/testPolyfillReported.c src/apps/testapps/testPentagonIndexes.c src/apps/testapps/testKRing.c src/apps/testapps/testH3ToGeoBoundary.c @@ -507,7 +507,7 @@ if(BUILD_TESTING) add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) - add_h3_test(testPolyfill_GH136 src/apps/testapps/testPolyfill_GH136.c) + add_h3_test(testPolyfillReported src/apps/testapps/testPolyfillReported.c) add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index 2734698e3..324157c3b 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -55,4 +55,6 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), void iterateBaseCellIndexesAtRes(int res, void (*callback)(H3Index), int baseCell); +int countActualHexagons(H3Index* hexagons, int numHexagons); + #endif diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 8cb73c2ce..34fff63b0 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -233,3 +233,16 @@ void randomGeo(GeoCoord* g) { (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; } + +/** + * Returns the number of non-invalid indexes in the array. + */ +int countActualHexagons(H3Index* hexagons, int numHexagons) { + int actualNumHexagons = 0; + for (int i = 0; i < numHexagons; i++) { + if (hexagons[i] != H3_INVALID_INDEX) { + actualNumHexagons++; + } + } + return actualNumHexagons; +} diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 6601b27ff..5781385f5 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -42,20 +42,26 @@ static GeoCoord emptyVerts[] = {{0.659966917655, -2.1364398519394}, static Geofence emptyGeofence = {.numVerts = 3, .verts = emptyVerts}; static GeoPolygon emptyGeoPolygon; -static int countActualHexagons(H3Index* hexagons, int numHexagons) { - int actualNumHexagons = 0; - for (int i = 0; i < numHexagons; i++) { - if (hexagons[i] != 0) { - actualNumHexagons++; - } +/** + * Return true if the cell crosses the meridian. + */ +static bool isTransmeridianCell(H3Index h) { + GeoBoundary bndry; + H3_EXPORT(h3ToGeoBoundary)(h, &bndry); + + double minLon = M_PI, maxLon = -M_PI; + for (int i = 0; i < bndry.numVerts; i++) { + if (bndry.verts[i].lon < minLon) minLon = bndry.verts[i].lon; + if (bndry.verts[i].lon > maxLon) maxLon = bndry.verts[i].lon; } - return actualNumHexagons; + + return maxLon - minLon > M_PI - (M_PI / 4); } static void fillIndex_assertions(H3Index h) { int baseCell = H3_EXPORT(h3GetBaseCell)(h); - if (baseCell == 0 || baseCell == 1 || baseCell == 120 || baseCell == 121) { - // TODO These do not work correctly + if (isTransmeridianCell(h)) { + // TODO these do not work correctly return; } @@ -355,40 +361,4 @@ SUITE(polyfill) { iterateAllIndexesAtRes(1, fillIndex_assertions); iterateAllIndexesAtRes(2, fillIndex_assertions); } - - TEST(entireWorld) { - // TODO: Fails for a single worldwide polygon - // TODO: Fails at resolutions other than 0 - GeoCoord worldVerts[] = { - {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; - Geofence worldGeofence = {.numVerts = 4, .verts = worldVerts}; - GeoPolygon worldGeoPolygon = {.geofence = worldGeofence, .numHoles = 0}; - GeoCoord worldVerts2[] = { - {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; - Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts}; - GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence, - .numHoles = 0}; - - int res = 0; - - int polyfillSize = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res); - H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut); - int actualNumHexagons = countActualHexagons(polyfillOut, polyfillSize); - - int polyfillSize2 = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res); - H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2); - int actualNumHexagons2 = - countActualHexagons(polyfillOut2, polyfillSize2); - - t_assert(actualNumHexagons + actualNumHexagons2 == - H3_EXPORT(numHexagons)(res), - "got expected polyfill size (entire world)"); - - free(polyfillOut); - free(polyfillOut2); - } } diff --git a/src/apps/testapps/testPolyfillReported.c b/src/apps/testapps/testPolyfillReported.c new file mode 100644 index 000000000..ddbbcf368 --- /dev/null +++ b/src/apps/testapps/testPolyfillReported.c @@ -0,0 +1,137 @@ +/* + * Copyright 2017-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "algos.h" +#include "constants.h" +#include "geoCoord.h" +#include "h3Index.h" +#include "test.h" + +// Tests for specific polyfill examples + +SUITE(polyfill_reported) { + // https://github.com/uber/h3-js/issues/76#issuecomment-561204505 + TEST(entireWorld) { + // TODO: Fails for a single worldwide polygon + // TODO: Fails at resolutions other than 0 + GeoCoord worldVerts[] = { + {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; + Geofence worldGeofence = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon = {.geofence = worldGeofence, .numHoles = 0}; + GeoCoord worldVerts2[] = { + {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; + Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence, + .numHoles = 0}; + + int res = 0; + + int polyfillSize = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res); + H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut); + int actualNumHexagons = countActualHexagons(polyfillOut, polyfillSize); + + int polyfillSize2 = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res); + H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2); + int actualNumHexagons2 = + countActualHexagons(polyfillOut2, polyfillSize2); + + t_assert(actualNumHexagons + actualNumHexagons2 == + H3_EXPORT(numHexagons)(res), + "got expected polyfill size (entire world)"); + + free(polyfillOut); + free(polyfillOut2); + } + + // https://github.com/uber/h3-js/issues/67 + TEST(h3js_67) { + double east = H3_EXPORT(degsToRads)(-56.25); + double north = H3_EXPORT(degsToRads)(-33.13755119234615); + double south = H3_EXPORT(degsToRads)(-34.30714385628804); + double west = H3_EXPORT(degsToRads)(-57.65625); + + GeoCoord testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + Geofence testGeofence = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geofence = testGeofence; + testPolygon.numHoles = 0; + + int res = 7; + int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res); + H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&testPolygon, res, hexagons); + int actualNumHexagons = countActualHexagons(hexagons, numHexagons); + + t_assert(actualNumHexagons == 4499, + "got expected polyfill size (h3-js#67)"); + free(hexagons); + } + + // 2nd test case from h3-js#67 + TEST(h3js_67_2nd) { + double east = H3_EXPORT(degsToRads)(-57.65625); + double north = H3_EXPORT(degsToRads)(-34.30714385628804); + double south = H3_EXPORT(degsToRads)(-35.4606699514953); + double west = H3_EXPORT(degsToRads)(-59.0625); + + GeoCoord testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + Geofence testGeofence = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geofence = testGeofence; + testPolygon.numHoles = 0; + + int res = 7; + int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res); + H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&testPolygon, res, hexagons); + int actualNumHexagons = countActualHexagons(hexagons, numHexagons); + + t_assert(actualNumHexagons == 4609, + "got expected polyfill size (h3-js#67, 2nd case)"); + free(hexagons); + } + + // https://github.com/uber/h3/issues/136 + TEST(h3_136) { + GeoCoord testVerts[] = {{0.10068990369902957, 0.8920772174196191}, + {0.10032914690616246, 0.8915914753447348}, + {0.10033349237998787, 0.8915860128746426}, + {0.10069496685903621, 0.8920742194546231}}; + Geofence testGeofence = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geofence = testGeofence; + testPolygon.numHoles = 0; + + int res = 13; + int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res); + H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&testPolygon, res, hexagons); + int actualNumHexagons = countActualHexagons(hexagons, numHexagons); + + t_assert(actualNumHexagons == 4353, "got expected polyfill size"); + free(hexagons); + } +} diff --git a/src/apps/testapps/testPolyfill_GH136.c b/src/apps/testapps/testPolyfill_GH136.c deleted file mode 100644 index 9c6504ce1..000000000 --- a/src/apps/testapps/testPolyfill_GH136.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2017-2019 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "algos.h" -#include "constants.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "test.h" - -// https://github.com/uber/h3/issues/136 - -static GeoCoord testVerts[] = {{0.10068990369902957, 0.8920772174196191}, - {0.10032914690616246, 0.8915914753447348}, - {0.10033349237998787, 0.8915860128746426}, - {0.10069496685903621, 0.8920742194546231}}; -static Geofence testGeofence = {.numVerts = 4, .verts = testVerts}; -static GeoPolygon testPolygon; - -static int countActualHexagons(H3Index* hexagons, int numHexagons) { - int actualNumHexagons = 0; - for (int i = 0; i < numHexagons; i++) { - if (hexagons[i] != 0) { - actualNumHexagons++; - } - } - return actualNumHexagons; -} - -SUITE(polyfill_gh136) { - testPolygon.geofence = testGeofence; - testPolygon.numHoles = 0; - - TEST(gh136) { - int res = 13; - int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&testPolygon, res, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 4353, "got expected polyfill size"); - free(hexagons); - } -} From e7c473773c6cfe16ce16866dc1920c9d8f8458e4 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Sun, 22 Dec 2019 22:40:06 -0800 Subject: [PATCH 199/771] Address CI errors (unused variables, missing include) --- src/apps/testapps/testPolyfill.c | 5 ++--- src/apps/testapps/testPolyfillReported.c | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 5781385f5..29280f7e8 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -59,9 +59,8 @@ static bool isTransmeridianCell(H3Index h) { } static void fillIndex_assertions(H3Index h) { - int baseCell = H3_EXPORT(h3GetBaseCell)(h); if (isTransmeridianCell(h)) { - // TODO these do not work correctly + // TODO: these do not work correctly return; } @@ -71,7 +70,7 @@ static void fillIndex_assertions(H3Index h) { H3_EXPORT(h3ToGeoBoundary)(h, &bndry); GeoPolygon polygon = {0}; polygon.geofence.numVerts = bndry.numVerts; - polygon.geofence.verts = &bndry.verts; + polygon.geofence.verts = bndry.verts; int polyfillSize = H3_EXPORT(maxPolyfillSize)(&polygon, nextRes); H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); diff --git a/src/apps/testapps/testPolyfillReported.c b/src/apps/testapps/testPolyfillReported.c index ddbbcf368..5da8be57f 100644 --- a/src/apps/testapps/testPolyfillReported.c +++ b/src/apps/testapps/testPolyfillReported.c @@ -20,6 +20,7 @@ #include "geoCoord.h" #include "h3Index.h" #include "test.h" +#include "utility.h" // Tests for specific polyfill examples @@ -34,8 +35,8 @@ SUITE(polyfill_reported) { GeoPolygon worldGeoPolygon = {.geofence = worldGeofence, .numHoles = 0}; GeoCoord worldVerts2[] = { {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; - Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts}; - GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence, + Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts2}; + GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence2, .numHoles = 0}; int res = 0; From eb2b81b0759315c1abce75c23161b2dc83d5d5a6 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 23 Dec 2019 07:29:51 -0800 Subject: [PATCH 200/771] Expand entire world polyfill test, fix build issue from CI --- src/apps/testapps/testPolyfill.c | 7 +-- src/apps/testapps/testPolyfillReported.c | 62 +++++++++++++++--------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index 29280f7e8..e09553e25 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -68,9 +68,10 @@ static void fillIndex_assertions(H3Index h) { for (int nextRes = currentRes; nextRes <= currentRes + 1; nextRes++) { GeoBoundary bndry; H3_EXPORT(h3ToGeoBoundary)(h, &bndry); - GeoPolygon polygon = {0}; - polygon.geofence.numVerts = bndry.numVerts; - polygon.geofence.verts = bndry.verts; + GeoPolygon polygon = { + .geofence = {.numVerts = bndry.numVerts, .verts = bndry.verts}, + .numHoles = 0, + .holes = 0}; int polyfillSize = H3_EXPORT(maxPolyfillSize)(&polygon, nextRes); H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); diff --git a/src/apps/testapps/testPolyfillReported.c b/src/apps/testapps/testPolyfillReported.c index 5da8be57f..1132b324d 100644 --- a/src/apps/testapps/testPolyfillReported.c +++ b/src/apps/testapps/testPolyfillReported.c @@ -28,7 +28,6 @@ SUITE(polyfill_reported) { // https://github.com/uber/h3-js/issues/76#issuecomment-561204505 TEST(entireWorld) { // TODO: Fails for a single worldwide polygon - // TODO: Fails at resolutions other than 0 GeoCoord worldVerts[] = { {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; Geofence worldGeofence = {.numVerts = 4, .verts = worldVerts}; @@ -39,27 +38,46 @@ SUITE(polyfill_reported) { GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence2, .numHoles = 0}; - int res = 0; - - int polyfillSize = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res); - H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut); - int actualNumHexagons = countActualHexagons(polyfillOut, polyfillSize); - - int polyfillSize2 = H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res); - H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2); - int actualNumHexagons2 = - countActualHexagons(polyfillOut2, polyfillSize2); - - t_assert(actualNumHexagons + actualNumHexagons2 == - H3_EXPORT(numHexagons)(res), - "got expected polyfill size (entire world)"); - - free(polyfillOut); - free(polyfillOut2); + for (int res = 0; res < 3; res++) { + int polyfillSize = + H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res); + H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut); + int actualNumHexagons = + countActualHexagons(polyfillOut, polyfillSize); + + int polyfillSize2 = + H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res); + H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index)); + + H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2); + int actualNumHexagons2 = + countActualHexagons(polyfillOut2, polyfillSize2); + + t_assert(actualNumHexagons + actualNumHexagons2 == + H3_EXPORT(numHexagons)(res), + "got expected polyfill size (entire world)"); + + // Sets should be disjoint + for (int i = 0; i < polyfillSize; i++) { + if (polyfillOut[i] == 0) continue; + + bool found = false; + for (int j = 0; j < polyfillSize2; j++) { + if (polyfillOut[i] == polyfillOut2[j]) { + found = true; + break; + } + } + t_assert(!found, + "Index found more than once when polyfilling the " + "entire world"); + } + + free(polyfillOut); + free(polyfillOut2); + } } // https://github.com/uber/h3-js/issues/67 From c2fcb55d9914bbebd707e936d89de07c8b4e0aea Mon Sep 17 00:00:00 2001 From: AJ Friend Date: Sat, 4 Jan 2020 13:50:45 +0700 Subject: [PATCH 201/771] Clarify some function definitions in h3api.h (#296) * clarify some function definitions in h3api.h * adding to geoToH3 doc * 'hexagon' to 'cell' in a few places * address comments --- src/h3lib/include/h3api.h.in | 36 ++++++++++++++++++++---------------- src/h3lib/lib/h3Index.c | 12 ++++++++---- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in index 9956fe858..35ad16719 100644 --- a/src/h3lib/include/h3api.h.in +++ b/src/h3lib/include/h3api.h.in @@ -150,7 +150,7 @@ typedef struct { * Functions for geoToH3 * @{ */ -/** @brief find the H3 index of the resolution res cell containing the lat/lon g +/** @brief find the H3 index of the resolution res cell containing the lat/lng */ H3Index H3_EXPORT(geoToH3)(const GeoCoord *g, int res); /** @} */ @@ -183,8 +183,7 @@ int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index *out); /** @} */ /** @brief hexagons neighbors in all directions, assuming no pentagons, - * reporting - * distance from origin */ + * reporting distance from origin */ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index *out, int *distances); @@ -256,10 +255,10 @@ double H3_EXPORT(radsToDegs)(double radians); * Functions for hexArea * @{ */ -/** @brief hexagon area in square kilometers */ +/** @brief average hexagon area in square kilometers (excludes pentagons) */ double H3_EXPORT(hexAreaKm2)(int res); -/** @brief hexagon area in square meters */ +/** @brief average hexagon area in square meters (excludes pentagons) */ double H3_EXPORT(hexAreaM2)(int res); /** @} */ @@ -267,10 +266,10 @@ double H3_EXPORT(hexAreaM2)(int res); * Functions for edgeLength * @{ */ -/** @brief hexagon edge length in kilometers */ +/** @brief average hexagon edge length in kilometers (excludes pentagons) */ double H3_EXPORT(edgeLengthKm)(int res); -/** @brief hexagon edge length in meters */ +/** @brief average hexagon edge length in meters (excludes pentagons) */ double H3_EXPORT(edgeLengthM)(int res); /** @} */ @@ -278,7 +277,7 @@ double H3_EXPORT(edgeLengthM)(int res); * Functions for numHexagons * @{ */ -/** @brief number of hexagons for a given resolution */ +/** @brief number of cells (hexagons and pentagons) for a given resolution */ int64_t H3_EXPORT(numHexagons)(int res); /** @} */ @@ -286,10 +285,10 @@ int64_t H3_EXPORT(numHexagons)(int res); * Functions for getRes0Indexes * @{ */ -/** @brief returns the number of resolution 0 indexes */ +/** @brief returns the number of resolution 0 cells (hexagons and pentagons) */ int H3_EXPORT(res0IndexCount)(); -/** @brief provides all base cells */ +/** @brief provides all base cells in H3Index format*/ void H3_EXPORT(getRes0Indexes)(H3Index *out); /** @} */ @@ -308,7 +307,8 @@ void H3_EXPORT(getPentagonIndexes)(int res, H3Index *out); * Functions for h3GetResolution * @{ */ -/** @brief returns the resolution of the provided hexagon */ +/** @brief returns the resolution of the provided H3 index + * Works on both cells and unidirectional edges. */ int H3_EXPORT(h3GetResolution)(H3Index h); /** @} */ @@ -316,7 +316,10 @@ int H3_EXPORT(h3GetResolution)(H3Index h); * Functions for h3GetBaseCell * @{ */ -/** @brief returns the base cell of the provided hexagon */ +/** @brief returns the base cell "number" (0 to 121) of the provided H3 cell + * + * Note: Technically works on H3 edges, but will return base cell of the + * origin cell. */ int H3_EXPORT(h3GetBaseCell)(H3Index h); /** @} */ @@ -340,7 +343,9 @@ void H3_EXPORT(h3ToString)(H3Index h, char *str, size_t sz); * Functions for h3IsValid * @{ */ -/** @brief confirms if an H3Index is valid */ +/** @brief confirms if an H3Index is a valid cell (hexagon or pentagon) + * In particular, returns 0 (False) for H3 undirectional edges or invalid data + */ int H3_EXPORT(h3IsValid)(H3Index h); /** @} */ @@ -358,8 +363,7 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes); * @{ */ /** @brief determines the maximum number of children (or grandchildren, etc) - * that - * could be returned for the given hexagon */ + * that could be returned for the given hexagon */ int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes); /** @brief provides the children (or grandchildren, etc) of the given hexagon */ @@ -410,7 +414,7 @@ int H3_EXPORT(h3IsResClassIII)(H3Index h); * Functions for h3IsPentagon * @{ */ -/** @brief determines if a hexagon is actually a pentagon */ +/** @brief determines if an H3 cell is a pentagon */ int H3_EXPORT(h3IsPentagon)(H3Index h); /** @} */ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index aa60e948b..a899cf4c3 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -35,9 +35,13 @@ int H3_EXPORT(h3GetResolution)(H3Index h) { return H3_GET_RESOLUTION(h); } /** - * Returns the H3 base cell number of an H3 index. - * @param h The H3 index. - * @return The base cell of the H3 index argument. + * Returns the H3 base cell "number" of an H3 cell (hexagon or pentagon). + * + * Note: Technically works on H3 edges, but will return base cell of the + * origin cell. + * + * @param h The H3 cell. + * @return The base cell "number" of the H3 cell argument. */ int H3_EXPORT(h3GetBaseCell)(H3Index h) { return H3_GET_BASE_CELL(h); } @@ -70,7 +74,7 @@ void H3_EXPORT(h3ToString)(H3Index h, char* str, size_t sz) { } /** - * Returns whether or not an H3 index is valid. + * Returns whether or not an H3 index is a valid cell (hexagon or pentagon). * @param h The H3 index to validate. * @return 1 if the H3 index if valid, and 0 if it is not. */ From 48fc96cf2dd3e56524c21cd3cec5b2d0db3d93cb Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 6 Jan 2020 21:45:58 -0800 Subject: [PATCH 202/771] Detect and fail on duplicate input to `compact` --- CHANGELOG.md | 1 + src/apps/testapps/testCompact.c | 46 +++++++++++++++++++++++++++++++++ src/h3lib/lib/h3Index.c | 10 ++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f4046cad..fb040060c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +- `compact` detects and fails on cases with duplicated input indexes. ## [3.6.2] - 2019-12-9 - Revert new `polyfill` algorithm until reported issues are fixed. (#293) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index d71fb4619..f904faed0 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -152,6 +152,52 @@ SUITE(compact) { "compact fails on duplicate input"); } + TEST(compact_duplicateMinimum) { + // Test that the minimum number of duplicate hexagons causes failure + H3Index h3; + // Arbitrary index + setH3Index(&h3, 5, 0, 2); + + int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, 11) + 1; + H3Index* children = calloc(arrSize, sizeof(H3Index)); + + H3_EXPORT(h3ToChildren)(h3, 11, children); + // duplicate one index + children[arrSize - 1] = children[0]; + + H3Index* output = calloc(arrSize, sizeof(H3Index)); + + int compactResult = H3_EXPORT(compact)(children, output, arrSize); + t_assert(compactResult != 0, + "compact fails on duplicate input (single duplicate)"); + + free(output); + free(children); + } + + TEST(compact_duplicatePentagonLimit) { + // Test that the minimum number of duplicate hexagons causes failure + H3Index h3; + // Arbitrary pentagon parent cell + setH3Index(&h3, 5, 4, 0); + + int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, 11) + 1; + H3Index* children = calloc(arrSize, sizeof(H3Index)); + + H3_EXPORT(h3ToChildren)(h3, 11, children); + // duplicate one index + children[arrSize - 1] = H3_EXPORT(h3ToCenterChild)(h3, 11); + + H3Index* output = calloc(arrSize, sizeof(H3Index)); + + int compactResult = H3_EXPORT(compact)(children, output, arrSize); + t_assert(compactResult != 0, + "compact fails on duplicate input (pentagon parent)"); + + free(output); + free(children); + } + TEST(compact_empty) { t_assert(H3_EXPORT(compact)(NULL, NULL, 0) == 0, "compact succeeds on empty input"); diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index a899cf4c3..1a8883849 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -314,7 +314,15 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, hashSetArray[loc] & H3_RESERVED_MASK_NEGATIVE; if (tempIndex == parent) { int count = H3_GET_RESERVED_BITS(hashSetArray[loc]) + 1; - if (count > 7) { + int limitCount = 7; + if (H3_EXPORT(h3IsPentagon)( + tempIndex & H3_RESERVED_MASK_NEGATIVE)) { + limitCount--; + } + // One is added to count for this check to match one + // being added to count later in this function when + // checking for all children being present. + if (count + 1 > limitCount) { // Only possible on duplicate input free(remainingHexes); free(hashSetArray); From 4028fc998a83dee08a7fa7eaa80383e35cd65400 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 6 Jan 2020 22:27:13 -0800 Subject: [PATCH 203/771] PR number --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb040060c..c445b7295 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] -- `compact` detects and fails on cases with duplicated input indexes. +### Fixed +- `compact` detects and fails on cases with duplicated input indexes. (#299) ## [3.6.2] - 2019-12-9 - Revert new `polyfill` algorithm until reported issues are fixed. (#293) From a8b099343b93301bf40ba9da160149587517abfc Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 6 Jan 2020 22:39:53 -0800 Subject: [PATCH 204/771] Add comment explaining depth of `fillIndex_assertions` --- src/apps/testapps/testPolyfill.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c index e09553e25..b74742938 100644 --- a/src/apps/testapps/testPolyfill.c +++ b/src/apps/testapps/testPolyfill.c @@ -65,6 +65,7 @@ static void fillIndex_assertions(H3Index h) { } int currentRes = H3_EXPORT(h3GetResolution)(h); + // TODO: Not testing more than one depth because the assertions fail. for (int nextRes = currentRes; nextRes <= currentRes + 1; nextRes++) { GeoBoundary bndry; H3_EXPORT(h3ToGeoBoundary)(h, &bndry); From da284331c234daa751bcf4cc9078ea413f85cac8 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 8 Jan 2020 21:33:30 -0800 Subject: [PATCH 205/771] Name the return codes for compact, add test case for ignored duplicate --- src/apps/testapps/testCompact.c | 46 ++++++++++++++++++++++++++------- src/h3lib/include/h3Index.h | 8 ++++++ src/h3lib/lib/h3Index.c | 12 ++++----- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c index f904faed0..d2adf38cb 100644 --- a/src/apps/testapps/testCompact.c +++ b/src/apps/testapps/testCompact.c @@ -155,20 +155,21 @@ SUITE(compact) { TEST(compact_duplicateMinimum) { // Test that the minimum number of duplicate hexagons causes failure H3Index h3; + int res = 10; // Arbitrary index - setH3Index(&h3, 5, 0, 2); + setH3Index(&h3, res, 0, 2); - int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, 11) + 1; + int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, res + 1) + 1; H3Index* children = calloc(arrSize, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(h3, 11, children); + H3_EXPORT(h3ToChildren)(h3, res + 1, children); // duplicate one index children[arrSize - 1] = children[0]; H3Index* output = calloc(arrSize, sizeof(H3Index)); int compactResult = H3_EXPORT(compact)(children, output, arrSize); - t_assert(compactResult != 0, + t_assert(compactResult == COMPACT_DUPLICATE, "compact fails on duplicate input (single duplicate)"); free(output); @@ -178,26 +179,53 @@ SUITE(compact) { TEST(compact_duplicatePentagonLimit) { // Test that the minimum number of duplicate hexagons causes failure H3Index h3; + int res = 10; // Arbitrary pentagon parent cell - setH3Index(&h3, 5, 4, 0); + setH3Index(&h3, res, 4, 0); - int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, 11) + 1; + int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, res + 1) + 1; H3Index* children = calloc(arrSize, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(h3, 11, children); + H3_EXPORT(h3ToChildren)(h3, res + 1, children); // duplicate one index - children[arrSize - 1] = H3_EXPORT(h3ToCenterChild)(h3, 11); + children[arrSize - 1] = H3_EXPORT(h3ToCenterChild)(h3, res + 1); H3Index* output = calloc(arrSize, sizeof(H3Index)); int compactResult = H3_EXPORT(compact)(children, output, arrSize); - t_assert(compactResult != 0, + t_assert(compactResult == COMPACT_DUPLICATE, "compact fails on duplicate input (pentagon parent)"); free(output); free(children); } + TEST(compact_duplicateIgnored) { + // Test that duplicated cells are not rejected by compact. + // This is not necessarily desired - just asserting the + // existing behavior. + H3Index h3; + int res = 10; + // Arbitrary index + setH3Index(&h3, res, 0, 2); + + int arrSize = H3_EXPORT(maxH3ToChildrenSize)(h3, res + 1); + H3Index* children = calloc(arrSize, sizeof(H3Index)); + + H3_EXPORT(h3ToChildren)(h3, res + 1, children); + // duplicate one index + children[arrSize - 1] = children[0]; + + H3Index* output = calloc(arrSize, sizeof(H3Index)); + + int compactResult = H3_EXPORT(compact)(children, output, arrSize); + t_assert(compactResult == COMPACT_SUCCESS, + "compact succeeds on duplicate input (correct count)"); + + free(output); + free(children); + } + TEST(compact_empty) { t_assert(H3_EXPORT(compact)(NULL, NULL, 0) == 0, "compact succeeds on empty input"); diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index 9b7fc913e..1e208c031 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -147,6 +147,14 @@ */ #define H3_INVALID_INDEX 0 +/* + * Return codes for compact + */ + +#define COMPACT_SUCCESS 0 +#define COMPACT_LOOP_EXCEEDED -1 +#define COMPACT_DUPLICATE -2 + void setH3Index(H3Index* h, int res, int baseCell, Direction initDigit); int isResClassIII(int res); diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 1a8883849..99276ae23 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -271,7 +271,7 @@ H3Index H3_EXPORT(h3ToCenterChild)(H3Index h, int childRes) { int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, const int numHexes) { if (numHexes == 0) { - return 0; + return COMPACT_SUCCESS; } int res = H3_GET_RESOLUTION(h3Set[0]); if (res == 0) { @@ -279,7 +279,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, for (int i = 0; i < numHexes; i++) { compactedSet[i] = h3Set[i]; } - return 0; + return COMPACT_SUCCESS; } H3Index* remainingHexes = malloc(numHexes * sizeof(H3Index)); memcpy(remainingHexes, h3Set, numHexes * sizeof(H3Index)); @@ -307,7 +307,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, // numRemainingHexes. free(remainingHexes); free(hashSetArray); - return -1; + return COMPACT_LOOP_EXCEEDED; // LCOV_EXCL_STOP } H3Index tempIndex = @@ -326,7 +326,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, // Only possible on duplicate input free(remainingHexes); free(hashSetArray); - return -2; + return COMPACT_DUPLICATE; } H3_SET_RESERVED_BITS(parent, count); hashSetArray[loc] = H3_INVALID_INDEX; @@ -391,7 +391,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, free(compactableHexes); free(remainingHexes); free(hashSetArray); - return -1; // Only possible on duplicate input + return COMPACT_LOOP_EXCEEDED; // LCOV_EXCL_STOP } H3Index tempIndex = @@ -423,7 +423,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, } free(remainingHexes); free(hashSetArray); - return 0; + return COMPACT_SUCCESS; } /** From 3070363d73d12f11f6b8875ff12a76775898b183 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 6 Jan 2020 22:18:35 -0800 Subject: [PATCH 206/771] Clarify that the reserved bits must be 0 for cell (mode 1) indexes. Clarify the documentation and validation functions that the reserved bits must be 0 for a cell index to be valid. This is done to prevent valid indexes being different but refering to the same cell. The high bit of an H3Index is also treated as a reserved bit (previously documentation was silent on it.) See #297. --- CHANGELOG.md | 5 +++++ docs/core-library/h3indexing.md | 6 ++++-- src/apps/testapps/testH3Index.c | 21 ++++++++++++++++++++- src/apps/testapps/testH3UniEdge.c | 5 +++++ src/h3lib/include/h3Index.h | 18 ++++++++++++++++++ src/h3lib/lib/h3Index.c | 5 +++++ src/h3lib/lib/h3UniEdge.c | 2 +- 7 files changed, 58 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c445b7295..121a58618 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ The public API of this library consists of the functions declared in file ## [Unreleased] ### Fixed - `compact` detects and fails on cases with duplicated input indexes. (#299) +### Changed +- Clarify that the reserved bits of H3 cell (mode 1) indexes must be 0 to be valid. +- Clarify that the high bit of all `H3Index`es must be 0. +- `h3IsValid` rejects indexes that have non-zero reserved bits. +- `h3IsValid` and `h3UnidirectionalEdgeIsValid` rejects indexes with the high bit set. ## [3.6.2] - 2019-12-9 - Revert new `polyfill` algorithm until reported issues are fixed. (#293) diff --git a/docs/core-library/h3indexing.md b/docs/core-library/h3indexing.md index e1a423211..02deac91e 100644 --- a/docs/core-library/h3indexing.md +++ b/docs/core-library/h3indexing.md @@ -21,7 +21,7 @@ The **H3Index** is the integer representation of an **H3** index, which can be p The components of the **H3** cell index (mode 1) are packed into the lowest order 63 bits of a 64-bit integer in order as follows: * 4 bits to indicate the index mode, -* 3 bits reserved, +* 3 bits reserved and set to 0, * 4 bits to indicate the cell resolution 0-15, * 7 bits to indicate the base cell 0-121, and * 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) @@ -34,10 +34,12 @@ The components of the **H3** unidirectional edge index (mode 2) are packed into * 7 bits to indicate the base cell 0-121, and * 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) -The canonical string representation of an **H3Index** is the hexadecimal representation of the integer. +The canonical string representation of an **H3Index** is the hexadecimal representation of the integer, using lowercase letters. The three bits for each unused digit are set to 7. +The highest order bit of an **H3Index** must be set to 0. + Bit layout of H3Index --- diff --git a/src/apps/testapps/testH3Index.c b/src/apps/testapps/testH3Index.c index f6c3c8832..168af081c 100644 --- a/src/apps/testapps/testH3Index.c +++ b/src/apps/testapps/testH3Index.c @@ -111,10 +111,29 @@ SUITE(h3Index) { H3_SET_MODE(h, i); char failureMessage[BUFF_SIZE]; sprintf(failureMessage, "h3IsValid failed on mode %d", i); - t_assert(!H3_EXPORT(h3IsValid)(h) || i == 1, failureMessage); + t_assert(!H3_EXPORT(h3IsValid)(h) || i == H3_HEXAGON_MODE, + failureMessage); } } + TEST(h3IsValidReservedBits) { + for (int i = 0; i < 8; i++) { + H3Index h = H3_INIT; + H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_RESERVED_BITS(h, i); + char failureMessage[BUFF_SIZE]; + sprintf(failureMessage, "h3IsValid failed on reserved bits %d", i); + t_assert(!H3_EXPORT(h3IsValid)(h) || i == 0, failureMessage); + } + } + + TEST(h3IsValidHighBit) { + H3Index h = H3_INIT; + H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_HIGH_BIT(h, 1); + t_assert(!H3_EXPORT(h3IsValid)(h), "h3IsValid failed on high bit"); + } + TEST(h3BadDigitInvalid) { H3Index h = H3_INIT; // By default the first index digit is out of range. diff --git a/src/apps/testapps/testH3UniEdge.c b/src/apps/testapps/testH3UniEdge.c index f1cd90111..a75273be4 100644 --- a/src/apps/testapps/testH3UniEdge.c +++ b/src/apps/testapps/testH3UniEdge.c @@ -166,6 +166,11 @@ SUITE(h3UniEdge) { H3_SET_RESERVED_BITS(badPentagonalEdge, 1); t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(badPentagonalEdge) == 0, "missing pentagonal edge does not validate"); + + H3Index highBitEdge = edge; + H3_SET_HIGH_BIT(highBitEdge, 1); + t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(highBitEdge) == 0, + "high bit set edge does not validate"); } TEST(getH3UnidirectionalEdgesFromHexagon) { diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index 1e208c031..905e00878 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -46,6 +46,12 @@ /** The number of bits in a single H3 resolution digit. */ #define H3_PER_DIGIT_OFFSET 3 +/** 1 in the highest bit, 0's everywhere else. */ +#define H3_HIGH_BIT_MASK ((uint64_t)(1) << H3_MAX_OFFSET) + +/** 1 in the highest bit, 0's everywhere else. */ +#define H3_HIGH_BIT_MASK_NEGATIVE (~H3_HIGH_BIT_MASK) + /** 1's in the 4 mode bits, 0's everywhere else. */ #define H3_MODE_MASK ((uint64_t)(15) << H3_MODE_OFFSET) @@ -79,6 +85,18 @@ /** H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. */ #define H3_INIT (UINT64_C(35184372088831)) +/** + * Gets the highest bit of the H3 index. + */ +#define H3_GET_HIGH_BIT(h3) ((int)((((h3)&H3_HIGH_BIT_MASK) >> H3_MAX_OFFSET))) + +/** + * Sets the highest bit of the h3 to v. + */ +#define H3_SET_HIGH_BIT(h3, v) \ + (h3) = (((h3)&H3_HIGH_BIT_MASK_NEGATIVE) | \ + (((uint64_t)(v)) << H3_MAX_OFFSET)) + /** * Gets the integer mode of h3. */ diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 99276ae23..5920239c2 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -79,8 +79,13 @@ void H3_EXPORT(h3ToString)(H3Index h, char* str, size_t sz) { * @return 1 if the H3 index if valid, and 0 if it is not. */ int H3_EXPORT(h3IsValid)(H3Index h) { + if (H3_GET_HIGH_BIT(h) != 0) return 0; + if (H3_GET_MODE(h) != H3_HEXAGON_MODE) return 0; + int reservedBits = H3_GET_RESERVED_BITS(h); + if (reservedBits != 0) return 0; + int baseCell = H3_GET_BASE_CELL(h); if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) return 0; diff --git a/src/h3lib/lib/h3UniEdge.c b/src/h3lib/lib/h3UniEdge.c index c36453e5e..156c1ffd7 100644 --- a/src/h3lib/lib/h3UniEdge.c +++ b/src/h3lib/lib/h3UniEdge.c @@ -179,7 +179,7 @@ int H3_EXPORT(h3UnidirectionalEdgeIsValid)(H3Index edge) { return 0; } - return H3_EXPORT(h3IsValid)(origin); + return H3_EXPORT(h3IsValid)(origin & H3_RESERVED_MASK_NEGATIVE); } /** From c431b8b3ed9f7a00d4ecb92d2d47a5fa38a93244 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 6 Jan 2020 22:28:39 -0800 Subject: [PATCH 207/771] PR number and remove dupe changelog for docs change --- CHANGELOG.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 121a58618..f9382edcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,8 @@ The public API of this library consists of the functions declared in file ### Fixed - `compact` detects and fails on cases with duplicated input indexes. (#299) ### Changed -- Clarify that the reserved bits of H3 cell (mode 1) indexes must be 0 to be valid. -- Clarify that the high bit of all `H3Index`es must be 0. -- `h3IsValid` rejects indexes that have non-zero reserved bits. -- `h3IsValid` and `h3UnidirectionalEdgeIsValid` rejects indexes with the high bit set. +- `h3IsValid` rejects indexes that have non-zero reserved bits. (#300) +- `h3IsValid` and `h3UnidirectionalEdgeIsValid` rejects indexes with the high bit set. (#300) ## [3.6.2] - 2019-12-9 - Revert new `polyfill` algorithm until reported issues are fixed. (#293) From 5642d99ef71e76f0123108fef79c0e24850ac351 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 7 Jan 2020 08:01:32 -0800 Subject: [PATCH 208/771] Adjust tests to assert for valid indexes too --- CHANGELOG.md | 4 ++-- src/apps/testapps/testH3Index.c | 24 +++++++++++++++++------- src/h3lib/lib/h3Index.c | 3 +-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9382edcc..805d21f6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ The public API of this library consists of the functions declared in file ### Fixed - `compact` detects and fails on cases with duplicated input indexes. (#299) ### Changed -- `h3IsValid` rejects indexes that have non-zero reserved bits. (#300) -- `h3IsValid` and `h3UnidirectionalEdgeIsValid` rejects indexes with the high bit set. (#300) +- `h3IsValid` returns false for indexes that have non-zero reserved bits. (#300) +- `h3IsValid` and `h3UnidirectionalEdgeIsValid` return false for indexes with the high bit set. (#300) ## [3.6.2] - 2019-12-9 - Revert new `polyfill` algorithm until reported issues are fixed. (#293) diff --git a/src/apps/testapps/testH3Index.c b/src/apps/testapps/testH3Index.c index 168af081c..7b1694eb9 100644 --- a/src/apps/testapps/testH3Index.c +++ b/src/apps/testapps/testH3Index.c @@ -109,10 +109,14 @@ SUITE(h3Index) { for (int i = 0; i <= 0xf; i++) { H3Index h = H3_INIT; H3_SET_MODE(h, i); - char failureMessage[BUFF_SIZE]; - sprintf(failureMessage, "h3IsValid failed on mode %d", i); - t_assert(!H3_EXPORT(h3IsValid)(h) || i == H3_HEXAGON_MODE, - failureMessage); + if (i == H3_HEXAGON_MODE) { + t_assert(H3_EXPORT(h3IsValid)(h), + "h3IsValid succeeds on valid mode"); + } else { + char failureMessage[BUFF_SIZE]; + sprintf(failureMessage, "h3IsValid failed on mode %d", i); + t_assert(!H3_EXPORT(h3IsValid)(h), failureMessage); + } } } @@ -121,9 +125,15 @@ SUITE(h3Index) { H3Index h = H3_INIT; H3_SET_MODE(h, H3_HEXAGON_MODE); H3_SET_RESERVED_BITS(h, i); - char failureMessage[BUFF_SIZE]; - sprintf(failureMessage, "h3IsValid failed on reserved bits %d", i); - t_assert(!H3_EXPORT(h3IsValid)(h) || i == 0, failureMessage); + if (i == 0) { + t_assert(H3_EXPORT(h3IsValid)(h), + "h3IsValid succeeds on valid reserved bits"); + } else { + char failureMessage[BUFF_SIZE]; + sprintf(failureMessage, "h3IsValid failed on reserved bits %d", + i); + t_assert(!H3_EXPORT(h3IsValid)(h), failureMessage); + } } } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 5920239c2..b40c956eb 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -83,8 +83,7 @@ int H3_EXPORT(h3IsValid)(H3Index h) { if (H3_GET_MODE(h) != H3_HEXAGON_MODE) return 0; - int reservedBits = H3_GET_RESERVED_BITS(h); - if (reservedBits != 0) return 0; + if (H3_GET_RESERVED_BITS(h) != 0) return 0; int baseCell = H3_GET_BASE_CELL(h); if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) return 0; From de661870d1a16246bc1265d52805ad15263ea476 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 8 Jan 2020 21:50:33 -0800 Subject: [PATCH 209/771] Documentation changes per review and remove no-op bitmask --- docs/core-library/h3indexing.md | 16 ++++++++-------- src/h3lib/include/h3Index.h | 2 +- src/h3lib/lib/h3UniEdge.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/core-library/h3indexing.md b/docs/core-library/h3indexing.md index 02deac91e..b0b6a3531 100644 --- a/docs/core-library/h3indexing.md +++ b/docs/core-library/h3indexing.md @@ -18,28 +18,28 @@ H3Index Representation The **H3Index** is the integer representation of an **H3** index, which can be placed into multiple modes to indicate the kind of concept being indexed. Mode 1 is an **H3** Cell (Hexagon) Index, mode 2 is an **H3** Unidirectional Edge (Hexagon A -> Hexagon B) Index, mode 3 is planned to be a bidirectional edge (Hexagon A <-> Hexagon B). Mode 0 is reserved and indicates an invalid **H3** index. -The components of the **H3** cell index (mode 1) are packed into the lowest order 63 bits of a 64-bit integer in order as follows: +The components of the **H3** cell index (mode 1) are packed into a 64-bit integer in order, highest bit first, as follows: +* 1 bit reserved and set to 0, * 4 bits to indicate the index mode, * 3 bits reserved and set to 0, * 4 bits to indicate the cell resolution 0-15, * 7 bits to indicate the base cell 0-121, and -* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) +* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total are reserved for resolutions 1-15) -The components of the **H3** unidirectional edge index (mode 2) are packed into the lowest order 63 bits of a 64-bit integer in order as follows: +The components of the **H3** unidirectional edge index (mode 2) are packed into a 64-bit integer in order, highest bit first, as follows: +* 1 bit reserved and set to 0, * 4 bits to indicate the index mode, * 3 bits to indicate the edge 1-6 of the cell to traverse, * 4 bits to indicate the cell resolution 0-15, * 7 bits to indicate the base cell 0-121, and -* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) +* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total are reserved for resolutions 1-15) -The canonical string representation of an **H3Index** is the hexadecimal representation of the integer, using lowercase letters. +The canonical string representation of an **H3Index** is the hexadecimal representation of the integer, using lowercase letters. The string representation is variable length (no zero padding) and is not prefixed or suffixed. The three bits for each unused digit are set to 7. -The highest order bit of an **H3Index** must be set to 0. - Bit layout of H3Index --- @@ -67,7 +67,7 @@ The layout of an **H3Index** is shown below in table form. The interpretation of 0x30 - + Reserved Mode Reserved/edge Resolution diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index 905e00878..e3204918c 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -49,7 +49,7 @@ /** 1 in the highest bit, 0's everywhere else. */ #define H3_HIGH_BIT_MASK ((uint64_t)(1) << H3_MAX_OFFSET) -/** 1 in the highest bit, 0's everywhere else. */ +/** 0 in the highest bit, 1's everywhere else. */ #define H3_HIGH_BIT_MASK_NEGATIVE (~H3_HIGH_BIT_MASK) /** 1's in the 4 mode bits, 0's everywhere else. */ diff --git a/src/h3lib/lib/h3UniEdge.c b/src/h3lib/lib/h3UniEdge.c index 156c1ffd7..c36453e5e 100644 --- a/src/h3lib/lib/h3UniEdge.c +++ b/src/h3lib/lib/h3UniEdge.c @@ -179,7 +179,7 @@ int H3_EXPORT(h3UnidirectionalEdgeIsValid)(H3Index edge) { return 0; } - return H3_EXPORT(h3IsValid)(origin & H3_RESERVED_MASK_NEGATIVE); + return H3_EXPORT(h3IsValid)(origin); } /** From 836d3cb0c205ea09a1d239db0fa85eb49fec664e Mon Sep 17 00:00:00 2001 From: Nicholas Rabinowitz Date: Tue, 21 Jan 2020 10:05:26 -0800 Subject: [PATCH 210/771] Preparing for release 3.6.3 --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 805d21f6c..606b35d42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The public API of this library consists of the functions declared in file [h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] + +## [3.6.3] - 2020-01-21 ### Fixed - `compact` detects and fails on cases with duplicated input indexes. (#299) ### Changed diff --git a/VERSION b/VERSION index b72762837..4a788a01d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.6.2 +3.6.3 From f5062de111a6f53568ec1565f608993c0f996e5c Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Fri, 7 Feb 2020 14:44:08 -0800 Subject: [PATCH 211/771] Add overrideable memory allocation RFC --- .../v4.0.0/overrideable-allocators-rfc.md | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md diff --git a/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md new file mode 100644 index 000000000..769503a3d --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md @@ -0,0 +1,125 @@ +# RFC: Overrideable allocation functions for H3 + +* **Authors**: Isaac Brodsky (@isaacbrodsky) +* **Date**: February 7, 2020 +* **Status**: Draft + +## Overview + +This is a proposal for adding a mechanism for users of the H3 library to provide heap allocator instead of the default +malloc implementation. + +## Motivation + +This will address the following use cases: + +* H3 is used inside of another application which has its own heap managememnt scheme. For example, using the allocation + functions provided by Postgres or the Java Virtual Machine. +* Testing of failure cases of H3, by simulating allocation failures. + +## Prior Art + +Reading materials to reference: + +* [C++ `vector`](http://www.cplusplus.com/reference/vector/vector/) +* [SDL](https://discourse.libsdl.org/t/sdl-2-0-7-prerelease/23232) (via `SDL_SetMemoryFunctions`) +* [PostgreSQL](https://www.postgresql.org/docs/10/xfunc-c.html) (via `palloc`) +* [SQLite](https://sqlite.org/malloc.html) + +## Approaches + +All approaches assume the user has defined the following functions: + +``` +void* my_malloc(size_t size); +void* my_calloc(size_t count, size_t size); +void my_free(void* pointer); + +// TODO: Do we want my_realloc? +``` + +### Global statics + +In this approach, H3 stores the allocation functions in a set of static variables. + +``` +h3SetAllocator(&my_alloc, &my_calloc, &my_free); + +// call into H3 as before +polyfill(geoPolygon, res, out); +``` + +Pro: +* Allows the user to replace allocators at run time. + +Con: +* Not thread safe, or an additional, complicated dependency is needed to ensure thread safety. +* Global state. + +### Templates + +This approach is similar to how C++ handles allocator replacement in its standard library, by accepting the allocator +as a template argument. However, H3 is written in C and must implement templates using macros. + +``` +POLYFILL_WITH_ALLLOCATORS(my_polyfill, my_malloc, my_calloc, my_free); + +// Call the function created by the template +my_polyfill(geoPolygon, res, out); +``` + +Pro: +* Allows the user to have multiple allocator replacements in use at once. + +Con: +* Exposes a complicated build process to the user in the form of macros. + +### Allocator argument approach + +In this approach, every function call includes allocators. + +``` +H3MemoryManager allocFunctions = { + .malloc = &my_malloc, + .calloc = &my_calloc, + .free = &my_free +}; + +polyfill(geoPolygon, res, out, &allocFunctions); +``` + +Pro: +* Allowing replacement on a per-call basis allows for maximum control by the user. + +Con: +* The user must always specify allocators, which is unlikely to be needed by most users. +* Alternately, additional overloads of all H3 functions that heap-allocate are needed. + +### `#define` approach + +In this approach, the allocators are specified at build time. + +``` +# In build process: +cmake -DH3_ALLOC_PREFIX=my_ ... + +// in source file, functions are used as before. +``` + +Alternately, instead of setting a prefix, the build could accept individual options +for functions, such as `-DH3_MALLOC=my_malloc -DH3_CALLOC=my_calloc`. (Although this +could allow a user to accidentally override `malloc` but not `free`, which is generally +very bad.) + +Pro: +* Minimal overhead for users and developers when allocator replacement is not needed. + +Con: +* Complex allocator replacement (i.e. different allocators for different calls) is possible but requires implementation + by the user. + +## Proposal + +`#define` based allocator replacement seems like the clearest and lowest overhead to implement, while still supporting +the full range of use cases. A user could optionally implement a more complicated replacement inside their custom +allocator functions. From 4a6df68e9f49402b5cc31cbfe5ce78598e7b2a99 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Tue, 11 Feb 2020 22:08:31 -0800 Subject: [PATCH 212/771] Update with feedback, list functions that allocate --- .../v4.0.0/overrideable-allocators-rfc.md | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md index 769503a3d..1ad832042 100644 --- a/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md +++ b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md @@ -13,15 +13,31 @@ malloc implementation. This will address the following use cases: -* H3 is used inside of another application which has its own heap managememnt scheme. For example, using the allocation +* H3 is used inside of another application which has its own heap management scheme. For example, using the allocation functions provided by Postgres or the Java Virtual Machine. * Testing of failure cases of H3, by simulating allocation failures. +Most H3 functions accept memory from the caller in order to avoid this problem. This will still be the preferred way +to handle memory management in H3. Stack allocation is avoided because H3 cannot know whether there is sufficient stack +memory available. (Note that `_kRingInternal`/`kRingDistances` implicitly uses stack allocation because it implements DFS +recursively.) + +A few functions in H3 do heap allocate memory because it is not feasible to do otherwise, or as a convenience. The +functions that heap allocate are: + +| Function | Reason +| --- | --- +| `kRing`| Convenience wrapper around `kRingDistances` +| `polyfill` | Convenience (could be passed in, requires internal knowledge) +| `compact` | Convenience (could be passed in, requires internal knowledge) +| `h3SetToLinkedGeo` | Requires knowledge of how to initialize the internal struct +| `destroyLinkedPolygon` | Required for `h3SetToLinkedGeo` + ## Prior Art Reading materials to reference: -* [C++ `vector`](http://www.cplusplus.com/reference/vector/vector/) +* [C++ `vector`](http://www.cplusplus.com/reference/vector/vector/) (via templates) * [SDL](https://discourse.libsdl.org/t/sdl-2-0-7-prerelease/23232) (via `SDL_SetMemoryFunctions`) * [PostgreSQL](https://www.postgresql.org/docs/10/xfunc-c.html) (via `palloc`) * [SQLite](https://sqlite.org/malloc.html) From 7de8265980ab106c4a74cc0c6d5f58aa2ff55f2a Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 13 Feb 2020 22:03:11 -0800 Subject: [PATCH 213/771] wip H3_MEMORY macro --- CMakeLists.txt | 4 ++++ src/h3lib/include/alloc.h | 36 ++++++++++++++++++++++++++++++++++++ src/h3lib/lib/algos.c | 8 ++++---- src/h3lib/lib/h3Index.c | 26 +++++++++++++------------- src/h3lib/lib/linkedGeo.c | 32 +++++++++++++++++--------------- src/h3lib/lib/vertexGraph.c | 10 +++++----- 6 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 src/h3lib/include/alloc.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fecd10fcb..7fcd21d07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ cmake_minimum_required(VERSION 3.1) set(H3_PREFIX "" CACHE STRING "Prefix for exported symbols") +set(H3_ALLOC_PREFIX "" CACHE STRING "Prefix for allocation functions") # Needed due to CMP0042 set(CMAKE_MACOSX_RPATH 1) @@ -216,6 +217,9 @@ if(BUILD_SHARED_LIBS) endif() target_compile_definitions(h3 PUBLIC H3_PREFIX=${H3_PREFIX}) +if(H3_ALLOC_PREFIX) + target_compile_definitions(h3 PUBLIC H3_ALLOC_PREFIX=${H3_ALLOC_PREFIX}) +endif() if(have_alloca) target_compile_definitions(h3 PUBLIC H3_HAVE_ALLOCA) endif() diff --git a/src/h3lib/include/alloc.h b/src/h3lib/include/alloc.h new file mode 100644 index 000000000..56bb041ad --- /dev/null +++ b/src/h3lib/include/alloc.h @@ -0,0 +1,36 @@ +/* + * Copyright 2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file alloc.h + * @brief Memory management functions + */ + +#ifndef ALLOC_H +#define ALLOC_H + +#include "h3api.h" + +#ifdef H3_ALLOC_PREFIX +#define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name) + +void* H3_MEMORY(malloc)(size_t size) +void* H3-MEMORY(calloc)(size_t num, size_t size); +void* H3_MEMORY(realloc)(void* ptr, size_t size); +void H3_MEMORY(free)(void* ptr); +#else +#define H3_MEMORY(name) name +#endif + +#endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index d41b086b9..2c2c1e0df 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -172,9 +172,9 @@ int H3_EXPORT(maxKringSize)(int k) { return 3 * k * (k + 1) + 1; } */ void H3_EXPORT(kRing)(H3Index origin, int k, H3Index* out) { int maxIdx = H3_EXPORT(maxKringSize)(k); - int* distances = malloc(maxIdx * sizeof(int)); + int* distances = H3_MEMORY(malloc)(maxIdx * sizeof(int)); H3_EXPORT(kRingDistances)(origin, k, out, distances); - free(distances); + H3_MEMORY(free)(distances); } /** @@ -674,7 +674,7 @@ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { // This first part is identical to the maxPolyfillSize above. // Get the bounding boxes for the polygon and any holes - BBox* bboxes = malloc((geoPolygon->numHoles + 1) * sizeof(BBox)); + BBox* bboxes = H3_MEMORY(malloc)((geoPolygon->numHoles + 1) * sizeof(BBox)); assert(bboxes != NULL); bboxesFromGeoPolygon(geoPolygon, bboxes); int minK = bboxHexRadius(&bboxes[0], res); @@ -706,7 +706,7 @@ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { out[i] = H3_INVALID_INDEX; } } - free(bboxes); + H3_MEMORY(free)(bboxes); } /** diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index b40c956eb..ad760e8a7 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -285,9 +285,9 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, } return COMPACT_SUCCESS; } - H3Index* remainingHexes = malloc(numHexes * sizeof(H3Index)); + H3Index* remainingHexes = H3_MEMORY(malloc)(numHexes * sizeof(H3Index)); memcpy(remainingHexes, h3Set, numHexes * sizeof(H3Index)); - H3Index* hashSetArray = calloc(numHexes, sizeof(H3Index)); + H3Index* hashSetArray = H3_MEMORY(calloc)(numHexes, sizeof(H3Index)); H3Index* compactedSetOffset = compactedSet; int numRemainingHexes = numHexes; while (numRemainingHexes) { @@ -309,8 +309,8 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, // This case should not be possible because at most one // index is placed into hashSetArray per // numRemainingHexes. - free(remainingHexes); - free(hashSetArray); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); return COMPACT_LOOP_EXCEEDED; // LCOV_EXCL_STOP } @@ -328,8 +328,8 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, // checking for all children being present. if (count + 1 > limitCount) { // Only possible on duplicate input - free(remainingHexes); - free(hashSetArray); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); return COMPACT_DUPLICATE; } H3_SET_RESERVED_BITS(parent, count); @@ -353,7 +353,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, break; } H3Index* compactableHexes = - malloc(maxCompactableCount * sizeof(H3Index)); + H3_MEMORY(malloc)(maxCompactableCount * sizeof(H3Index)); for (int i = 0; i < numRemainingHexes; i++) { if (hashSetArray[i] == 0) continue; int count = H3_GET_RESERVED_BITS(hashSetArray[i]) + 1; @@ -392,9 +392,9 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, // LCOV_EXCL_START // This case should not be possible because at most one // index is placed into hashSetArray per input hexagon. - free(compactableHexes); - free(remainingHexes); - free(hashSetArray); + H3_MEMORY(free)(compactableHexes); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); return COMPACT_LOOP_EXCEEDED; // LCOV_EXCL_STOP } @@ -423,10 +423,10 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, memcpy(remainingHexes, compactableHexes, compactableCount * sizeof(H3Index)); numRemainingHexes = compactableCount; - free(compactableHexes); + H3_MEMORY(free)(compactableHexes); } - free(remainingHexes); - free(hashSetArray); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); return COMPACT_SUCCESS; } diff --git a/src/h3lib/lib/linkedGeo.c b/src/h3lib/lib/linkedGeo.c index 4fe24b1fc..8b8f14f74 100644 --- a/src/h3lib/lib/linkedGeo.c +++ b/src/h3lib/lib/linkedGeo.c @@ -30,7 +30,7 @@ */ LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) { assert(polygon->next == NULL); - LinkedGeoPolygon* next = calloc(1, sizeof(*next)); + LinkedGeoPolygon* next = H3_MEMORY(calloc)(1, sizeof(*next)); assert(next != NULL); polygon->next = next; return next; @@ -42,7 +42,7 @@ LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) { * @return Pointer to loop */ LinkedGeoLoop* addNewLinkedLoop(LinkedGeoPolygon* polygon) { - LinkedGeoLoop* loop = calloc(1, sizeof(*loop)); + LinkedGeoLoop* loop = H3_MEMORY(calloc)(1, sizeof(*loop)); assert(loop != NULL); return addLinkedLoop(polygon, loop); } @@ -71,7 +71,7 @@ LinkedGeoLoop* addLinkedLoop(LinkedGeoPolygon* polygon, LinkedGeoLoop* loop) { * @return Pointer to the coordinate */ LinkedGeoCoord* addLinkedCoord(LinkedGeoLoop* loop, const GeoCoord* vertex) { - LinkedGeoCoord* coord = malloc(sizeof(*coord)); + LinkedGeoCoord* coord = H3_MEMORY(malloc)(sizeof(*coord)); assert(coord != NULL); *coord = (LinkedGeoCoord){.vertex = *vertex, .next = NULL}; LinkedGeoCoord* last = loop->last; @@ -95,7 +95,7 @@ void destroyLinkedGeoLoop(LinkedGeoLoop* loop) { for (LinkedGeoCoord* currentCoord = loop->first; currentCoord != NULL; currentCoord = nextCoord) { nextCoord = currentCoord->next; - free(currentCoord); + H3_MEMORY(free)(currentCoord); } } @@ -115,14 +115,14 @@ void H3_EXPORT(destroyLinkedPolygon)(LinkedGeoPolygon* polygon) { currentLoop != NULL; currentLoop = nextLoop) { destroyLinkedGeoLoop(currentLoop); nextLoop = currentLoop->next; - free(currentLoop); + H3_MEMORY(free)(currentLoop); } nextPolygon = currentPolygon->next; if (skip) { // do not free the input polygon skip = false; } else { - free(currentPolygon); + H3_MEMORY(free)(currentPolygon); } } } @@ -242,9 +242,10 @@ static const LinkedGeoPolygon* findPolygonForHole( } // Initialize arrays for candidate loops and their bounding boxes const LinkedGeoPolygon** candidates = - malloc(polygonCount * sizeof(LinkedGeoPolygon*)); + H3_MEMORY(malloc)(polygonCount * sizeof(LinkedGeoPolygon*)); assert(candidates != NULL); - const BBox** candidateBBoxes = malloc(polygonCount * sizeof(BBox*)); + const BBox** candidateBBoxes = + H3_MEMORY(malloc)(polygonCount * sizeof(BBox*)); assert(candidateBBoxes != NULL); // Find all polygons that contain the loop @@ -267,8 +268,8 @@ static const LinkedGeoPolygon* findPolygonForHole( findDeepestContainer(candidates, candidateBBoxes, candidateCount); // Free allocated memory - free(candidates); - free(candidateBBoxes); + H3_MEMORY(free)(candidates); + H3_MEMORY(free)(candidateBBoxes); return parent; } @@ -308,11 +309,12 @@ int normalizeMultiPolygon(LinkedGeoPolygon* root) { // Create an array to hold all of the inner loops. Note that // this array will never be full, as there will always be fewer // inner loops than outer loops. - LinkedGeoLoop** innerLoops = malloc(loopCount * sizeof(LinkedGeoLoop*)); + LinkedGeoLoop** innerLoops = + H3_MEMORY(malloc)(loopCount * sizeof(LinkedGeoLoop*)); assert(innerLoops != NULL); // Create an array to hold the bounding boxes for the outer loops - BBox* bboxes = malloc(loopCount * sizeof(BBox)); + BBox* bboxes = H3_MEMORY(malloc)(loopCount * sizeof(BBox)); assert(bboxes != NULL); // Get the first loop and unlink it from root @@ -349,14 +351,14 @@ int normalizeMultiPolygon(LinkedGeoPolygon* root) { // been unlinked from the root and the caller will no longer have // a way to destroy it with destroyLinkedPolygon. destroyLinkedGeoLoop(innerLoops[i]); - free(innerLoops[i]); + H3_MEMORY(free)(innerLoops[i]); resultCode = NORMALIZATION_ERR_UNASSIGNED_HOLES; } } // Free allocated memory - free(innerLoops); - free(bboxes); + H3_MEMORY(free)(innerLoops); + H3_MEMORY(free)(bboxes); return resultCode; } diff --git a/src/h3lib/lib/vertexGraph.c b/src/h3lib/lib/vertexGraph.c index 2aaae6f38..f6fd7c0d8 100644 --- a/src/h3lib/lib/vertexGraph.c +++ b/src/h3lib/lib/vertexGraph.c @@ -33,7 +33,7 @@ */ void initVertexGraph(VertexGraph* graph, int numBuckets, int res) { if (numBuckets > 0) { - graph->buckets = calloc(numBuckets, sizeof(VertexNode*)); + graph->buckets = H3_MEMORY(calloc)(numBuckets, sizeof(VertexNode*)); assert(graph->buckets != NULL); } else { graph->buckets = NULL; @@ -53,7 +53,7 @@ void destroyVertexGraph(VertexGraph* graph) { while ((node = firstVertexNode(graph)) != NULL) { removeVertexNode(graph, node); } - free(graph->buckets); + H3_MEMORY(free)(graph->buckets); } /** @@ -91,7 +91,7 @@ void _initVertexNode(VertexNode* node, const GeoCoord* fromVtx, VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, const GeoCoord* toVtx) { // Make the new node - VertexNode* node = malloc(sizeof(VertexNode)); + VertexNode* node = H3_MEMORY(malloc)(sizeof(VertexNode)); assert(node != NULL); _initVertexNode(node, fromVtx, toVtx); // Determine location @@ -108,7 +108,7 @@ VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, if (geoAlmostEqual(¤tNode->from, fromVtx) && geoAlmostEqual(¤tNode->to, toVtx)) { // already exists, bail - free(node); + H3_MEMORY(free)(node); return currentNode; } if (currentNode->next != NULL) { @@ -150,7 +150,7 @@ int removeVertexNode(VertexGraph* graph, VertexNode* node) { } } if (found) { - free(node); + H3_MEMORY(free)(node); graph->size--; return 0; } From c9ffd78540c33a4c9a20a547dd8f82c08d9a46dc Mon Sep 17 00:00:00 2001 From: Thanabodee Charoenpiriyakij Date: Tue, 18 Feb 2020 21:13:00 +0700 Subject: [PATCH 214/771] Add -k option to kRing and hexRange Fixes #314 --- docs/core-library/filters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/core-library/filters.md b/docs/core-library/filters.md index b141305c0..0c7009b89 100644 --- a/docs/core-library/filters.md +++ b/docs/core-library/filters.md @@ -38,10 +38,10 @@ Unix Command Line Examples * output all indexes within distance 1 of the `H3Index` 845ad1bffffffff - `echo 845ad1bffffffff | kRing 1` + `kRing -k 1 --origin 845ad1bffffffff` * output all hexagon indexes within distance 2 of the `H3Index` 845ad1bffffffff - `echo 845ad1bffffffff | hexRange 2` + `hexRange -k 2 --origin 845ad1bffffffff` Note that the filters `h3ToGeo` and `h3ToGeoBoundary` take optional arguments that allow them to generate `kml` output. See the header comments in the corresponding source code files for details. From 724716cd23ef127ba074a80a24e1771c50a8cc4c Mon Sep 17 00:00:00 2001 From: Thanabodee Charoenpiriyakij Date: Wed, 19 Feb 2020 00:16:17 +0700 Subject: [PATCH 215/771] Make commands example in filters.md to use arguments style --- docs/core-library/filters.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/core-library/filters.md b/docs/core-library/filters.md index 0c7009b89..e5be9e797 100644 --- a/docs/core-library/filters.md +++ b/docs/core-library/filters.md @@ -22,19 +22,19 @@ Unix Command Line Examples * find the index for coordinates at resolution 5 - `echo 40.689167 -74.044444 | geoToH3 5` + `geoToH3 --resolution 5 --latitude 40.689167 --longitude -74.044444` * output the cell center point for `H3Index` 845ad1bffffffff - `echo 845ad1bffffffff | h3ToGeo` + `h3ToGeo --index 845ad1bffffffff` * output the cell boundary for `H3Index` 845ad1bffffffff - `echo 845ad1bffffffff | h3ToGeoBoundary` + `h3ToGeoBoundary --index 845ad1bffffffff` * find the components for the `H3Index` 845ad1bffffffff - `echo 845ad1bffffffff | h3ToComponents` + `h3ToComponents --index 845ad1bffffffff` * output all indexes within distance 1 of the `H3Index` 845ad1bffffffff From 288b14db9b1e43bf807a70caf7429badbc1adc9b Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Mon, 17 Feb 2020 16:02:55 -0800 Subject: [PATCH 216/771] wip alloc demo --- src/h3lib/lib/algos.c | 1 + src/h3lib/lib/h3Index.c | 1 + src/h3lib/lib/linkedGeo.c | 1 + src/h3lib/lib/vertexGraph.c | 1 + 4 files changed, 4 insertions(+) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 2c2c1e0df..346b8938f 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -24,6 +24,7 @@ #include #include #include +#include "alloc.h" #include "baseCells.h" #include "bbox.h" #include "faceijk.h" diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index ad760e8a7..158989c98 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -23,6 +23,7 @@ #include #include #include +#include "alloc.h" #include "baseCells.h" #include "faceijk.h" #include "mathExtensions.h" diff --git a/src/h3lib/lib/linkedGeo.c b/src/h3lib/lib/linkedGeo.c index 8b8f14f74..f4de2f8ba 100644 --- a/src/h3lib/lib/linkedGeo.c +++ b/src/h3lib/lib/linkedGeo.c @@ -20,6 +20,7 @@ #include "linkedGeo.h" #include #include +#include "alloc.h" #include "geoCoord.h" #include "h3api.h" diff --git a/src/h3lib/lib/vertexGraph.c b/src/h3lib/lib/vertexGraph.c index f6fd7c0d8..db962faf3 100644 --- a/src/h3lib/lib/vertexGraph.c +++ b/src/h3lib/lib/vertexGraph.c @@ -23,6 +23,7 @@ #include #include #include +#include "alloc.h" #include "geoCoord.h" /** From 908f7607de4dd22a5816408af208f3c8e6c816a3 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 27 Feb 2020 14:34:31 -0800 Subject: [PATCH 217/771] wip 3 --- CMakeLists.txt | 6 +++ src/apps/testapps/testH3Memory.c | 69 ++++++++++++++++++++++++++++++++ src/h3lib/include/alloc.h | 4 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/apps/testapps/testH3Memory.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7fcd21d07..0e03da4d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,6 +179,7 @@ set(OTHER_SOURCE_FILES src/apps/testapps/testH3LineExhaustive.c src/apps/testapps/testCoordIj.c src/apps/testapps/testCoordIjk.c + src/apps/testapps/testH3Memory.c src/apps/miscapps/h3ToGeoBoundaryHier.c src/apps/miscapps/h3ToGeoHier.c src/apps/miscapps/generateBaseCellNeighbors.c @@ -379,6 +380,7 @@ if(BUILD_GENERATORS) endif() if(BUILD_TESTING) + option(RUN_MEMORY_TESTS "Run memory allocator tests (requires H3_ALLOC_PREFIX to be set)" OFF) option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) include(TestWrapValgrind) @@ -531,6 +533,10 @@ if(BUILD_TESTING) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) + if(RUN_MEMORY_TESTS) + add_h3_test(testH3Memory src/apps/testapps/testH3Memory.c) + endif() + # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c new file mode 100644 index 000000000..1ec6bb29a --- /dev/null +++ b/src/apps/testapps/testH3Memory.c @@ -0,0 +1,69 @@ +/* + * Copyright 2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests main H3 core library memory management. + * + * usage: `testH3Memory` + */ + +#include +#include "alloc.h" +#include "geoCoord.h" +#include "h3api.h" +#include "test.h" +#include "utility.h" + +#ifndef H3_ALLOC_PREFIX +#error "This test can only be run with a prefix for alloc functions" +#endif + +static int failAlloc = 0; + +void* H3_MEMORY(malloc)(size_t size) { + if (failAlloc) { + return NULL; + } + return malloc(size); +} + +void* H3_MEMORY(calloc)(size_t num, size_t size) { + if (failAlloc) { + return NULL; + } + return calloc(num, size); +} + +void* H3_MEMORY(realloc)(void* ptr, size_t size) { + if (failAlloc) { + return NULL; + } + return realloc(ptr, size); +} + +void H3_MEMORY(free)(void* ptr) { return free(ptr); } + +H3Index sunnyvale = 0x89283470c27ffff; + +SUITE(h3Memory) { + TEST(t) { + int k = 9; + int hexCount = H3_EXPORT(maxKringSize)(k); + + // Generate a set of hexagons to compact + H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); + H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); + } +} diff --git a/src/h3lib/include/alloc.h b/src/h3lib/include/alloc.h index 56bb041ad..6ab25c5c5 100644 --- a/src/h3lib/include/alloc.h +++ b/src/h3lib/include/alloc.h @@ -25,8 +25,8 @@ #ifdef H3_ALLOC_PREFIX #define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name) -void* H3_MEMORY(malloc)(size_t size) -void* H3-MEMORY(calloc)(size_t num, size_t size); +void* H3_MEMORY(malloc)(size_t size); +void* H3_MEMORY(calloc)(size_t num, size_t size); void* H3_MEMORY(realloc)(void* ptr, size_t size); void H3_MEMORY(free)(void* ptr); #else From ce04cbf483d186d9d79582bb7a3886e558f701d4 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 27 Feb 2020 14:39:11 -0800 Subject: [PATCH 218/771] working build of testH3Memory --- CMakeLists.txt | 122 +++++++++++++++---------------- src/apps/testapps/testH3Memory.c | 8 +- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e03da4d5..b63de3495 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -478,71 +478,71 @@ if(BUILD_TESTING) # Add each individual test - file(GLOB all_centers tests/inputfiles/bc*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_ic_files tests/inputfiles/res*ic.txt) - foreach(file ${all_ic_files}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_centers tests/inputfiles/rand*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testGeoToH3 src/apps/testapps/testGeoToH3.c ${file}) - endforeach() - - file(GLOB all_cells tests/inputfiles/*cells.txt) - foreach(file ${all_cells}) - add_h3_test_with_file(testH3ToGeoBoundary src/apps/testapps/testH3ToGeoBoundary.c ${file}) - endforeach() - - add_h3_test(testCompact src/apps/testapps/testCompact.c) - add_h3_test(testKRing src/apps/testapps/testKRing.c) - add_h3_test(testHexRing src/apps/testapps/testHexRing.c) - add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) - add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) - add_h3_test(testH3ToCenterChild src/apps/testapps/testH3ToCenterChild.c) - add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) - add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) - add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) - add_h3_test(testH3Index src/apps/testapps/testH3Index.c) - add_h3_test(testH3Api src/apps/testapps/testH3Api.c) - add_h3_test(testH3SetToLinkedGeo src/apps/testapps/testH3SetToLinkedGeo.c) - add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) - add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) - add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) - add_h3_test(testPolyfillReported src/apps/testapps/testPolyfillReported.c) - add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) - add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) - add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) - add_h3_test(testBBox src/apps/testapps/testBBox.c) - add_h3_test(testPolygon src/apps/testapps/testPolygon.c) - add_h3_test(testVec2d src/apps/testapps/testVec2d.c) - add_h3_test(testVec3d src/apps/testapps/testVec3d.c) - add_h3_test(testH3ToLocalIj src/apps/testapps/testH3ToLocalIj.c) - add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) - add_h3_test(testH3Line src/apps/testapps/testH3Line.c) - add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) - add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) - add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) - add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) - - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) - if(RUN_MEMORY_TESTS) add_h3_test(testH3Memory src/apps/testapps/testH3Memory.c) + else() + file(GLOB all_centers tests/inputfiles/bc*centers.txt) + foreach(file ${all_centers}) + add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) + endforeach() + + file(GLOB all_ic_files tests/inputfiles/res*ic.txt) + foreach(file ${all_ic_files}) + add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) + endforeach() + + file(GLOB all_centers tests/inputfiles/rand*centers.txt) + foreach(file ${all_centers}) + add_h3_test_with_file(testGeoToH3 src/apps/testapps/testGeoToH3.c ${file}) + endforeach() + + file(GLOB all_cells tests/inputfiles/*cells.txt) + foreach(file ${all_cells}) + add_h3_test_with_file(testH3ToGeoBoundary src/apps/testapps/testH3ToGeoBoundary.c ${file}) + endforeach() + + add_h3_test(testCompact src/apps/testapps/testCompact.c) + add_h3_test(testKRing src/apps/testapps/testKRing.c) + add_h3_test(testHexRing src/apps/testapps/testHexRing.c) + add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) + add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) + add_h3_test(testH3ToCenterChild src/apps/testapps/testH3ToCenterChild.c) + add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) + add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) + add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) + add_h3_test(testH3Index src/apps/testapps/testH3Index.c) + add_h3_test(testH3Api src/apps/testapps/testH3Api.c) + add_h3_test(testH3SetToLinkedGeo src/apps/testapps/testH3SetToLinkedGeo.c) + add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) + add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) + add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) + add_h3_test(testPolyfillReported src/apps/testapps/testPolyfillReported.c) + add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) + add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) + add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) + add_h3_test(testBBox src/apps/testapps/testBBox.c) + add_h3_test(testPolygon src/apps/testapps/testPolygon.c) + add_h3_test(testVec2d src/apps/testapps/testVec2d.c) + add_h3_test(testVec3d src/apps/testapps/testVec3d.c) + add_h3_test(testH3ToLocalIj src/apps/testapps/testH3ToLocalIj.c) + add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) + add_h3_test(testH3Line src/apps/testapps/testH3Line.c) + add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) + add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) + add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) + add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) + + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) + + # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. + # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. + add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) + add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) + add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) endif() - # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. - # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. - add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) - add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) - add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) - add_custom_target(test-fast COMMAND ctest -E Exhaustive) endif() diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c index 1ec6bb29a..a44d3a1be 100644 --- a/src/apps/testapps/testH3Memory.c +++ b/src/apps/testapps/testH3Memory.c @@ -33,6 +33,7 @@ static int failAlloc = 0; void* H3_MEMORY(malloc)(size_t size) { + printf("malloc %lx\n", size); if (failAlloc) { return NULL; } @@ -40,6 +41,7 @@ void* H3_MEMORY(malloc)(size_t size) { } void* H3_MEMORY(calloc)(size_t num, size_t size) { + printf("calloc %lx\n", size); if (failAlloc) { return NULL; } @@ -47,13 +49,17 @@ void* H3_MEMORY(calloc)(size_t num, size_t size) { } void* H3_MEMORY(realloc)(void* ptr, size_t size) { + printf("realloc %lx\n", size); if (failAlloc) { return NULL; } return realloc(ptr, size); } -void H3_MEMORY(free)(void* ptr) { return free(ptr); } +void H3_MEMORY(free)(void* ptr) { + printf("free\n"); + return free(ptr); +} H3Index sunnyvale = 0x89283470c27ffff; From 366ea592751bce94aff96e1841ed8f2bd04876fa Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 4 Mar 2020 15:27:06 -0800 Subject: [PATCH 219/771] Always run memory tests, assert number of memory calls --- CMakeLists.txt | 212 ++++++++++++++++++------------- src/apps/testapps/testH3Memory.c | 18 +-- 2 files changed, 133 insertions(+), 97 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b63de3495..776c17099 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,34 +202,41 @@ configure_file(${UNCONFIGURED_API_HEADER} ${CONFIGURED_API_HEADER}) set(INSTALL_TARGETS h3) -# Build the H3 library -add_library(h3 ${LIB_SOURCE_FILES} ${CONFIGURED_API_HEADER}) +function(add_h3_library name h3_alloc_prefix_override) + add_library(${name} ${LIB_SOURCE_FILES} ${CONFIGURED_API_HEADER}) -target_compile_options(h3 PRIVATE ${H3_COMPILE_FLAGS}) -target_link_libraries(h3 PRIVATE ${H3_LINK_FLAGS}) + target_compile_options(${name} PRIVATE ${H3_COMPILE_FLAGS}) + target_link_libraries(${name} PRIVATE ${H3_LINK_FLAGS}) -find_library(M_LIB m) -if(M_LIB) - target_link_libraries(h3 PUBLIC ${M_LIB}) -endif() + find_library(M_LIB m) + if(M_LIB) + target_link_libraries(${name} PUBLIC ${M_LIB}) + endif() -if(BUILD_SHARED_LIBS) - set_target_properties(h3 PROPERTIES SOVERSION ${H3_SOVERSION}) -endif() + if(BUILD_SHARED_LIBS) + set_target_properties(${name} PROPERTIES SOVERSION ${H3_SOVERSION}) + endif() -target_compile_definitions(h3 PUBLIC H3_PREFIX=${H3_PREFIX}) -if(H3_ALLOC_PREFIX) - target_compile_definitions(h3 PUBLIC H3_ALLOC_PREFIX=${H3_ALLOC_PREFIX}) -endif() -if(have_alloca) - target_compile_definitions(h3 PUBLIC H3_HAVE_ALLOCA) -endif() -if(have_vla) - target_compile_definitions(h3 PUBLIC H3_HAVE_VLA) -endif() -target_include_directories(h3 PUBLIC - $ - $) + target_compile_definitions(${name} PUBLIC H3_PREFIX=${H3_PREFIX}) + if(h3_alloc_prefix_override) + message("Using override " ${h3_alloc_prefix_override}) + target_compile_definitions(${name} PUBLIC H3_ALLOC_PREFIX=${h3_alloc_prefix_override}) + elseif(H3_ALLOC_PREFIX) + target_compile_definitions(${name} PUBLIC H3_ALLOC_PREFIX=${H3_ALLOC_PREFIX}) + endif() + if(have_alloca) + target_compile_definitions(${name} PUBLIC H3_HAVE_ALLOCA) + endif() + if(have_vla) + target_compile_definitions(${name} PUBLIC H3_HAVE_VLA) + endif() + target_include_directories(${name} PUBLIC + $ + $) +endfunction() + +# Build the H3 library +add_h3_library(h3 "") # Automatic code formatting find_program(CLANG_FORMAT_PATH clang-format) @@ -380,7 +387,6 @@ if(BUILD_GENERATORS) endif() if(BUILD_TESTING) - option(RUN_MEMORY_TESTS "Run memory allocator tests (requires H3_ALLOC_PREFIX to be set)" OFF) option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) include(TestWrapValgrind) @@ -405,6 +411,37 @@ if(BUILD_TESTING) ) endif() + add_h3_library(h3WithTestAllocators test_prefix_) + + macro(add_h3_memory_test name srcfile) + # Like other test code, but these need to be linked against + # a different copy of the H3 library which has known intercepted + # allocator functions. + add_executable(${ARGV} ${APP_SOURCE_FILES}) + + if(TARGET ${name}) + target_link_libraries(${name} PUBLIC h3WithTestAllocators) + target_include_directories(${name} PUBLIC + $) + target_compile_options(${name} PRIVATE ${H3_COMPILE_FLAGS}) + target_link_libraries(${name} PRIVATE ${H3_LINK_FLAGS}) + endif() + + math(EXPR test_number "${test_number}+1") + + add_test(NAME ${name}_test${test_number} COMMAND ${TEST_WRAPPER} "$") + + if(ENABLE_COVERAGE) + add_custom_target(${name}_coverage${test_number} + COMMAND ${name} > /dev/null + COMMENT "Running ${name}_coverage${test_number}" + ) + + add_dependencies(coverage ${name}_coverage${test_number}) + add_dependencies(${name}_coverage${test_number} clean-coverage) + endif() + endmacro() + macro(add_h3_test_common name srcfile) # need to actually make the test target if(NOT TARGET ${name}) @@ -477,71 +514,68 @@ if(BUILD_TESTING) endmacro() # Add each individual test + file(GLOB all_centers tests/inputfiles/bc*centers.txt) + foreach(file ${all_centers}) + add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) + endforeach() - if(RUN_MEMORY_TESTS) - add_h3_test(testH3Memory src/apps/testapps/testH3Memory.c) - else() - file(GLOB all_centers tests/inputfiles/bc*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_ic_files tests/inputfiles/res*ic.txt) - foreach(file ${all_ic_files}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_centers tests/inputfiles/rand*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testGeoToH3 src/apps/testapps/testGeoToH3.c ${file}) - endforeach() - - file(GLOB all_cells tests/inputfiles/*cells.txt) - foreach(file ${all_cells}) - add_h3_test_with_file(testH3ToGeoBoundary src/apps/testapps/testH3ToGeoBoundary.c ${file}) - endforeach() - - add_h3_test(testCompact src/apps/testapps/testCompact.c) - add_h3_test(testKRing src/apps/testapps/testKRing.c) - add_h3_test(testHexRing src/apps/testapps/testHexRing.c) - add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) - add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) - add_h3_test(testH3ToCenterChild src/apps/testapps/testH3ToCenterChild.c) - add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) - add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) - add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) - add_h3_test(testH3Index src/apps/testapps/testH3Index.c) - add_h3_test(testH3Api src/apps/testapps/testH3Api.c) - add_h3_test(testH3SetToLinkedGeo src/apps/testapps/testH3SetToLinkedGeo.c) - add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) - add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) - add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) - add_h3_test(testPolyfillReported src/apps/testapps/testPolyfillReported.c) - add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) - add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) - add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) - add_h3_test(testBBox src/apps/testapps/testBBox.c) - add_h3_test(testPolygon src/apps/testapps/testPolygon.c) - add_h3_test(testVec2d src/apps/testapps/testVec2d.c) - add_h3_test(testVec3d src/apps/testapps/testVec3d.c) - add_h3_test(testH3ToLocalIj src/apps/testapps/testH3ToLocalIj.c) - add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) - add_h3_test(testH3Line src/apps/testapps/testH3Line.c) - add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) - add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) - add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) - add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) - - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) - - # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. - # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. - add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) - add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) - add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) - endif() + file(GLOB all_ic_files tests/inputfiles/res*ic.txt) + foreach(file ${all_ic_files}) + add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) + endforeach() + + file(GLOB all_centers tests/inputfiles/rand*centers.txt) + foreach(file ${all_centers}) + add_h3_test_with_file(testGeoToH3 src/apps/testapps/testGeoToH3.c ${file}) + endforeach() + + file(GLOB all_cells tests/inputfiles/*cells.txt) + foreach(file ${all_cells}) + add_h3_test_with_file(testH3ToGeoBoundary src/apps/testapps/testH3ToGeoBoundary.c ${file}) + endforeach() + + add_h3_test(testCompact src/apps/testapps/testCompact.c) + add_h3_test(testKRing src/apps/testapps/testKRing.c) + add_h3_test(testHexRing src/apps/testapps/testHexRing.c) + add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) + add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) + add_h3_test(testH3ToCenterChild src/apps/testapps/testH3ToCenterChild.c) + add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) + add_h3_test(testH3GetFaces src/apps/testapps/testH3GetFaces.c) + add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) + add_h3_test(testH3Index src/apps/testapps/testH3Index.c) + add_h3_test(testH3Api src/apps/testapps/testH3Api.c) + add_h3_test(testH3SetToLinkedGeo src/apps/testapps/testH3SetToLinkedGeo.c) + add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) + add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) + add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) + add_h3_test(testPolyfillReported src/apps/testapps/testPolyfillReported.c) + add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) + add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) + add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) + add_h3_test(testBBox src/apps/testapps/testBBox.c) + add_h3_test(testPolygon src/apps/testapps/testPolygon.c) + add_h3_test(testVec2d src/apps/testapps/testVec2d.c) + add_h3_test(testVec3d src/apps/testapps/testVec3d.c) + add_h3_test(testH3ToLocalIj src/apps/testapps/testH3ToLocalIj.c) + add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) + add_h3_test(testH3Line src/apps/testapps/testH3Line.c) + add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) + add_h3_test(testCoordIjk src/apps/testapps/testCoordIjk.c) + add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) + add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) + + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) + add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) + + # The "Exhaustive" part of the test name is used by the test-fast to exclude these files. + # test-fast exists so that Travis CI can run Valgrind on tests without taking a very long time. + add_h3_test(testH3ToLocalIjExhaustive src/apps/testapps/testH3ToLocalIjExhaustive.c) + add_h3_test(testH3LineExhaustive src/apps/testapps/testH3LineExhaustive.c) + add_h3_test(testH3DistanceExhaustive src/apps/testapps/testH3DistanceExhaustive.c) + + add_h3_memory_test(testH3Memory src/apps/testapps/testH3Memory.c) add_custom_target(test-fast COMMAND ctest -E Exhaustive) endif() diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c index a44d3a1be..9b5d645c8 100644 --- a/src/apps/testapps/testH3Memory.c +++ b/src/apps/testapps/testH3Memory.c @@ -31,33 +31,34 @@ #endif static int failAlloc = 0; +static int actualAllocCalls = 0; -void* H3_MEMORY(malloc)(size_t size) { - printf("malloc %lx\n", size); +void* test_prefix_malloc(size_t size) { + actualAllocCalls++; if (failAlloc) { return NULL; } return malloc(size); } -void* H3_MEMORY(calloc)(size_t num, size_t size) { - printf("calloc %lx\n", size); +void* test_prefix_calloc(size_t num, size_t size) { + actualAllocCalls++; if (failAlloc) { return NULL; } return calloc(num, size); } -void* H3_MEMORY(realloc)(void* ptr, size_t size) { - printf("realloc %lx\n", size); +void* test_prefix_realloc(void* ptr, size_t size) { + actualAllocCalls++; if (failAlloc) { return NULL; } return realloc(ptr, size); } -void H3_MEMORY(free)(void* ptr) { - printf("free\n"); +void test_prefix_free(void* ptr) { + actualAllocCalls++; return free(ptr); } @@ -71,5 +72,6 @@ SUITE(h3Memory) { // Generate a set of hexagons to compact H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); + t_assert(actualAllocCalls == 2, "Number of allocation calls for kRing"); } } From a0b03a5080b72539126effdcf68017f0c63db8ff Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 4 Mar 2020 16:40:20 -0800 Subject: [PATCH 220/771] Add missing free call to test --- src/apps/testapps/testH3Memory.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c index 9b5d645c8..2d546b0a2 100644 --- a/src/apps/testapps/testH3Memory.c +++ b/src/apps/testapps/testH3Memory.c @@ -73,5 +73,6 @@ SUITE(h3Memory) { H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); t_assert(actualAllocCalls == 2, "Number of allocation calls for kRing"); + free(sunnyvaleExpanded); } } From e73f07fc8194d519a7a985a8f592e3fd656dc64e Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 5 Mar 2020 11:42:18 -0800 Subject: [PATCH 221/771] Add tests for alloc failing in compact --- CMakeLists.txt | 1 - src/apps/testapps/testH3Memory.c | 81 ++++++++++++++++++++++++++++---- src/h3lib/include/h3Index.h | 1 + src/h3lib/lib/h3Index.c | 12 +++++ 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 776c17099..d7e4b6fe0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,7 +219,6 @@ function(add_h3_library name h3_alloc_prefix_override) target_compile_definitions(${name} PUBLIC H3_PREFIX=${H3_PREFIX}) if(h3_alloc_prefix_override) - message("Using override " ${h3_alloc_prefix_override}) target_compile_definitions(${name} PUBLIC H3_ALLOC_PREFIX=${h3_alloc_prefix_override}) elseif(H3_ALLOC_PREFIX) target_compile_definitions(${name} PUBLIC H3_ALLOC_PREFIX=${H3_ALLOC_PREFIX}) diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c index 2d546b0a2..e93de2210 100644 --- a/src/apps/testapps/testH3Memory.c +++ b/src/apps/testapps/testH3Memory.c @@ -20,21 +20,33 @@ */ #include -#include "alloc.h" #include "geoCoord.h" +#include "h3Index.h" #include "h3api.h" #include "test.h" #include "utility.h" -#ifndef H3_ALLOC_PREFIX -#error "This test can only be run with a prefix for alloc functions" -#endif - -static int failAlloc = 0; +// Whether to fail all allocations +static bool failAlloc = false; +// Actual number of malloc/calloc/realloc calls observed static int actualAllocCalls = 0; +// Actual number of free calls observed +static int actualFreeCalls = 0; +// Set to non-zero to begin failing allocations after a certain number of calls +static int permittedAllocCalls = 0; + +void resetMemoryCounters(int permitted) { + failAlloc = false; + actualAllocCalls = 0; + actualFreeCalls = 0; + permittedAllocCalls = permitted; +} void* test_prefix_malloc(size_t size) { actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } if (failAlloc) { return NULL; } @@ -43,6 +55,9 @@ void* test_prefix_malloc(size_t size) { void* test_prefix_calloc(size_t num, size_t size) { actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } if (failAlloc) { return NULL; } @@ -51,6 +66,9 @@ void* test_prefix_calloc(size_t num, size_t size) { void* test_prefix_realloc(void* ptr, size_t size) { actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } if (failAlloc) { return NULL; } @@ -58,21 +76,66 @@ void* test_prefix_realloc(void* ptr, size_t size) { } void test_prefix_free(void* ptr) { - actualAllocCalls++; + actualFreeCalls++; return free(ptr); } H3Index sunnyvale = 0x89283470c27ffff; SUITE(h3Memory) { - TEST(t) { + TEST(compact) { int k = 9; int hexCount = H3_EXPORT(maxKringSize)(k); + int expectedCompactCount = 73; // Generate a set of hexagons to compact H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); - t_assert(actualAllocCalls == 2, "Number of allocation calls for kRing"); + t_assert(actualAllocCalls == 1, "kRing called alloc"); + t_assert(actualFreeCalls == 1, "kRing caleld free"); + + H3Index* compressed = calloc(hexCount, sizeof(H3Index)); + + resetMemoryCounters(0); + failAlloc = true; + int err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == COMPACT_ALLOC_FAILED, "malloc failed (1)"); + t_assert(actualAllocCalls == 1, "alloc called once"); + t_assert(actualFreeCalls == 0, "free not called"); + + resetMemoryCounters(1); + err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == COMPACT_ALLOC_FAILED, "malloc failed (2)"); + t_assert(actualAllocCalls == 2, "alloc called twice"); + t_assert(actualFreeCalls == 1, "free called once"); + + resetMemoryCounters(2); + err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == COMPACT_ALLOC_FAILED, "malloc failed (3)"); + t_assert(actualAllocCalls == 3, "alloc called three times"); + t_assert(actualFreeCalls == 2, "free called twice"); + + resetMemoryCounters(3); + err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == COMPACT_ALLOC_FAILED, "compact failed (4)"); + t_assert(actualAllocCalls == 4, "alloc called four times"); + t_assert(actualFreeCalls == 3, "free called three times"); + + resetMemoryCounters(4); + err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == COMPACT_SUCCESS, "compact using successful malloc"); + t_assert(actualAllocCalls == 4, "alloc called four times"); + t_assert(actualFreeCalls == 4, "free called four times"); + + int count = 0; + for (int i = 0; i < hexCount; i++) { + if (compressed[i] != 0) { + count++; + } + } + t_assert(count == expectedCompactCount, "got expected compacted count"); + + free(compressed); free(sunnyvaleExpanded); } } diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index e3204918c..ef8298c52 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -172,6 +172,7 @@ #define COMPACT_SUCCESS 0 #define COMPACT_LOOP_EXCEEDED -1 #define COMPACT_DUPLICATE -2 +#define COMPACT_ALLOC_FAILED -3 void setH3Index(H3Index* h, int res, int baseCell, Direction initDigit); int isResClassIII(int res); diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 158989c98..21853518c 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -287,8 +287,15 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, return COMPACT_SUCCESS; } H3Index* remainingHexes = H3_MEMORY(malloc)(numHexes * sizeof(H3Index)); + if (!remainingHexes) { + return COMPACT_ALLOC_FAILED; + } memcpy(remainingHexes, h3Set, numHexes * sizeof(H3Index)); H3Index* hashSetArray = H3_MEMORY(calloc)(numHexes, sizeof(H3Index)); + if (!hashSetArray) { + H3_MEMORY(free)(remainingHexes); + return COMPACT_ALLOC_FAILED; + } H3Index* compactedSetOffset = compactedSet; int numRemainingHexes = numHexes; while (numRemainingHexes) { @@ -355,6 +362,11 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, } H3Index* compactableHexes = H3_MEMORY(malloc)(maxCompactableCount * sizeof(H3Index)); + if (!compactableHexes) { + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return COMPACT_ALLOC_FAILED; + } for (int i = 0; i < numRemainingHexes; i++) { if (hashSetArray[i] == 0) continue; int count = H3_GET_RESERVED_BITS(hashSetArray[i]) + 1; From 84b584c7bb67bcd88569bdf603718f18ffef7717 Mon Sep 17 00:00:00 2001 From: Rusty Conover Date: Tue, 17 Mar 2020 11:42:26 -0400 Subject: [PATCH 222/771] Add Rust binding links --- docs/community/bindings.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index 2d08ff297..1e6211514 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -3,7 +3,7 @@ As a C library, bindings can be made to call H3 functions from different programming languages. This page lists different bindings currently available. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/bindings.md). ## BigQuery - + - [cartodb/bigquery-jslibs](https://github.com/CartoDB/bigquery-jslibs) ## C# @@ -64,3 +64,8 @@ As a C library, bindings can be made to call H3 functions from different program ## Ruby - [StuartApp/h3_ruby](https://github.com/StuartApp/h3_ruby) + +## Rust + +- [rustyconover/libh3-sys](https://github.com/rustyconover/libh3-sys) +- [rustyconover/libh3](https://github.com/rustyconover/libh3) From 4976227b51baac7ffba6822da494b99cb3216287 Mon Sep 17 00:00:00 2001 From: Priyam Mohanty Date: Mon, 23 Mar 2020 17:14:38 -0700 Subject: [PATCH 223/771] Add H3 React Native binding --- docs/community/bindings.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/community/bindings.md b/docs/community/bindings.md index 1e6211514..43649d9cb 100644 --- a/docs/community/bindings.md +++ b/docs/community/bindings.md @@ -34,6 +34,7 @@ As a C library, bindings can be made to call H3 functions from different program - [uber/h3-js](https://github.com/uber/h3-js) - [dfellis/h3-node](https://github.com/dfellis/h3-node) +- [realPrimoh/h3-reactnative](https://github.com/realPrimoh/h3-reactnative) ## Julia From 48ed08f18aa7aa7ff5b25670acf0ce4afe20ad86 Mon Sep 17 00:00:00 2001 From: AJ Friend Date: Tue, 24 Mar 2020 11:58:41 -0700 Subject: [PATCH 224/771] Remove extra `malloc` from `kRing` (#322) * pass on docstrings for kring functions * one argument per line in many-argument functions * optimism * use `calloc` and NULL instead of 0 * bigger benchmarks * remove old commented-out function * revert to original benchmarks, as the large ones i added were expensive * deduplicate some code --- src/h3lib/lib/algos.c | 72 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index d41b086b9..444566320 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -150,74 +150,82 @@ static const Direction NEW_ADJUSTMENT_III[7][7] = { CENTER_DIGIT, IJ_AXES_DIGIT}}; /** - * Maximum number of indices that result from the kRing algorithm with the given + * Maximum number of cells that result from the kRing algorithm with the given * k. Formula source and proof: https://oeis.org/A003215 * - * @param k k value, k >= 0. + * @param k k value, k >= 0. */ int H3_EXPORT(maxKringSize)(int k) { return 3 * k * (k + 1) + 1; } /** - * k-rings produces indices within k distance of the origin index. + * Produce cells within grid distance k of the origin cell. * - * k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and - * all neighboring indices, and so on. + * k-ring 0 is defined as the origin cell, k-ring 1 is defined as k-ring 0 and + * all neighboring cells, and so on. * * Output is placed in the provided array in no particular order. Elements of * the output array may be left zero, as can happen when crossing a pentagon. * - * @param origin Origin location. - * @param k k >= 0 - * @param out Zero-filled array which must be of size maxKringSize(k). + * @param origin origin cell + * @param k k >= 0 + * @param out zero-filled array which must be of size maxKringSize(k) */ void H3_EXPORT(kRing)(H3Index origin, int k, H3Index* out) { - int maxIdx = H3_EXPORT(maxKringSize)(k); - int* distances = malloc(maxIdx * sizeof(int)); - H3_EXPORT(kRingDistances)(origin, k, out, distances); - free(distances); + H3_EXPORT(kRingDistances)(origin, k, out, NULL); } /** - * k-rings produces indices within k distance of the origin index. + * Produce cells and their distances from the given origin cell, up to + * distance k. * - * k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and - * all neighboring indices, and so on. + * k-ring 0 is defined as the origin cell, k-ring 1 is defined as k-ring 0 and + * all neighboring cells, and so on. * * Output is placed in the provided array in no particular order. Elements of * the output array may be left zero, as can happen when crossing a pentagon. * - * @param origin Origin location. - * @param k k >= 0 - * @param out Zero-filled array which must be of size maxKringSize(k). - * @param distances Zero-filled array which must be of size maxKringSize(k). + * @param origin origin cell + * @param k k >= 0 + * @param out zero-filled array which must be of size maxKringSize(k) + * @param distances NULL or a zero-filled array which must be of size + * maxKringSize(k) */ void H3_EXPORT(kRingDistances)(H3Index origin, int k, H3Index* out, int* distances) { - const int maxIdx = H3_EXPORT(maxKringSize)(k); // Optimistically try the faster hexRange algorithm first const bool failed = H3_EXPORT(hexRangeDistances)(origin, k, out, distances); if (failed) { + const int maxIdx = H3_EXPORT(maxKringSize)(k); // Fast algo failed, fall back to slower, correct algo // and also wipe out array because contents untrustworthy - memset(out, 0, maxIdx * sizeof(out[0])); - memset(distances, 0, maxIdx * sizeof(distances[0])); - _kRingInternal(origin, k, out, distances, maxIdx, 0); + memset(out, 0, maxIdx * sizeof(H3Index)); + + if (distances == NULL) { + distances = calloc(maxIdx, sizeof(int)); + _kRingInternal(origin, k, out, distances, maxIdx, 0); + free(distances); + } else { + memset(distances, 0, maxIdx * sizeof(int)); + _kRingInternal(origin, k, out, distances, maxIdx, 0); + } } } /** * Internal helper function called recursively for kRingDistances. * - * Adds the origin index to the output set (treating it as a hash set) + * Adds the origin cell to the output set (treating it as a hash set) * and recurses to its neighbors, if needed. * - * @param origin - * @param k Maximum distance to move from the origin. - * @param out Array treated as a hash set, elements being either H3Index or 0. - * @param distances Scratch area, with elements paralleling the out array. - * Elements indicate ijk distance from the origin index to the output index. - * @param maxIdx Size of out and scratch arrays (must be maxKringSize(k)) - * @param curK Current distance from the origin. + * @param origin Origin cell + * @param k Maximum distance to move from the origin + * @param out Array treated as a hash set, elements being either + * H3Index or 0. + * @param distances Scratch area, with elements paralleling the out array. + * Elements indicate ijk distance from the origin cell to + * the output cell + * @param maxIdx Size of out and scratch arrays (must be maxKringSize(k)) + * @param curK Current distance from the origin */ void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances, int maxIdx, int curK) { @@ -410,7 +418,7 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { * @return 0 if no pentagon or pentagonal distortion area was encountered. */ int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index* out) { - return H3_EXPORT(hexRangeDistances)(origin, k, out, 0); + return H3_EXPORT(hexRangeDistances)(origin, k, out, NULL); } /** From 691ad092d9d51c3f48ea02831c14a6fb4c9e9436 Mon Sep 17 00:00:00 2001 From: AJ Friend Date: Thu, 26 Mar 2020 22:35:19 -0700 Subject: [PATCH 225/771] RFC: Names for H3 Concepts, Types, and Functions (#308) * rfc: concepts and datatypes * move RFC to a v4.0.0 folder * adding notes on edges * use DirectedEdge instead of DiEdge * extended list of function names * add isValidIndex * reorder `isValid*` functions * rename naming rfc * tweak notes on casual use of "hexagon" * notes on use of term "index" * add "grid" * gridPath * formatting * area and length functions * emPHASis * break out function renaming into subgroups * more subgroups for renaming * more concept regrouping * table formatting * EMphaSIS * Alternative grid function names * update cell parent/children names * move grid path/distance functions to consensus. disk vs gridDisk? * prefix `isValid` notes * Pluralize grid functions * clean up and re-order things a bit * adding a few alternatives * changes coming from meeting yesterday * update the Terminology section (renamed from Concepts) * function section formatting * grid function notes * clarify that distances never allocated * ordering * link back to discussions for after this is landed * one to three * adding changes discussed in today's meeting * remove column * hexRanges updated * add my `hexRanges` skepticism * pentagon/hexagon suffix notes up front * authors * rename `cellToPoly` to `cellToPolygon` * `gridDisksUnsafe` notes * typo and spacing * geometric -> geographic * update cell definition * base cell notes * add plan for `gridRing` functions * Names for data structures? * polygon functions and data structures * formatting * space! * names behind the public API don't really matter * note formatting * remove discussion of `Linked*` types * which/that * draft -> under review * add polyfill back in * notes on `Linked*` type discussion * updates to `compact`, `uncompact`, `polyfill` * mark as accepted !!! * s * fixing the function calls that `kRingDistances` makes * one row for `GeoMultiPolygon` --- .../names_for_concepts_types_functions.md | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md diff --git a/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md b/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md new file mode 100644 index 000000000..31245aa29 --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md @@ -0,0 +1,265 @@ +# RFC: Names for H3 Concepts, Types, and Functions + +- **Authors**: + - AJ Friend + - Nick Rabinowitz + - Isaac Brodsky + - David Ellis +- **Dates**: + - Started: 2020-02-02 + - Accepted: 2020-03-26 +- **Status**: Accepted +- **Discussions**: + - + +## Motivation + +Concepts like `hexagon`, `cell`, and `index` are currently used ambiguously in the H3 codebase and in documentation. +This can cause confusion, for example, when a function might only work on strict H3 *hexagons*, but fails when encountering H3 *pentagons*. + +Reaching a consensus on the precise, technical language used when discussing H3 concepts will clarify future library discussions and improve end-user documentation. + +We would also like to standardize a function-naming scheme. + +## Terminology + +The following technical terms should be used in the documentation, the H3 codebase, and precise technical discussions of the library. + +- `H3Index`: + - an unsigned 64-bit integer representing *any* H3 object (hexagon, pentagon, directed edge ...) + - often represented as a 15-character (or 16-character) hexadecimal string, like `'8928308280fffff'` + - the full term "H3 index" should be used to avoid confusion with other common uses of "index"; + when a "traditional" index is needed, prefer using "number", "pos", or another term to avoid confusion +- **mode**: + - an integer describing the type of object being represented by an H3 index + - this integer is encoded in the `H3Index` +- **cell** or **H3 cell**: + - a geometric/geographic unit polygon in the H3 grid, corresponding to an `H3Index` of `mode 1` (hexagon or pentagon) + - for functions that can handle either hexagons or pentagons, the more general term "cell" should be used whenever possible +- **hexagon**: + - an H3 **cell** that is a **topological** hexagon + - below, we explain that functions that *only* work with **hexagons** have an `Unsafe` suffix; + these functions are paired with ones having a `Safe` suffix, meaning they can handle **pentagons**, but are slower +- **pentagon**: + - an H3 **cell** that is a **topological** pentagon +- **directed edge**: + - represents a traversal from an origin **cell** to an adjacent destination **cell** + - corresponds to an `H3Index` of `mode 2` +- **grid**: + - the graph with nodes corresponding to H3 cells, and edges given by pairs of adjacent cells + - for example, `gridDistance` is the minimal number of edges in a graph path connecting two cells +- **point**: + - a representation of a geographic point in terms of a latitude/longitude pair +- **topological**: + - H3 cells are **topological** pentagons or hexagons, in the sense that they have 5 or 6 neighbors, respectively, in the H3 **grid** + - the majority of **hexagons** are also **geometric** hexagons (similarly with **pentagons**), in that they have 6 edges and vertices when represented as polygons of lat/lng points + - a small number of **hexagons** are not **geometric** hexagons (similarly with **pentagons**), in that they have extra vertices and edges due to distortion around icosahedron boundaries + - for more details, see this [h3-js issue](https://github.com/uber/h3-js/issues/53) or this [Observable post](https://observablehq.com/@fil/h3-oddities) +- **base cell**: + - one of the 122 H3 **cells** (110 hexagons and 12 pentagons) of resolution `0` + - every other cell in H3 is a child of a base cell + - each base cell has a "base cell number" (0--121), which is encoded into the `H3Index` representation of every H3 cell + - there is a one-to-one correspondence between the "base cell number" and the `H3Index` representation of resolution `0` cells + + e.g., base cell 0 has `H3Index` hexadecimal representation `'8001fffffffffff'` + + +### Use of "hex", "hexagon", "cell", "pentagon", etc. + +We realize that "hex" or "hexagon" will still be used informally to refer to the concept of "cell" (As the development team, we do it ourselves!). +This should be expected in casual, informal discussions of H3. +However, when *precision* is required, we advise the use of strict technical terms like "index", "cell", "hexagon", "pentagon", etc. +In the codebase and in the documentation, strictly correct terminology should *always* be used, as many functions and algorithms distinguish between hexagons and pentagons. + + +## `H3_EXPORT` and C name collisions + +To avoid C name collisions, we should build the bindings (`h3-py`, `h3-java`, `h3-go`, and `h3-node`) with a standard function prefix, using the `H3_EXPORT` C macro. +The `h3-js` binding would not need this. + +The proposed prefix is `h3_`. + +## Functions + +### Conventions for "property getters" and transforms + +- use `get` prefix for + + constant data (`getNumCells`, `getRes0Cells`) + + object properties (`getResolution`, `getBaseCellNumber`) +- use `to` to denote transforms + + different representations of the same object + + when doing a lossy transformation to a new object (`cellToParent`, `pointToCell`) +- do not use `get` or `to` for *computations* + + e.g., `polyfill`, `compact`, `cellAreaKm2` + +There is some ambiguity between property, transform, and computation, so use your best judgement with these guidelines in mind. + +### Validity checks + +- `isValid*` should mean that a *full* validity check is made +- without `Valid` (like in the case of `isPentagon`), we do not guarantee + that a full validity check is made; instead, a user should assume only a + minimal bit mask check is done + - we could imagine a `isValidPengaton` function, if full verification + would be convenient +- similarly, a function like `areNeighborCells` will assume each cell + has passed the `isValidCell` check; the function will do only minimal + work to determine if they are neighbors + + +### General Function Names + +| Current name | Proposed name | +|-------------------------------|-----------------------| +| *Does Not Exist (DNE)* | `isValidIndex` | +| `h3IsValid` | `isValidCell` | +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `h3IsPentagon` | `isPentagon` | +| `h3IsResClassIII` | `isResClassIII` | +| `h3IndexesAreNeighbors` | `areNeighborCells` | +| `h3ToParent` | `cellToParent` | +| `h3ToChildren` | `cellToChildren` | +| `numHexagons` | `getNumCells` | +| `getRes0Indexes` | `getRes0Cells` | +| `getPentagonIndexes` | `getPentagons` | +| `h3GetBaseCell` | `getBaseCellNumber` | +| `h3GetResolution` | `getResolution` | +| *DNE* | `getMode` | +| `geoToH3` | `pointToCell` | +| `h3ToGeo` | `cellToPoint` | +| `compact` | `compactCells` | +| `uncompact` | `uncompactCells` | +| `polyfill` | `polygonToCells` | + +**Note**: `getResolution` and `getBaseCellNumber` should work for both cells and edges. + + +### H3 Grid Functions + +Many of these functions will have three forms: +- `` +- `Unsafe` +- `Safe` + +The `Unsafe` version is fast, but may fail if it encounters a pentagon. +It should return a failure code in this case. + +The `Safe` version is slower, but will work in all cases. + +The version without either suffix is intended to be the one typically +used. +This version will first attempt the `Unsafe` version, and if +it detects failure, will fall back to the `Safe` version. +Encountering pentagons is rare in most use-cases, so this version +should usually be equivalent to the fast version, but with a guarantee +that it will not fail. + +Initially, we **will not** expose the `Safe` versions to users in the API. +We may expose them in the future if a need becomes clear. + + +#### Distance + +| Current name | Proposed name | +|--------------|-------------------------| +| `h3Distance` | `gridDistance` | +| `h3Line` | `gridPathCells` | +| *DNE* | `gridPathEdges` | +| *DNE* | `gridPathDirectedEdges` | + + +#### Filled-In Disk With Distances + +| Current name | Proposed name | Calls | +|---------------------|---------------------------|---------------------------------------| +| `hexRangeDistances` | `gridDiskDistancesUnsafe` | NONE | +| `_kRingInternal` | `gridDiskDistancesSafe` | NONE | +| `kRingDistances` | `gridDiskDistances` | `hexRangeDistances`, `_kRingInternal` | + + +#### Filled-In Disk Without Distances + +| Current name | Proposed name | Calls | +|--------------|-------------------|---------------------| +| `hexRange` | `gridDiskUnsafe` | `hexRangeDistances` | +| *DNE* | `gridDiskSafe` | | +| `kRing` | `gridDisk` | `kRingDistances` | +| `hexRanges` | `gridDisksUnsafe` | N x `hexRange` | + +- **Note**: We may remove `hexRanges` from the API, as it is just a very simple wrapper around + `hexRange`. Inclusion is a discussion separate from this RFC. We'll simply state that + *if we do* include it, we will rename it `gridDisksUnsafe`. + + +#### Hollow Ring + +| Current name | Proposed name | Calls | +|--------------|------------------|----------------------------------| +| `hexRing` | `gridRingUnsafe` | NONE | +| *DNE* | `gridRingSafe` | `gridDiskDistancesSafe` | +| *DNE* | `gridRing` | `gridRingUnsafe`, `gridRingSafe` | + +### H3 Edge Types + +Instead of `UnidirectionalEdge`, use the term `DirectedEdge`. + +For a future undirected edge mode, use the term `Edge`. + +| Current name | Proposed name | +|-----------------------------------------------|------------------------------| +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `getH3UnidirectionalEdge` | `cellsToDirectedEdge` | +| `getH3IndexesFromUnidirectionalEdge` | `directedEdgeToCells` | +| `getH3UnidirectionalEdgesFromHexagon` | `originToDirectedEdges` | +| *DNE* | `destinationToDirectedEdges` | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | +| `getOriginH3IndexFromUnidirectionalEdge` | `getDirectedEdgeOrigin` | +| `getDestinationH3IndexFromUnidirectionalEdge` | `getDirectedEdgeDestination` | + + +### Area/Length Functions + +| Current name | Proposed name | +|----------------|-----------------------------| +| `hexAreaKm2` | `getHexagonAreaAvgKm2` | +| `hexAreaM2` | `getHexagonAreaAvgM2` | +| `edgeLengthKm` | `getHexagonEdgeLengthAvgKm` | +| `edgeLengthM` | `getHexagonEdgeLengthAvgM` | +| *DNE* | `getPentagonAreaAvg*` | +| *DNE* | `getPentagonEdgeLengthAvg*` | +| *DNE* | `cellAreaKm2` | +| *DNE* | `cellAreaM2` | + +**Note**: `cellAreaKm2` and `cellAreaM2` would return the actual area of +the passed-in cell. + + +## Polygons + +**Note**: In addition to the changes listed in this section, we are considering +removing the `Linked*` data types from the public API. However, that is a larger +discussion requiring benchmarking, so we will defer that to a +[separate issue](https://github.com/uber/h3/issues/323) outside of this RFC. + + +### Data Structures + +- rename `GeoBoundary` to `CellBoundary` to indicate it is space-limited to describing the geometry of cells + +| Current name | Proposed name | Notes | +|-------------------|-------------------|-----------------------------------| +| `GeoBoundary` | `CellBoundary` | <= 10 stack-allocated `GeoPoint`s | +| `GeoCoord` | `GeoPoint` | | +| `Geofence` | `GeoLoop` | heap-allocated `GeoPoint`s | +| `GeoPolygon` | `GeoPolygon` | | +| `GeoMultiPolygon` | `GeoMultiPolygon` | currently not used | + + +### Functions + +| Current name | Proposed name | Notes | +|-----------------------------------|--------------------------|------------------------| +| `h3ToGeoBoundary` | `cellToBoundary` | returns `CellBoundary` | +| *DNE* | `cellToLoop` | returns `GeoLoop` | +| *DNE* | `loopToBoundary` | | +| *DNE* | `boundaryToLoop` | | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | returns `CellBoundary` | From 1ab3a8a84121c868e5492d06182a3cf0b5058363 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 2 Apr 2020 11:18:36 -0700 Subject: [PATCH 226/771] Fix H3_DIGIT_MASK_NEGATIVE --- src/h3lib/include/h3Index.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index e3204918c..b3cfe6fc6 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -80,7 +80,7 @@ #define H3_DIGIT_MASK ((uint64_t)(7)) /** 0's in the 7 base cell bits, 1's everywhere else. */ -#define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK_NEGATIVE) +#define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK) /** H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. */ #define H3_INIT (UINT64_C(35184372088831)) From b4ee0b3f9fd34dc0a1caea4a71661a0c2870377a Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Wed, 22 Apr 2020 16:45:17 -0700 Subject: [PATCH 227/771] Add kRing alloc test --- src/apps/testapps/testH3Memory.c | 33 ++++++++++++++++++++++++++++++++ src/h3lib/include/alloc.h | 6 +++++- src/h3lib/lib/algos.c | 7 +++++++ src/h3lib/lib/h3Index.c | 2 +- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c index e93de2210..db2292b94 100644 --- a/src/apps/testapps/testH3Memory.c +++ b/src/apps/testapps/testH3Memory.c @@ -20,6 +20,7 @@ */ #include +#include #include "geoCoord.h" #include "h3Index.h" #include "h3api.h" @@ -83,6 +84,37 @@ void test_prefix_free(void* ptr) { H3Index sunnyvale = 0x89283470c27ffff; SUITE(h3Memory) { + TEST(kRing) { + int k = 2; + int hexCount = H3_EXPORT(maxKringSize)(k); + H3Index* kRingOutput = calloc(hexCount, sizeof(H3Index)); + + resetMemoryCounters(0); + H3_EXPORT(kRing)(sunnyvale, k, kRingOutput); + t_assert(actualAllocCalls == 1, "kRing called alloc"); + t_assert(actualFreeCalls == 1, "kRing called free"); + + for (int i = 0; i < hexCount; i++) { + t_assert(kRingOutput[i], "kRing produced output"); + t_assert(H3_EXPORT(h3IsValid)(kRingOutput[i]), + "kRing produced valid output"); + } + + resetMemoryCounters(0); + failAlloc = true; + memset(kRingOutput, 0, hexCount * sizeof(H3Index)); + H3_EXPORT(kRing)(sunnyvale, k, kRingOutput); + t_assert(actualAllocCalls == 1, "kRing called alloc"); + t_assert(actualFreeCalls == 0, "kRing did not call free"); + + for (int i = 0; i < hexCount; i++) { + t_assert(!kRingOutput[i], + "kRing did not produce output without alloc"); + } + + free(kRingOutput); + } + TEST(compact) { int k = 9; int hexCount = H3_EXPORT(maxKringSize)(k); @@ -90,6 +122,7 @@ SUITE(h3Memory) { // Generate a set of hexagons to compact H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); + resetMemoryCounters(0); H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); t_assert(actualAllocCalls == 1, "kRing called alloc"); t_assert(actualFreeCalls == 1, "kRing caleld free"); diff --git a/src/h3lib/include/alloc.h b/src/h3lib/include/alloc.h index 6ab25c5c5..a493d2bbb 100644 --- a/src/h3lib/include/alloc.h +++ b/src/h3lib/include/alloc.h @@ -15,12 +15,16 @@ */ /** @file alloc.h * @brief Memory management functions + * + * This file contains macros and the necessary declarations to be able + * to point H3 at different memory management functions than the standard + * malloc/free/etc functions. */ #ifndef ALLOC_H #define ALLOC_H -#include "h3api.h" +#include "h3api.h" // for TJOIN #ifdef H3_ALLOC_PREFIX #define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name) diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 346b8938f..2c5a9e7ea 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -173,7 +173,14 @@ int H3_EXPORT(maxKringSize)(int k) { return 3 * k * (k + 1) + 1; } */ void H3_EXPORT(kRing)(H3Index origin, int k, H3Index* out) { int maxIdx = H3_EXPORT(maxKringSize)(k); + // Using malloc is OK here instead of calloc because kRingDistances has two + // things it tries in order. First is hexRangeDistances which does not read + // distances. If that fails, distances is zeroed before the next call. int* distances = H3_MEMORY(malloc)(maxIdx * sizeof(int)); + if (!distances) { + // TODO: Return an error code when this is not void + return; + } H3_EXPORT(kRingDistances)(origin, k, out, distances); H3_MEMORY(free)(distances); } diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index 21853518c..6ef418cad 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -361,7 +361,7 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, break; } H3Index* compactableHexes = - H3_MEMORY(malloc)(maxCompactableCount * sizeof(H3Index)); + H3_MEMORY(calloc)(maxCompactableCount, sizeof(H3Index)); if (!compactableHexes) { H3_MEMORY(free)(remainingHexes); H3_MEMORY(free)(hashSetArray); From c9556ff65bb251f785795745c2fe74ef69e3e1f1 Mon Sep 17 00:00:00 2001 From: Isaac Brodsky Date: Thu, 1 Aug 2019 11:21:16 -0700 Subject: [PATCH 228/771] Work in progress using ocular-gatsby --- docs/table-of-contents.json | 12 ++ website/.eslintignore | 2 + website/.gitignore | 61 +++++++ website/README.md | 24 --- website/gatsby-browser.js | 1 + website/gatsby-config.js | 5 + website/gatsby-node.js | 20 +++ website/gatsby-ssr.js | 1 + website/html.config.js | 31 ---- website/ocular-config.js | 62 +++++++ website/package.json | 29 ++-- website/scripts/build-to-gh-pages.sh | 36 ----- website/src/config.js | 46 ------ website/src/mdRoutes.js | 151 ------------------ website/src/styles/_variables.scss | 16 -- website/src/styles/index.scss | 3 - website/static/favicon.ico | Bin 1150 -> 0 bytes website/static/images/ca_compact_6_901.png | Bin 209684 -> 0 bytes .../static/images/ca_uncompact_6_10633.png | Bin 335634 -> 0 bytes website/static/images/classII.III.png | Bin 307168 -> 0 bytes website/static/images/cpidigits.png | Bin 59194 -> 0 bytes website/static/images/footer-pattern.gif | Bin 93 -> 0 bytes website/static/images/icon-chart.svg | 14 -- website/static/images/icon-high-precision.svg | 27 ---- website/static/images/icon-layers.svg | 29 ---- website/static/images/ijkp.png | Bin 133201 -> 0 bytes website/static/images/neighbors-hexagon.png | Bin 68117 -> 0 bytes website/static/images/neighbors-square.png | Bin 30540 -> 0 bytes website/static/images/neighbors-triangle.png | Bin 84679 -> 0 bytes website/static/images/neighbors.png | Bin 672224 -> 0 bytes website/static/images/parent-child.png | Bin 902806 -> 0 bytes website/static/images/substrate3.png | Bin 53406 -> 0 bytes website/static/images/triEdge.png | Bin 121337 -> 0 bytes website/static/images/uber-logo.png | Bin 1175 -> 0 bytes website/static/index.html | 15 -- 35 files changed, 181 insertions(+), 404 deletions(-) create mode 100644 docs/table-of-contents.json create mode 100644 website/.eslintignore create mode 100644 website/.gitignore delete mode 100644 website/README.md create mode 100644 website/gatsby-browser.js create mode 100644 website/gatsby-config.js create mode 100644 website/gatsby-node.js create mode 100644 website/gatsby-ssr.js delete mode 100644 website/html.config.js create mode 100644 website/ocular-config.js delete mode 100755 website/scripts/build-to-gh-pages.sh delete mode 100644 website/src/config.js delete mode 100644 website/src/mdRoutes.js delete mode 100644 website/src/styles/_variables.scss delete mode 100644 website/src/styles/index.scss delete mode 100644 website/static/favicon.ico delete mode 100644 website/static/images/ca_compact_6_901.png delete mode 100644 website/static/images/ca_uncompact_6_10633.png delete mode 100644 website/static/images/classII.III.png delete mode 100644 website/static/images/cpidigits.png delete mode 100644 website/static/images/footer-pattern.gif delete mode 100644 website/static/images/icon-chart.svg delete mode 100644 website/static/images/icon-high-precision.svg delete mode 100644 website/static/images/icon-layers.svg delete mode 100644 website/static/images/ijkp.png delete mode 100644 website/static/images/neighbors-hexagon.png delete mode 100644 website/static/images/neighbors-square.png delete mode 100644 website/static/images/neighbors-triangle.png delete mode 100644 website/static/images/neighbors.png delete mode 100644 website/static/images/parent-child.png delete mode 100644 website/static/images/substrate3.png delete mode 100644 website/static/images/triEdge.png delete mode 100644 website/static/images/uber-logo.png delete mode 100644 website/static/index.html diff --git a/docs/table-of-contents.json b/docs/table-of-contents.json new file mode 100644 index 000000000..5eb87148d --- /dev/null +++ b/docs/table-of-contents.json @@ -0,0 +1,12 @@ +{ + "id": "table-of-contents", + "chapters": [ + { + "title": "Overview", + "entries": [ + {"entry": "docs/overview/mainpage"}, + {"entry": "docs/overview/usecases"} + ] + } + ] +} diff --git a/website/.eslintignore b/website/.eslintignore new file mode 100644 index 000000000..1eae0cf67 --- /dev/null +++ b/website/.eslintignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..32d70965c --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,61 @@ +### Node ### +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + + +# Build Files +public/ +.cache/ + +# Gatsby context +.gatsby-context.js + +# Bundle stats +bundle-stats.json + +package-lock.json diff --git a/website/README.md b/website/README.md deleted file mode 100644 index ae2e828b1..000000000 --- a/website/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# H3 Documentation Website - -This is the source for the [H3 documentation website](https://uber.github.io/h3/). - -The source of the pages in the documentation is in the [docs](../docs) directory. - -## Building Locally - -Building the documentation requires Node.js. To build and view the H3 documentation, -run the following from `./website`: - -``` -npm install -npm run build -npm start -``` - -## Updating the H3 Website - -Make sure your `gh-pages` branch has its remote set to the upstream repo, then - -``` -make publish-website -``` \ No newline at end of file diff --git a/website/gatsby-browser.js b/website/gatsby-browser.js new file mode 100644 index 000000000..73b25666e --- /dev/null +++ b/website/gatsby-browser.js @@ -0,0 +1 @@ +module.exports.wrapPageElement = require('ocular-gatsby/gatsby-browser').wrapPageElement; diff --git a/website/gatsby-config.js b/website/gatsby-config.js new file mode 100644 index 000000000..056f3bb3e --- /dev/null +++ b/website/gatsby-config.js @@ -0,0 +1,5 @@ +const {getGatsbyConfig} = require('ocular-gatsby/api'); + +const config = require('./ocular-config'); + +module.exports = getGatsbyConfig(config); diff --git a/website/gatsby-node.js b/website/gatsby-node.js new file mode 100644 index 000000000..08b65dc2b --- /dev/null +++ b/website/gatsby-node.js @@ -0,0 +1,20 @@ +const config = require('./ocular-config'); +const getGatsbyNodeCallbacks = require('ocular-gatsby/gatsby-node'); + +module.exports = getGatsbyNodeCallbacks(config); + +// NOTE: It is possible to override the ocular-provided callbacks +// and this take control any aspect of gatsby: + +// exports.onCreateNode = ({ node, actions, getNode }) => +// ocular.onCreateNode({ node, actions, getNode }); + +// exports.setFieldsOnGraphQLNodeType = ({ type, actions }) => +// ocular.setFieldsOnGraphQLNodeType({ type, actions }); + +// // This is a main gatsby entry point +// // Here we get to programmatically create pages after all nodes are created +// // by gatsby. +// // We use graphgl to query for nodes and iterate +// exports.createPages = ({ graphql, actions }) => +// ocular.createPages({ graphql, actions }); diff --git a/website/gatsby-ssr.js b/website/gatsby-ssr.js new file mode 100644 index 000000000..1b5d548e3 --- /dev/null +++ b/website/gatsby-ssr.js @@ -0,0 +1 @@ +module.exports.wrapPageElement = require('ocular-gatsby/gatsby-ssr').wrapPageElement; diff --git a/website/html.config.js b/website/html.config.js deleted file mode 100644 index 0e9bf93ff..000000000 --- a/website/html.config.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - - title: 'H3', - - meta: [{ - name: 'description', - content: 'A hexagonal hierarchical geospatial indexing system' - }], - - scripts: [ - // Adds Mathjax support - 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' - ] - -}; diff --git a/website/ocular-config.js b/website/ocular-config.js new file mode 100644 index 000000000..93dd8537b --- /dev/null +++ b/website/ocular-config.js @@ -0,0 +1,62 @@ + +module.exports = { + // Adjusts amount of debug information from ocular-gatsby + logLevel: 4, + + DOC_FOLDER: `${__dirname}/../docs/`, + ROOT_FOLDER: `${__dirname}/../`, + DIR_NAME: `${__dirname}`, + + EXAMPLES: [ + // { + // title: 'my example', + // path: 'examples/my-example/', + // image: 'images/my-example.jpg', + // componentUrl: '../examples/app.js' + // } + ], + DOCS: [ + // your table of contents go there + ], + + THEME_OVERRIDES: [ + // {key: 'primaryFontFamily', value: 'serif'} + ], + + PROJECT_TYPE: 'github', + PROJECT_NAME: 'H3', + PROJECT_ORG: 'uber', + PROJECT_URL: 'https://github.com/uber/H3', + PROJECT_DESC: 'DESCRPTION GOES HERE', + PATH_PREFIX: '', + + FOOTER_LOGO: '', + + HOME_PATH: '/', + HOME_HEADING: 'DESCRPTION GOES HERE', + HOME_RIGHT: null, + HOME_BULLETS: [ + { + text: 'Designed for React', + desc: 'Seamless integration.', + img: 'images/icon-react.svg' + }, + { + text: 'Totally ready for production', + img: 'images/icon-layers.svg' + } + ], + + PROJECTS: { + // 'Project name': 'http://project.url', + }, + ADDITIONAL_LINKS: [ + // {name: 'link label', href: 'http://link.url'} + ], + + GA_TRACKING: null, + + // For showing star counts and contributors. + // Should be like btoa('YourUsername:YourKey') and should be readonly. + GITHUB_KEY: null +}; diff --git a/website/package.json b/website/package.json index 1321ded70..8972eab36 100644 --- a/website/package.json +++ b/website/package.json @@ -1,18 +1,23 @@ { - "name": "h3-website", - "description": "Website for H3", + "description": "A website built with ocular", + "license": "Apache-2.0", + "keywords": [ + "ocular" + ], "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/uber/h3.git" - }, "scripts": { - "start": "ocular start open", - "build": "ocular build", - "lint": "ocular lint" + "start": "yarn clean && yarn develop", + "clean": "rm -rf ./.cache ./public", + "develop": "gatsby develop --port=8001", + "build": "yarn clean && gatsby build --prefix-paths", + "serve": "gatsby serve --prefix-paths", + "deploy": "NODE_DEBUG=gh-pages gh-pages -d public" }, - "license": "Apache-2.0", "dependencies": { - "ocular": "^0.5.5" - } + "gatsby": "^2.13.48", + "ocular-gatsby": "^1.0.0-alpha.46", + "react": "^16.8.6", + "react-dom": "^16.8.6" + }, + "devDependencies": {} } diff --git a/website/scripts/build-to-gh-pages.sh b/website/scripts/build-to-gh-pages.sh deleted file mode 100755 index e44ca753e..000000000 --- a/website/scripts/build-to-gh-pages.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# Copyright 2018 Uber Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This file runs the build of the H3 documentation website and commits the -# results to the `gh-pages` branch. -# -# The script expects to be run from the `website` directory. - -set -ex - -TARGET_BRANCH=gh-pages -CURRENT_COMMIT=`git rev-parse HEAD` - -npm install -npm run build -# The dist directory is not removed because it is gitignore'd. -git checkout "$TARGET_BRANCH" -cd .. -# Copy over the .gitignore file -git checkout $CURRENT_COMMIT -- .gitignore -git rm bundle-*.js styles-*.css -cp -R website/dist/* . -git add . -git commit diff --git a/website/src/config.js b/website/src/config.js deleted file mode 100644 index f8770f176..000000000 --- a/website/src/config.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export const PROJECT_TYPE = 'github'; -export const PROJECT_NAME = 'h3'; -export const PROJECT_ORG = 'uber'; -export const PROJECT_URL = `https://github.com/${PROJECT_ORG}/${PROJECT_NAME}`; -export const PROJECT_DESC = 'A hexagonal hierarchical geospatial indexing system'; - -export const PROJECTS = { - 'H3': 'https://uber.github.io/h3' -}; - -export const HOME_HEADING = - 'A hexagonal hierarchical geospatial indexing system.'; - -/* eslint-disable quotes */ -export const HOME_BULLETS = [{ - text: 'Partition data into a hexagonal grid', - desc: `H3 has an easy API for indexing coordinates into a hexagonal, global grid.`, - img: 'images/icon-high-precision.svg' -}, { - text: 'Hierarchical grid system', - desc: `Easy, bitwise truncation to coarser, approximate cells, along with area compression/decompression \ -algorithms.`, - img: 'images/icon-layers.svg' -}, { - text: 'Fully global', - desc: `Along with twelve pentagons, the entire world is addressable in H3, down to square meter resolution.`, - img: 'images/icon-chart.svg' -}]; - -export const ADDITIONAL_LINKS = []; diff --git a/website/src/mdRoutes.js b/website/src/mdRoutes.js deleted file mode 100644 index 4cd5b30df..000000000 --- a/website/src/mdRoutes.js +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import mainpage from '../../docs/overview/mainpage.md'; -import usecases from '../../docs/overview/usecases.md'; - -import overview from '../../docs/core-library/overview.md'; -import usage from '../../docs/core-library/usage.md'; -import coordsystems from '../../docs/core-library/coordsystems.md'; -import filters from '../../docs/core-library/filters.md'; -import geoToH3desc from '../../docs/core-library/geoToH3desc.md'; -import h3Indexing from '../../docs/core-library/h3indexing.md'; -import h3ToGeoBoundaryDesc from '../../docs/core-library/h3ToGeoBoundaryDesc.md'; -import h3ToGeoDesc from '../../docs/core-library/h3ToGeoDesc.md'; -import restable from '../../docs/core-library/restable.md'; - -import api_hierarchy from '../../docs/api/hierarchy.md'; -import api_indexing from '../../docs/api/indexing.md'; -import api_inspection from '../../docs/api/inspection.md'; -import api_misc from '../../docs/api/misc.md'; -import api_traversal from '../../docs/api/traversal.md'; -import api_regions from '../../docs/api/regions.md'; -import api_uniedge from '../../docs/api/uniedge.md'; - -import community_bindings from '../../docs/community/bindings.md'; -import community_libraries from '../../docs/community/libraries.md'; -import community_applications from '../../docs/community/applications.md'; -import community_tutorials from '../../docs/community/tutorials.md'; - -export default [{ - name: 'Documentation', - path: '/documentation', - data: [{ - name: 'Overview', - children: [ - { - name: 'Introduction', - markdown: mainpage - }, - { - name: 'Use Cases', - markdown: usecases - } - ] - }, { - name: 'Core Library', - children: [ - { - name: 'Overview', - markdown: overview - }, - { - name: 'Coordinate Systems', - markdown: coordsystems - }, - { - name: 'Unix-Style Filters', - markdown: filters - }, - { - name: 'H3 Index Representations', - markdown: h3Indexing - }, - { - name: 'Walkthrough of geoToH3', - markdown: geoToH3desc - }, - { - name: 'Walkthrough of h3ToGeoBoundary', - markdown: h3ToGeoBoundaryDesc - }, - { - name: 'Walkthrough of h3ToGeo', - markdown: h3ToGeoDesc - }, - { - name: 'Using H3', - markdown: usage - }, - { - name: 'Resolution Table', - markdown: restable - } - ] - }, { - name: 'API Reference', - children: [ - { - name: 'Indexing', - markdown: api_indexing - }, - { - name: 'Inspection', - markdown: api_inspection - }, - { - name: 'Traversal', - markdown: api_traversal - }, - { - name: 'Hierarchy', - markdown: api_hierarchy - }, - { - name: 'Regions', - markdown: api_regions - }, - { - name: 'Unidirectional Edges', - markdown: api_uniedge - }, - { - name: 'Miscellaneous', - markdown: api_misc - } - ] - }, { - name: 'Community', - children: [ - { - name: 'Bindings', - markdown: community_bindings - }, - { - name: 'Libraries Using H3', - markdown: community_libraries - }, - { - name: 'Applications Using H3', - markdown: community_applications - }, - { - name: 'Tutorials', - markdown: community_tutorials - } - ] - }] -}]; diff --git a/website/src/styles/_variables.scss b/website/src/styles/_variables.scss deleted file mode 100644 index 7eb9743d1..000000000 --- a/website/src/styles/_variables.scss +++ /dev/null @@ -1,16 +0,0 @@ -$primary: #00ADE6; -$secondary: #05E3D5; -$black: #041725; -$black-20: #213746; -$black-40: #5A666D; -$white: #EDEDED; -$white-40: #8D9BA3; -$font-family: 'Source Sans Pro'; -$footer-height: 13rem; -$topbar-height: 4rem; -$topbar-maxheight: 8rem; -$toc-width: 17rem; -$mobile: 576px; - -$gradient-1: linear-gradient(to right, $primary 0%, $secondary 100%); -$gradient-2: linear-gradient(to bottom, $primary 0%, $secondary 100%); diff --git a/website/src/styles/index.scss b/website/src/styles/index.scss deleted file mode 100644 index c2bbcd882..000000000 --- a/website/src/styles/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -i, em { - font-style: italic; -} diff --git a/website/static/favicon.ico b/website/static/favicon.ico deleted file mode 100644 index 83cdafe487437325b962efdacd72a56d43d81158..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 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 diff --git a/website/static/images/ca_uncompact_6_10633.png b/website/static/images/ca_uncompact_6_10633.png deleted file mode 100644 index 44f43a203e98d4349a257913c04f3c8516d6049c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335634 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

Gg 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АY~dJ-Hxc$ZKTMz*_y0 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

nEwXpC2% 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 R9tXgm7td7W%0Wu+{{sl{wfX=6 diff --git a/website/static/images/classII.III.png b/website/static/images/classII.III.png deleted file mode 100644 index dd40d9d5e538dad520728f80b362f39b26d482a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307168 zcmY(r19W7|7cU&!wr$(CZF6GVwlVR96Ki7IoFo$)6L#!;$-Vdg-urs3UVXZ{PF3w) zyEcA%pN>*ekc5Z9fdK*nf|r&OQvm`3B?1Bh4u*pGY{B9!EB^cdvlNyW1_G*2fPFOv z|NKs5Dy1S11msNt1QZww1oZsb6nG2-_5*5~Nj)@oX=TJmx{rVe%t#%2yC<_w;8j-S1OfcQLlJ}>ReU5$x6?Y`N& z@Obi*{L_Qy^ZKiqk%Z`7Cb6q693)) z`Hi2%%GK48hmq04!-K(tmBGQ;l98F4o12k|g^`7Y{<81u89e`m6H`H!qm0vW%4VPs}tV*Ed2 zf8NUX)ykvjY;FEI^Vj$S%zXd!{QtH6HxD1<*W~}tV*aJ{pVm)O1z`9X{}0;)VC4EK zwSjTY?o*_&a*w6(WF5-6Tn-O&7~zI68wuTR`Z$0{6D@wYZ+V;tzy?ilnf8k4z+QGg z=-Br3-1)tn=5gVEYlPAQqXWSJjtLa+B{4#N)Pp)s8Q%kB3h-P6)F_+}U<5Hl2DZR< zr}&Zo*QM^CJ6h0zHMd*6?`UvvapQdHy- zRn0y5ABqZ8iHP!$<0PD}_oeyn7F8`2Y?rF~PHTJYr%&4}*Z-oS{z|EXas>ga0xw2= zg>r{6qywpOms#8B@E}ErGTI+aGCV6jJN}P5vnR-rLnc?=U0j}5L=bRTfl5@Nsi|ms z-M-k?*4A1b?({UYwAJXv3m?hu!7aGJw!m#0k!t`RdJsy5oLc?Y_Yg)ya{E5kaXZkTLO^shKsAvXfhW3Cohf*T z^)~xAH8&g26^RdnsOaj(gu!Cs92(0XZ2&%CUZ($9=5{0THVj6YVm=3AWX5sMuMh}$ zmUKk(L6t@rde9JkZ7?_x4WRlDQdeCty`8<;Lea;Vo=4c%GfTmcnIlmJ1%&ro#Sb)I zkBhTkD=U~S|4K)YqGay@v2%;}X?4rwRCRT=gcrF%QD&n2caEL@FxdRfq%IreWc+Wo=#GwvOL=w)(#fCL)rJFcH$I z(h3?O48W_Xs3@e%~F6sW%-#DCdZ@r9YVs+h~URTyhoAyj_6z%Ps@R^>6hB z4gXG-+)8{d$6hG%!`_&4M!As?1dt0UuHo7P55Np z*IwDj1$qY2npNpE!&GY4a%9zJXJ^APFgTq2X{5ZqzK#tn`lf{0^Ot#nZ^6E0Pw+}7p^4o8=-ofS{v8My+ zfd@8kbvA{3xj(n{jL3rq138?Fj)sxTW*aNs^Lt9utV^lUnkzRYu7|1K3a{zf{Eb`( zBBl8ecK+f=1M>24Inp>IV0+<2Pt2oqHWC;FTIaT=LFeTFUHqpZyHYW1-k|B9t<@(0 z*7PC|`#oPGD}QkF`syo}!!_60@hIl(-0&v@$a%}}!T9lNM@!iDIlH-1*>A@;V`Q|u zKzzHA=u;|Zf|I+-WQn&~5*saNvPqQ3gUPq_IsJ+ZG{B2#BGho?(?J$n9JcJ49OX~- zVUS)}{yRxm`65DmJB%OKj8m*KExevrMvb*vBFiAjd3o`~qTxobkAUH7k1-$FdbbIR zre+?P>W{_1dy5z$OwnE#BKLT>-30o=J>MpiK-;-hG;yxzGS5*lZ3 zIALIaEXC>eSh@3l)%G0tWXbjY1Z%DGU#&n(vVD!%b|LVv?ozsK6nWA9uoWN(0gq>9 zpshZuFP^sU)!5MBIK%&7bU2w+uA^&i0*gqnBI#jBd00ogYqm8;a;1$_2Qq3YJhr)T zfW+l~mT3&u@o*-=h9b^}!G3wnf`CqnC-AM+7*D49@zn4GN0-BanVIB*UmpSOMdW`> zh=OWu3b-kqdOT4Kh@PKUnatwF+#8M)y)4>1Y*SJxfAeay4ih2X3ugDZ{|1N0HQQ=e zt=|aY1}CK%)3RmfK?kw{3rrj6TD#Su+f!ZHm0Th!4lyJY9TSt3lr)#OBLgP^5}~7f zNfL|A3ZYsmS13&uk7?+QEt!DFx?F`m*lVQuFF$mNw&!2>MiTZ;Eb~|{^>p-tYyF=l zsOYFVDWpB|VB75zZEHPcymfdkx;zLhCNtyxAmg!!&DPS-BSWzhr(f2)<;&d7k&h|9 z6u|e_*?V^UQlcHxPg>5^ZPD=_?`i|ycs%v!HMvm2gJIqLtPYqywK1wzV`;S9fYa{= zxjmkhv!H+M&v64(BxB@ZZQ{{K0C}*j1!RWk0&<|{3#UNWZ2Q)BRAV1oDS)vwVvsw>mFul?Oo2K!R_uUxA z><1i^L`o;tF8iIL$p@a~B08QyYD*cRSVaecXwF0EWhJu63p@oVb%Y z@z4hr>+WbTHBoUnIr2H4HKy~tL5C<+6w8lxZnr5}$xO6={7CjQ|Fp&hFGNH;16PPJ zsIZt_5ks(BLSFeWler#XQR=VB3|M3Vzcll4UdP!!skL_;u`7$_85+j+0z5e{HR)P<>fD0tgC8?0xhJQsvK|tJQ=s z4Ed~<2+l4pYtTJ%97S|0Ftmb3)F9hQ^!+IZLBRaI= z_cDb%i`QY1D&3Z8Afk+)%s)mlca^SZ&R6s*!vRl?-7JsQ0b85wer3q=88TN8p z5*Fkibs*@=AUl3Rx$1*e?HMn>*>${qZ(FUT%{ZlI>Wuk$cM4Cj^|JYp6%`6cmMRA! zd`QgDM?tSXa;PJwR;*M{R3TTw<@U^Ww)TPk`d3qN=T6h`2dpM}w2W-*S~|KIPm$%r zKMrDVZcN~WAcKL`@cfVrUvluG67$cQa4NY`l;pT7JZH!r#3{MJ--~~lkZ|~s5_n!T z871p&by=4jxT529J@(F?D!E)r;Wceu>69{I^C|J^r!bXgS!4P>X`KZ!vtY3xoA&3G zXxwUJTFuf06F~mdm%b!y_ad6Y+piTao)70OPWvmy`$y!XyL(<4-~pgLfC!i@?+KM-n+4tCVSFD!G~b!%E!2^7k&s53SHvj%2!0wt$|OM z=6DH83Y)y0uq62JTghqNw=oMdGV{Il3OF5pojRj;fzTh)nf#nvP{h=?Kd+zl}CS7-!EDI~+bs`$ zI1LSx3^CcZOMwk%5ElxRID$)_f|eQh^GM+BK3OcD0G!8ERvc*u!d}`@{!sZGDYMCB z>jhkkpT|Fb|7;kNBUqs6$n>_L|2r<55#mMm73FafJC0<6e*gQ%kyFKms9qI*SS{b` z%qUC*;@ony{BxC5s)pM*VnqD!-R*i)zEe>r8Q|`l+zKo~cFZSo=G)1!U`~ww-=)Hy z&u!>c@YkfV*cm~)MNY0y?D~Jw#0zAh#yQUD+^ZFCA(MIh;8Dm+776 z-xFzUeRCEZl zHbpciy=kjh1fE84(>ZvNPqqAUX_pCNTgiHGSbFyQbr-K6X=k{v7@scawJuOY#w8z^ z9)$DXL1a3uE1GF05GK;hVC}{uli6*VVy1M`bqwP(Nv!u`GaZo}kJPvUWNtm?!Kt|d z`r7NJ8BDN=kb(whFpCX0&P{`N0t^OET-Kw>flz9N>`h)oW?s|(Vz=YS-nYzGBjHwXmWvnHTP)x=1qyHH6?%4rJ_BjmKpVj`mgkq!OaLhp~m9yfRUFx?W-?)9Y@h07b*pH{^9+|9q&2Rxm(^EVdP!abM?ey9F$xEjF2-$^MsvoeoV>94?i-KGMgz0 z>b3f!<1SSX&xJ&gRbcr$TM}DY+9E%mec7c(Q}fGCP$Z=(?dA|k1*4Pe=40$}rx1eZ# zbT=K6cu?>|X!57oeYXCK-5YAt8UuL&9n8feEd53$bi}PZkT+oeJBY~##gg)sj1u|!H>bGQ}@G^9FOn07N z^+hm{SA?}}y56ASn;>u2YF&I7#HDbLKMmIkq2`x-a7upfAvC)s0Js75QYx@n~Ypajd z6GI#VY?0(I4OruOITtGajk1AbgvvyOTn#}+3q>OUw<(O7ZFl3e!<;<;LnQ+Z3or7$-2zhHuYWOz>F`e2QbDfV$2u~)I}Eo3F_AKmwf+VOzhpKZo`c)n7z)(VHv zI6d%tEHoqqKUX%n&cbu<-{6X?rGDGJE}>E&s6cM%^(;M7H`c9Pt}l++q~wCr4zIe< zd8|NxaFSI|rxYe__k}Y7i7b!~-p~cOR6v}?Bw$AVu12%Tg%n1GsrUce9 zo6IpXaOozwQM;d}s5e*MAg;?c5RHTlnBQ&h2XS;R)aZh+Ek23qW?Hlea__@q!EkrJ0{(s zU6b3Jwp|TCVBNN2)(jPnmdXGe+9|S}3K7#UlQX6WvQHVWuMfj;w5OZ-)-WyAs= z&ZR>FuO|D1bXP|FH*VYa9Q>AAe&ouSKWU02B*O+igxU9C)rTk4aGc>yl_iC%`ncgI zWH1`Ve!qB(PwW!1psid`J&7^|4hH7kz=jLqFmH^e@t6-Tv;8X%MB9V-<>nHMGrVqx zN70Ay=L!AYCVuDXNcXtow2ULhU)#HPvLDX;Ul6F5QaBADZhxO_{*`0?j^k0ZLXC+Ts!QY0wOv#>oQmd}xC2tj@Di+W z;$Ykkhm?SFuaJCD`njfhM`D_ORh@N}{;0Eog@UroWVV<1ado*n-tc{Q+4E@Qfyw)p z>efs@nasNBGZWzo43^WA$#6w-kKT?65-;8tGLd2Gc{BAxOW!U2@X9+i-Ln2rk{JT- zmV`eJ1A!$ZQ80e7m@8Qu?C*1!1{@5Lv~Yy668F$y9prgf@buk&F_wP4)&>XGQP*V7 zkoXJAHx-p8$Nc4(n4mw6-loq@z^;eaMhD{qo~Lm?DA?=j3#1_Gr~X5xyB)#wPDk2* z(zF}$8y~VdY<`=}=8wD05#D3Vijdk@FB^~q?mvQ^i@uPY5+8oTw<)fyMjWFCHanR0 z(j1Nn4VM0czF`5Dcn@kR2`$f;sy8W;VVr=GJ(7FFmQ1CKftr6iei;^_mE*WyjvNd6 zN6fzgWh8-+G@^Z}XRUcd2kb)ZGc<6fe7A9*KEIH|<;)vU4ETlm1TH^mfj$&sND#X7 z!y9)ZoNj&Wwx#4%7?x+O^VeX_9to8``C?ohP6oZe9`np!uji|uD8w7J`)#rj26-_g zqc$zd5N)*K`q^~=)M#cecWiHS$*X5n_La`LYAc^TsQZ=w7+}u{f&#awki#W>`qUVE z14N;S9U`4VLENLsNQ(4`?Lb_TYU4?@X3Uf*l1ykcJV0@_?w-ALLDbNwJ(Uwpg(GDJ z?ICwIyqn}n%!&}f5)6eM%~~S{4@0D)iY+WA0`=iUM;hr^`RD1FN6$bb9Fow4c<|a} zGXDd|{cI&j0==VQiewi26K9ped_?Y8qivnsTW`bYeB4FQ>vRRCwx-77ZN?*&*e79R zM7}Hpf;T5Z=Eih7`Zz~O@@PRooo`e8=B==ds!LdcrQPd?#Mi&%q)a%e}qBHfW+Rx*1@$azH3zdaVn`n_i0&T0!Xnms+KUv z&mI@c1-7x?;YRuHu4JA!*Um5q6o+A;A8E-Q>ZDwe=Apun8~;tE&Xj4XBb7v~CFxP%pzQ*8jepl;sg7QR`#D|H?w<&6F!KGV>%wH(09MBILhG} zTCG?2_Fg%1jjx}=p;5*qs5(a8eB7U6MjS8H?KI)GMD@hCHl!yKmLsB$G2|PBk)Yk7r?s&jo*M)c>3K!w1$3 za=Y3Vetl8&Hyh69KeCU-=S{L#6i4GrE~mRz9vckfBNie+p&W=(He$v=9)88IKv3m^ zDl94jI?3|CxDm)&U(*e4!Q$>~wm&XX7~LcW9z+(X(H4xI?5lSZv?G)AL@Ac2EFj7k z1~f7o_mjOoFZW2O|JKoKQ>mOr!9Z`c)x-$mMffx`>rR5&4|#RA{Q{2LH2ydH$Yu|6 zriV0)7vJ@xqflX$4RC;BzTJNuQ+hU1O%iE|8fu+FLrOiA{*Z1}nuKK6iKQtN`tgXk znWd$-BRY&Slx)?Fjg7r;hiV0$Wzw$KE_$Ecj>qdb;Ed zN-p60?Pb)u0pVwFYRtyBwo4W`{Fo#wfT~^T_H7WTxAAb!yBQ08`Kl-KWw#&5R8{%u z^oi+66Xk!|-tBafI_n9G*KG%Xp;K{+?$={YCa=F_?HBh#WJ|GBVMyrJ>KJr;^x_9; z833&79Xqo}aeaN#BloOeVI;p7^ZDx?Ux}#umX`RJR0cFjt89)#32oULKmV+S_P+JQ zMObLnRb~)WhY3Y3VT-Bks1n%>)2D0nRy99nWjB4qRSV?Lpt$uO)A49(W4d*Xcv}jr z!+mLcEZ;%YT?16-``&F5e(c;2n3I$VmS8xn+j$XUe`1%mTX}!MHxG5#eI5j20i*J+ zwxhiQ*V>L{xRh;H9>(hQA6?GRzw2G{aHvgxCKMG9h5%BWvpTwo^%c)Pep-WKPqFHutek^k zNR*LIy1aul@O@N_}-yL0SpVK-`kM7tOSYJ#|xUII3))JG7u=T%ZtmGG`8 z{okvl?~b&!*N_||AJ4BmB?B>PM~?ucMh|abwFFbx3*YpRt3=a8o3CB;0auy zQ+rM{)xK<|BU*2KC?*ti5XB2b&bwmt_k>(B^<=$|aH3aPMH_WsPbVb&8%`t6Tf%%& zKPj~Tq~T9!yC%>4?U%%vNr`#vY-(7TCooQ;MvV~>CS#>VT_}|wYU#d%SF7F#Y}wR_ z9Dqbv;Gc9FdY00>4;3#+`EtV)-a-GIa6@_Ss}6l=)bhmjyhVT>tLBX35E8HZ%s9s4 zFTi4-xVD)fwX!6)rs^9LDwj^Cxl6@vm$CuyNPVp+>#^)Kiae%Sd;dnj7?=s`vT!3( zC@=_ryrUm$q6}_*?Afy1ljo0y~^e1krbqDoDx*;#mt_z&~5GT<>3>Xt|skaLB6y4YV>PX(MR_xaCblMbLEQ zTxODS+d3ur&h|>;aS56EXhkL>cKKfSDG_QTO}Bf6n}XMe&V{PzJav z?FmOurfcXya`C?$_Itz8X+~i!elGVSV8*V7n8?K+J2qe;G^&}TU4qxn)}{6(2O)oc z7IR07lSVRAcF+>8>-GDRqB>#6{fcknH)<#w6_=eP4eu`^y6`JcKJjszA)gEYfKBHq zbGzAs6GQzM%<4u5+B&7L&F^w<6$2?-{ES7!W&x{^uqq%zwwx1Ym|a?_vj!@hMY>T= z5#y;b2|*EYx33koaA$d;B8fvx+@hi_+DAjDEf&;>I2;9A7HBksW)_Lm5|&)rxu66? zE6XgLZ~qPxk(03=?Ke6;Zt|-J;Ca;-;rM)J-EQnB)v~!^W$xwvfX@r(;PFX2PLOQ? zcCL4}yYmJ*FtQ^w$|{4dI}&4OE8$SrkJoa=5&Z`^p&np5F!4hnaa4|TPVY0$3+tsiSh#OKm_!> zl9sY;FWp^^EPVb~bwj*OQ}CH?Oc)6O$b!mHgD3hNZA|pn|AFJ8+(}OFTb9(6qX2TOjFO+#;)?H6{wZ+}*VX9`$4 zn4q)Ph}+C@uXNvO24Lt4Z7ArN`%YOyW4M_1!RYTk_DYK-qlRx?FiiCg;mJVWXF%-^ zX8-7Na< z$&CGh^RgyjEpVG>Bu1O_m~I#wP%pK2+<>Q-zz=dspVFDOaLeh`+R$SbF<3THm}%8bcqg`%};n0ZZj%^muFKhr+2Jh z-!|pmJyTDPNvB=XbFp&He%^eki0Kbpw>9kK3!LE9MYItS2nR+(_ap`lO>JG$tfd5F zs!FLJF{-$i$SKG>i1U_9GhtqJQkBh8DPkKbi&C7xBVvMoC+O@m%rFqPm~PY$^uUWo zNbGKrHDrdEf+uI$b1)L4P$3J7>EJIr1Hdl3{IW}3j_@7EZ`V&&s{eyLnn>%c7bsr$ z4FhcABM@o^o2XTj(z9*g_5^4uQ=7!d^qK{9boZ?0=1Z%h35G)-+wOKBnYXtEP`;Th zPH|XbbIZz1tf(6@v7J-oKzOpXga{rzB6OP#~{bJ8|go^X4Lt>&L zxNmE|bA$3|hpbR_?eMCl8AkoZ&ZW|+SH|CV$;M;bt{|-63S?xK5K(OAY|$gypFUCy zXXtVs+{lqeFjv4RlaWKSFtl9YAh2QQaj|A(&JWPrMrW?}4lEUn2fQhXHjKp-6y5Fq z1N-w4ftR0^T`C}84}0QSf0r@YtWZtnFoSkodt<}4b+3?PNh!^u#3^lCnO9d-5-jH2 zeCC3%G`b8!I1Twf--45m35`(R&a^ zGSgou_clEJdFCJItA^K3v#Pw0SRC zCdt0YdWdc2Yg{7X1ImknKCB__M_!XMXLDG#$yd%Q$=CfcZPY?@F?n7Da#=|U zxg9t458KLgJ{<^+hdCC$Qp{NyO-?3!`3~Xt*8e6wbCDgZ2`#79_J%UHn3ZC49R(>A z{1Vw(GhvARXIT#}hFpx81q(__z{?btOizFPSm|^kL^$gRg|$2mA3DB?t#XCK&xu*@ zlpFR3Q}zMSxPRjkIaonn)T7fJop6bWYTuFUCZ16~yJ^LhJCSXE`Y_s-^AlJW`Rl=5K*f-R^;5$MU4nHIA)fSp|%F{81`fKA~ zFuNu$@W&Hn#CFRou0zcbF6?H6pe2~a<_%SNe0FHIHzAI~$gD`8>FFWP*{VNI#J&37 z;tr37XixBx6~F4mu=2cMBmwsr747L%>LofBcLNys)7VN+2LU5rJ$^)dUjK`%qR|_U z`@W*26Ed9(AosxOI2yMh6c2aR>M)CE3534XTHDCwkIdzcr0 zQyyz|dhm>SF+gRf6i(k;=o0IP8$UNYH0cQ3NK+PS-MOUTaQIJ9tt%6_kH^cQOo1-M zmxk9+qLn4-uj)I>H{rj8wN#O~XJJ}huS}g!=UrvrKdwGzE9>ES!!}n$DuzoB!VQhquoKSo#!jS8-sRIvetka!M0udjFDNt zqaJDy>mdt<0)`J7G5W14Z2NP+xG0D*;Cp(*o`k=){lBlVc{V>&8c+J{wD!<6Oh0RFKI?V9=jq zYwwf1%8*D)nu>y6#u1lk@|4b$m=}LASy)UCq$v6Z(%T~Ju8*;D1xVMEpzxqE7F9!P z{xzkDQD>4e4*b)U$}Vd^0KE`_g@f1>`5?Wm#0O2!W`^&NQ40@dbwFu|ny>2E&SrZ( z$dc}^u(hXXj5p3DmxVK&EN(m3LK3NI$RGbgxE|vW-~xy4jG$`WM4Qa@cg3b~MI|Teh5itpG@k40-$kk>Fn-J&ucMcHpgk0Qpad7IeTq}W zPl{wCCVM*6fmM`(QeFtt-HgqP#z2gpe7H(+0t<=PO|t;W-V>E>3ZBiofF4xlW`TX+ zXTb`1`M4MeQ+M+`8A5u04VX4@G#-T^Zh38K0R3XNKJ;f5-f^x*6<5&5jYmh4qA~G4 zt>j%4lE#8gACn6M+$O;)=EM5;g!d2@CAFOXmw6?%RGFO+Cm*su&Rf^B^Y$>`zoT`j zc>_9Gl%GJD?@xq7X@zy3`8^N9y0lun8T*B0;BBD&f4H_68u6ejR_yCH=rEOv zu2N|q!mDm~NeIn~#$Od$rs`-%%kk)vJznB{;DD#k;T+RVHv#j5X_=xdBqARw49?mxun;cMeBCK zVQI(;#YEU?lay#WYsR=`_q2vquv@&LP^<(ebO%OTw{yR4Q?lVoJc;9s#g0{v(@D*G>q1` zBtfyZQFvK5nL&LtuG)5@rm}_Hn4p^}IZ(ZsRWe8tF5hD07lfQ2G1~l~2aTCmWU^ChrS( z{pHbk%2i0J@8=RYaO_OO)+E4^Q>???gFnn5kfZKf50R`h#JX~S%L8fWI)SisWPU#V zadw)c0=m#Iydx!E#^=lItyj-XL8cIo;m(r%$R&s)#blvI@&4C=V&^45EkX_gTj1uq z%kdiLcXrXoZr>$&@+_=g`~R`t6sf=|m<`qQ=-g$ci8)w+9J{JbExIqnXEr%6xNrc% zd91_-U5Fo}Q7kE0HPWb@K(#bQgtnTu8oy{wIZFs`reIcxpookF1!7RMiLlsYEJMVW z<7I3t&h$`UyD1h<^mpmEcCTC+DD>VxtjsyQ=fVkc_Y#%jT&pqy!`n`!U=)zsp<`ex zl#)yiW-AyTB|0(3=1q>iOARI9VGqoCb@j+xPF27@9{Iy_q|GZWEx<2`zl}eHAqFZH zi;K$1QZ5XX`Q9g{sOYewuN&0d&7Y!x|J3lne@Qr-p!h>>WMMs7yK#28VZa_)o?m+q zaL5oFrw<_a5>80j0UbLw(V8ijSn$2;)j5Gh(3?w69_5j%r&L$kU!{(4M_Wk^ zlsR{EL}{d_nTRGHRhO3Oq{b!gsgPhu?Z^lh4Zi4nFPMaP&?=75~7RHnA-jg z9W{@BB^T-w2H+0cMn9AjM7-b8Tp67Wx~8U^D+3`i?&PFN*>1Yu;mogysUox&LST3|kFh60X0Oi{oYsGI2onT6KW%Y;7bb8>er zk1tY))XAQ<>Hr|`F9B;&ufBruc((lm3H!5(EsPCVo(yrRBWgUDeTSA^le=WwK}IN3 zzs*ocs$P#cO1RkI#B&DOEa4uWFMo9{eMshe9G2X~{}x$7g65B^P9n)ULPtBkVY-2t z0_-fQ?H@b=j+dYJZUIc*2Hl~8&wFpK=vStzO?(4`i)D8IF#I#k2!I-WF8pP$&;IMO zJNmkxEH+=Q@3u{Q^c`7}k(Y)o^I&q^CD?fJ-Qnv?ryBxDyvfW=%FbX5C~aWX+<_ z0%4U-QUps$ZdF`kqX#D_?fNY(sw2MQwb2At-Q`E7Nt*N-kcuy1O|PAOcWEy*H9xTt z|0x(7$%xK8On*ZcqMRFSx0jlMbEYwghDF<+*Mn#lI>okHtSP^$d;|Cy^7v;qSpl^l z4SDQM&PqBm%X9$g38kF;v6>#GuX@U`eg{ZS!hJMcgtHjqyLk?aGb@WTNfZ@PYrYAY zqj8f7e)PMP;jtfqd@#7ohb*ykBfoufPC@n6^rkkh4Lp|HdVSV&x4e8z6Y>|6z!2p% zbe$Mjoi0wj82E1IvPttde_^oX-1t7IQ#!q`Q*RPTcv++7c@_a1et0WRW-agn){pY} zc|Y@)|3u%|U~q3oBTauL=>08mIqX(K`aA38p69|lgSi@ZE6H<#;exDj(}Vi9|pfm3bK*;D%Zlwv(@)|)``@J)k>@4FyLcp zHa4s!=iI@dHGl@F&;kOkSuwv9Jf$ zhYiLe#7@(4X@m+z?fYzi)#=P8F7bOW1047`H1vm56KY55Q6m7AhKswSCp)bVeFCGW z2Ls{ozpE%4a3v9QCGG4`YYfcgAWemyF%O96=TSu=Ft=;GK$(qMY*Xu)OjMi$VHdy` zNK7{47GPVPhbl(hWa%gq(AOzraRYrWvEy1WFGTYNtRIK=BA9G7sA(b&0Th@}Q}Z03 z><{^3Ki2wrIRtP7)RKYy;Lo3&b-M#4$4O}ssl_P!78KaQoi;=Msp*XwgrR77X|Sbli2cba(E&sx7<*HtLmUQP9iXXxss00~ zILab9>POkwoB~#HCmf$wkW#ur<2ofTduKCLS)L4l92OgC;Zlp(Eeporc>!Vzr^zxB`cUv%`@uu{ zBfz)|WWBX2zUl<$-eg+}ms?SGblJo{G_l(4*uYhxd8U9l*h7l)EHCyS{x>O0ifS^5 zIa`gXYGXDwi9`aJ`Lr09BFDjx$;HeQd}?7rhPqowx-;E1&(xjUWte5 zZ)DUE;r$tILo9;H`hLPtu8)3Ky2=1cy1L93->AL!%}DtNu!gLk3gWV2@>4Y`Aozh%{GchI35w!8<7pvVzwO_E z`jLh_7ZYqCZ@e6Y$z2#VS!I{*sbJXOY|r*pW`3;OL$Exbc&i6Pqq;B|9Yg80v!Kat zdg40t=!Xh}!X%}nm}3u9_SwyR6}xX>1hK2DKehyTV}yl)&aI<~N>B|K1!qBpl^2W9 z3O1l05f=(0Ss%t_H*$f{hV@cpB375Ie{^ zLoXz|W`W1A5uP%Mwp8208Zfo~CGlZj5>K^%-U<=ac%*35huhN^A4ltz6Frt9%WNq@ zSj8~idmp#vR0^Q^xuhrNwMDQLL3@&TuS~Jx`W$U4Z22@w1m%N z>OOhivo?Nyx0koX{=iewgFO*CeM6TJ2QC&IsY2}h4kxhQ)q#H5>4SAt$!JRS7TWW6 z9)-on6k6T_MX3n?1L&IYv*?Yt)%KojGMoMUM)6~>)NbZq0E`#ztAL{W8N|TzPJB8~ zjU#(v+l~;lK^wH#0ft2dTl`qLeGN>MX@Bbg82^NwkkfhF(BC!F1d*L?Ine1NHz!CN4c8}$~Tt-m=2WS6VfyPnveZK+1A+7O2P zdIDA)M$#lI7!#v{p*fr_B!~LxqoM23GoatIR&zo(_hSv9hvL zpw}A&x`Q?GIFk(d^Y8Nl?TjGK_$c(gmSen4M1qnTmBLrU&jt1L*!+*chB}ArVG#VT zX+?g4LMN({uvsCGA=+YPMn#Ge8}WzYQ|3YWjk0LJ>u1WePJe@Fidelc@>6p@Y=%^%1)Bdj7Q4w*tBg z2A0Y6FIg${nH`@!?Q_|zD_w#=7`*WL$WQq|@nDUYWOd#<2VH3_5tkEw5p&MaEijqQ$Y+h)hM zZL4G3ww-ir+qTV)ZTJ0q?|sI&@9S;Wnl1Lyg1N_3uFgHYrxF%Wn=k zQyp5dIL^0bdc%I;Q##$-(s1XP@#Qt)B{J)gDt#Kb<$R#`rXa~zn2TVkCI&}i$Oxa6 z&mHtDr+wqM9$0*fChwDuq~lcW9;Fm*M~dlb1{_{CwFwM{(lK>&gFTNazb7DN z8Z)D*VidJ{cw#nPkJA!y5{M~Pfhs4Y>l_Xoidp>r%G#c2_r`fo{MpVk;$5e0{7dlgWo&>8Q>O-(N)T5($|}rZFm(-+V_(pJ zc`-v!v_?@Khqx-)H^NOvh>|NXvIp3NsVzIh?~I;2jR~3vmGJZcEuTj{`ynpGc;o;#Uty??e7iPjsRuzwz?_cA{6oZdtLJYtNmHHe^)k~X05 zDnPozH%5RDIgm2=66ZB`{Y#=4_SXzibea9x%@XeK2KfmEG>q-gtC|$rlJi(qJMq#s zVR%Oo8{1T~V91n|#lFxhcRgiwld7|@>s+s(XXr+f!<&9>aYS=nlxQASMwF%ZPB2PI z!!Y{1lSbon;bw7EvB?ybmq(;)s#k5kYj5=biyDv%>AU9hx*bZI&Ek^Hyah6*geVHF z|Aj)ofa#rsYt%;AT~fTyp(ALg5{lENtvlD#d8#omLE#sD5joy5nbT(B@X^>MsAacR zuLJ$FY)vNRmlQoR46NaZQ?`J5m`IpBVa(IdK$RxbhOrtL(g|w(G}p*4FpZ?4QI&_x zNULZt_aI3=`F+w6EmAE~LXR$#L{9pwB{i59bt%sDrCY8Ux1{170)J?>=K!C;aIZcefEz4F0vvztun={EOHF5AjNa}L ziNZ!iCK|}%i{yl#s5R7KY6q42Z`3u6ddKVLxg-4|koMzCwq^f?g;+=ci0Jt_J%IPq zGn?;;83QCqY;hd|ykG1qH@qSBpsf6k=I;P09cDjt5Eh`$9JpKkqF^% zFN~iK`wmDHrnEW6+VBzzO;-C31R8 zax&~~>?HkUmcwXwr}1>1B}OemhlG{#ds}+aZ)$PigG`09XdWx-%TX_}kTZ4UxPZjn z{WSKnL>m1DqcOs)hCoq>jGa7l6z)0_)FYo&S!QhL{5 z8(GtM=@lPv-`cSNV7m5cf49|r0Bg0e5gn7Ya+vZ~yYQGj(|2L$e!Bmmam5z45~yYs z9j-tdOzMXoQJHqFuD9iUV}O22b8uGqYOpSJxua;mCa!}X!YFVn$-|R43wA{T>>3=8 z;51$xBEVEPZs__0q&z}+OjEO7v$(Dfayur4 zIQ=n?3D-%0{T>$J5_t2^2t(#?v$o&^-5~?Y&_Dxs7<(s@#o##NaDwe5*Er+jBokX~WphTLUp2w_cM?DTorJ95rXem^Y{SBv z*A3lp`QeF$8p1(8B*9Q$z*jh#H}IL$)~ErC>s=z;XR<*5V6scV7AW9Eq+qQ^2EYa$5P8?nw5?i)Su3U#{<#%LJL zi;=Y|{0KbG2uP6Wsj`?fWaS068yz!^KoD&A;}e?}BmW7JIQ7jUB%;7QS#nCsewe@~ zkJ`+(0cN5pb_BuZKO8%NKE}VYucD?WnBqr``gjIeI@cAwNom@BkzPF>e{nH+{kuDg zN)bDGD>*a79YmtZg7Jd6sQblWcaG30F9zF7cI>wEv9S2e!6i<>Pux-7!`#DtczO-w zB1LCfN}2HRQZWMhY`el?o{85udR4u5}uyiBhgqvwF1wWE491PZx1Ide?F)d(@2hVR@?ai8a$)_6rTYr6nmA{f-K~8z*JZ5CLA@F%k zV02Ws|J(d@G{8sQT{jZHL$BT;Pe74nkoTt%ZkpGRpr*sgR>fm=yHWsRnd0c z`u(EspfsHasdQNiUhO0Gffj}Tt^d`(&0D2HSB%?;0hrBi&!hJ!mjdgziWIGS4Mr>lPz2`M@N2l6GzLD4Ye2rM<306tLF8RI7ZpBZKx zQq~cYRPy~2;H%4djhsB^T7h9YNz?f9Iy@&j?Y`5U?m>C@;8KW}j|AdsYUuw`P;Pu* zI@>&(@ug1_94^}(UnJMt0wNshV0k+>pJy@?w3j6?6qxX* zg88x*qB1(QYv3JXVYs6fc=8lqCnTe-7XL^b!yws)5I_itL{QV_pIUhtyToT>B$N$D zsOU5DfK|p1)hz$1pw5nTR*+pBxw?`WU6jYX$V~I1;Z~{JndM~y!i3^7x*;sqUm41G z8;lvG>76Z96%vSyh5vV8MpnDlSS8+qvhDC^yqLA9Qv`8O{;O4W0F(g#p$B- zRaQqXfwRD@QYj(~@+3QwIQv0*)E1bCY=y#iMn1i1do{{i_9d_7-V25}J&i0zy6(^U zG$4Y=7aTYsT%}VFL*QKpVLrnRe3qJr8Gd=r{?D1X3FPF4cYyt1F&IWrGZOiS1|F5g zY^qNr`fKbaMSNGq2{z%E@A@dFN{x&nAfQfCa_U$pDljct*froWn(-a})^O=JvrN@# z)b^%z-DkHlr(<+SwHjg+HIpBdWovLqczWFUA2}hx`CWhp-A>OWZ z(v~rcx*-kPMMi;?{~VnzQUD;sZU3a#8&{HQoboa!&f@|9So~MPTb;d~)yR6w;u!s7 z;cwa`N5U!iVSiYsz+kfANU9&jct@%0g;PB<2{z7uOd1mtr9Ke!ky_iX^J;wHYM>kJ zYa}2Xz>(C|7+JG@767q36@#4KzoD^qes#ppQwvS@PiGca?4;36x~CfmvY7+ zZw6RujYa``G`7g`gM&VbBf<1Yngw|IFj~jodw`<4MS{hcDt$TVT6@7?bmR9Iv5=}l zn{knX8Pb>YCEB~?uN}*o=Z%EM6aI1v)Fq2R9Mj+N_O+2hjx<VOf zTkO`YfHHhmZDewJGy2_FQ!a|K5`)ltHM2F4Ub0z*@wG$`s=V<_;5Sd~#Vo;%g~&|} z`cCmV9gDFEYBoX+M>E}ZQl^@S44KiFRd7EucDf4mK*EhhZ&Z;4 zZ%}%R5DQC4rbzLtZBc+EWJE7wHdCZG*L8W?k7DaBqN309_^)(dv`$!dhZ_eMugk5s z<9D021yR(W<{6%g3Np1f6oSM|PRtlV)$Gaj_q#|xE%cbCA?0u7vSP0=#ac^mVfd3IZG7zKt9_ZLE-z!6*}{*n<)uU8wY=9vQNF&;4j zEqJi_hj;(3TqlQWeHN%`S84mgdhYXut7Y~%C32|>RCwet%P-pMGO7o9=qxL!Ss4tJ zPjkGS1D~k{f2phZ$PXw7xQ_M6M)nvXA7(-$PG|2n@`@Rg8Bt8?#WY1#NP?MhLRAoq zLLRYB1?u4b0&*RrOQd&MqD8;j+N{k0J^kO~od+3so@u@@GgE8I&o;p$WS``^-#E?} zvVFZ94&Ki0)@U+R4R?#=r4YnS$>wmh*%;p5`p<*PC1p%IEfPZev6@XN>54AguH>9v z1pZa^V9iX1wUHFPJR`+2*55@Bc4z|f)InUXN{Qg>J{2V@&B%&a77TRHicz9h?KC@_*H`jShAGeOG}N8 ztFSP6?BEaZH_jp|5eKeAeb;NG!&vruRGID zmBC^F$w@_hb^nXZ zt1b%s`~1R^?-tw=9{SdpFXPZ;5oBP`HJ7FI&RW;^J?@_BB?4Iz$PorIQc~&sj&UY9 zYP8Z8&K8*KfgE}~ktez9;oUs5Bn(SQXYNIuZlUYN$sa)zIh1F0w1)@G_~Z`?-7yx? zO8)c2Oo|Z;xr;{C?l8GWeu*+ovIeEqn!jcgd{5$wH~)a*&D^8oD?**E6&CLvgh`=! zf8!d1Vj<;apcNwxWa~x)C$OZ%)r@2YIsRb(K+R^QV2O+M7Us)Jg1$bzbi=(-e(~r$ zCgw1lRvid;cXV{5qC0mpg!6b_F_FwVzBNN=FoObTdIb-kJ!VJTTd{K8hT(+LZx?*3>NVm zD_~{=Niv-M+k6GK09-=0p2%lnl4?q}|2QT~)^N1*rUx=)%7Qrb0LK5=?05#waJ!V$8`dUWY>(<*r4{m?d8%CH@)Sxe$?;@eMmj#TKJ zWv;R_J80s|{Oy4~y@yw9jl&3JYBnZZPWRBVO%3n4xMGtz)wCu)ss6!mq9gTC^>&|# z6>Fu4c89HJO-lqb_v)!wo-GRdx4QAV5_(IIc>!ob&y(nA830oc>-C~LAn@(LAr)0~ zQ2T8~q1*VI6-WDi+-HLZJzzEh(Bk+h{GabGkR38cGg!={Z;4>T1E+i6rtO8x-I9`$ zVxEe)wrrktlWw27Nn?x4@7a|fhv93_MDUHii2{YoztK0b$JWG| zE$FI;O&vxxmIaoCjh~>2U>WWSnRzjlW{v!AUA&h4Jy!9>ZJ)|CV2Fw$RNU>94ww#U z#bmS36E1h~%ycFkLveBkixrFR`bb3PSmdt_f8`Zg3+jNRK-k%Hw_OLf6ORy$V5a$t z$dGsgx1$f8Mv{@MYH3Xj1Sc_Cuh1Sl{soH4pek)^TLXLT>=pe$avlAzNXHZGr!8M` zLG+jV87?y~c(^#oTIUJe^HqfqFpGrjd0NO;S1uqCwLdrlEt*bdV1Ll`h-12{{TF5} zeepm1+oUtSO4Bd=)H@)S~6-+Z2*J=^%uNmTCSx)zS^glim^CVd{Ly>4EFwgGU zFw99{!~3e|B5FA8uhcs?hnY#xQR-7&D4;%DF?cgnA85M^9$`Zs-I0f;drTs6U^#1eX*)ESQo1x^K(hg9j`atl86De%2SRh=r-L4vTT|?f1L`%3pKQ z^YArmFy}?2r~y=mQTL+vQ>if0RC}2$R{DT*-6nB*v#U#X-P^VMu4m0RB4^FDD0x;m- zCFAYR)z4S?migJD4(&TaLS%zRVzoD~tCGGudfTOTCf(iu|kF!Y8=9z?gn-LZ%Y`fJq-}7~4 zuPx>oy6v{>({kD(s-~e~QC-cP1M2Eu-QdJIcO~>yDR$q-G!)1uT8}v7=_Obm(#DUU z{7fZR4=x?L-ZLnE`ItKRe7wQJ?xdoR!=Z>JX~O02bL-dMAg4@LGF3X(|D5yfO%4dZTKD4u)5rJ^^C~Ni*pLk+o3%AVjgGLj;xkS3(GcpaV*GUv zD1x>oDXis{$U|$bwd3tjSi9$|=P?1>)>Sp!x}5r)=WY8|t?f7H+kB%*n#3qtLD`OH zOsd6A$7w0)f)Uh}P&pYQDqopgFn>Gtx$Z+lM`0>5JwnEn5l0fpm0MD#!0XTtjL0JP zH9hmNx}NR#)L^RLS#r20u(RUzzc>>{G@)iIF*y^%4 znwO3@hFNh;>FwfDOUZPT@eC#&uj6Ff^_E@gNs2-lX?L{OFa32@2ULYUP(?x{L4Kt5 zz_6N9|5@H=g0-8ifMn~gDt)Ytw~w54%_!4$y*I8gmrp&}zMAt>dJP0=QFRJnKrTM~ zpiA*rnh_PnuFXP|a8_OWz)Y@HJ;&-2(oeUIfqLdinId`#=`vF@gFr}wPMzeuxO^ab zXNBolk}w_LpWZ?Bc7!Ek1Np8N0_QYaIYZgmX3~UsBVUq%@F0rjmG>21{lQXSUe`Kf zD^*;kUT(^1gHkpdj|nC{)M6iEP_ULnx-p34+vNx038)7ADIY@;tXj1zETVGf{)omO z8#GKZH@qivxm0z2fCT%NXrs6|-uv)vkCPm7U{VWUa1a%Wwk~ zhpVP9^~)%%`}N%S0H{FlL&gZgxvEVdl0m1&$kDVwDkM(9IFiy)9c(U4HLM-Fg3IO^ zIKvsbYDH(8UO%^gV9;_GP0e=j?eW#&}hvcGOdYL4B*K`v3Kj8f>CiOgxj-OoHgFC+HBVHZ2DJFQUT{u4xNYIuE$6#WQ5W0}hHJtbFb zHBXGh;G7u!{M z)*C=H!?->NHZ#xS$Pofc_`{PGts%KWFYccX7GrZPa|yYENtLFfOL;XPXD)g7zGpY{ z{;}b-tvT0xg3#S=`4@Y7yJ+-tq{oXaR@AK<+Xh`UO9&B~Fy@x+7~y!oiuj`T2r9Q0q;?#U<0kENVopE?O*h23{}O z&8RY4$ebb%e{su^?atgZ!>NZd7R(@M~31jf>7;= zUHyuJ0sbI=b1CLVs7(`XfG7}T(T*Y4%;Nw)f zGL`C$>U<$va-7l7otW_px3G9AjWXO)_qbX6bH6=usx_K7xf3(1>x(8*clZL6PgOui zw$ZwdL0gE{b7_iDhT&fnH;2&*~tD52);fSDc39Nnq>cxwNd}eoLk+ zRaRa!JY7`Od#0f%NhX&%*THjdsfY`klAwt)jf z#ujoS6RdgBx!XZ7dZnPzn?f`Ij%B|X>D2rDG@-uXn%b{^kC9%+} zxqdSq58hew=Ms7M(5{X|B;f;#uDRv@$J1GJs8x@@S=_P&GnqfNcJ>FuHZRv3ZNJ{1 zp0{tjS3}{jj2fcB=<)^sQxo`9dk=^u82a7Es+&!J2zEhUHd6;u9>TgHmgWMEKaLTRF4(h}$|FZQi~RV|k-o1=S5Dpr%~c8!ZC z7uD@-Mi1!8o0!Zde^3udQho|@e~VL5Iyb4M0rQSH1`9g2dvlfcd(bWE(iZq@U$7oe8 zDxg8;G!nACC3Kghx~5$VbI9ix@>LEPs1lLDNo)x?ANjA6rfwj!o|gCcs~z7pYHG+$ z3IgiUU5u!ol|-4|NMNE?Zz)uWG?+#a%ilT@i-%{P*X0*Dot|asp+dIm zsrQsKlx398+Qb3VF_d9|)=tj%F4 zmfy_k#t4b3e_O-gQ-fkUhw0|?=l;s|_{h-O*3KVPhQyZ%(Hil(-3U6{5TZ?_Up^VD zGE1CNOp#%N^sr5AxUS&?BwT`6tL@l+*XOi`kTpaV89x9)?%Z7q^{hPVCGwuj_c@%V@5KUDBxPx?n}A`5$!1Pg0=+gNJ=eBq&0HSl|9d zg+0J(B)k5P4eQ$Wy_2^GjJ-hCfq-Q6O|8=?Ce8rR(?x-=mt1)Ie6Oz!j0&SlmDcxQ z;8V&>!f1>Z7m=Xu#<$?*)#Z(x7nzn}X;_;hjZbgQ!?K5nA5*_&G_+oLN)(I?N<|q7 z=kNyug`~-nq+kR7P*E{rch!%?f(DP8A!X<8Gw#T0;@u{s$_R(Nm+W!#kZS&%Pf6ec zBp_Ne;&rxchCY4R90c2F*X7SOFef)l^@n;25;)>|Uh)ymbnTMAN7fY98`&Pcm#TE} zxLyiEy|@36KxfdqOrQR^;%O83?_JVM5AzCBH8MgT9EgT)UE5OVtLnN-aU*u8JYI-f zqDl!K;4jJrL%CcPPb?9zBh|A{7p1^?Sv7AgT=`g2%_50k*S%Y+H>yHf|UmuK4s z!wUQIbY9Kt<7)AF8)s7?9KOYpWx{qemH(FX+$Nsb zeKj_yCRbTxkTZ*~Ht&hy#1T`H0v(M+P4PYitO8$;Y7yK{6Gd>(i_bdeK^E-l&1iJ%{eyi4}9V{%t9vkQ4>NLSBi`gz6?RmVVDH=*GldEO_io^D;A#Z(S zb#*;`-q`k_iJvzOlZ8pR4w~{-h_X-W-`iwI0Nnd{Ubt(xLbcL%+6wXVWH!&-dCq|9 zw>+FMP?`6I7HLqGU_ldOws;XK?qx{vO=hrjcOWpO9Es$zhUU|#h!KiYzZ7wG?fUq+ ztMW(X5Xr64bf48iL`euHvZ~Xt#z7{|0)Zq-_#&7GobdrM5>C7(diH4n?ET+lAv%1arNvxp26g zihsa;?OulBL12Ia<`5{#+ggc$>dlr7^}nO~nnL_%i=#2Z5zL9hUKQqi>T{5s@SP5x zUb3)9zhDh)eI|u&&fX_#%9a1n2P;A8B}b$!zCvd_=lz`op`p79YWD54^*XWbbhtxx z^klL9#v@Zx%axIVj`Cu}U)kSsG=>6`rA)=f(bC9w+vp#>GB{`dI8#oasvdtwFV6op z(R2s;?q6Tx`l`@#C6KRj2I9tDkn#+BXJ@8dYOVo+)e-q#yne3EzIjn=SE_&Tqv&D$ zQB^q8ASOZ@{kkc~jA-C^cl9VU6gN ze9k*)MJr%ZclSeW^Mro<&PBNHDWS>-zXEI$vjs1IMgeXVwp4 z9dMl|ucxuh>1j45ZSZHW4Z$58A^Cd3)@|3UtKHsR-@7RNwPMMnOP0L1XlFmz;P|W} zYX|jzeW;fo=9N=LU*Eo0=NXn`E}jVO8DN4y!(nrxeB$b}xmBStF~5snn79LzMD zQl?^TPBoP5Xa64*)Fbqe6ChssjHV%d6{hWOKJ)^lNKR;j8ERrKaZpZShl#5w!Vdq< zS`c0Z&jOG`4VjF;zhHI>9v`vGdgx7Jo+NN}7${?vZWBC&TPW|6Sj=QwuQt)w+`i8) zhR&)+b8M=nwOP}&-$b`=k}%WDg3uNAz7+bj*Sqs50=?`#U|#c`?}*n$b9E)}_*D3t zyl%cQ$v3fzH__$_($XZeG$K@(^~V2541_}_0#$<22NcVlH$6WoE^;y93#xN%M)Zf@ zJII*9O)WLBHyu!``m{~!x!W=9d8~&b;0S+3Nd+FYK}LxtN2^iaCm&JIxPmNO3RVUa z`oTTpLjGWU$zD9Y30=e|qWVebr4&qfA54>8^HV~QVLDMz7x=trL0Cc* zoh&#($x?y~hIgnN6vYpRtK0Q`3VnWGPYncD>;4&W&fly6=})v{Ek#r)s^qw(Bl?@< z^Iln{L>PX{iLXmvEJ1bssGs+ORTc$GC+AGVnAp?v`(lgfA-#2leJeUGVB0`;t2BJ| z%7%gj@DOnpvwh&SzJ{Ud;Ucod9{p10xptxr7pjDcGlXAjnW#5TA&?`kfiKLH)CA4o z^Ef2L;eA%@lW$rMugg}?U9+xhfom+^V>uRkeqcHhE#<`AA6N!}nT+TP6Gl-K zuLeDo;M@n#7E?YO?s}q?Lg%#WP*x6T-?wHglk|dznk6<|y+0}c9ZKjiY^YW-`H$IM z>`=P|&_O#2tymQLY~xp_+s15~fT?OxrOjutIy`ACvt)BF1o%Un{$uw$ObEOU4RqPdy~$?SRS2_$4&GdGyT^Cj1KF1cOU)E**%;8mXWV6>TP}XyL&U=^Q*C4I#CeB z=C&JM$+Z%~C~ZTt)C&8ZJO>x&62kN*287ouC2uEwDHYPzlgOtiX$I>p6zdm_^5u10 zT*FpZ&+~+|xa~*mSIcKPiK~P8(gGE^lFwzADgn2-x%DiISQ#3b`C2k~kj=(aJ!Sj5 zM(?*KDP2UH)n$8|y5wkS`4Hx${kOMLVxs2dAxstPZDb~7BP1Nc<|qMeb3o9-I$oT5gh-f4&_F zSE(bgls3*X;fS2Fl$bHF#3=)eT+)zgX2ka8r(NB9LB6HOM$kACwGxf^j}|~j6V%9M z@yw;K+osieTPE~;Y-41zbwpk3hf_0i=cCl`+~+`Gx)A@tG9QF$4mA0x8kl)p&IoyP zs;-x>Of+=mO>x`K973Cib*}CkG+`q*LX5yAgv!UJZho!ceU1JScHv4nyxGA|Ab!8q zs$a15*UMb5+brby?-A~{h(LxR*RtPys`8<#WwSM)Jfo9rVeF~!CCF+Nut~r$_v>Fu zaxR!@-R>eUu7%t-G)1>r*6S z;dDBTyQT6OV$oohjsXH;HQpZOZnbLy+j z&Y*z5&UAcii@AEPa~rwavQv^v`0tmbI0Agj%nzvUHG5t$WJFOt>kFN$0+BQ-zhd=v zerxy@7bp3HBqb!$%!_f$z?yA}yku^3l3Q82i**^!3O1E?kW|I`xc zTD5oQEH5`@YLnsM=5x^~zT36h!^w2LrHLLjEp3BqjbwjfF!>H$u1_Fz8eT6_AdFzQ zABcGbAu~-ITX&}HN?C+ryA@9En(58Eye-7as%^k z1Ly;(r4QH=*k(CU{_zp2uwJdY_eaz#jodT$oXZV<9I!hr1P%D#EkD}tl=?s3)8HR~ zanCsI`#H8Vb#hem?RKXUz?PpW2n1Y-Y$?T7LXV)D zAnE^M{mlvn1PL4R-=CJNFP9lniUvMg_kH&W_gi90`*<_k&wQciD$iCE1HYFJBYk*0 zAAetMw#FHSI@>-^mFE^hiY70#bXxt<5J@Bhd*sLpm|R|GA$y*>XF-L!9PrGRCQe{Z zbUV@(HRV6^SFZYv`J$;~K_ci3w@P}4uGy)ZO;{xr8UrOm4su-)QG1rR+EpDpXwXzC z4&D*wxUHH!JjLZBA;1f(mtwiua!oGi3+Y`oh@CmI5zQ5e_fsg0Fuy)Iy(FjU-u6}Y z&!0c>P~cNx;zP*XMh9-*-ux8c_}gvm&5C8kxo~=rFZv_hmq6&b*i{5{P&nq*??@w36W7_Y}+I<G^yjC^aC} zZ{jh*J5mzIVkNeg&W&WOc)&y{9Wly1J&09hd+^0`91$WjHl}So>~yPJ^gtCm3%ir1 zpF_t^+xN#DB7h&cpV-Zn_Bo{}<5C+wi;*6$8Vc*?%% zc3wvei8%EpqAL)vE$d*hS)uw)OY5Y(=Y2nxvHN{{r;*VZpx+RiIuQT6iS$Xpy}NAf zEE~)Gng@0UQp)5V3#K!fM#bRpBEX4;%MEo_M9^1m%F1sH2SeKrDle#p-T{kVH~7Bm z<9w#x(Tg0;tO6-W4avmXgd*d~bnCr|zyiJ9#We-)aJMwqr!usKV&a8N=#QdTzG=Vj zoX`Y$s!|E_Prz4*z_6)il9@TGh6T{Wu3gaRLZmh1j@|UKgXRy zT{e(*<(CWCk3dWC0w3UoJ-^EfE6SSB^gJ$-`|woa_C=PV`=VgmHgJRGE_c?=a8_5f zjFo>((d^pwHV%M4g$(4V5T>co9Kb-16d`Z*JGd;=z3UYD)QP$q^=yAhDl7=WMTwO2 z-GAL|-uS#tx^51Uo=dg%P-8%fs-=Ug{l#?c{Cgd9c*pfXB5Xzng&imab<+agjf}d;Ne~{fz2X|DhUoU2a+$m&~ zd0fs_UVKobz~(Awufc$ll_BgM*fRV#Np(uOk+3&5lIzczuZKd|eY7%w=V{wgc5qwO zs<6imDl$PD*%S+!YI&Rj!woXO)7v}cWkydJzB@U^l7DOA6UTJrrZq^cKEOnXB zDw=Ap6M5OKn|YaU5_w7rg=3mOU_7@*5;;Hwo~HOPu}y1tSn}Im-AZsHZ!djiENXBg zunLA@M;@}ThfaUkPFG5y7HN?=J;>H?rsk&$GpT7w5&a~si;SdAjxZw$#TZ~Yc;5Yc z>;l;SOqqdu=z6{7@G;~QWV04dio+XhquaVGzwsrjA|YUc!*18YynvY2_wk6&@!>@l zj%s7)_^*Z0eGBwW_w*o^cDmWLqRsNbLWoz}=kY(!4I&nLU*G@M1U0{CK!_92oYa4ab>aNww&Z`S(*mH+V)=s*-j0i zg6x}^k-Ia3Dl-lKGC*__g+;R*74PZTuWOQ*Q@R!Z7TgSWB zK_^M{Nt)|+J0R!}HZ?On!Jr>u+MwH3#?+W%z%bl&ivB;LLr#_>drfg!4A-VX@=`Qu z$HZ@;07I{s&k*IM6zM;PO0FV9G)w86e5+YUYbZirm+hc%byuH@<#t#xyOuo^SZRyu zR!$!b53;GPH9i-P6#N;IjoMfNO{J#6ioZ`WsOM3zfpE!fKZ;n@D$SO3xdSm?*A|jg@-qWb~2Nx%jt(jBi@a-wrXUp&tqD-nzNTPMgoUOJ9TcHWOks&PCYvT zQQDV8ZMzlh3&n$<>``cXVxpz2+z6^9;1%(}a9)~$v?jhkBnjMV%y7UA;&{__pXgOV#>ysXk++qJ zyLfNfn6t^SQ3?-v>0LF09z!v>$fugRn`XcpjGwWZ@~mzNniO(81Cwtghj(eENDrTi z{zOp7#KuInT5M~y!FMS(jLgHhENS`$e=%iQL{_Hug=?CKgJacnC^N9c z>L$1Q`H?X? z|Ag=s5q>;H+X@TErZ>Jz#-r@TO0{!bIi;N<^7sFv>7Al8>$Cd>ySe+MIKY(fid^8W>caHIj9Jnjw&6>lEh7oQg9pgda(( z;!9z41zokPoT47CB_sw4dgMsFDN@%dR|e`HYR-q(+uWQhCbC)9uXHv~*yts~$p3-o?;O-1~v3I>}wy6pP1 zCZNZYv#sW<$CQu{{C6(A51`*nN=gF7+m8eIlw#Hwtv-J->@vfzJz_#V;j-&}7ztKU zeC)mbBIHvuI6c}f4*yUul z+s|$h_?n#kHZ|liw6QaCWprUU~dVA;+N8u3_8uo}cuD|D?vwsh>bm z$^&v{^@%hKCwHy`>b7s{jlSsC2UWT+5s2Rpj)JckHh_UD(kGNa{vz@g=Rg;vJPP1D zmUkT`+iUU^Ic+{!w)?`%x0h5*n##d3GG2^~Xl$;9jL8Rx|0X0qa7Xh7D)-o~i`{(u z!V(~s7vreC-ZRe7rb(!T=Ou#Q}GhPJYb@=+(WFZxWcBI?1(MN~P*Ys>CR;>mEq_Z=2RzAOpZ?B0XPGP4Q)^TiBcGe)y#4zUx(A0_}x zVV{8N{_VHRw(4NNZify&mBnpzzEsuhk^#_?aKP7M@B`L-P@tP>&CLzSX=eDzaoji{ z*ov%?MHH|vj!8!t@8N^J`rTxomO~oK?nb7arfjiMW4hxp?)y6y7HL4oj;onPQ>bG6 zDtkGmCG;yf3zxK-i-*X)W~#asO6y#BxS$a#)`b&sV*^lF`%>)MsiI&I*b`RpEemAF1uNXDK5%`%h7 zjPj@UQcTGU&Hg`#P;5ILX+}kB?&Oml zk69Y{r-u4-FHt`ZkiLnpV}}GAN5`=gLOWTH=$?MoR_MFDMkv<~dC3$aKcd(HjkMavcw=-`%_FT$bK&!Yi{L{3Ho|HbF^2Vin^8edbz^$u zamYoB{#{?E#tS3)%u;qo2_1oV7fU`R%+K$rhC`C_fZ@7yY?_ZD@1xww|kRw8@ zmR5mpx&lVZ8(}Zxb@P67t&pU{xkAzRjbpRb5u|yWm6_2d z!$Y^xjm9lBP(0qUxpVbR2-=(;FZrJb_*M{q^PNeyhjToZ!{xbM{No;}STtt6X^u=c zsQ!d#(1NUJvGZMZbKQ+?{jVn>$1RsLg3YUdYA^XE5L}qI9he^$2a}40!gX0yUTX?| z#l)e5w@drYs?E80-TW}uMWc#W#hZTqBo;ILq(&he1%d)X!FXCUZVZTW<|qF~x)aqmAR?nT-s)dMAIBK9=koFRG(F9UyPQG4sEaJ@kN@+^xC!e?fuiF zo%g&;Zw6sO?xaw;3L`sO)Pg)$P4N^wJ~t>c$FSGI`c3Ve?5L*@8GRt0l7f@~NNNa; z5L@~mx5}_to%faL=%kbsv-{)e<|u5owX?-?ouR6q>VmZJ*v=T}#rGj;EL8sfXLPbr5!kiokbBOwE9)KS-94-?s7XIwq;G*d=Pnp435(9^;p?{hNh3~i< zl0OoG8-rwwR2&+95BaoVifb2;En#mTx1AnbL8va%aYT0Lx)@f~s&#^DSiRSi)x)cgt$+SSjVEa^+mt?r>IY?)zyJcRpBt}JR z+2XPg_eY>>u;7km_!FV0sgP~Fr`|VpCd=KO5c78>J#}tYihr&lHL8Lyt4~gqppZQD zYS;QKp(cAn5{J~*z{X&lR4yN1f?+kX|xJ*umfv(R= zd?No}!scUU7aaq3dkRD^@D%nuFdfT!&yQKKQ`>^5B^+u(Sj)6c=QDKWSb)G^ag>ice})gk zGc4g6P3d{{Y}T8XR#ro6KA+|k4rH#)2Hd4Q12}fhgnQcRe}@ADt@93WI=K-Q^<`q* zZRLzE@cw4=7j0_k(`~=SGt@RDb97NWO1ik9c^~h7p)Tjuz068u^P@Xvnys?Xtzj%8 z8B$aKU3Urwa<#fTy;RXATsElma*w{2V?YW;8STS?uivUHfxnbr-1emGIkojN_|QHA z_cMPQAM~ZsZCH7_+%}8(+EKuObiD3-Zrjc;?$)ROpDX}B8l(&4e6CQ{>mdyL*`K*Ch^FG#N+(tD}Ih(|rW47^Uu~c$Kmx_fut383JA) zBiu?1ByMlA9Y&IW$21XdP`oEr(3e)NR0cLiM(nG@D>_IWA`OoRZ>sMiLCM4Q>NIF0 zKS_BS6shxRPY?yhSL~ETb=+eq!g_Zmreo_Jw@tI3O9~%_*+YW-srclMQZ4{;f`%M* zOz4BNn-v3Z#=t!nTnz2owpgFWc*b!G9qzca7#zOiOh-I zhCnE5U_cIe!_YbSULWKlD|XHWmL{t9BE6P3<$Bg7S=^)Ka-cE2tVA|{(4ElT2>kkN z`K>D+?D-s~WEmap{hEwed@6-wrPmk6WE_$!V_=ZG>GG^&J~^YE$t%M8u6FUGqN&QZ z^=!%ikz)P4yZk}$vp}qtaB8x@5}hkeDAoOoR~Js1E5iF^7+J0*?Wj{`%~NjlMxxF_ ze0no)B*z_|Y+r5-wAsm)6&op)$hg4Mo(^RX!9c=t2fzcXv$&8|!BDj^=*4Tq$%vJa zPmTMHnGa@KscOL^YT@)bMvVE;XdboOv_l-A(Q$&-t~?5xNt-#}EqUB4YBw>5FjON+ zh3)T&PGS)9#2h&vtK89blTc+ticM}Cj%6!YdiNm5%HxxZY86Z5@dy)k_1o{S3@tg) z)`A@@ROiBWJg$28#}sq(c}F+krJS!}C{gxrvDPsB^ofwU1zWT%)^fu)MqALO>JQ}6 zeG2OygLD5~q()((G}HT-_f8Q67rAdfHp#s+-sKTXuXTi-t!EzM8> zhjs=2EPQz=a=y|2+x+UF+QX_%;qiHFsCK@^<8r%>*y^>6T(#`Gmg6Yz8uAs$C~U&{ z1TTy=R*?-6;z;dOJ#8)Knd_~M;!{j2n5kjYY0J>`0BcUnW#X37j1U`>{~`ANM|e{S z$Lx|q`zZ`f`OTD>4A~#%(ok38%3q!Pa*R+`x$d`IqxSCx<06{c-h?js-yaLiCWff^ z<_0S_Leo9Q#1asIxr@uA>&uNn^Y^J7AD9n>L!_HbGUj(axUXx~>OrXp!>(h$sGvfL zB@N*)e!#Wig~ATNDN_LH8^O|7s2CdPT!iT=RwoAhmB~ z5!7`g$K)syE{Bba8DE|_1bidlnDzJyC_&w3cQ>s)fZ+{T3Ym@?_Xp(as@Y&ndkqS2 z&B{ICqWqM%o75fn8eKIPKGB4+;;FWVhN2@szKFnG942-r4z=$NF`t4s1RM=CA)+R* zLbMa%c3IYtVSbc5DQpq6Rw9C(jH;JdBQRnM;anQ55Qix|BloC$1)khp-^Jko)h-UG z4>0t3MeH}TCf9&e zuLutvx>k2+w9-c4mBP69rdITF}OnE?mm_6VwBKQsm2W`GI&Q96n()(X*4nz z_>6sbVNB z@xPlhd3`wh4sdP%6=(ad!Q(Cv5&l0zg*_@_=<8SlhFW~vXOt>6os5VU-|&z!+^|VX zg&##ZnBLqx#iM(ww7)%qdN>Wy8rji~P!+t-$@x}YzrN;x^UhkM$2{5dOfm0cjl^hP zYDcx-{<*5&b`CUSQCn;effNs=IoE{clp^kjJ@K9xp1_7WyZYa8SP6DqL4JG8h7~pG ztYPzy-c5OLi#+dt{slafLsnm0FRA6TK362Vhj=c{Z}b@_e7Pc8qRK zSET~MJ>itVHP8KMAr`oTsm7!`a2+JUAIeXI3KAb}$GR5Jkn@#vWM`XabEX(ngo}vv z?q$Et$%!?S;|#cdb_Hr+X%7)X>jWM{((hyNUfJ!SqEQPUcE_JS4BpoLnwn7peDa&r z?2U-K(W&Z}*R$Uu?q*=3Tl>2zABfd6oo+Fg+mrd$k7T-!wH01GhbTLxLU7}Hqklv* zFEPOa(*c{0avhxx*W4nF5;eL_*d}%!HD0g;S-}H?{6`dmO@6Do#aqnM^xeATb(&nB z4weqjUKJc?ywN|9V>X?2Nkb?({{C@KU0GWD$Kwf#Qq2Vk2jYL8J2Hx$fbU*VnWx8Y zp0UrA(PWkd-sjbJ8r(xgH80|qYL>$rI0D(z`F*+sLRj5}hp8x4M)a%x{pEi4X3i(N zCHX&gKPhLnwoXSAg#K-lU2lukip7>xjL1H;5v+t~Lp^hW?J9}xkb~SmeAoa%*AM0T&YL|=t2XamlM8k4cN>7g9D9QrCDgBib(37W8zrT5wc=T1 zp&gCyj`k9I{Dn3-sFaQh97d2APA)AS{J>_qIfSKutm~pPuh`Xbb&TUM#)GT%8YG-1NzMyYN7))cAyD&GpU%=h!PfNpO#D51z%mB~+1kk3d`F5b$ie77MMt3`_lIMe2Y(z0(b=zy z_fJz?UK?F@tFN)d5HXNHg<>D6z>i1_Am|)FV?DO{o^{1m)iq!?n;^UC7=V$0!yZOO z0*5_(+7E2;!Q%J}QUv5cnGjriM(?n;-UdALysx@g=T$wJuF|Wm(lfojj=kj?a3RP0 zTCnLf%>%GGV`+b{YS)2uZDGGMa8bIdQ(IO_Ji_u{dl1~k7S~z zmkYr*p>(r*xN6mA<%_yJa?EUXQgCz69_RvmeLQw(!bDJeke9gZ`uU zxcHKb$txjx)FQ%kHJ&DTA2k}j9L?6QIWt<|%&n)k*lC0Mc{jJPs_}>VgG7VCuLDOK zE#e+L@tTgSTK8P6+q&_+Aa-Rd@egoYUG^yBjrBZIVFM|LsN)vLGpY3jfgCa9f?foQ z3b>-?^7jP~MkH9^8BC<>vLFDI9x6ZuB z^`Y~v+r$3lU!$nN-m_QdBSKA$KN5xYK{!T{j${NYGqkS@e^J|vJc~?m=?O2Qc{t)c z@24~o{Xw@6GI&t?Njmdjs{9@Xt`(A(*Em8Q##w~^8^C`hhX0wn-fgoBLQO&8{NBbh zv7y~dnGj=5eN9)6wC@;>5SNBN`>F~@2Cp@!yI|U z%<{RBddP#q+W7QijF{KX5FavS|W$??{_J_VP^RhqjQ(t-;3KT z#e9zzHyAjBZ{;tc^6_BM>;a)70wf4K02A(BL8TS)!7<2VjkdmT<5&LK!(Hy*)Of`# zT|2dG8b4FpXf^F)&FOm2-K?Xf51z2Ctd(EhQX2gQW>z-Q>${(3l{FjUo4VpY2-@{T zS?_hIs#t3H8ZDnbZol{zpN68&|7ZDmee^n#rbA@0%QBayJZF?t@(jX6RI zP0P_G`zC>MC0LMXjT;qaX&FTdk+axaXRZda0qEy7&D%L63r*-BK7(KSd^6$#fq6;V zOWOW9u*eJTZES~bJ6NB0P9(fDd0yLm!_grS9u$#;K8MRQDhPDytgE1ZQH!VPGI8u04@3OLEsf@EAVW2 zZV_drAmw^wepI)Bm4LxDC#QG=ok(A_vd0R79Y#f=XR%J?$Qjwi`}*#853ctYxk@00 z&vv^Hzoz@l%%_C}xgU{IGE*oj3p97ISupg<5>8>sY@RN=*KHmR1+KmWi~|*A%PyK_!f$Mb!gi_dw-m6Bs3 z-JW71KN%)lz%P@-y)NhA*xG%?%YZPll|E7x*C#{tZl^9d3adK1uTPHk#-Lx+RgYIJ z4pb`}bErGj)ISf>HUmgz*Urz+?M$+nim53*JpE_de@3lo`=!Hi*0ehg$UC%$u|Wy} z8R5tFQUr@aqtrP=d@}%t7_IF3>MPArQ#4?6F6cgAD;wHHRXHs_s$ezcgB?9i;Cpw@ zo?=1yteJhoWsfD=lg+twTa-_-9Tfcq?}c_g_dN(1qye{pJ9RcoJ)ccZ_->=!vOm(o zYYdv?wu+=a6_=GNs@+#M)R^2Oz%|QB=tsd!Oesf4WOupUyFC5RHwFhy2nn6S$pmC1 z#D9kgoN00gL9N*twB>8*2(bfAj;GqGDJ9)!G`zF?s@7m4>a8z~>jvBjSvQGd&I80Y ztw?ocGzd^ac2Mq59<%;1k8m0$M)1aQrRE>cQ>#_6KVjHRZ&|)yPFMF1 z*r|(zG9C*<{-^c%uPMBi07lqZ?(iJxy8X7T0sdsJ?BrOD#w%@VtS;0Lb>vWKCmv`G z_+eh&$k8<_MvJ%bmjOAk)5F1hL;H8&JzlaFQy4K;QSHqd6;Fu%ZLHV(pp8VLn7zKw zZtS=o{`Bm;M8oWPLlTZ12>X4ncS z#MadV(ZTxEhKov1aXUSuuA+9UJT5=R<0(|@RE=!+_a3GaAK06e4uKdSXRh%V|08mV zgn{cdUA-v^lO6#m z@R)h6vh}e=MP{V&O>|LFA~wGAJiYyAWbiXV5B!DRRuh?)@d|O}b zZ*97`Wj4Qw0RMY0Og2ofCnM;JBX+#*%n#TDcxwS-w)vnGRpI21~r z)hGu}W79VS$ukrc;6%`73OcF6ji@Tlm?uX4PBzjwbx=!U#gh_|3Z=vWiyZn>nj=`L zNX41NXY^y%Xd4IKPwdFT+*8SZQ0)f&zOIYt!Jru#C3|O)Bdnh=Z%rvq< z18pr~Q1yXr&j8ei7@%}uD?tl>ftl7 zjQ=>_qe0}f{`9k3JoU5u#P!k*<;tGq@r$Rl4|WoEthfHLfHCl8S8pX|)X}N8fG=aB zhe(T$2br7!IMTqXqDsitlG#A%+Q1Rhl$O)GDY0DC5*I*U$+Zptdj2>3w`$eLp6P!@ zw#n}BWS#KYzik&x1ectlW|;erWxe}6=ktCx!F6|m#p^^VzrvDc36Ta)GEdg>7lUjq z!A~T(R%Ux*dpe@1=j?KI9I8!8^Gci%I+lVhz%_pHqxV|9qIOHt@7W1`lzf?k(Vs4* zdSA@(`!R6bBv(z19W$yHb4pc^xF0!8k%2Vm5 zt~{0Ylec0LOo$Ke^1>WkB3uvR;<&BJpFsV^WaV!^kk=~E(WhRnMI928{Hm01zaW=O z1{{A=kp&|{<3*_C;Gwm}$058})n?}KpOSDRR9SEB7d(Gj_ z;BEz~_kmoa(oXGDt}KlCo$l32lsi$($3rYnTyj&kJ!M3S*PsXN1!4ol5`ArV8A-1- z{6&k77xgGqD(cC$Q6LE3y7aatSx!7?dwR^<&+wN>Mkf!K(|H9zs>nxmA3^SKpK&xW zgU9pJJ99NfXHYU^x??J0{UAspWkA&GYhA$+D6Y9Yj&@BmX8>!e zhKGZfPaE}cKc<(3v!ABO6Bhn|PAYqF@CLwh;~IT;!}wBH*SLnJnKXTUM1&;MhXVQO z4&{%h^_)N>Y;&14i^jh+S>hrCRnAdC#T#dh6r{S>5eQx@WZt5+3wQ4kD|nX6YAPt- z_+q9R}wVHd4cD?=1Km9hj{ai`xNnH&+zA8tv#W8i=l| zpk*3*DB@CcK!%YUn`iJ?-TAvNlGX7igbqMr=t25vvmAhNacUB?x+9=hGrBM8`t5g@ zdyM6LgDvnM1S0AMlkY{!eFD^d@YCWu3u3+P7AlR7P9cFvu!0{Sh~D-%CYxNxI^_}9 zAH6hx6u8yffCmVT-Rf~%EYj&llDG4!qJf;@w?&(01wmcBJ$}0TYrLy4HcjLN#pnR3 zGmA%B{++lCb%N8ri7hd;Dwl6RrMe!fdzc$)z$#6LjyyO)$)4g=+0JZFkZd;Ib*R~- z@-xfzrkxAlTUrQ3(E;Zp{%I##${4=BiyZHdeK7D>*$&S@4$CLqdYg;X^JY>~lKLOT z(qf06Ci|}~uWN{4N>(U-uZBC!6gKijusHL%Rm?hcZR3oL8E{2-9%77fM9Vg%W2hQ> z%Rx8IAMLO|Bd0l~tAxEaqyhcTR z6O2B6CEP{3c}FDa1pyulkC?bw>TyXa{S8l9Vc4Jb#D6B5EfHV?h_P~%sHc~hEknQN zB-H2zjru#A+e=b_=K{$465Cdj6D#Y}+}Wk-HcpdVqq2fD{bt==kJujc04FCWgUvsH<8<(7`Sio=3AT_Sj|&-KLmF#} zK;0)H?b2H*2E9mt9zAQQCZb@rCD`<|yjET9%Ik5sQJCuHxM|Q4^t14B>Bvp@+}sBT z2I>cfJC33gNkW#PC2FB8*0d&Maqa5&#SGSzwnDcMQDDg6b zPhTHhS+OZ6bSoQus4onDGR+LDzCpS?0aRiLtjJ(KE74i(Hm3~1aYk>7??xSH=(RU8 zUDj!*>iCFQoM;P>{!&f$)JitO@PtLK?AK;lckp0sZL8lvT^r^6&K63VTAZ^d`f@{! zWvztsTdQ;aLl^!w+s;#4+8IXsLr=u)Gt4pN?{vW+g^JP=LN&l(I<;hVW*jzA8K`Wf zjQ>PC@<{#ZqfwRK$1Kk`+A+_E!B7E)bj#)u;HS&Onrf9bZ_Rjh@d9X9ooFwc{2`k> zUQf<^ELKa_zeOs2F8#hUX?5CSbG$p78%*C&=DXw|w?K}L&>#~JA>c52W3BXf49%>f ziOtd0KD$}hLe)(6@(p_=`Apl zFhz@eKC>+Hh<(`h%YF9TkyTTJmS&v$x*id@Y)1EdRofa8;TPoGhR+!P{{gIh4gE#Z z%}w7})#X-`c$7o48-HRN*?e zlx1j#j6BaHF5TYcVYVlo+xPr?aQ_~O1J-#ks#j35QL8O1EgLcy9|5lF0gt)x7!Ww- zq~m`B_q@!V2K(_>1@im=j;+YE390@gw2@talZKhy5DMP^T$_AjX{e}bCIBZ*M$8(B z^`d3LChJvZfbD@gb!+9f%gJ4w4ExCmAL4)VKfalmM+G?*0+22ZBcX7SZ$hm`$CM;= zG7Vc`tcgQxH$&RvF zmm9lC02zrU5vezIU3?nw1MBNR%mOlIOpD@!zC?BZabx)M z95sR;M6jQs_GS5NdJ4LBF;>@ia7d^sG)HIT@_RB`@LzQoxvx1GblQdkCOZM&qYDcy zIsdk`R7RBnTkCo?L`yOmoS2;_#v_9J2AW?H58@0GlhcO@7zzF914*H6BEr z7-}V|8O+^*?(x6?Q>J9NFHV(z3Njy(*SmI$M$cZSp;!1qkZJ&(IXl{KvsulK1`%|h zbmn8O%ltUAEZ$Kdr_!r`i#ipJ7<%mDS6?{P)v=`HGnyW#uwDOMwkNs%Go;31&`{q? zZg>WM?J}86lcrM_b|w_j2O6Y=#zX(CrN(hhEnaa^Q#Zwn`ZJ#pwyo==Fp5{>+ac6> zp9|t;N`urp>?u$Nlo?fNfOtnpAs!IgOTKprN4bc9y z3A88A5MEqZY~8EDz^gr#zRyB?;McUSE^=Ccg}rN-nD_-VQ&fqyh;dI}KL5HQe5(34 zyol>!fEUppt7xB~RIB}5#hu3r+~`$VTRQ04<%1(7Q;3F9xE?DR0XsaDu<8)d`MFl! zB008<0XjbSB2Cb_ z#Rq)eX%hZ#&%J-&TEZ>U#7WOwB}DDxjv&n9--(=+)it(R-ixnoYcR67 z_Uf{{ou#MZX#P(Xy~D@;gXR;)zIB?eQn!VC=AOo8&GS#QKp}rv^h0 zQMy2Rj%oI~&Nlmmc&e}DnqJNSKDPOhz$|qO-_ExZ|9m2vepqGPyz$R-#q89Hd!e=1u~w z6)8+ngXzv|Xz*-s7i@@R<=D4Zk?NDlb~&8RRLLIk8qB^mLBjjLv$R&)1DPM&h{G1RL12EE9gRP}tb*AUh!B?Edu z93#K(K-g%hrvIHcB+=v6(OzqVedhywJp(qI!UF{dPjY(JACzhH|19?m;0@U=nZP)# z!E(;*rISs}rMx|4H0vLFRy$o`6+fWfKqrEJ+?6JwP*z6vg|?>dlgkdcy-a;QJs@&scD`4h-b!5qT(6qBe1D{d zg#I1+a7@^VibbA2w`-K+Ht}#O($Mq>QBh4?XC6;kRpRr4DU!Fv|9&C29!o4`pkZVP z@QVJID&eobneZuNp=65uMR4}L1LqR;kUFAE0#bg^mmJ)Qjt4J~r_LxX8v4}6uX z@l^()qB)@i`aKv$8CXZ2;@%e_V6Z0`s-dfyd}wN2&uVwo5PeNv;95IN9aF@K_N3o0P;13tI8(eLyGw3qCYv`gI)o-&-q4pHDUb+dg}2d5vF{RmgPJc%1BCQU8&IK8C&rmVE_w3p!!|HavFK9iA&| z8X*8TGNn|ye$$Du#ynnsNUSH4)PTQWFro8;OF<&QMd`9LaegIAUj{L#IZC?o@c1?h zb|is7AQP@}i9CTi9H6vlYS!{51L*XW4LV*C7bB&r?~4(i0B`HAq+}BicbbXOx;Qc} z=VJ7G?jRLm=;p0O7D(E+)zF!eK`pJzIaqql<?|mgV$)o_ zquhPQ^h%MAf}aHmGsagR+FXt~sjs+=XjU=n4`wjx?0@V3X~#&knQbcd{vQycnF!qb zJZvKtjdaZOm|6vP`vs|-XTy*l-ggFX+kftoU<^>_pb)3|^^;*r{k!vhvoKLPSC}Wj`xLB@*-Uu81Pxud zvV+epe@0rsFoVS)kGA#Fb-nhGAi2)0($6Ey=cpNvM8=7?0};!+;M)G)4twL(PVT=> zxcM9IYtd}ydp4U3pWNQQ*=E%h{yAHa20!0=X(N~Bfe{et=O4-VY7UGnQJ@Fc68}s##;PM;K=patjMi_KTZ$Gt9C1-XKF89GpL|%pp~g&pi%?qM8x@24m8Dpo zM|WZcT55tL!eqbai=9=C4%uy1{}42?o z5I-c?<0w7xiI+b5m@%@;IyXDJj#4$ zGddT*T>$x6+`$`o{a^e0qjIobZ(HnoYW9m9%tr+u!v&Z=u%8JY#2(~O}js%EKEXkEG6YoYBbpOBPtx~TQjFq=l~!Sn0d(#&YDc+8pwcvvN!(PrPays6{GhR-lFSJ zMa3y8Wol3B$1WFTSXI}(Cz9#?hC>miYV%grvEoah`|1gEYyGwF=as8|C!j$03Mniz z8uD4Hbs1+KKWVhwK%`Yy`67J(CV-2h?y?zVvU<4?T6z|kgYMH#DpH`|Wk%k-5(e4m z?-Pz2Mg-(d5D(oOd_Z$@C4S9X4>w6Q84h~ z2D(Rha1;xOah#4c3;KCW?( zr{~ak@UX8So)wWqwX<*iU@1ZSY8bJd>0KZ)hN64M7&x3H)_%UOg}9mQ%R_Mi}H}4v9@NHW~%VQVvg!5^^-p)vM!5axm*{b9xuW)@uEo@H`ob^GW-Cdnd=^*NNs_X`_Vy!1&08z z29Nh^0b%^_1{eHbh%7h%qQwd)M!_7QodZRZOL-Cw%b>7h{Ul7ARS%1&rwlJ~6|W_g zkfis75aW=5Tn^Z%H>G>XyXX(Q$JGwA>P5e22Us}b`$aEC+V9>itw|I@B3)(M#%^`f z%i?KHAatF!wCHEYE0>$DyDdn<0yGWRJ?h%Ry2Q2?DwA

FRYmpO}wh`hc=8LFvy={)SZ(v*|lXl(U{RW>8o))f}7%l%%*z2Y|#I^r6gnz#hH$%pc{>=EW>IBw7aUR~1 zdF#}{MT{zMk=ZCN6kd2Aky7UzYztLg_bWi7_RW2~%(g+IIaRndGf$2W)MD)ZOm#52 zc<%amSM|wTTk2}va=ql);RajqyWYhlF>i(fZ?J@3qZI`Hj609{0o%^2c00~A*|1xH za~N1vM6UF`76J@OfPp}05Jgt1yod*6gMs3vWYaV$1BI;v!|L#$JTx*teDI!U7r}Kv z)vr>|K{(xH^(Q@mZD>G&19y(hIn$YF@c$*mlZLVu1fh8omSUPsUl|#djaA4Qly!de z@vb+$f=I&! zB=W1OT*}A_5f`-}X@oDpNmD^6?0Gl1()FBxMB3y(82l#iI9~#Xo%4KjZDV zWIm@Idj&*p0fP`g2LfTQcwPUjo-!i;xg&E~*#T}%@7SlWc-y%$(k@6cq{)~QCfwuM zr$$uh>MC_B=oBsrC~B21;4U)31Rm#DXOy0_&L((IQ(D8z%#jNMK_!n~lh#W(mK0U0zKxH}$RS6nFmiJ-6?g=2e+^+FH zFLtv-D1TL8mb_neSLqis zJ3;8?5beGXo1g8$Kqf5DqVTRhi5qq;`-1X_5MNnaiBNiSIGuRfN80Pw!wD;Lj<;@f zx~Ix~J;Fboi(rNFDHvrod>g_?SYGa8lyfnHI2$N6<#~}if858%T}qbOv}{Q&Dr%x> zbVXK0w|3(f2ayMVc_!<~i1IV08rP2MR7*NY7vS$N+5`cJ*-r3F8NXSQ4M3aVF4kff z<%9a>fiiDI9!o%bE&ZJofh!+h)(=*G+O1a+j9+th$=y8doA~wfIZpdTBmeV9rv^ed zQAKDL7#XEQRtHWhjGx$TBZKcY{-#a+N%%h!R)wPNRFw6OF}9mRd?6(%XD1bxLI}9) zY8o*0t}Tm52=qbTSWpN8>kMX$+`Y`TmPeb;n>*@M+gpC2+t1QF4XuC&Ke^WmnYVf_ zJy2um^QEjgwyuZ7F{`@;d(Iyks1FSXU#Nw=3r?W_H*izC=o~z#34@*BoAHK$P-e6+ z{vpFQIX`tt@hephD#6@+8c<@^Js41E6zj0RtsBF!Ajm-!YtI#2`+kMjw=Ee-^cxrR zFjGAUE{DB9dovya)ydZH&%m>3o{sdTWf_G=AR>sT{0jfGx7 z!D$j7zRv^W=j8SWIUF9hxZ8#YM%+F69+xVN@9Hvb9<~Kg8e2_r^1I1j=%QxpU@orA z@bDdCa{-)&{@)r~Y(f7BP4o@$f08~=XJ(0C$nlD7tEi}`TplQ(wNf(W$6>n_J@y@4 z3e{$;1K~S|2P1*U7?p7|i>FIY)v76+tTSQG%dCKcpZ^~V;E%t^H(E#;uCk16yzI%O zhRt>@K7OZZ1ES(bT2s1mHv3^_lDlVc9WoF}gEvkfb& z>K3+Nm&}KA=Ftgo&PgNc^Z#?`04?r)paHz4>X@X4t5fYw11Uo9+^u1DfQY{i)Eshl zcyHo{f#gChfBbm}PAPop?FPF+%^BBa6A%9tVTwZ|KuI7sa)Eic*614^jmuta=3A?q zFZMiNgXBVGFD}SW7ui)!AUsM}Nl19NxO%LoJlwh|dCmu&ZszhBMll7eD4-i#jHl3V z$Cq;vusG{Tax6V>5$s^?gyX@2C6XGmD%up{eq|;nL9K>2S4JA95}IiDG+`NqnIuGq zz=Cgm!UaWd4KeUVt2_PMmn5L(0jsJw`Je6rnt|ai7OkxI`2t7jW&?jxBW|siD9Ny4_TgO$4St?cetq!4? z3XUnsL|mym>VPvC^CYT$?=cU-Bx|t3E|wdZ4gbIJzhDffJ9^{|RoKV2usa=iX4AXR z4png52o{5LC}rE{UXT&SC&40WQ2kcNP8oo~)zRS#F2f5`RK}Ag%s>jS_EY&2Kt~#? zoOVQzf)&Y%OrAAegdVtnTP0KS;_8yebTW9ZT1ImzEf5Mtu{T}gvwWn;fw zHvUdF*%X<$#C?jtKT|Jh3$FT|!Zx3B+y!!ft?ZYDgvw?yF@9{yGpq0lQO6qc^ZtJT zw?Ih0BM;lsk(RcYmajTY$iqz3*GwiHzufVXfaVMu*)^D0E|Ji4O3tZLo5wO z1T}9gjh7h*fR=bktePPxfwIOdABWHA!{35fZh&tR^$gVjnR9@2r=hk6e7leunfP?W za9FL|9&=0Cx_I3@t?M zCf=jbUtUq0W|>`pWs7RO%k-{j#3xtPONXe%2|elSnS6BMv(k*SXGS(*k%>MwV_tvl zt?$(S!^id1<6Bf)GY4YmXJ<*?RgJx)v($yu3Zz!xdR~F#@4ST_=i`q*jv!?v`I-o? zx_GfhjT%M%CIWQuT_l~iiL5a&G2`Sx55^j6^4M^r4Is>I1~_L3Y_VE_x`T$KD=)V{ z+0pON(@*cg|L>?aZr(>@L`TtimDG~s!)^A)`}eZA^h3wo2i+l&VfWE}V5fB9@uyTU zaUA)bYS46aYx49wm6S|Wer}##d}g~&VE6U#_Zo4Ozo;*LWh`N2i3Wva-Ki%abE~8+yNbhd1!AI(ayJz=(T4KXvm0i4H+{ULcu+uafldg7{G$Gh4FV?Y|v@4 zo_Ac>ue71l(QhZTABpk!wlEEgX#Bc*N{$yvJ7F@R^5wS}wysT2{9Nb0c%S_B9SOMwH<_5;)(q-a zPCL{)T`0LoBCmb9MKwUJ-p~0IHhDFAWU;` z5=fa%x&ncKwwmFI)}D8-y&sMbql@7?3%V>|43VwSt^}G&@6ik_Tw~A{45lM=vew4J zNVHg;i99D zK|TXBJ6@F)<#b`D37Y0HrpgV!0x1UM27kl`8EZe<@jqC%=7hfWUpHxBd4_7MhwAsf zHc`VzhT|qe7%Z`|bG0i*a+BoZ^#Th68<&Ip#FCUy z{OOn5i`0KjxT5WW4VJX;egHD(&qxPUiwT*y_|_phdAv#g{lU$869@V+ z6Dm=im#LTpd1hQ3FWx>3upVK|7l={c@K=8kf#_Rn-21zfzKRXQ<2|T;5>-5o?Rz+} zt@1mIW4Rcl&wl3zDxN-5S%U`#=Rg)On5?01qTdX1oMh<)d8A%`p+#Fa5H$opi^cbq zW7<@xEQhg&*>gTA*eAvhpyRZcPNWq_Lot9yYkj%@cgz7oV~56QeJ|I0|3@Y&rVu=J zn9iV*hZy(~WFlr8Ml|tx+Ap$*U1Vb zf8S@$oY9Ye{9{a#PH5`XshTxw7EDK%X3nZYcLmgG|OgE;X<_d*31M8EnlPf!_Ua{HyWP@$qU+P%Y;DJ z15+4Xc0E^&{sy>4f1Nz5PR!U8a-zVRV1{*)HLk0%i5R)8NGNRok2c$su^y)L=87^L ziWxOgCj;u&w;z5jx1j~uOi11rv}*Mt@_f~)UsV;Iq{?Sy1yT&i4gRFfeAvlt!^UPk z|LhT!W&-fdMH(?;kY-^5RK&*KkePv$!W(c)zaz=Jk)7QqCCW*G-Ks+dhT7pWZxN^^ z&#w41aJ{2kz83XrxHI^{i;#cLr;&wPw|42$pmsOB_5d#J1rX+%O}#F@wLz!;6TP^N~$xU^^9#9#e^pZ;b|=IG~?Dc^==8ixB7Rp!)aPCTQII z?KV|EwF0RX_>`_dwDAP#z=fAzepwGb_+S{R{XXW+n-`AFcw`b?(9sh^{Qw^CGNA}Y z!5Eupfn6{Nj+)hl$xa&B?N0~m=XScAH!T>hy5W7uJ(8~S%3RgdmhsBMqzSq= zs7r-;#d`Xw7211Xj~@QX8I<|$L>?PU*jw;9ryGp6{a0kY5XqxBhWQ8%?~v^vq+)$- zYQ-6In4OE{>Wb|w<&3i=Q z5sjc`M8MJgUm)_Fm*y?Vd^lvcrX)l3xtjxRHNJ>H5_|R@BXLmY^^6PfihvT{|3m}cIjx4 zlobyddc`ndKLAJ83<8=K2%uHoNTLFdVs^^*uP`Ts-Bnk%4j~|5ZtC@&s*1>@@aU2MAU`wtT!j&gIi*@DY4|K+Ol8m7xVqOP7^DL|N zc?Q)3Gsz1wLJi+J32`~2pL}n-#!t-Bh*4|?m^XhsAE?{ZO{o<~t-z;y1r8oOs2}{` z`(cnayP7s_8p4Ra0q^Ylk)555>6G(iz)Tn)p(EEq10#&dM>@eyT)}>Su4jJ=?>al! zSlf{sVR;DJaS;48wqzBwX~HCY3{G4`VDz@qhL4Y!3>X+xC*j_%V?_BlU9VVm9ciLa ztyueUzDemsu_~E8Tk(>Tz$AH7+*90nz%B${IENeay3nE*6oKRT?{!c&6SJ&Ilk+fp znyoe*#-DonEj{*1ek%a74XpEX}ah0LkJj?rRQ;s z-?(8b=3q-;fG+8_J4S^-A*C5+9lRuHAA&^zV`ptG=s8D(?~Nj<$cO^+pV|a_wu$LdGwcBwtTrpjvT3xBSu2Y6MGHrPL&&X1>SvE zcH_?ZGc&WK_G8oL<65AOL9s6g6Z7^ML+t`TqV-xD=i<&#Dj^uvTm@Qb!WTuMR z%r(h;xK}eELHgtt0)g<=PoRW>`#JYoAv0KLXw3ZC#0`3(nR5%Za#g8zY&@iAm+a6T zulCWP!6Yk$-}1VAl0*IkRwdO%Y6U*CD-iIFAGAa3I<)LdFTEVr;`ZBb*92_%+cCp& zQdnm>j~vh)(aMqgA}oCOg)>mFNyU^010C=su?^vJ2GZ{gB<@`u86*Pi)UNH;5`gDf z9kh+4p6G%Bq4LOdhnBnhQj@wiZwb^R=cc=qzvy4<;>uNOU9(=X@)E@cmaF-(*LCp^ zx2Sl*JZOV)*BkHv{}E_$Y|&A48A*}@u7J%M>4aNH!<~gcUuGG}SqtO({clWHL0P6= zdU*>bReSVze|wU!y^D3z;{MRmPVLy%7}{>SWUWFJK;-PjdJP|0uHv#P6%neqys}tR zrqrNOE>?AQn)1+ccmj4}cbX~_l%T+&-*z_nX6Wihrm0{5f$G~oS5G|NuBESU(0}`f zU+VO^MY^YPjwVelRb_v=417a8Fis92la5)N=M~L3@mvB>dzhTFnC{Co)8<=&%m*%m zbFPP+y-dYSj5QhN-OO5=9$dr$ebbg^ZQp6es(?TQc|l_XiR5npp%n~ECx1I3-wDh} zXD81NNnK#_XgmkM95Wmv})?BG3zrUAf759(tH}Y3U>YB>IL4oxv>Zujwt4#JTTZQxZ&2G?-{WrmY5G6Rd#V z;nPe=_=4}8(*#Bc6h3iGdUNdsZCZN}4NZpb|H3HMV6tRq|DgRy4(45kklX;g%hw<6 zpFfFL_!ybG6 zHtugwM%_de{?%WraM~2*kHoK|vQkI>xj@ICds4A}eP|0j?x3AJt<& z->;`1J&NVmNnN_MDa`dE+KJ4}Y#h!nqVcX}lRX9D8K$>G3(1#~frC5Yd=c8fZ!u>J zv*^Ps!^S)fp^wdvJ@&>HGiqpv2>V+?gsw%mW2V*r76OA5>*eP+==tZ~(y7zk(D{j) zcT->Tjby?was%VF7Ab~+G58bORM;j^Ndc3Y4g_nVW4MkG2ASI|6LT@W^&{$NgMndO zaeu*!cq!1eE}ZgD>EMB8d}9ux2|B_Zg_vSxFn{zNWfAk@cAQ{1ZVrg?#PF|)VIr4C z@k;73ZKdE zIQ>YA+x5%+Tv@E1XBJ4l97`NY9Dr$%F2!_g!o*5VoLQ^A``^aFdkYS112le8iHb{* z{!rJZuD-9!4&7-cB+R9E7lAs`ysrg{c2(cKPhBT5{UkXJ&={_9GoT(04dme{ojC4D zhc+~7$xHi{TZGD;v3jFkTmq9v<;V=#pd5A7TkBz>o;>e8jF0=+;Tr>i3dAC;n3s{U zSe0+77xu;o9;eT$(7qiLb#Uh;y|84n#y?U-FoO#Gi6T?2l+^0uep0FSQ!DWCu0T@w zVa>*)k3Oo68#jgy@3`X*jT|*HXg#d$F!Nw&b+8Q=JEI%ZB2&_E>GE5^-w1?_qmfCk zafNHXiEEa37$3b)ZfWkof398q%Ze~@8lY_GRmXvS!I(DxkH4;>xpP%8d4jU52qI!9 z!2slGn9fee*vVMr4K{7{8?1{jzpl35dO%rK{X?*j9*j!huVI_s6R+fuL33lfH|~Kk zNF!u=x=Q=Ru_CB|Ay}-w6$kb6ADlp9kFQCteMgd8s+dYk^K|U^DSiHdshT}^tm61; z6cJGn!GCa`htFW0=$Aga(N?6H9tR5IkR()rk;u=D!^E@`X^Vu2n7QQ_N#iD#sH|im zA>51g$Rn!=*Sk~y{NN!HH;&hxcTG|4AaYCP@hsY5zPd7%YsQXt&2U6{w-7e6&RCj3 z_i+pl#0ch*H86kX4FoBv7(k3jh|pgAJnHLlG(X=;LfU3++)}S6pIE8&>zQ{h8RAn2$sH z7QOcBYZ^LinEKN7tZe(gZ%p~Ibe_UT>P^u{@z zYiid`_m*nPjD9L6vIvpzKp--c<`hM~3=n{z3g_04EGa-B2pNh|I*HVYOV{{F60K`| z^&T!=qkTZX3o|N9#jMS6geXg4GEpm!8k?uPKQ~l={_oan@18S35;J625$bK{+<+jW z$~L=VXTAJf7?7moD>)M8+tXu`8A*P}r&rLgPkcCt%q5Vj9K-*roB*XD91-6WU@k5|I6R%B>K6y3~ zS@#my1;{Z9Nb(CK+gHn%q_*k0l(l3OX3;V56u+(fi3 z0M*(S#qd9*jX)Cc!$`y7+erc2F#)!9S|)*GVrXZwtl1|zm^J8whi2$2U*lPz8T$F7 zYjm{!i2mtYt1(;a*6)60h6doTS5S;T9@|*6HR+g#+2l87-y7!Vh?Z&iOIj0eKbJN$ z30_LpJstdakgM}pRyCY$*UDqJq9{t5% z{6z@MJ8jwwEto%_xjXoc+vr7vX)aZ6j1@>RAUDQy?3o3>)$oJAh$-rl*G^*s)PU5a zLe)5A&%3Ecb)(ajlV{Llb7@s5cof67GyJ~82AZa5gTtsH;5Rynu7{4i0e_d0+(^I6 z*Wt47j+*ZcD%U=?D%gNYE_R#*k&59MXeaN!L>`$kD_;w59iq(}_v_im_h`YQYL%3g zg{UAg!T>_b0#jg(hyky64?W|1$HnC6dTLy8U^3CcA_rXuWAndg@#v3nT1#;9r1bid zLwe|^YczUjAI)DhOw(qe{V21QJwF<7W+pZO_Onf{iT{`& z7M@=euRmh0yq3d8WN6ClK6>@FJRKrw*0WFVCL&oCPL=kl7K?q_D>SFWSjesdVn1VqZj9mb0ytGUO z^JeMd_y3t|wOortL>HDVSIPW&3E>J&_bL&FCbmP4`sCd>tc95a`*wJ)u`pJ69;&tD zlbD0XBQ4%Qy|XGSD*)%~bmHW$z<}iB*cT@1zz+8e7qhB1*6AXQ1zP>IQeH>_?HEq- zU9V}k@fVFn3?{(P>+t98PD%@tk`=d^S`##|K=46oy40?!0U1QX8lgh6&_DV3dTm&@ zQ!hOG26;Ie^@T6a#nie$@GQZP!x`5zVK_3((LlF6BCjFjioRev_-uv`I(Lp|(A-4; zfG(|BdO%BG-KxEBpFtagFJ`PoZ3qNw29@EEU!_rFhK7ia6@4=?$33JU|7exYoH?v# zp6F60{xg>v%Qc3)Ed^+8%+SDkMf@Vq$TYlz=#p_FNM@o*tD-%dUfp@;om#eXxn9KI zsBYMB)z(%=iWg0-2MdIAY?&pJ*-YrEfyz@$Q9gxIs)C`DK z#>VGhR%PPHMt&esMDD(SVsJ*^dhDcr_3UmmAcdMZ1=9c!+`yWF1gI6J#W_NP9cyyP z48NOeX#wmZF3IbOBhSu6z@_JtN*%Om6I&BdFr5McMz!s}Oh8(iW7@K%g{8qz0WO{&x;{=QrOq`J zwj*_>H}hdAjj9__gKtck*1Z+on~4K?62I;15XQy0Gtt<@@k@;3q#cdh^`m>jJDLI$ z96tjqg&c{?B^_a58-6mK?M-N4a-cn?HJvIdOw;09`l^5B96er^s|SCuRBK<~uC}I3 zoj)^H3vaG~VSwSo6snB{Zf$Yf^vHZsq=fOe(Z?mstaj{b)zT%qwR_tM?rl~5{^L4P zk1<qGZohpZk03+k6*(}6es&^>V695fjDPFDEWtPAqQ3vVW!krY zC=T{xSsVL)m{Elb>2Bd~2HMHqBa^jtAOj2K?2tZt_H3Oatkw%KiZ2lKVEWYQDl08T z^OYCYGGY?F8mV%ltU!tZxlx`Z^N2t+rjt0Oz4Y=yZQ8gS;?RL~VK_brm8uyE@~{a; z_5iryKxoAGUNed3-V=L0!kbURL3F`jl{|HwD^J3e_x1K3+OmzXiGrCAFe>cVLpZ^1 zl3sOLvXTX}QKIpa2kO+B(|YJ9O98u5RNi%j7)I)al*L5RHm(LqtD3JUoI1?8r7@Sw z<%xE(pkA5~R+s+$jp>1xEi6r#gPrLdD%dS_>)0`A<%+{vz48bWoPHWNsRE~Y;<*=a zBNORtX%6Fw$DyW|yJCLUsf0${P$&U#ue_A}>hfn8!{yTtbJX*=!?^6U7)Wr>sDe)p zlg}W}in*`Bb(ut88Av4ieu@|F(GP#HU32G-W}^ak(tC0rW>BenQ!9{Kflq7&ylFP> z?Ay1mC*yhbfNI@~`PG1`0YDh0H24j81D+I|xV|+Z$qiz19Xd?jjNJ#QnT82%LTCovf(PIpP#JIv^ns1|)e!0Svug>#e(OSA_;3GN zu~8F)8CKh>CAzp_LtsFt(yR1tfxDBKO51jbkDx57 zAWp6%MG>vI!c=-nh%!l=7*7G4mj1)6+0i8wKsIQDOrc!p$Ic<17j^9`;fPXB(3=^@ z2ZpFp9cDtZa#3#aij}K_=+6_ca!z7Hb$Y1&D9L>RJ#^zsL zU9Bp}!z>Ismksd$ zU6QyMK9eWWS66)B>(a-1$ha)6@`l$N-ftJ>nqyAlV>nQEqeTdEfDJ^|% z4^C|5nmw;1gfzSamWCi-o=OtqdkxrawlpQ?nOKhGvRu4~6zT#DNSldWv_vL1@I@Yu zI#F3$7#B9`Tswa*rnRds>8-a;s)3FdPZ+A3ZW%#zE|1&H5Skc#KpfUK5E)ZoFLRw;p?>Ue*8G2o;dUIQpCXs7IP=FSP=x75KPTAjw3$@y0qr@BRvtD>j68-W4*Q z8w2bc7U3|s9JJ_Q2Fys30kLV8(IVN-wZ}F7_1}F`wc_HRjW}}boTRZHzWMKO1l5Ew- zZrLR*m~|yI=5}niW*J5!*i^ZK`}3X5&Da^y7P73vgmhxI)rHSy2J<%)*ol{TR+iTy zF7odZQL9^%Cgo{BztI>g=aH;%C7OtXdgQ10a1c%G_WOow`~)`ptnIdKZ8~(|xK5H& z-~Zh#d?F(5akay0GKq#0*PXy9ATpEmM&9actVscAqI6(JJAP6Dxj{zj#NjsWBrf?Azu1Lz zs)7g|WJD)IM>h7j-PqdN`HzNrM(rte0{VS-oYo+~wF^5}1AmZM5jJE zu)y399MB;gjv&&3B+0}Ae?wH{nE-lBD_8Hw0sV+-ss?NByiwS|7Gf(*HO6ZHkdP?R zj)y@8g@Nv;rg$}&KOX_)ecDqZ*mqp{j7&$l!CACDFKD4E`=#T2IYb*boz?bjXY^

xpOyC?1#e$M~xay2J(fN`V_PAMEk+! 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�o53x>|qzSN}PjEm*WzbLK3<)F&UD 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� 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 diff --git a/website/static/images/cpidigits.png b/website/static/images/cpidigits.png deleted file mode 100644 index 6b2a1ad48674cdef9756b12178c09cb786d7ee64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59194 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 diff --git a/website/static/images/footer-pattern.gif b/website/static/images/footer-pattern.gif deleted file mode 100644 index 5bff427841150ce875124ef2df97411040083e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93 zcmZ?wbhEHbRA5kGSj4~}s%$8xVkE9=>=T~o8 - - chart - Based on font-awesome and made with vim by balthazar ;) - - - - - - - - - - diff --git a/website/static/images/icon-high-precision.svg b/website/static/images/icon-high-precision.svg deleted file mode 100644 index 71651cbb1..000000000 --- a/website/static/images/icon-high-precision.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - high-precision - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/static/images/icon-layers.svg b/website/static/images/icon-layers.svg deleted file mode 100644 index 77dde0d11..000000000 --- a/website/static/images/icon-layers.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - architecture - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/static/images/ijkp.png b/website/static/images/ijkp.png deleted file mode 100644 index 25f4168314325d47cfd1a3a78c993fc11150646d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133201 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

?Q)&k*Flohb~scaT3SRgAfvpe_PbM*|4rWqzG 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%0A+kD0&Bfw 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

*JiQ9Rd`zB^~pH>%)CD@i;6~xJX zWGN7x@TPY=09>7X*J;@t5XHW7R60a>g+R;WL%t#7Da_`V2@Bhk-T_~){6Q*f zZ$pG8I53R;?D98@-C}Er`R2pH*E_Hv!7}?_OG=d_-M?P;NSc7mb4+L7l~E^-_ixqO z)ovXsJ^6x4n^x(qixBuQ57kJ0=`rTPxExu}G|1x>b-wFlIk=fAXTqMI2sdZVbfdqn zDqqwsUgZ)xHrn1BT!al>Z6aM!?R-}w9vV>=gKWpk(vP_zEcSSu7`%hf%o#qZvcfP} z120pD0^PqMJbCE4+D`dLwH#giA;>djw0Bv2cM`h9$yWHm75t-+0!A{j-#1b9Qh)TE z=M`FqT$69{j*aB2mOn?`eUjN##-1&;FNQww3RkDg8xRtg-m#Y$0dL9XXV>K!c20-T zKR9D7w`QW0CPfRIYs3@p)TnNDz+xKhGCC4mwNXZ~ybM`1@EPf$lA5WKSay`GcbEBg z2r-}TG^fMySi>*uT%BX(R*UZ4z^~=2c#^s{jC+YDN`E)s9ZMwm6H7uh5}JtZTEe*n z{0jOun}HbLiCjh#DjG>qy#BrZom{oTZ0E?HbRAnjv>%J7&x^;aAns~wi;eK#0S@Q} z{kSEFHD|kKzgs42;&i>Di!T;J#J2p`#n8rsHsxOO8^36~yVuV4v!~d@!OOPfZd^(I z@Z9WTcoZWu_k~zdZ1^|WHOvCug`TaRw>_|2^}E-_s7K?wncLfAxx4RQ>SmeW!~$go zDNqQvffj^bVuW&HO1On~p1vs(uqvdsyUpg&q!gZUKm6S_VysTLg!>WV$j?G^Qpk6g z&Muofk>B?hvPeg)KeU>#RUpglrB)6`{7{l4$>D5_tHjxIMj zeBc&GP=F)ww8Qo@Cly=0luq+GI0a<_lxzP^O^+s%0js+{VP94$V*|NTrriPuhc+?? z`SVy#3CF;cv{s}t&w3{lhy*^FrT+p;yolwZrGbyreYnXENrImp{@kHbW9HMC3X$2- zt}wsLww00AP1&Di*{0ni@F{P6e_@bEP;Qy`faDv?%uHz<;(-sKTa9bi z^J*dT4)5d&O~I5T0jS6zkCiv2o+#Ye8J9>J_^vWF!P9r=s_|Qd<#D*R^!}D>)TA>H z_sk`iHNu3Ya*inQ`F&99fQC-Sk!iJJB0{CP{&4!I!4Dv(qYrovEs*)B+1~!@I{yU& zF7Ak-^1j0pVHJ@Kh3ulr&YCPFTfR*?ut@s2ktlqK z&#F)G$Lx6o8D$T%!b7=jCFh&0jGJI*=ed<1iH&=$bQ=_8zk2R~pFt*=wL-BpOR_3J zplaPh)|I_ntEqbf{Q#KvAaQa-5vWL&yDLwZ6nXZJUR$TP)bwA&QCo8~3&DrpDUDcl z6rO7G4XSS_kM9*T>2?=*adasNC`>=5ZSxDLKVcq|=3AeU6)rgvAAo4*u!p1ILVi2* ze9Bun-93_UeOuG`<6%BFfxO-;!qZ0(l64t0$VVDycHiT;D3F}(S*4s&n(M&<2HdQC z+|0q3fJ19c=>0)=v>bPzG*?QuZ2mqg>gH6d-RtX(-F#Yl=&iNK3B?VGpscKV!*tud ze2STh5Vrw#rKe}|8FTyS6 zaA8U4#fvV3yhF~mZCVol&n!Gj7ocoUD<|?gbBjj7@&5D=N*8LVOtL9<>1v<7Z8}Qr z3NIf9E^;h2K%a2!`Zr?A#_q+I=x5RvUix>Inl_zDz6Cx#y5Nf%1dLx4al1UaeDMO@ zn-``6@H>(eLJ0lmYz*PHsZx!Xghm3LMA>(Lq$3b~5kAy+1V#y@^b-%0ZRExFwr)nL zrxx(;?#;KFOy76~9W?5_ty++6gNnJ`T}&6=-Jf}x9JzJe7-K|`#UTixl+JYu4t8x< z>fBB*YL|gS=v=vE>jEg|SijX^YG^X0cefg<3y&vNWVH{5k3KrIHViL+WBl><$h+k> zeb+L!aEgm(c7zMEL`r>p+Fuwl6M*j^Vipv9&mxAB39$0Ip>QVWmA_-L%^44r4`u1U zD^o=k#QOQr7`!yY_46pEdh5?--{Sg0rt=)QORD1%bD)4(X9^67NZpe3kObFA=`It(x|uL(GDb z&3|?e=9VK;E$>vdP483%G7MPJ1e=n2hYU!!m@CP1y}d?fg+{*oS!c{^{)UgDh)guQ_9@?_LP%=|O`FT)g!mKY4QaR?+FszFM76Km0ggqzD~Dyd8%oZx?d=}N&B8C_HIp3Lgbh?W#yY=kM)eh-ugQfncQ4J-Ds)| zlUtkwPnK>~Xr*DVybLxfpzW$3B&>Ug`+A<%pJrE>|MZf2ggjQ~eeyM@UX0B(SS`BX zW4t;8sP1g>(qTQ(19i)WuCiBAvJz)uX|>)7uYO`rucR%}ZcqJrDq=2~b`TK*+{Xp6 z{PRJxtSdH}8G-gZ`B!aO!o+-9v_Rf5T?a%8O!kJv)L$TLBBNa{N|+~#RxbLE$MQ_d zP~|1}TglA8^nez|OxIuHnwAEA%Z`~mVb;3q;yrt;7tNJk@~gf1n7QM&*cVzNW@k@u z0!Xt+IIU3MigBfQQuV0p&K*u!j!%G9I8J=0e&RvSjf(V>B}cmH055dK2|tdyn+)BT z1V#}RHlo%Jfv%bTf#QJ5N3E7NwaCNbUrdKuj>MgvBMYO2747$V3|@gp#dZUG1N&(w zf7L}-mb5;fYPO|F6o%LGK3QK8xd%X)PF92@&Z?8Nz+`?Ww>k zE(!nDnH8O+RdnL1G_LT1%h}$ z>YQEy+>pFRxu@9e$nBZs&C%6vAb89NdrFm`Y_aO{t;JUkM#{-GzED;jTVvJ{^A4)d zk>`t7J#gOr11WVAw)v0h4Hsg?n>r%$cogM>#`=op1v(~&wDObKNEQ0 zn2YE*TjQ)cXSpHQJ_-L0rnM1n+3UhvZas=`>lD;j{QYO_7N>6CH17U*A*FU7sNPpHzC#6H!SS?%$UU%ynD z)sRS#qW9NW=#SblugLlMy84PpkXs4LC5=s7*EAG6By3E$B->KJgHGE@A#3Zy=z)%7 z6c-#?bd$4$=(C>t@7o`dDtBDwE11RFI`{ruxxUp?SeWJp{dHE^LCyRtD7Kp{=#bj) zAx+H$9CGD^biqOmtO_r3?!`dbVb_rvybW1O4g1}ca^{+zP40p*y^1-Szy35rDO_vi zq~k*$p^v|jltotX`Yhs;9pUx$I2Kt8rB##02;c8&kM*j(>RAp6+0nH1c~=i_H?p{R zfOW3=NwOuumh7SDby+fPo_zDKIaB2=YIon-$6NL{n^%+~uloQ}emm|)u|xIOwrI>R zl>?1Qe?~{AygX&epI>}m;svT6BR#(WIN;2Y9a|csgG_;Gkn=OuQIl_JRcNz3P1eaf zxA8ZKL;G}qpO;jwYnftA_N>(llM_@LZYW;TWxJ@4EebO~SWk-}Pknxf<2)A?6&@H( zQ*VfIh276&B1vAJUgqN`ewLcnZQZq3dWO6_kUzS6IFSh5jC^`nV!rXtlk+sC^1fc% zNH03L*yB&Z9ft|77t6%dz@Dd18^e4o~DuJiME-Um%F+qLD=e?HC$FJJW8 zKiogJVQ_Ca{|Y=XaAfR~GhD3pu`5mZ#xS0pdCD4k>h82q8gGQilhEX%X*xZJSYe4d z0t&twcJWzNSoe00wQ2KaTpdFGu;BSK^v{n>GrF&}8#@6`enN`aHK9Kdg)5I&PM*DH zdMI9_Q=}SKPwFjr(@qrf)FR~3+XyYVGlX1IY#9%7uX-+D3jG|hx$VNnxA?2?vGf>}?%TU#FuWR_B!KA;1Xs{j z&o;oqlQoiDU?2_RVfNORQnP#SWP^YRMFLZZJ9w8hT_UT)H~#j?uEqx6-Sk<9cTFTc zji@ha&>OS<;!T5?3cKc+68lMyP&27I*QJuO*YArCF?ZiMKQ4PFx`&A=V&9|OLI(6Y zgRyk><6`+Xv=RcZ{R@{C3nd)yUSyZE6|Uq%W(itM`g~_;mD!sBenIX}xdIJNOTC++ zc2)U+9O=qf;qb{kqH&hhoq%WT2hpU$_VT&UD2XM?*6FR-kVyMm~$~=|xEo2SHkCDL}k=4AUP4JGNu*I}$H_gwF{? z{@7(*Aa-1cfg6B7-}YkYK0ch_3ko={;ARpfOz3feXG|ma;#j|!pKl}Tj;u|aUy*E|Yn^f3!QC8-q102UH&g{IP#@pKnY;>;w~Y^{F(;ahIo zP&^%h$1k5qrjah&4`@j(iZE?d7$jX>U8OBA1g(y)`~fTdz0!CFlPt*tKVGzzGP zD-B7Z!VJ)L%*mvc$Qdq?t$>oGv0tD~|3+2A%KjoiC_- zf)Z~%row1;2Aw@4Zok3V8s8=l_OHOY`e1^BJY9;FqKGk~ZuE*09dGj|{=VgexWDkt zmJXMo89LY>vD{u7)ob^h1YcuCWZIvY)WF<8UasW3igZ55m<8SXDXUv3gkJJ@(yP-u z`8^Jz*9UUs{lyqZrH2!qz7(muO0N=!u$D8_kg?x2A zeo=3so%8~ROcsn0Oe@*BW1+IhUyRhyjc@1zKR3!u^&TeuX0BiQJAUij`2;Y{ zg0-3Iog~q2NchEVE4L0HD1@TF*-5{i-9Flq<{-A6KZ)snXYGpoIkzA`j`EnOT^t)PPSmnWSnJ%GV z&7#Z*H>>Sov6ghUw+OjRZ$+{wcwF6($D(x1^pjpT&&#sp-ne!yGPya<+1H=@!oz20 z*MwVUtIGjSVWth!sEGc>6Wk99`1np%<;v8GSu71h_d6*gdrw9)OiX`)I9>aw-7g!6 zLX^MZhA+s@W|tP}eh$CrSgWnOpR=(zOP66HOX=AYnloUHJDNdn9LrugOZnvKOJYDd z9ha_OjZ60CC3IoH^_^j!#G`+xS8aeBa)4;>QZCP$aG=jG_t=IDzd3BiU^tSxRgIZ@ z6LNAi&d@{={ziw0lGs#xrEcrH(QI##%v{X1Q~3=5(To6rZObD0=L{nYeJ;_D zX-IZ^+Gtdf-n4b5{i!;~83;O9+hLwv1Fcyn#kg%BxCk3My)WO>Svs%kM_(H!2XZ&A z_IVIHNvkj{oVzH#vx4q%BI@+!+Laoh`IJzjYz)?w>jf4VD`^+J9BauF|LD5%Vfd(} z!o>G1eP5j7yy_M6(DchmvizFq#OF8C_rAtYIcJ^1LwAv3Ni^1N?Zz;>QNZNd>|x@yRzQ-~)$J_XlDt%t z$V|F&^}Yww;;Sw&N6$at=9TjLsQU9dN|Yb&b!uZYIEqC`Ss)T z=GJuRo7Ti_+CVsrT%U}y#C|r$rd>3Z9PD3M8VxPXjZB`84TjgG>v}9XZGf*hvuSNE z#B0_h9;`6rP&Tn~s-A~)W+5vhn=}+wF>schs*k`>=ZS31{Fx)NfnE2)YQkkWf?f8| zhya|!tEBPCF z?ln7l#JX2`|KSX6rU(NwJC;2Pml%m3FBr z$EQ#4su1z9L;M(=ml#=d;0OC})ijv}?d7KxV6f_h@Nvw#-ch&aObcCxMm6c)~Y*vPu{weXO@xm^@@H#(Vihh)W^+&|BY~8}m z!;%HfWb?X<80FKPBU&7V*FnNM4s-B6o1RYQ__p6ft;=e`4zFIjt;uGxGWdQoMH4ewuT^OaZIOj^i>?0X z*x0#L=f{#2BrPnA^nu7^) zvAC0pD^A(1t^D;yXP=QjRsML`N^;}bU~wt;ec51ZdGP3XQ77M(gn8m)b6^2fKG3Vk| zlsq1C++tkXt1Yb0%DD~?VPM6)FP67W5xuLl$no21gIrclwLuY;kt@EL8@M4CB}UWJ z6lDf}{%QF+nTW*>H34}%XR{^o05UtH`%CHo*`A6f>8aKqI(ht^TxGtC^G0=ss3O3er0YQ{>Nnd(LMY@GIM7jGWpAJW8=MSXMZzuLK{dYW4K zNmr)h(w?tWTp#DoeXf2CS}SvRMwHvg<21lU_kaguwUzLt$EC`{)TA#l*6?`IAv&M7iuc z^usAXnAAw9q9?SAA%pw#s4jYi^>1gUIlKX}jL$oKRG8`1q}Dt+$C1lA|n z&&4SQ6&tG`SUWa(m`b(6M>3qWUM@HRpg4ApGA<6mXLx!{|VVCXq);{HF zU-r(qAe%Z6r)%j5B1yFSLcf)y(d<=`^jz28ky!eU^9qtvfu5$@>EmXc1AV?h9wo2) zn*w6ntWP|@xC31-mLj#*VZ_!!Ky}FfL4w?d4-7-6rZ2f15o4iPO}9Y@ZHAsm*+^vPp%x4n$1Bj0Xzl-Wv|NKrknz zfw){@+UzD|r&Mxpj-tfWM?Lz0<}I>{OM$)QTw2@j+uwd1d}qVCeJV98i;UKUF6b|p zS$Nwnwp-bUAmJk=FgxIPalSL_NzvLV$CELC8ozs(47disdG7qZ^QlsOufhmSP93p0FY2an|(26vewtO+Dve`a-}KY86pJ?>wZoM&|&0xdHB z9N5p9cxIkZSQNxu&umN3nmSalVk?A$0U28H-?PVyofm$P@mMNX{DNoTq_LohaJ=Nc z_?cQ!Xe#*YS@tG@NtC>9Zjm#K;doH03u7D$6{xO75a+o5 zl;%BG_{nDdE=_OW4SC0^_@i6bpNXXL>?50a*;!d>;gs~yxctS8-nR*i#;=_*5-}n-*EPm^0s!;XrTnJgPcLon zrG^yJ1l}#HN`WTtSWYJ3@!CLQF097Oz1 zX3N`e$ZDLdhs6OSS&{bhT<0DWbTjI02p8U03_Ok?7YA4wwx>azfIlBwp|(CLoo3kH z_d{$C4_A2ys;bhTkt45;M=gcgLi7EK!UeXUogb;L zJ*h4C_L?|_v~0L!j%)KX9m!Wb+;Va8OyaPPj*!N;gknDQJ@BARVg1?95MF+MX2?W^ zg{_{nEAGQ0^V3Ws-LCi>aR$b(oL!Wn&h38uAj@A{vkSpE?mr%t%gjjmjHy#$MoxDD zyFS08(MiNF6L*q&F50M;v0@3_StfhOYhre&t3yT(7&BoXTjlUqnxZ2(7}ADBW++ubev9!R#Bt_&IgsyOk!+^p8`R7A9!$ahibLk8CoM88pVU1fj8JIo}vd=q!1%$lj z4XHde9}a>^>88u8g37b@@?!1Y4x0&g-s#gaERHdQbP%d|U;XB+XZc;>y&qntel0~E z%xkpHSF`PvFJNE^R&K7cOz=h-lqCtzN;%&1Po0q8T*1l^7eX1Qi@p?3AC_Fsak!mi z<0qYOf`%O?XSPM78|@1y1TKbQd%pPcuJ{DGV|di}^Z*eJ;QlRlNJ zH74^Z*nM`vJM{$?zk>zhf1jZ1T%X+HI8D^xwQT98WP}D8@G?Ic_3jRt`pgYUmuHNu zdXn|~M<5)!^Ald*VjOZEYKu=u{|e7b9%oUhtU2I?P7a_YOBLn1q1?FOCJPlt{@~Nz zt~FkGcK5A7`;nELCg9YN`luprP0nK@XTv<79vNEqyk&UZGyYqzWNx<8q3(uKp}zBW z?=Mc&HL+V89?sr-0!Ha@%OZ@g?FM5c-9pt_ZLZLk+s*IXDEh#kCc<*fJ%;tWOU(!q zKcJTsa8bw4UK95u!dDk@n2}SNS-*sRoi~d%56v6elHcOFiC?HzSL{f>#D6DuRbmen zrgE%B^}_ZX3r%C0p`bnC0q{F6v_l_$)AGX^bKR~kJYO#b59}XWrkX8LZR#*E{drni zpXT@Dxfm_Ttl$u|o>iMaw9Kio6&6ZNbI@~I-TsAZ!hBs~@$mEPtc)*0@W*#Gc8>0u|*S%L6 zoHkgQF^A43h7G&}n!jTO&!rdd}@;od+Mr4y^Lk6o$oS z-w_ht){Les$c+3kiFo!x+BWHs{^Cyz@9E1wgzQP46Nwn{#H81@VpB}R6u4EgjL$jM z&h*9XOu>tE>nJ$3JUgh|yK{@z){IvQ&CO+Z4OwfaI0f}P*KO9=NwUOUxz!F0rg)us z#@+h}O25O<-9vj@_Tno9Aq+JBM$s>rw3t&P*x__P%a5%galmCulA(IGudE9PA=uJR z{pEX9HW)#|b_A+Buv*Q5t zyBDE*C`_*lP6GKJV7A^bX6k!QW3#s3=pLvuX`D-+?{C(Vr#y!d-fu4fqq5M zeG=;Iq#K{9?aWkAaSsv&8w0;3J*N1kX9@IN-y~s9ZRpyv=6r&?X(A?6O&7aS*~6t> zS7bjt7*LD<9&xqU6cej(H>53qKg;paTC9a^XTn}b`n_>LVq2}$8XuLnnCy|g(_ZXn zmy3^W30G?AbXB1K4fY*pR&(Q|@N1AtRnfrJgNG*0LPDo%YZH2NY1py$(A2V~wnB&Y z>#IXdnXdmI<4Z=?x{2ACItmH^0N(!_g`%h^ok*beJ7UQ^ctN#-9e$9C%jJZ>Rmu0Y z$S2oQemkO;!nVxYFmVMeupACm#=2FhK)97kUnw&;yV>pmbkee6CLHKdLH_n~cO(`Z|)7gYNShkLZs2_iiZwv)u4L>xlGB z2+yq&eP{)Yg&k3|99fke17V$KavA<*j6)(9tD)b{rk>h+!`?EsHg7V$9yq)8fh_0( zT4;LFNI-hZ-$NO6(&za;60mDn75rk@F;||Tzd=5Dh;Q{kk;lxjC_H806bdl;au?Yp z0AK}yFEha!bM3)NL)Uoz1bFM7B_rY@E(1;=pdGbJuK~ z=bOa`hHYQ@2~}80F0Y$PAxRUjxhca`fgb0%d%u6bqV`Ujh~E)h^6Duuwk3Obs|Dk*Q;K zlmVq`7A{qb#AdN#G!aFgo>V)S6%yQI#MCm&O(Tu$;$}H4j{L8^hjrSaW~mXlQa9M$ znTvjSw@S)o!6ffK3I$WqEE7p5 z?A=~B92BxD|L?^C@N=P}4Ek3`!H~M+8kaN|9Z3YV_3%6gm4-D5pz~ov+h(aXKjC{} z-Tny=Mr>u8SMQ91sJnNO2O;5+(QzXrSds7&WFyuP%Yyv10iD+8 z=Bu3(Yfei4&qI}gszANJl7+d20u7g_k{fsS7@&wZl>R?KHrRaaB%MwKMmE8h1e=&} zzPuXap$!Qh=t|Pn@>iJUqPwa(lVbGqBYR7)Jl4wv)apPW0>T@y><-|EPW9vVyBCb= zBPQ(PvXT;gFZ@RwF*EwK!;-RO^X&n;fME}81!6+EZW|-w@2d&wUxdV3(l1mSI=303=@w|A7Ll+=xz46EGe6RkWw5;y`KH*KoH=YZXrsQ6^oxQ9u zxKeFfYyb+YmPrRp8kFM20VvnK$FfstgAyT6(ZSh!X-1QlEsG-p0Pucu3PM6N5R6Z_ z$leo@2?37QmFy?EOx?s>PzEXiK&d4Pq$|^d;ZmrMsmrHE`PNXmiJ7hF1#$Bf%Ajb* zr;BZ8Tt10Xr&WDj+E?Eao%UH)-SZC*5J<|u%vw(gl)JVPs*R~M;Ct`sZ(T1-P|&w- zxceX~?g6);_;rpq2e18?{prRrWs zxy>X=B5uW$ti=D1+C#pryGon;%E5;iEBvWojE40!YMXpthAuH&Nml!w9^Df_OZeUm zQR%S7522<78EF1))GOmHBjL)76q2<=!U%_uiwVEnh_c#CKDdw9*zlsfd7OpFvG|at47y^{N_s6vT&N zge(f9=NjlYNO5-~dM{?z^$SQLMx^&@U6PxX;$y(Feqx$AD={q=RNL?Ep#+eoAj3;fXT?SYxFhv^;$$9P$k^{zO?P;6mGKq6^s3z4aBJ(N+; z`?b{RLd|J#jFC{4Ir4e??9s^I0DU+$<@0@o0{$}`AuB5=73eGka&lHSlck!tK0e3< z$Nw0k3u$#n1F2Iu%Dh9a9hJkE#aDiDP?18oQW=ve75N>L%Y;R&KWprCS-dB!{qKJG zfmQA|R?K&=nS-9s@wyk+mBW2A;gbjK+jQue zAWs(ds-1UI*KyatTy_Es3NIFRxZxcFBGrSMOrS%dDeT_*M^r*;HfvF1wltuhHqncVIRg2oDT{)0?30o;@T2#3fpC)@G95%8eu z4GG-`Y8o7k80-(72V-@yXje|vSQK&4B%u6!QKTAvt_NyPWn_Vv;G!0Qfh*#B6RMBI zghIch!okr*u?He?A9YPME8G8Q3&HPDR5Yg5th_#k8()@NNGr2uM;%WNLBEe0mVo9T zEgSasbG<82^gD1OUkCQWPhOl~SntwDc1>g_WZ|T!` zlV~}`W(d4~qmuY#msFnBLdng@c!ffqT8;$uvyEG&i>BM7>~AQl-CR3jX`f z7UX^uHHB2sb!8BQcPJ7WfrduWmz4gx#w;qmlk(wjyIl;3Az!VagCH!b?~80Gu#+lD zPsX2z9DL({mdS|#c2}HO2yC~yp~9qK;9z46CyxQ(gkD#CzXTZE+c%|lGotb@!M^|j z;t#m|`c87#0OBwJUYuxrFUWtg5leWRYH_&R4N1S}2<}iWR*cgP3jAz=4kC&Xt%BJI znk(am+lF7|l|%4t=a9&}Bue!Ka-Zd#V2&p2 zFF7f7GB+*P9em9ESD@cw0j@HDvuRZgqh|ufdNHE;TR37GQ|F==_9i2rcaf1C%t5z+(rrzRN7pLFxCPT9X;&2BNP7IpFfWkH<6M z_Sc}VAAl|{*~e)AOFeb~D2;cEGb=nG<(wM$MT06Nn}q#db>p>30+<*}9T4h)Jk^9% zNruhV6T%!9l5&uI!>d4?m-($FjyAA(`Wlat^(_O`OTz#_DoKRJijYAD~Jk# zW)ebqQ$u9F{C%l@526$pQ?;ON=@*Jh9MSw$LBD7TfGk3e;nfp}yz8?Gw%FkP39VG~ z0w>!ryFAj=PYY_OnJWzhbl4apxlM(DB|ey}E55xn1p3&GEwN8QEs1+IzwP_aDPX1w zfgipk zl>jXk#c)QfK|3F~dP(_B_kQw%GKhX=NRQV6V2uz*P02bK2O#7Cm~&$N=WxIQ?Pxst zztCQYYnI$8EQH9y>odK_f<{J*WoHN0V1s9mM6ab%_b7-HaC0##NeAg`I;cy;1 z;sa3xxq=}isq8Yaj)_W8C)}ESo$&boIWaJ|fC-*^8u|TGXcl-R3J%=ghf{2&mI}xv ztu6}HH-df#VF9}bk&+o1$*R-(bo$NGVOplGZ6Rk)w>9dG{{n_le3y zq@Z#+Uw!Ls#n&xGf%qvTgdL$-<4cm@DBH$r85DfX->^eVkoq!LJD59Q`|8FGlk7d1P5 z)=nB}7?_sT5!z_HMeZ`)-+R!CT#*$#`McA${xS}dU*h=hCc*V=bd zdPe^V5S%yoxw{Kj#oL(N?SSmkiSXYg4ma0vvOP>89&DDOiWx>g<~vFq7#W1(bT2zc zE2QD(w%Uh)uH$Hft3rQEALqvQwHg1XrbU5OR9~sQKeE5ikqbk}eW{WF^4qujS1CCg z0V7y0F(`Y&?c8_7>1+U&D`LVZ${{wA8B(94n}8ztgvOW(>X^9|d7C~^rJ>>?piCh2 zA2CSv5urJfK92wHfi$!%=s)QU@{hhsqm*)2g9)BCMidZ{u9R}f z;U>2Dq8*J-g+o;dm?XB?>W@$l5F#R={I6FOEswAX6i6a#julx%rF1s&X1TNvr8q33 zCzSZ>qYN=S4k}GUdq|?X5BS6mxk(!Pg8=2~iHti#)<*_fTXpD4q-h|H<7ie(=u(lLY`{9sbAAhkyC;Qcs}e zP+;#B1beBkI^c-am6r}t@JBO%Ly-8e1w$ecq+#7@b4mpmDsyU*5T<0igDj%{(-a7P zRe&aJ9{kpdhFD6!QhBkNo@lgsT_7q=K3d8fP}rw$5KDWAknZ*{)4Bzhl*z0Icwa4+ z06ry~!5F8#4xszRW$ae=e{u^ZS-4>wZ>r=;JnsWUkr2=>3RFu|0r`K>1vjZiyn$H) zZ%kyvWDhSWKkMGp;Nc90d{GCqf5-<4!64?(?JhS2jQ3UBiU%kuDl&ur=@%j_fb5GZ zxsD8l(F}!u74b3?pa8ojP%ap#Hqqr2Dg)6G%V#WZ%MS`6R60T_Ny1~3sO*Uq-9pP0q_YD6pRNmE5{$J=AS_%fJG&A6U5^KW4AE2h_ zuEfk{SQXR_2Zyu?kq}eGu|Gu3Ax^~2Rj(iu4;00Pv1uGd=y2i-?q+cw=wIXFjXFXs zg-1h6ceF?Wc_0FKAprp9#wNU`{!&E%+}uY>W?{H3V+xT$Oh}r=<)HfH4RRh4d;5;a z9*|oTgQui=yTkCG#gOkOio02~jFkY#_&gg*!FWlnS^7?Rg11H3L?~SF2#r!nY$ube zpFTv(ROXq!7ub$=#5Icr@uxVvg}y&DlljjW{RQX+d3$JWVT&%Jio=7*ho}IO3J!tb zV4(VXP8c@U1b@JwilRG29>ut~oX6is)gXjy02Dl_kV?^As1Cf`5B$E3_K!=s51^L3 zbV@T3M1cpS=|d=-C~?H-J+YZ^`Jqh@7-|}lf=B3-pTu_Nm$8SxYq?51^Y+4e{>x%G zUk^iYZ#-yN{yQ6WsHk$Uf~^WJHsD!90*E9Cd5200*7go&6ok#;0+MH8&*Y+01U9~e zJcJSCBD1J(xZiL>{LSV;&?yOt>3@C91W^j~Zqr*T#y3z>Nq8*R4r7FFk8^63mS_dR zijFArBFgm#ox#}f?<%qe0Gg>F0`5{jl9p^HglR;Y7_7fNc2OWba+jl6^CmSg;+jU8 zrCnw)$WSfQpySyN1c7a$o=ziLRlr~o5=L-XoPQuTdld68D}SSiHb&Tt7HQWDb^A+y zGD-A+3#m7*21il;YqhO__E5|Z?XQ;DK$%izwv+vBV0#!xxs|wNNG|%jA)J3!E_OkP zrSw5X&VZw2y^OD7-Cr zfgJ#1!2f6MDv%(K(=(%Ninwb3XFY5Jl6x`H!-Np6juLPnH4G2i1^P2Z{6&;|u+hS>(O=S{6~9=^ zj!yni$V!3s87KJbYFA$=%D+0Lubc%j-uk8Q6ZkVZg%$6G5! zSwGcUZl(b#7+*=15=`(8`x5t`jSo`7>p~Ukxzsj`7`tXtfCnEVFF36QxIv1e%@Im~ zPq-OB@ro#-T?A$t&fp+G`&oHF=D1xd;$xVNMzWjl9jaEqsVGM^O8p9 zX&tzzx4iH!hF1Ke7+}=I4Id*T?;la>^sLm1-Mng;JMSi0i5DV2{}5e&+v_DMq4VFY zRg}P#HjVPWiP0~fn|JikKh>iC7aE{)DH!E_7a`1nLhC{%nkx)Z2-}F|9Ys)up9qunLZuXbOB8mMUp7u8k zQ3jy??$|95-R?8K1C@6Wg2SZW9fP|HN0O;Vt9;7ruFC@b^juFf3I{%>{kO6L$s$E z(xf^1{G3$u-!A_K&Nac=WfF?cf=v1EnNAd&{?klfjw3+FUqWdBKr0ZqUB;k#{V?M|ENk1fn5@AtY3{|sdTp?ZHvPEKMoTG7NaAu z%RjYIRH!Md{dm44k{XG`Xu4+w@yrH{O@!7i+WQiI#RQaR-q80 z27GqX?Be5h$^Ac_GRvhIxAFg{`3DbBmj3Vg0O diff --git a/website/static/images/neighbors-square.png b/website/static/images/neighbors-square.png deleted file mode 100644 index 51ec794e09d28d009f22ac448b7d93fe7ecf2ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30540 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 Wy?KTC>&X{@kDBr$r2>U#KK}>B1su)* diff --git a/website/static/images/neighbors-triangle.png b/website/static/images/neighbors-triangle.png deleted file mode 100644 index 4016113e046f31a8f57e40370223cafc332aa194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84679 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

rB%>jj0u=~Rrj{}9^U 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