diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +node_modules diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..150be1b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,7 @@ +{ + "parser": "babel-eslint", + "extends": "@react-native-community", + "plugins": [ + "prefer-object-spread" + ] +} diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..47d80d9 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,69 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* + +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js + +; Ignore polyfills +.*/Libraries/polyfills/.* + +; Ignore metro +.*/node_modules/metro/.* + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow/ + +[options] +emoji=true + +esproposal.optional_chaining=enable +esproposal.nullish_coalescing=enable + +module.system=haste +module.system.haste.use_name_reducers=true +# get basename +module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' +# strip .js or .js.flow suffix +module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' +# strip .ios suffix +module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' +module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' +module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' +module.system.haste.paths.blacklist=.*/__tests__/.* +module.system.haste.paths.blacklist=.*/__mocks__/.* +module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* +module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* + +munge_underscores=true + +module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' + +module.file_ext=.js +module.file_ext=.jsx +module.file_ext=.json +module.file_ext=.native.js + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +[version] +^0.92.0 diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2d56161 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,111 @@ + + +### Is this a bug report? + +(write your answer here) + + + +### Have you read the [Installation Instructions](https://github.com/react-community/react-native-maps/blob/master/docs/installation.md)? + +(Write your answer here.) + +### Environment + + + +### Steps to Reproduce + + + +(Write your steps here:) + +1. 2. 3. + +### Expected Behavior + + + +(Write what you thought would happen.) + +### Actual Behavior + + + +(Write what happened. Add screenshots!) + +### Reproducible Demo + + + +(Paste the link to an example project and exact instructions to reproduce the issue.) + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..040aaeb --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,53 @@ + + +### Does any other open PR do the same thing? + + + +(please answer here) + +### What issue is this PR fixing? + +(please link the issue here) + +### How did you test this PR? + + + +(please answer here) + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0766de3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace +Pods/ +AirMapsExplorer.xcworkspace/ + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# Bundle artifact +*.jsbundle + +# VSCode workspace settings +.vscode diff --git a/.gradle/4.10.3/fileChanges/last-build.bin b/.gradle/4.10.3/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/.gradle/4.10.3/fileChanges/last-build.bin differ diff --git a/.gradle/4.10.3/fileContent/fileContent.lock b/.gradle/4.10.3/fileContent/fileContent.lock new file mode 100644 index 0000000..d825274 Binary files /dev/null and b/.gradle/4.10.3/fileContent/fileContent.lock differ diff --git a/.gradle/4.10.3/fileHashes/fileHashes.bin b/.gradle/4.10.3/fileHashes/fileHashes.bin new file mode 100644 index 0000000..4731536 Binary files /dev/null and b/.gradle/4.10.3/fileHashes/fileHashes.bin differ diff --git a/.gradle/4.10.3/fileHashes/fileHashes.lock b/.gradle/4.10.3/fileHashes/fileHashes.lock new file mode 100644 index 0000000..a6ce14f Binary files /dev/null and b/.gradle/4.10.3/fileHashes/fileHashes.lock differ diff --git a/.gradle/4.10.3/fileHashes/resourceHashesCache.bin b/.gradle/4.10.3/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..a140bf1 Binary files /dev/null and b/.gradle/4.10.3/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/4.10.3/gc.properties b/.gradle/4.10.3/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/4.10.3/javaCompile/classAnalysis.bin b/.gradle/4.10.3/javaCompile/classAnalysis.bin new file mode 100644 index 0000000..29b359c Binary files /dev/null and b/.gradle/4.10.3/javaCompile/classAnalysis.bin differ diff --git a/.gradle/4.10.3/javaCompile/jarAnalysis.bin b/.gradle/4.10.3/javaCompile/jarAnalysis.bin new file mode 100644 index 0000000..d333880 Binary files /dev/null and b/.gradle/4.10.3/javaCompile/jarAnalysis.bin differ diff --git a/.gradle/4.10.3/javaCompile/javaCompile.lock b/.gradle/4.10.3/javaCompile/javaCompile.lock new file mode 100644 index 0000000..aefdc5e Binary files /dev/null and b/.gradle/4.10.3/javaCompile/javaCompile.lock differ diff --git a/.gradle/4.10.3/javaCompile/taskHistory.bin b/.gradle/4.10.3/javaCompile/taskHistory.bin new file mode 100644 index 0000000..4ec46f4 Binary files /dev/null and b/.gradle/4.10.3/javaCompile/taskHistory.bin differ diff --git a/.gradle/4.10.3/taskHistory/taskHistory.bin b/.gradle/4.10.3/taskHistory/taskHistory.bin new file mode 100644 index 0000000..b2392a7 Binary files /dev/null and b/.gradle/4.10.3/taskHistory/taskHistory.bin differ diff --git a/.gradle/4.10.3/taskHistory/taskHistory.lock b/.gradle/4.10.3/taskHistory/taskHistory.lock new file mode 100644 index 0000000..fbdfb37 Binary files /dev/null and b/.gradle/4.10.3/taskHistory/taskHistory.lock differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..0906a83 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..aee69d1 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Fri Apr 12 17:58:29 PDT 2019 +gradle.version=4.10.3 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..291920a Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.jscodeshiftignore b/.jscodeshiftignore new file mode 100644 index 0000000..a785361 --- /dev/null +++ b/.jscodeshiftignore @@ -0,0 +1,9 @@ +# To run a codeshift on the react-native-maps library, cd to the root dir and run: +# jscodeshift -t PATH_TO_TRANSFORM . --ignore-config .jscodeshiftignore +.idea +android +docs +example +gradle +node_modules +scripts \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e409ca6 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "trailingComma": "es5", + "singleQuote": true +} diff --git a/.project b/.project new file mode 100644 index 0000000..f564041 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + react-native-maps + Project react-native-maps created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..e889521 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..aab9b30 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +language: node_js + +node_js: + - "lts/*" + +cache: + directories: + - node_modules + +script: npm run ci diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..58f9bb3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,678 @@ +# Change Log + +## 0.25.0 (July 11, 2019) +* Android: [#2941](https://github.com/react-native-community/react-native-maps/pull/2941) Fix build gradle to allow jettifier to run correctly +* Android: [#2741](https://github.com/react-native-community/react-native-maps/pull/2741) Use a shared image icon for markers when they share the same image URI +* Android: [#2557](https://github.com/react-native-community/react-native-maps/pull/2557) Fix bug when changing subview of Marker to icon +* Android: [#2392](https://github.com/react-native-community/react-native-maps/pull/2392) Add support for loading base64 encoded image +* iOS: [#2423](https://github.com/react-native-community/react-native-maps/pull/2423) Handle annotations without images on iOS map snapshot +* iOS: [#2881](https://github.com/react-native-community/react-native-maps/pull/2881) Update podspec to use GoogleMaps 3.1.0 +* iOS: [#2253](https://github.com/react-native-community/react-native-maps/pull/2253) TestID's for e2e automation +* iOS: [#2826](https://github.com/react-native-community/react-native-maps/pull/2826) Follow up for [#2253](https://github.com/react-native-community/react-native-maps/pull/2253) +* iOS: [#2397](https://github.com/react-native-community/react-native-maps/pull/2397) Add compass location offsets for iOS maps +* Common: [#2568](https://github.com/react-native-community/react-native-maps/pull/2568) Support for WMS Layer support +* Common: [#2017](https://github.com/react-native-community/react-native-maps/pull/2017) Update the Google Maps custom map style if changed after initialization +* Common: [#2903](https://github.com/react-native-community/react-native-maps/pull/2903) Fix react snapshot undefined warning + +## 0.24.2 (April 17, 2019) +* iOS: [#2818](https://github.com/react-native-community/react-native-maps/pull/2818) Google Maps - Weak refs to gesture targets to address memory leak + +## 0.24.1 (April 16, 2019) +* iOS: [#2815](https://github.com/react-native-community/react-native-maps/pull/2815) Google Maps - Free instance variable in getActionForTarget to address memory leak + +## 0.24.0 (April 11, 2019) +* Common: [#2740](https://github.com/react-native-community/react-native-maps/pull/2740) Fix deprecated UIManager usage when accessing component names +* Common: [#2393](https://github.com/react-native-community/react-native-maps/pull/2393) add typings for pointForCoordinate & coordinateForPoint +* Common: [#2732](https://github.com/react-native-community/react-native-maps/pull/2732) Implement ability to flip y coordinate for Google Map tiles. +* Android: [#2765](https://github.com/react-native-community/react-native-maps/pull/2765) Allow setting of play-services version through ext +* Android: [#2702](https://github.com/react-native-community/react-native-maps/pull/2702) Enable RN projects to define the Android AppCompat Library version +* Android: [#2720](https://github.com/react-native-community/react-native-maps/pull/2720) Fix Android dependencies and build errors +* Android: [#2682](https://github.com/react-native-community/react-native-maps/pull/2682) Implement 'tappable' prop on polyline for Android +* Android: [#2417](https://github.com/react-native-community/react-native-maps/pull/2417) Support for lineCap and lineDash pattern +* Android: [#2727](https://github.com/react-native-community/react-native-maps/pull/2727) fix build: only apply mvn push gradle plugin if POM_ARTIFACT_ID is set +* iOS: [#2446](https://github.com/react-native-community/react-native-maps/pull/2446) fix iOS GoogleMaps camera always animate +* iOS: [#2746](https://github.com/react-native-community/react-native-maps/pull/2746) onPanDrag support for iOS +* iOS: [#2581](https://github.com/react-native-community/react-native-maps/pull/2581) Custom callout improvements 🎉 +* iOS: [#2794](https://github.com/react-native-community/react-native-maps/pull/2794) Fix CalloutSubview on Apple maps +* iOS: [#2716](https://github.com/react-native-community/react-native-maps/pull/2716) Fix Memory Leaks +* Docs: [#2675](https://github.com/react-native-community/react-native-maps/pull/2675) [#2685](https://github.com/react-native-community/react-native-maps/pull/2685) [#2707](https://github.com/react-native-community/react-native-maps/pull/2707) [#2704](https://github.com/react-native-community/react-native-maps/pull/2704) +* Example: [#2792](https://github.com/react-native-community/react-native-maps/pull/2792) Upgrade Example to react-native to 0.59.3 +* TypeScript: [#2705](https://github.com/react-native-community/react-native-maps/pull/2705) Add Marker icon property introduced in [#2650](https://github.com/react-native-community/react-native-maps/pull/2650) to index.d.ts + +## 0.23.0 (January 17, 2019) +* Common: [#2651](https://github.com/react-native-community/react-native-maps/pull/2651) Use `resolveAssetSource` method from Image +* Common: [#2576](https://github.com/react-native-community/react-native-maps/pull/2576) Fix import error for `MapMarker` and `MapOverlay` +* Common: [#2615](https://github.com/react-native-community/react-native-maps/pull/2615) Added helper method for calculating bounding box from region +* Common: [#2607](https://github.com/react-native-community/react-native-maps/pull/2607) Fix camera type definition error +* Common: [#2563](https://github.com/react-native-community/react-native-maps/pull/2563) Added camera system and deprecate `animateTo` methods +* Common: [#2571](https://github.com/react-native-community/react-native-maps/pull/2571) Added `getMapBoundaries` to `MapView` +* Common/iOS: [#2650](https://github.com/react-native-community/react-native-maps/pull/2650) Added `icon` prop for `MapMarker` +* iOS: [#2414](https://github.com/react-native-community/react-native-maps/pull/2414) Fix path for yoga in Podfile +* iOS: [#2627](https://github.com/react-native-community/react-native-maps/pull/2627) Added `tileSize` prop for `MapUrlTile` +* iOS: [#2608](https://github.com/react-native-community/react-native-maps/pull/2608) Fix `animateToCamera` +* Android: [#2653](https://github.com/react-native-community/react-native-maps/pull/2653) Defaults to the map services version instead of play services +* Android: [#2587](https://github.com/react-native-community/react-native-maps/pull/2587) Allow specifying a different version for base and maps on android +* Android: [#2598](https://github.com/react-native-community/react-native-maps/pull/2598) Fix crash for cannot getActiveLevelIndex +* Docs: [#2639](https://github.com/react-native-community/react-native-maps/pull/2639) Added note about recursive framework search paths +* Docs: [#2631](https://github.com/react-native-community/react-native-maps/pull/2631) Added notes for Google Play Services + +## 0.22.1 (November 8, 2018) +* Common: [#2548](https://github.com/react-community/react-native-maps/pull/2548) Moved `babel-plugin-module-resolver` and `babel-preset-react-native` from dependencies to devDependencies +* Android: [#2555](https://github.com/react-community/react-native-maps/pull/2555) Fixed [#2507](https://github.com/react-community/react-native-maps/issues/2507) +* Android: [#2545](https://github.com/react-community/react-native-maps/pull/2545) Fixed “The specified child already has a parent” +* Docs: [#2541](https://github.com/react-community/react-native-maps/pull/2541) Improve installation docs +* Docs: [#2550](https://github.com/react-community/react-native-maps/pull/2550) Specify how to use Google Maps +* Docs: [#2559](https://github.com/react-community/react-native-maps/pull/2559) Clarify cacheEnabled is apple maps only + +## 0.22.0 (October 11, 2018) +* Common: [#2049](https://github.com/react-community/react-native-maps/pull/2049) Added `animateToNavigation` method to `MapView` +* Common: [#2207](https://github.com/react-community/react-native-maps/pull/2207), [#2232](https://github.com/react-community/react-native-maps/pull/2232) Added `timestamp` property to `onUserLocationChange` event callback +* Common: [#2479](https://github.com/react-community/react-native-maps/pull/2479), [#2524](https://github.com/react-community/react-native-maps/pull/2524) Added `edgePadding` to `fitToSuppliedMarkers` function +* Common: [#2448](https://github.com/react-community/react-native-maps/pull/2448) Added custom indoor picker level +* Common: [#2238](https://github.com/react-community/react-native-maps/pull/2238) Support the `asset://` scheme for images +* Common: [#2136](https://github.com/react-community/react-native-maps/pull/2136), [#2184](https://github.com/react-community/react-native-maps/pull/2184) Modifications/Enhancements to MapView.UrlTile +* Common: [#2039](https://github.com/react-community/react-native-maps/pull/2039) Fix for `pointForCoordinate` and `coordinateForPoint` +* Common: [#2217](https://github.com/react-community/react-native-maps/pull/2217) Using `ColorPropType` to validate all color props more accurately +* iOS: [#2396](https://github.com/react-community/react-native-maps/pull/2396) Added installation for iOS via `react-native link` +* iOS: [#2243](https://github.com/react-community/react-native-maps/pull/2243) Added support of `lineDashPattern` polyline props to iOS Google Maps +* iOS: [#2149](https://github.com/react-community/react-native-maps/pull/2149) Added `paddingAdjustmentBehavior` for Google Maps on iOS +* iOS: [#2231](https://github.com/react-community/react-native-maps/pull/2231) Prefix DummyView class +* iOS: [#2229](https://github.com/react-community/react-native-maps/pull/2229) Use global imports for new Pods dependencies in AIRGoogleMap +* iOS: [#2248](https://github.com/react-community/react-native-maps/pull/2248) Make tiles display at the same physical size regardless of pixel density on iOS devices +* iOS: [#2306](https://github.com/react-community/react-native-maps/pull/2306) Prefix or eliminate globals in AIRMapMarker +* iOS: [#2351](https://github.com/react-community/react-native-maps/pull/2351) Added support for `calloutAnchor` with Google Maps on iOS +* iOS: [#2501](https://github.com/react-community/react-native-maps/pull/2501) Fixed issue that app crashes after trigger Marker `onDragEnd` +* iOS: [#2359](https://github.com/react-community/react-native-maps/pull/2359) Fixed zIndex didn't work on map moving on iOS 11 +* iOS: [#2185](https://github.com/react-community/react-native-maps/pull/2185) Fixed Xcode warnings for format, pointer type, unused var +* iOS: [#2154](https://github.com/react-community/react-native-maps/pull/2154) Fixed CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF warnings +* iOS: [#2341](https://github.com/react-community/react-native-maps/pull/2341) Fixed warnings about `self` +* Android: [#2224](https://github.com/react-community/react-native-maps/pull/2224) Respect `tappable` prop on Android +* Android: [#2390](https://github.com/react-community/react-native-maps/pull/2390) Consider pixel density in coordinate<->point conversion +* Android: [#2477](https://github.com/react-community/react-native-maps/pull/2477), [#2487](https://github.com/react-community/react-native-maps/pull/2487) Implemented `tracksViewChanges` on Android +* Android: [#2478](https://github.com/react-community/react-native-maps/pull/2478) Let `onVisibilityChanged()` be called on children (mainly fixes `Image` issues) +* Android: [#2375](https://github.com/react-community/react-native-maps/pull/2375) Fixed `lineCap` of Polyline +* Android: [#2320](https://github.com/react-community/react-native-maps/pull/2320) Fixed custom marker updates on Android +* Android: [#2197](https://github.com/react-community/react-native-maps/pull/2197) Fixed overlay removal bug +* Android: [#2317](https://github.com/react-community/react-native-maps/pull/2317) Fixed disabling the toolbar and my location button +* Android: [#2472](https://github.com/react-community/react-native-maps/pull/2472) Fixed compilation error due to minSDK in manifest +* Android: [#2172](https://github.com/react-community/react-native-maps/pull/2172) Fixed crash for Android API level below 18 on isFromMockProvider +* Internal: [#2462](https://github.com/react-community/react-native-maps/pull/2462) Fixed packager script path in `pacakage.json` +* Internal: [#2480](https://github.com/react-community/react-native-maps/pull/2480) Fix peer dependencies +* TypeScript: [#2165](https://github.com/react-community/react-native-maps/pull/2165) Typings improvements & fixes +* Docs: [#2541](https://github.com/react-community/react-native-maps/pull/2541) Vastly improved installation guideline +* Docs: [#2171](https://github.com/react-community/react-native-maps/pull/2171) Add 'none' option to docs for `mapType` of `MapView` +* Docs: [#2174](https://github.com/react-community/react-native-maps/pull/2174) Add opacity to `Marker` API docs +* Docs: [#2181](https://github.com/react-community/react-native-maps/pull/2181), [#2219](https://github.com/react-community/react-native-maps/pull/2219) Add note about mandatory `NSLocationWhenInUseUsageDescription` +* Docs: [#2381](https://github.com/react-community/react-native-maps/pull/2381), [#2358](https://github.com/react-community/react-native-maps/pull/2358), [#2363](https://github.com/react-community/react-native-maps/pull/2363), [#2429](https://github.com/react-community/react-native-maps/pull/2429), [#2425](https://github.com/react-community/react-native-maps/pull/2425) Documentation improvements + +## 0.21.0 (March 31, 2018) +* Common: [#2030](https://github.com/react-community/react-native-maps/pull/2030) Broadened peer-dependency support +* Common: [#2035](https://github.com/react-community/react-native-maps/pull/2035), [#2113](https://github.com/react-community/react-native-maps/pull/2113), & [#2141](https://github.com/react-community/react-native-maps/pull/2141) Typescript improvements and fixes +* Common: [#2011](https://github.com/react-community/react-native-maps/pull/2011) Add suport for KML file (Only Markers) +* Common: [#2053](https://github.com/react-community/react-native-maps/pull/2053) Fix 'module undefined' for React Native >= 0.54 +* Common: [#2131](https://github.com/react-community/react-native-maps/pull/2131) Fix initialRegion for React Native >= 0.54 +* Common: [#2115](https://github.com/react-community/react-native-maps/pull/2115) Upgrade React Native peer dependency to 0.54 +* Common: [#2032](https://github.com/react-community/react-native-maps/pull/2032) Add onMyLocationChange event +* Common: [#2039](https://github.com/react-community/react-native-maps/pull/2039) Fixed problem with pointForCoordinate and coordinateForPoint methods +* Common: [#2050](https://github.com/react-community/react-native-maps/pull/2050) Add support for onPoiClick +* iOS: [#2022](https://github.com/react-community/react-native-maps/pull/2022) Add support for Map.Overlay +* iOS: [#2068](https://github.com/react-community/react-native-maps/pull/2068) Prevent marker press from calling MapView onPress +* iOS: [#2057](https://github.com/react-community/react-native-maps/pull/2057) Fixed polygon and polyline not re-rendering when changing tile URL (AirMaps) +* iOS: [#2101](https://github.com/react-community/react-native-maps/pull/2101) Fixed re-render not updating MapView.Circle component in UI when radius or center coordinates change (AirMaps) +* Android: [#2111](https://github.com/react-community/react-native-maps/pull/2111) Allow vector drawables to be used as markers +* Android: [#2132](https://github.com/react-community/react-native-maps/pull/2132) Add mock-provider boolean on each location update +* Android: [#2047](https://github.com/react-community/react-native-maps/pull/2047) Check for presence of project-wide (ext) Gradle configuration properties `compileSdkVersion`, `targetSdkVersion`, `buildToolsVersion`, `supportLibVersion`, `googlePlayServicesVersion`, and `androidMapsUtilsVersion`. This provides a better mechanism for aligning the requirements of the module with that of the host project. +* Android: [#2096](https://github.com/react-community/react-native-maps/pull/2096) Updated gradle configuration for gradle 3.0.0+ + +## 0.20.1 (February 13, 2018) +* Common: [hotfix PROVIDER_GOOGLE](https://github.com/react-community/react-native-maps/commit/cd868ea7b33a04c8bdd5e909cf134a133b2cb316) +* iOS: [#2019](https://github.com/airbnb/react-native-maps/pull/2019) Exposing the maximumZ property to AIRMapUrlTile + +## 0.20.0 (February 9, 2018) +* Common: [#1889](https://github.com/airbnb/react-native-maps/pull/1889) Fix for 'Animated.Region undefined constructor' in recent react-native version. +* iOS: [#1853](https://github.com/airbnb/react-native-maps/pull/1853) Fixed onMapReady no longer getting called on iOS +* Android: [#1906](https://github.com/airbnb/react-native-maps/pull/1906) Manage Zoom Controls visibility on the map +* iOS: [#1911](https://github.com/airbnb/react-native-maps/pull/1911) Add gradient/multi-color polyline support for iOS (MapKit) +* Android: [#1918](https://github.com/airbnb/react-native-maps/pull/1918) Ground Overlay Support +* Common: [#1851](https://github.com/airbnb/react-native-maps/pull/1851) New methods to convert between LatLng and Point +* iOS: [#1846](https://github.com/airbnb/react-native-maps/pull/1846) Fix callouts appearing behind markers +* iOS: [#1969](https://github.com/airbnb/react-native-maps/pull/1969) Added tracksInfoWindowChanges property to iOS Google Maps +* iOS: [#1960](https://github.com/airbnb/react-native-maps/pull/1960) Fixed gradient polyline not always fully drawn + stability issues +* iOS: [#1953](https://github.com/airbnb/react-native-maps/pull/1953) Fix onMapReady not getting called after first time, initialRegion lat/lng delta not setting properly, setRegion method getting called even when map is not ready and prevent onRegionChange/ onRegionChangeComplete event until initialRegion or region is set. +* Android: [#1781](https://github.com/airbnb/react-native-maps/pull/1781) Polygon holes support +* Android: [#1976](https://github.com/airbnb/react-native-maps/pull/1976) Add native animation for Markers on Android + +## 0.19.0 (December 14, 2017) +* Common: [#1715](https://github.com/airbnb/react-native-maps/pull/1715) Fixed region/initialRegion null overrides of this.props +* Common: [#1876](https://github.com/airbnb/react-native-maps/pull/1876) Added support for locally stored tile overlay +* iOS: [#1854](https://github.com/airbnb/react-native-maps/pull/1854) Update GoogleMaps dependency to 2.5.0 + +## 0.18.3 (November 30, 2017) +* Android: [#1839](https://github.com/airbnb/react-native-maps/pull/1839) [AirGoogleMapManager] Use RCTDirectEventBlock for onMarkerPress + +## 0.18.2 (November 29, 2017) +* Android: [#1835](https://github.com/airbnb/react-native-maps/pull/1835) [AirMapView] Null check map instance on view methods + +## 0.18.1 (November 28, 2017) +* Android: [#1828](https://github.com/airbnb/react-native-maps/pull/1828) [AirMapManager] Update MapBuilder for getCommandsMap to support all entires + +## 0.18.0 (November 28, 2017) +* Android/iOS: [#1587](https://github.com/airbnb/react-native-maps/pull/1750) Add support to set map boundaries +* Android/iOS: [#1750](https://github.com/airbnb/react-native-maps/pull/1750) Add mapPadding property +* Common: [#1792](https://github.com/airbnb/react-native-maps/pull/1792) Make all components use ViewPropTypes || View.propTypes +* iOS: [#1774](https://github.com/airbnb/react-native-maps/pull/1774) Added missing parameters to google map screenshot +* iOS: [#1824](https://github.com/airbnb/react-native-maps/pull/1824) Add new iOS `mutedStandard` map-type +* iOS: [#1705](https://github.com/airbnb/react-native-maps/pull/1705) Enable control of Google Maps Marker tracksViewChanges property. +* Android: [#1710](https://github.com/airbnb/react-native-maps/pull/1710) Added support for new Android camera movement APIs +* iOS: [#1741](https://github.com/airbnb/react-native-maps/pull/1741) Fixed iOS google MapView.onMarkerPress not receiving the marker identifier +* iOS: [#1816](https://github.com/airbnb/react-native-maps/pull/1816) Fix The name of the given podspec ‘yoga' doesn't match the expected one ‘Yoga' +* iOS: [#1797](https://github.com/airbnb/react-native-maps/pull/1797) Fixed onMapReady event on iOS to resemble onMapReady on Android +* Common: [#1817](https://github.com/airbnb/react-native-maps/pull/1817) Allow fitToCoordinates to be called without options parameter + +## 0.17.1 (October 18, 2017) +* Common: [#1687](https://github.com/airbnb/react-native-maps/pull/1687) Fixed TypeScript definitions + +## 0.17.0 (October 11, 2017) +* iOS: [#1527](https://github.com/airbnb/react-native-maps/pull/1527) Added [iOS / Google Maps] support for showsIndoorLevelPicker +* iOS/Android: [#1544](https://github.com/airbnb/react-native-maps/pull/1544) Adds support to animateToBearing and animateToViewingAngle ( IOS + Android ) +* JS: [#1503](https://github.com/airbnb/react-native-maps/pull/1503) Remove caret from "react": "^16.0.0-alpha.12 +* Android: [#1521](https://github.com/airbnb/react-native-maps/pull/1521) Fix rare android crashes when map size is 0 +* Common: [#1601](https://github.com/airbnb/react-native-maps/pull/1610) Added Typescript Definitions +* Android: [#1612](https://github.com/airbnb/react-native-maps/pull/1612) Remove legalNotice from android AirMapModule + +## 0.16.4 (September 13, 2017) +* Android: [#1643](https://github.com/airbnb/react-native-maps/pull/1643) [MapMarker] fix android release crash on custom marker + +## 0.16.3 (September 2, 2017) +* iOS: [#1603](https://github.com/airbnb/react-native-maps/pull/1603) Added missing satellite option for iOS Google Maps +* iOS: [#1579](https://github.com/airbnb/react-native-maps/pull/1579) Set initial region on view + +## 0.16.2 (August 17, 2017) +* Android: [#1563](https://github.com/airbnb/react-native-maps/pull/#1563) Add missing native method for setting initial region +* iOS: [#1187](https://github.com/airbnb/react-native-maps/pull/1187) Reverted due to build issues + +## 0.16.1 (August 15, 2017) +* Android: [#1428](https://github.com/airbnb/react-native-maps/pull/#1428) Add ability to load marker image from drawable +* iOS: [#1187](https://github.com/airbnb/react-native-maps/pull/1187) Improve marker performance +* iOS/Android: [#1458](https://github.com/airbnb/react-native-maps/pull/1458) Add Google Maps legalNotice constant +* JS: [#1546](https://github.com/airbnb/react-native-maps/pull/1546) Fix initial region native prop + +## 0.16.0 (August 9, 2017) +* Android: [#1481](https://github.com/airbnb/react-native-maps/pull/1481) Handle Android RN 0.47 breaking change +* iOS: [#1357](https://github.com/airbnb/react-native-maps/pull/1357) add MKTileOverlayRenderer +* iOS: [#1369](https://github.com/airbnb/react-native-maps/pull/1369) Add onMapReady callback +* Android/iOS/JS: [#1360](https://github.com/airbnb/react-native-maps/pull/1360) Add minZoom and maxZoom properties for android and ios +* JS: [#1479](https://github.com/airbnb/react-native-maps/pull/1479) Fix timing function used in AnimatedRegion.spring + +## 0.15.3 (June 27, 2017) + +* iOS: [#1362](https://github.com/airbnb/react-native-maps/pull/1362) Updates for React 0.43-0.45 and React 16. +* JS: [#1323](https://github.com/airbnb/react-native-maps/pull/1323) Updates for React 0.43-0.45 and React 16. +* Android/iOS/JS: [#1440](https://github.com/airbnb/react-native-maps/pull/1440) Updates for React 0.43-0.45 and React 16. +* iOS: [#1115](https://github.com/airbnb/react-native-maps/pull/1115) Fix animateToCoordinate and animateToRegion +* Android: [#1403](https://github.com/airbnb/react-native-maps/pull/1403) Fix an NPE + +## 0.15.2 (May 20, 2017) + +* iOS: [#1351](https://github.com/airbnb/react-native-maps/pull/1351) Fix file references + +## 0.15.1 (May 19, 2017) + +* iOS: [#1341](https://github.com/airbnb/react-native-maps/pull/1341) Fix compile error in rn version >= 0.40 +* iOS: [#1194](https://github.com/airbnb/react-native-maps/pull/1194) Add onPress support for Google Maps Polyline +* iOS: [#1326](https://github.com/airbnb/react-native-maps/pull/1326) Add Marker rotation for Google Maps on iOS +* Android: [#1311](https://github.com/airbnb/react-native-maps/pull/1311) Fix overlay issue +* Common [#1313](https://github.com/airbnb/react-native-maps/pull/1313) Fix Android sourceDir for react-native-link + +## 0.15.0 (May 8, 2017) + +* iOS: [#1195](https://github.com/airbnb/react-native-maps/pull/1195) Rename project file to fix iOS build error +* Android: Update Google Play Services to version `10.2.4` + +## 0.14.0 (April 4, 2017) + +## Enhancements + +* Restructure project #1164 + +* Add showsIndoorLevelPicker -> setIndoorLevelPickerEnabled to MapView #1019 +[#1188](https://github.com/airbnb/react-native-maps/pull/1188) + +* iOS - Added onPress support for Polygons on Google Maps +[#1024](https://github.com/airbnb/react-native-maps/pull/1024) + +* Add customized user location annotation text +[#1049](https://github.com/airbnb/react-native-maps/pull/1049) + +* iOS - Google Maps - Add `showsMyLocationButton` support +[#1157](https://github.com/airbnb/react-native-maps/pull/1157) + + +## Patches + +* Fix getResources() null crash in mapview +[#1188](https://github.com/airbnb/react-native-maps/pull/1188) + +* Rename MapKit category to avoid conflicts with the one in RN +[#1172](https://github.com/airbnb/react-native-maps/pull/1172) + +* Upgrade GMS dependencies to 10.2.0 +[#1169](https://github.com/airbnb/react-native-maps/pull/1169) + +* fix multiple-instance memory leak +[#1130](https://github.com/airbnb/react-native-maps/pull/1130) + +* fix onSelected event for markers with custom view +[#1079](https://github.com/airbnb/react-native-maps/pull/1079) + +* Crash in our App fix +[#1096](https://github.com/airbnb/react-native-maps/pull/1096) + +* Use local RCTConvert+MapKit instead of the one in React Native +[#1138](https://github.com/airbnb/react-native-maps/pull/1138) + + +## 0.13.1 (March 21, 2017) + + +## Enhancements + +* Add id identifier to marker-press event on Android +[#1008](https://github.com/airbnb/react-native-maps/pull/1008) + (@stan229) + +* setNativeProps, marker opacity, nested components +[#940](https://github.com/airbnb/react-native-maps/pull/940) + (@unboundfire) + + +## Patches + +* Update the android buildToolsVersion to 25.0.0 +[#1152](https://github.com/airbnb/react-native-maps/pull/1152) + (@markusguenther) + +* use `provided` for RN gradle dependency +[#1151](https://github.com/airbnb/react-native-maps/pull/1151) + (@gpeal) + +* fix null activity crash +[#1150](https://github.com/airbnb/react-native-maps/pull/1150) + (@lelandrichardson) + +* Updated Google play services and gradle build plugin +[#1023](https://github.com/airbnb/react-native-maps/pull/1023) + (@chris-at-translate) + +* Sets the map value for the AirMapUrlTile so that it can be updated properly +[#992](https://github.com/airbnb/react-native-maps/pull/992) + (@jschloer) + +* onPress and onCalloutPress doesn't trigger on markers in iOS +[#954](https://github.com/airbnb/react-native-maps/pull/954) + (@RajkumarPunchh) + + + +## 0.13.0 (January 6, 2017) + +### Breaking Changes + +* Update iOS header imports and JS SyntheticEvent import for RN 0.40 + [#923](https://github.com/airbnb/react-native-maps/pull/923) + (@ide) + +### Patches + +* Fix issue where callouts sometimes overlap or don't appear + [#936](https://github.com/airbnb/react-native-maps/pull/936) + (@RajkumarPunchh) + +## 0.12.3 (January 6, 2017) + +### Patches + +* Fix "Animating with MapViews" example – fixes #763 + [#888](https://github.com/airbnb/react-native-maps/pull/888) + (@javiercr) +* [iOS] Fix "Option 2" method of building Google Maps + [#900](https://github.com/airbnb/react-native-maps/pull/900) + (@vjeranc) +* [Android] Fix exception when animating region during initialization + [#901](https://github.com/airbnb/react-native-maps/pull/901) + (@mlanter) +* Updated documentation + [#902](https://github.com/airbnb/react-native-maps/pull/902), + [#904](https://github.com/airbnb/react-native-maps/pull/904), + [#910](https://github.com/airbnb/react-native-maps/pull/910) + (@anami, @dboydor, @ali-alamine) + + +## 0.12.2 (December 9, 2016) + +### Patches + +* [Android] Added support for taking snapshots on Android + [#625](https://github.com/airbnb/react-native-maps/pull/625) + (@IjzerenHein) +* [iOS] Allow legalLabelInsets to be changed and animated + [#873](https://github.com/airbnb/react-native-maps/pull/873) + (@scarlac) +* Added rotation attribute documentation + [#871](https://github.com/airbnb/react-native-maps/pull/871) + (@Arman92) +* Update mapview.md documentation + [#866](https://github.com/airbnb/react-native-maps/pull/866) + (@dccarmo) + + +## 0.12.1 (December 6, 2016) + +This release only corrects the version in package.json. + +## 0.12.0 (December 6, 2016) + +NOTE: This version was not published because package.json was not properly updated + +### Breaking Changes + +* [android] If we've disabled scrolling within the map, then don't capture the touch events + [#664](https://github.com/airbnb/react-native-maps/pull/664) + (@mikelambert) +* [android] Use latest Google Play Services + [#731](https://github.com/airbnb/react-native-maps/pull/731) + (@mlanter) +* [android] update google play services + [#805](https://github.com/airbnb/react-native-maps/pull/805) + (@lrivera) + +### Patches + +* [iOS] Support iOS SDK < 10 ( XCode < 8 ) + [#708](https://github.com/airbnb/react-native-maps/pull/708) + (@rops) +* [iOS] Added showsUserLocation property support for Google Maps + [#721](https://github.com/airbnb/react-native-maps/pull/721) + (@julien-rodrigues) +* [iOS] Added Google Maps Circle, Polygon, Polyline, MapType Support + [#722](https://github.com/airbnb/react-native-maps/pull/722) + (@unboundfire) +* [iOS] Fix Anchor point on Google Maps iOS + [#734](https://github.com/airbnb/react-native-maps/pull/734) + (@btoueg) +* [Google Maps iOS] Marker init with image props. + [#738](https://github.com/airbnb/react-native-maps/pull/738) + (@btoueg) +* [iOS] Fix dynamic imageSrc removal + [#737](https://github.com/airbnb/react-native-maps/pull/737) + (@btoueg) +* [iOS] implement fitToSuppliedMarkers and fitToCoordinates for google + [#750](https://github.com/airbnb/react-native-maps/pull/750) + (@gilbox) +* [iOS][android] Add onPress for polygons and polylines on iOS and Android + [#760](https://github.com/airbnb/react-native-maps/pull/760) + (@frankrowe) +* [iOS] Fix flicker of map pins on state change + [#728](https://github.com/airbnb/react-native-maps/pull/728) + (@mlanter) +* [iOS] Set region only when view has width&height + [#785](https://github.com/airbnb/react-native-maps/pull/785) + (@gilbox) +* [iOS] Implements animateToRegion for Google + [#779](https://github.com/airbnb/react-native-maps/pull/779) + (@btoueg) +* [iOS] Google Maps Custom Tile Support + [#770](https://github.com/airbnb/react-native-maps/pull/770) + (@unboundfire) +* [android] Map Styling for android + [#808](https://github.com/airbnb/react-native-maps/pull/808) + (@ali-alamine using @azt3k code) +* [iOS] IOS Google Map styling + [#817](https://github.com/airbnb/react-native-maps/pull/817) + (@ali-alamine using @azt3k code) +* [iOS] Add support for polygon holes for Apple Maps and Google Maps on iOS + [#801](https://github.com/airbnb/react-native-maps/pull/801) + (@therealgilles) +* [iOS] Fixes #470. Support legalLabelInsets on Apple Maps + [#840](https://github.com/airbnb/react-native-maps/pull/840) + (@scarlac) + +## 0.11.0 (October 16, 2016) + +NOTE: `0.10.4` was released *after* this version, and it's possible +`0.11.0` does not include everything in `0.10.4`. (see #851) + +### Breaking Changes + +* Update example app for RN 0.35, fix Gmaps bug for 0.35 + [#695](https://github.com/airbnb/react-native-maps/pull/695) + (@spikebrehm) +* Upgraded to RN 0.35 + [#680](https://github.com/airbnb/react-native-maps/pull/680) + (@eugenehp) + +### Patches + +* Update installation.md + [#696](https://github.com/airbnb/react-native-maps/pull/696) + (@securingsincity) +* [android] Fixes crash during Activity onPause() + [#694](https://github.com/airbnb/react-native-maps/pull/694) + (@felipecsl) +* Included MapUrlTile usage in README.md + [#687](https://github.com/airbnb/react-native-maps/pull/687) + (@ochanje210) +* [android] Add parameter to disable the moving on marker press + [#676](https://github.com/airbnb/react-native-maps/pull/676) + (@mlanter) +* Add support for setting zIndex on markers + [#675](https://github.com/airbnb/react-native-maps/pull/675) + (@mlanter) + +## 0.10.4 (October 31, 2016) + +### Patches + +* [iOS] implement fitToSuppliedMarkers and fitToCoordinates for google maps + [#750](https://github.com/airbnb/react-native-maps/pull/750) + (@gilbox) +* [android] If we've disabled scrolling within the map, then don't capture the touch events + [#664](https://github.com/airbnb/react-native-maps/pull/664) + (@mikelambert) +* [iOS] Fix Anchor point on Google Maps iOS + [#734](https://github.com/airbnb/react-native-maps/pull/734) + (@btoueg) +* [iOS] Added showsUserLocation property support for Google Maps + [#721](https://github.com/airbnb/react-native-maps/pull/721) + (@julien-rodrigues) +* [iOS][android] Add support for setting zIndex on markers + [#675](https://github.com/airbnb/react-native-maps/pull/675) + (@mlanter) +* [android] Add parameter to disable the moving on marker press + [#676](https://github.com/airbnb/react-native-maps/pull/676) + (@mlanter) +* NOTE: v0.10.3 was not published + +## 0.10.2 (October 19, 2016) + +### Patches + +* [android] Fixes crash during Activity onPause() (fixes #414) + [#694](https://github.com/airbnb/react-native-maps/pull/694) + (@felipecsl) + +## 0.10.1 (October 10, 2016) + +This release fixes issue [#656](https://github.com/airbnb/react-native-maps/issues/656) + +### Patches + +* [android] fix gradle build setup for explorer, bump to gradle 2.2.0 + [#666](https://github.com/airbnb/react-native-maps/pull/666) + (@gilbox) +* [android] fix getAirMapName to fix ref-based commands + [#665](https://github.com/airbnb/react-native-maps/pull/665) + (@gilbox) + +## 0.10.0 (October 5, 2016) + +### Breaking Changes + +* Upgrade to `react-native@0.33.0` + +## 0.9.0 (September 28, 2016) + +As of this release, this repository has moved from +`lelandrichardson/react-native-maps` to `airbnb/react-native-maps`. + +### Breaking Changes + +* [iOS] Support Google Maps on iOS + [#548](https://github.com/airbnb/react-native-maps/pull/548) + (@gilbox) + +### Patches + +* Added support for AnimatedRegion without modifying the AnimatedImplementation.js of react-native + [#608](https://github.com/airbnb/react-native-maps/pull/608) + (@IjzerenHein) +* [iOS] Remove pod stuff. Fix AirMaps.xcodeproj related to missing pod stuff + [#620](https://github.com/airbnb/react-native-maps/pull/620) + (@gilbox) +* [iOS] Fix import of AIRMapSnapshot + [#622](https://github.com/airbnb/react-native-maps/pull/622) + (@spikebrehm) +* [iOS] Fix nullability issue + [#614](https://github.com/airbnb/react-native-maps/pull/614) + (@simonmitchell) +* [iOS] Added support for drawing polylines on snapshots on iOS + [#615](https://github.com/airbnb/react-native-maps/pull/615) + (@IjzerenHein) +* Add `fitToCoordinates` method + [#545](https://github.com/airbnb/react-native-maps/pull/545) + (@naoufal) +* [Android] Fix list of examples on Android + [#597](https://github.com/airbnb/react-native-maps/pull/597) + (@spikebrehm) +* [Android] Fix overlapping map issue + [#589](https://github.com/airbnb/react-native-maps/pull/589) + (@fdnhkj) +* Add tile overlay support + [#595](https://github.com/airbnb/react-native-maps/pull/595) + (@cascadian, @spikebrehm) +* [Android] Support Android LiteMode + [#546](https://github.com/airbnb/react-native-maps/pull/546) + (@rops) +* s/lelandrichardson/airbnb/ + [#573](https://github.com/airbnb/react-native-maps/pull/573) + (@spikebrehm) +* [Android] Don't fit to elements if no positions added + [#567](https://github.com/airbnb/react-native-maps/pull/567) + (@ryankask) +* [iOS] Add class prefix to EmptyCalloutBackgroundView + [#563](https://github.com/airbnb/react-native-maps/pull/563) + (@terribleben) +* [Android] Minor code cleanup + [#564](https://github.com/airbnb/react-native-maps/pull/564) + (@felipecsl) +* Documentation updates + [#566](https://github.com/airbnb/react-native-maps/pull/566), + [#591](https://github.com/airbnb/react-native-maps/pull/591), + [#601](https://github.com/airbnb/react-native-maps/pull/601), + [#602](https://github.com/airbnb/react-native-maps/pull/602), + [#624](https://github.com/airbnb/react-native-maps/pull/624) + (@felipecsl, @Alastairm, @Keksike, @bbodenmiller) + +## 0.8.2 (September 8, 2016) + +We realized immediately after publishing 0.8.1 that the NPM package contained +some test code in the `example2/` directory that contained a copy of the +`react-native` package, causing this packager error: + +``` +Failed to build DependencyGraph: @providesModule naming collision: + Duplicate module name: String.prototype.es6 + Paths: /Users//node_modules/react-native-maps/example2/node_modules/react-native/packager/react-packager/src/Resolver/polyfills/String.prototype.es6.js collides with /Users//node_modules/react-native/packager/react-packager/src/Resolver/polyfills/String.prototype.es6.js + +This error is caused by a @providesModule declaration with the same name across two different files. +``` + +0.8.2 is identical to 0.8.1, except with the offending code removed from the NPM package. + + +## 0.8.1 (September 8, 2016) *[DEPRECATED]* + +#### *NOTE: 0.8.1 has been unpublished from NPM because it was faulty. Please use 0.8.2.* + +### Patches + +- [Android] Use latest available (wildcard version) of RN to build Android ([PR #547](https://github.com/airbnb/react-native-maps/pull/547)) +- [Android] Use `Activity` to call `MapsInitialier.initialize()` ([PR #449](https://github.com/airbnb/react-native-maps/pull/449)) +- [Android] Fix file path for `AirMapModule` ([PR #526](https://github.com/airbnb/react-native-maps/pull/526)) +- [Android] Fix path to React Native in `node_modules` ([PR #527](https://github.com/airbnb/react-native-maps/pull/527)) +- [Android] Bump Google Play Services dependency to `9.4.0` ([PR #533](https://github.com/airbnb/react-native-maps/pull/533)) +- [iOS] Fix a few warnings ([PR #534](https://github.com/airbnb/react-native-maps/pull/534)) +- [JS] Fix ESLint violations ([PR #515](https://github.com/airbnb/react-native-maps/pull/515)) + +## 0.8.0 (August 30, 2016) + +### Breaking Changes + +- Upgrade to `react-native@0.32.0`, and update Android code to match ([#502](https://github.com/airbnb/react-native-maps/pull/502)) + +### Patches + +- [android] Add `showsMyLocationButton` prop ([#382](https://github.com/airbnb/react-native-maps/pull/382)) + +- Add `fitToSuppliedMarkers()` method ([#386](https://github.com/airbnb/react-native-maps/pull/386)) + +- [ios] Update AirMapMarker to use loadImageWithURLRequest ([#389](https://github.com/airbnb/react-native-maps/pull/389)) + +- Improvements to watch and copy script ([#445](https://github.com/airbnb/react-native-maps/pull/445)) + +- [ios] Added check on marker class in predicate ([#485](https://github.com/airbnb/react-native-maps/pull/485)) + +- Use `StyleSheet.absoluteFillObject` where appropriate ([#500](https://github.com/airbnb/react-native-maps/pull/500)) and ([#493](https://github.com/airbnb/react-native-maps/pull/493)) + +- Add ESLint and fix a number of linting violations ([#501](https://github.com/airbnb/react-native-maps/pull/501)) + +- Remove unused `NativeMethodsMixin` for compat with RN 0.32 ([#511](https://github.com/airbnb/react-native-maps/pull/511)) + + +## 0.7.1 (July 9, 2016) + +### Patches + +- Fix iOS CocoaPods Issue ([#308](https://github.com/airbnb/react-native-maps/pull/308)) + + + +## 0.7.0 (July 9, 2016) + +### Breaking Changes + +- RN 0.29 compatibility changes ([#363](https://github.com/airbnb/react-native-maps/pull/363) and [#370](https://github.com/airbnb/react-native-maps/pull/370)) + + +### Patches + +- Fixing scrolling map inside a scrollView ([#343](https://github.com/airbnb/react-native-maps/pull/343)) + +- Fix shouldUsePinView ([#344](https://github.com/airbnb/react-native-maps/pull/344)) + +- Not calling setLoadingIndicatorColor when null ([#337](https://github.com/airbnb/react-native-maps/pull/337)) + +- Fixes `Undefined symbols for architecture x86_64: “std::terminate()”` ([#329](https://github.com/airbnb/react-native-maps/pull/329)) + + + +## 0.6.0 + +## 0.5.0 + +* [Android] Updated package to `com.airbnb.android.react.maps` (PR #225) +* [Android] Lint fixes (PR #232) + +## 0.4.0 + + * Initial release diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..8308684 --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'cocoapods' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..8f78988 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,76 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.0) + activesupport (4.2.11.1) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + atomos (0.1.3) + claide (1.0.2) + cocoapods (1.6.1) + activesupport (>= 4.0.2, < 5) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.6.1) + cocoapods-deintegrate (>= 1.0.2, < 2.0) + cocoapods-downloader (>= 1.2.2, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-stats (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.3.1, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.2.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.6.6) + nap (~> 1.0) + ruby-macho (~> 1.4) + xcodeproj (>= 1.8.1, < 2.0) + cocoapods-core (1.6.1) + activesupport (>= 4.0.2, < 6) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + cocoapods-deintegrate (1.0.4) + cocoapods-downloader (1.2.2) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.0) + cocoapods-stats (1.1.0) + cocoapods-trunk (1.3.1) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.1.0) + colored2 (3.1.2) + concurrent-ruby (1.1.5) + escape (0.0.4) + fourflusher (2.2.0) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + minitest (5.11.3) + molinillo (0.6.6) + nanaimo (0.2.6) + nap (1.1.0) + netrc (0.11.0) + ruby-macho (1.4.0) + thread_safe (0.3.6) + tzinfo (1.2.5) + thread_safe (~> 0.1) + xcodeproj (1.8.2) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.6) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods + +BUNDLED WITH + 1.17.2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6659955 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Airbnb + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..05666ec --- /dev/null +++ b/babel.config.js @@ -0,0 +1,14 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], + plugins: [ + [ + 'module-resolver', + { + alias: { + 'react-native-maps': './', + }, + cwd: 'babelrc', + }, + ], + ], +}; diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..1a2b159 --- /dev/null +++ b/build.gradle @@ -0,0 +1,32 @@ +buildscript { + ext { + minSdkVersion = 16 + compileSdkVersion = 28 + targetSdkVersion = 28 + supportLibVersion = '28.0.0' + playServicesVersion = '16.1.0' + } + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.3.1' + } +} + +allprojects { + repositories { + mavenLocal() + google() + jcenter() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$rootDir/node_modules/react-native/android" + } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/build/android-profile/profile-2017-09-02-17-13-08-775.rawproto b/build/android-profile/profile-2017-09-02-17-13-08-775.rawproto new file mode 100644 index 0000000..d63be83 Binary files /dev/null and b/build/android-profile/profile-2017-09-02-17-13-08-775.rawproto differ diff --git a/build/intermediates/dex-cache/cache.xml b/build/intermediates/dex-cache/cache.xml new file mode 100644 index 0000000..1b0d303 --- /dev/null +++ b/build/intermediates/dex-cache/cache.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/intermediates/lint-cache/maven.google/com/android/support/group-index.xml b/build/intermediates/lint-cache/maven.google/com/android/support/group-index.xml new file mode 100644 index 0000000..c2e0c79 --- /dev/null +++ b/build/intermediates/lint-cache/maven.google/com/android/support/group-index.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/intermediates/lint-cache/maven.google/master-index.xml b/build/intermediates/lint-cache/maven.google/master-index.xml new file mode 100644 index 0000000..c28b52e --- /dev/null +++ b/build/intermediates/lint-cache/maven.google/master-index.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml b/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml new file mode 100644 index 0000000..2cedebf --- /dev/null +++ b/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/callout.md b/docs/callout.md new file mode 100644 index 0000000..fe41843 --- /dev/null +++ b/docs/callout.md @@ -0,0 +1,38 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `tooltip` | `Boolean` | `false` | If `false`, a default "tooltip" bubble window will be drawn around this callouts children. If `true`, the child views can fully customize their appearance, including any "bubble" like styles. +| `alphaHitTest` | `Boolean` | `false` | If `true`, clicks on transparent areas in callout will be passed to map. **Note**: iOS only. + +## Events + +| Event Name | Returns | Notes +|---|---|---| +| `onPress` | | Callback that is called when the user presses on the callout + + + +--- + + + +# `` Component API + +**Note**: Supported on iOS only. +Use to handle press on specific subview of callout. +Put this component inside ``. + +## Events + +| Event Name | Returns | Notes +|---|---|---| +| `onPress` | | Callback that is called when the user presses on this subview inside callout + +## Notes +Native press event has property `action`, which is: +- `callout-press` (or `marker-overlay-press` for GoogleMaps on iOS) for press on `` +- `callout-inside-press` (or `marker-inside-overlay-press` for GoogleMaps on iOS) for press on `` + diff --git a/docs/circle.md b/docs/circle.md new file mode 100644 index 0000000..d00d6f4 --- /dev/null +++ b/docs/circle.md @@ -0,0 +1,28 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `center` | `LatLng` | (Required) | The coordinate of the center of the circle +| `radius` | `Number` | (Required) | The radius of the circle to be drawn (in meters) +| `strokeWidth` | `Number` | `1` | The stroke width to use for the path. +| `strokeColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The stroke color to use for the path. +| `fillColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The fill color to use for the path. +| `zIndex` | `Number` | 0 | The order in which this tile overlay is drawn with respect to other overlays. An overlay with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays with the same z-index is arbitrary. The default zIndex is 0. (Android Only) +| `lineCap` | `String` | `round` | The line cap style to apply to the open ends of the path. Other values : `butt`, `square` +| `lineJoin` | `String` | | The line join style to apply to corners of the path. possible value: `miter`, `round`, `bevel` +| `miterLimit` | `Number` | | The limiting value that helps avoid spikes at junctions between connected line segments. The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If the ratio of the miter length—that is, the diagonal length of the miter join—to the line thickness exceeds the miter limit, the joint is converted to a bevel join. The default miter limit is 10, which results in the conversion of miters whose angle at the joint is less than 11 degrees. +| `geodesic` | `Boolean` | | Boolean to indicate whether to draw each segment of the line as a geodesic as opposed to straight lines on the Mercator projection. A geodesic is the shortest path between two points on the Earth's surface. The geodesic curve is constructed assuming the Earth is a sphere. +| `lineDashPhase` | `Number` | `0` | (iOS only) The offset (in points) at which to start drawing the dash pattern. Use this property to start drawing a dashed line partway through a segment or gap. For example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the middle of the first gap. +| `lineDashPattern` | `Array` | `null` | (iOS only) An array of numbers specifying the dash pattern to use for the path. The array contains one or more numbers that indicate the lengths (measured in points) of the line segments and gaps in the pattern. The values in the array alternate, starting with the first line segment length, followed by the first gap length, followed by the second line segment length, and so on. + + +## Types + +``` +type LatLng { + latitude: Number, + longitude: Number, +} +``` diff --git a/docs/examples-setup.md b/docs/examples-setup.md new file mode 100644 index 0000000..89dfc33 --- /dev/null +++ b/docs/examples-setup.md @@ -0,0 +1,43 @@ +# Examples Setup + +## iOS + +1. If you don't have bundler gem installed: + +``` +gem install bundler +``` + +2. Install dependencies and open the workspace: + +``` +npm install +npm run build:ios +npm run run:ios +``` + +or + +``` +yarn install +yarn build:ios +yarn run:ios +``` + +## android + +1. Start your emulator + +2. Install dependencies and run the example: + +``` +npm install +npm run run:android +``` + +or + +``` +yarn install +yarn run:android +``` diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..f0cc937 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,453 @@ +# Installation + +Install the library from npm: + +```sh +npm install react-native-maps --save +``` + +The library ships with platform native code that needs to be compiled +together with React Native. This requires you to configure your build +tools. + +The actual map implementation depends on the platform. On Android, one +has to use [Google +Maps](https://developers.google.com/maps/documentation/), which in turn +requires you to obtain an API key for the [Android +SDK](https://developers.google.com/maps/documentation/android-sdk/signup). + +On iOS, one can choose between Google Maps or the native [Apple +Maps](https://developer.apple.com/documentation/mapkit/) implementation. + +When using Google Maps on iOS, you need to also register for the [iOS +SDK](https://developers.google.com/maps/documentation/ios-sdk/get-api-key) +and include the Google Maps library in your build. The native Apple Maps +based implementation works out-of-the-box and is therefore simpler to +use at the price of missing some of the features supported by the Google +Maps backend. + +## Build configuration on iOS + +### Using React Native Link + +Run `react-native link react-native-maps` after which you should be able +to use this library on iOS. Note that by default this will use Apple +Maps and you will miss some of the features provided by Google (see the +instruction on manually enabling Google Maps below). + +### Using CocoaPods + +> If the CocoaPods package manager is new to you, please first review +> its [installation guide](https://guides.cocoapods.org/using/getting-started.html) + +Setup your `Podfile` (found at `ios/Podfile` as below, replacing all +references to `_YOUR_PROJECT_TARGET_` with your project target (it's the +same as project name by default). + +```ruby +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target '_YOUR_PROJECT_TARGET_' do + rn_path = '../node_modules/react-native' + rn_maps_path = '../node_modules/react-native-maps' + + # See http://facebook.github.io/react-native/docs/integration-with-existing-apps.html#configuring-cocoapods-dependencies + pod 'yoga', path: "#{rn_path}/ReactCommon/yoga/yoga.podspec" + pod 'React', path: rn_path, subspecs: [ + 'Core', + 'CxxBridge', + 'DevSupport', + 'RCTActionSheet', + 'RCTAnimation', + 'RCTGeolocation', + 'RCTImage', + 'RCTLinkingIOS', + 'RCTNetwork', + 'RCTSettings', + 'RCTText', + 'RCTVibration', + 'RCTWebSocket', + ] + + # React Native third party dependencies podspecs + pod 'DoubleConversion', :podspec => "#{rn_path}/third-party-podspecs/DoubleConversion.podspec" + pod 'glog', :podspec => "#{rn_path}/third-party-podspecs/glog.podspec" + # If you are using React Native <0.54, you will get the following error: + # "The name of the given podspec `GLog` doesn't match the expected one `glog`" + # Use the following line instead: + #pod 'GLog', :podspec => "#{rn_path}/third-party-podspecs/GLog.podspec" + pod 'Folly', :podspec => "#{rn_path}/third-party-podspecs/Folly.podspec" + + # react-native-maps dependencies + pod 'react-native-maps', path: rn_maps_path + # pod 'react-native-google-maps', path: rn_maps_path # Uncomment this line if you want to support GoogleMaps on iOS + # pod 'GoogleMaps' # Uncomment this line if you want to support GoogleMaps on iOS + # pod 'Google-Maps-iOS-Utils' # Uncomment this line if you want to support GoogleMaps on iOS +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + if target.name == 'react-native-google-maps' + target.build_configurations.each do |config| + config.build_settings['CLANG_ENABLE_MODULES'] = 'No' + end + end + if target.name == "React" + target.remove_from_project + end + end +end +``` + +Then run in the `ios` folder + +```sh +pod install +``` + +and open the produced workspace file (`.xcworkspace`) in XCode to build your project. + +### Enabling Google Maps on iOS + +If you want to enable Google Maps on iOS, obtain the Google API key and +edit your `AppDelegate.m` as follows: + +```objc ++ #import + +@implementation AppDelegate +... + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ ++ [GMSServices provideAPIKey:@"_YOUR_API_KEY_"]; // add this line using the api key obtained from Google Console +... +``` + +The `[GMSServices provideAPIKey]` should be the **first call** of the method. + +Then, do either of the following + +1. If you are using CocoaPods to manage your dependecies, uncomment the +lines related to Google Maps from the `Podfile` and run `pod install`. + +2. If you used React Native link, you may include Google Maps manually as a +XCode framework following the instructions from [SDK docs -> Install +manually](https://developers.google.com/maps/documentation/ios-sdk/start). Then, to link this library to the framework, add the following to your +`package.json` and replace the +`REPLACE_ME_RELATIVE_PATH_TO_GOOGLE_MAPS_INSTALL` with the relative path +from your project root to the directory in which you installed the +Google Maps frameworks. You might need to specify a recursive search path +by adding a `/**` at the end of the provided path (e.g. `"./node_modules/react-native-maps/enable-google-maps 'ios/my-frameworks/GoogleMaps/**'" + + ```json + { + "name": "your-app", + "scripts": { + "postinstall": "./node_modules/react-native-maps/enable-google-maps REPLACE_ME_RELATIVE_PATH_TO_GOOGLE_MAPS_INSTALL" + } + } + ``` + + Re-run `npm install` or `yarn` to ensure the `postinstall` script is run. + +3. Import and add `{PROVIDER_GOOGLE}` to your JavaScript: + ```javascript + import MapView, { PROVIDER_GOOGLE } from 'react-native-maps'; + ... + + + + ``` + +## Build configuration on Android + +Ensure your build files match the following requirements: + +1. Define the `react-native-maps` project in `android/settings.gradle`: + +```groovy +... +include ':react-native-maps' +project(':react-native-maps').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-maps/lib/android') +``` + +2. Add the `react-native-maps` as an dependency of your app in `android/app/build.gradle`: + +```groovy +... +dependencies { + ... + implementation project(':react-native-maps') +} +``` + +If you've defined *[project-wide +properties](https://developer.android.com/studio/build/gradle-tips.html)* +(**recommended**) in your root `build.gradle`, this library will detect +the presence of the following properties: + +```groovy +buildscript {...} +allprojects {...} + +/** + + Project-wide Gradle configuration properties + */ +ext { + compileSdkVersion = 26 + targetSdkVersion = 26 + buildToolsVersion = "26.0.2" + supportLibVersion = "26.1.0" + googlePlayServicesVersion = "16.1.0" // or set latest version + androidMapsUtilsVersion = "0.5+" +} +``` + +If you do **not** have *project-wide properties* defined and have a +different play-services version than the one included in this library, +use the following instead (switch 10.0.1 for the desired version): + +```groovy +... +dependencies { + ... + implementation(project(':react-native-maps')){ + exclude group: 'com.google.android.gms', module: 'play-services-base' + exclude group: 'com.google.android.gms', module: 'play-services-maps' + } + implementation 'com.google.android.gms:play-services-base:10.0.1' + implementation 'com.google.android.gms:play-services-maps:10.0.1' +} +``` + +3. Specify your Google Maps API Key: + + Add your API key to your manifest file (`android/app/src/main/AndroidManifest.xml`): + +```xml + + + + +``` +> Note: As shown above, `com.google.android.geo.API_KEY` is the +> recommended metadata name for the API key. A key with this name can be +> used to authenticate to multiple Google Maps-based APIs on the Android +> platform, including the Google Maps Android API. For backwards +> compatibility, the API also supports the name +> `com.google.android.maps.v2.API_KEY`. This legacy name allows +> authentication to the Android Maps API v2 only. An application can +> specify only one of the API key metadata names. If both are specified, +> the API throws an exception. + +Source: https://developers.google.com/maps/documentation/android-api/signup + +4. Add `import com.airbnb.android.react.maps.MapsPackage;` and `new MapsPackage()` in your `MainApplication.java` : + +```java +import com.airbnb.android.react.maps.MapsPackage; +... + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new MapsPackage() + ); + } +``` + +5. Ensure that you have Google Play Services installed: + + * For the Genymotion emulator, you can follow [these instructions](https://www.genymotion.com/help/desktop/faq/#google-play-services). + * For a physical device you need to search on Google for 'Google Play + Services'. There will be a link that takes you to the Play Store and + from there you will see a button to update it (do not search within the + Play Store). + +## Troubleshooting + +### The map background is blank (Google Maps) + +If google logo/markers/polylines etc are displayed but the map +background is otherwise blank, this is likely an API key issue. Verify +your API keys and their restrictions. Ensure the native `provideAPIKey` +call is the first line of `didFinishLaunchingWithOptions`. + +Ensure also that the relevant Google APIs have been enabled for your +project from the URLs below: + +- [Google Maps SDK Android](https://console.developers.google.com/apis/library/maps-android-backend.googleapis.com/) +- [Google Maps SDK iOS (if required)](https://console.developers.google.com/apis/library/maps-ios-backend.googleapis.com) + +For reference, you may read the relevant issue reports: ([#118](https://github.com/react-native-community/react-native-maps/issues/118), [#176](https://github.com/react-native-community/react-native-maps/issues/176), [#684](https://github.com/react-native-community/react-native-maps/issues/684)). + +### No map whatsoever + +Ensure the map component and its container have viewport dimensions. An +example is below: + +```jsx +import MapView, { PROVIDER_GOOGLE } from 'react-native-maps'; // remove PROVIDER_GOOGLE import if not using Google Maps +... +const styles = StyleSheet.create({ + container: { + ...StyleSheet.absoluteFillObject, + height: 400, + width: 400, + justifyContent: 'flex-end', + alignItems: 'center', + }, + map: { + ...StyleSheet.absoluteFillObject, + }, +}); + +export default () => ( + + + + +); +``` + +### Build issues with Google Maps iOS Utils (iOS) + +If your XCode project uses dynamic frameworks (e.g. you also have Swift +code in your project), you cannot install `Google-Maps-iOS-Utils` with +CocoaPods. The issue and a workaround for it has been documented +[here](https://github.com/googlemaps/google-maps-ios-utils/blob/master/Swift.md). + +### Runtime errors on iOS (Apple Maps) + +If you are trying to mount the map with the `GOOGLE_PROVIDER` during +runtime, but your build has been configured for the Apple Maps backend, +a runtime exception will be raised. + +In addition, when using Apple Maps, some Google-only functionalities +have been disabled via runtime errors. + +An exception will be raised if you try to use advanced features that +depend on the [Google Maps SDK for +iOS](https://github.com/googlemaps/google-maps-ios-utils). These include + +- Making markers from KML files +- Heatmap rendering +- Marker clustering +- etc. + +### Clearing caches + +Run these commands to clean caches + +```sh +# NPM +watchman watch-del-all +npm cache clean + +# Android, if you encounter `com.android.dex.DexException: Multiple dex files define Landroid/support/v7/appcompat/R$anim`, then clear build folder. +cd android +./gradlew clean +cd .. +``` + +### When using XCode <9 + +If you use Xcode with version less than 9 you may get `use of undeclared +identifier 'MKMapTypeMutedStandard'` or `Entry, ":CFBundleIdentifier", +Does Not Exist` errors. In this case you have to update your Xcode. + +### When using Android studio + +Make sure your Android studio is up to date and set up following the +[React Native +docs](https://facebook.github.io/react-native/docs/getting-started.html). + +In particular, the following packages have to be installed: + + - Extras / Google Play services + - Extras / Google Repository + - Android 6.0 (API 23) / Google APIs Intel x86 Atom System Image Rev. 19 + - Android SDK Build-tools 23.0.3 + +### No native module found exception on Android + +Be sure to have `new MapsPackage()` in your `MainApplication.java` : + +```java +import com.airbnb.android.react.maps.MapsPackage; +... + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new MapsPackage() + ); + } +``` + +### Android emulator issues + +- When starting Android emulator, make sure you have enabled `Wipe user data`. +- If you are using Android Virtual Devices (AVD), ensure that `Use Host GPU` is checked in the settings for your virtual device. +- If using an emulator and the only thing that shows up on the screen is + the message: `[APPNAME] won't run without Google Play services which + are not supported by your device.`, you need to change the emulator + CPU/ABI setting to a system image that includes Google APIs. These may + need to be downloaded from the Android SDK Manager first. + + + ### Google Play Services conflicting issues with other modules + + In case you have multiple modules using Google Play Services such as `react-native-onesignal`, Make sure to exclude all the Google Play Services dependencies from the modules and import all the Google Play Services dependencies for all the modules in the project-wide `build.gradle` file like the following example: + ``` + implementation(project(':react-native-onesignal')){ + exclude group: 'com.google.android.gms' + } + + implementation(project(':react-native-maps')){ + exclude group: 'com.google.android.gms' + } + implementation 'com.google.android.gms:play-services-base:12.0.1' + implementation 'com.google.android.gms:play-services-basement:12.0.1' + implementation 'com.google.android.gms:play-services-location:12.0.1' + implementation 'com.google.android.gms:play-services-tasks:12.0.1' + implementation 'com.google.android.gms:play-services-maps:12.0.1' + + + ``` + +### Trouble with Google Play services + +- Make sure that your emulator has Google Play (Go to Anroid studio -> Virtual Devices -> Check that you have icon in "Play Store" column) +- Click to bottom dots icon in the emulator +- Go to Google Play Tab and click Update + + +### Android build error: "Program type already present" + +If you **don't** use project-wide properties as per instructions above (not making changes to global android/build.gradle) and encounter at build time "Program type already present" error - add those lines to your android/app/build.gradle in the dependencies section: + + dependencies { + ... + implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" + implementation "com.android.support:design:${rootProject.ext.supportLibVersion}" + implementation "com.android.support:support-v4:${rootProject.ext.supportLibVersion}" + } + diff --git a/docs/mapview.md b/docs/mapview.md new file mode 100644 index 0000000..00d11c2 --- /dev/null +++ b/docs/mapview.md @@ -0,0 +1,227 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `provider` | `string` | | The map framework to use.

Either `"google"` for GoogleMaps, otherwise `null` or `undefined` to use the native map framework (`MapKit` in iOS and `GoogleMaps` in android). +| `region` | `Region` | | The region to be displayed by the map.

The region is defined by the center coordinates and the span of coordinates to display. +| `initialRegion` | `Region` | | The initial region to be displayed by the map. Use this prop instead of `region` only if you don't want to control the viewport of the map besides the initial region.

Changing this prop after the component has mounted will not result in a region change.

This is similar to the `initialValue` prop of a text input. +| `camera` | `Camera` | | The camera view the map should display. If you use this, the `region` property is ignored. +| `initialCamera` | `Camera` | | Like `initialRegion`, use this prop instead of `camera` only if you don't want to control the viewport of the map besides the initial camera setting.

Changing this prop after the component has mounted will not result in a region change.

This is similar to the `initialValue` prop of a text input. +| `mapPadding` | `EdgePadding` | | Adds custom padding to each side of the map. Useful when map elements/markers are obscured. **Note** Google Maps only. +| `paddingAdjustmentBehavior` | 'always'\|'automatic'\|'never' | 'never' | Indicates how/when to affect padding with safe area insets (`GoogleMaps` in iOS only) +| `liteMode` | `Boolean` | `false` | Enable lite mode. **Note**: Android only. +| `mapType` | `String` | `"standard"` | The map type to be displayed.

- standard: standard road map (default)
- none: no map **Note** Not available on MapKit
- satellite: satellite view
- hybrid: satellite view with roads and points of interest overlayed
- terrain: (Android only) topographic view
- mutedStandard: more subtle, makes markers/lines pop more (iOS 11.0+ only) +| `customMapStyle` | `Array` | | Adds custom styling to the map component. See [README](https://github.com/react-native-community/react-native-maps#customizing-the-map-style) for more information. +| `showsUserLocation` | `Boolean` | `false` | If `true` the app will ask for the user's location. **NOTE**: You need to add `NSLocationWhenInUseUsageDescription` key in Info.plist to enable geolocation, otherwise it is going to *fail silently*! You will also need to add an explanation for why you need the users location against `NSLocationWhenInUseUsageDescription` in Info.plist. Otherwise Apple may reject your app submission. +| `userLocationAnnotationTitle` | `String` | | The title of the annotation for current user location. This only works if `showsUserLocation` is true. There is a default value `My Location` set by MapView. **Note**: iOS only. +| `followsUserLocation` | `Boolean` | `false` | If `true` the map will focus on the user's location. This only works if `showsUserLocation` is true and the user has shared their location. **Note**: iOS only. +| `showsMyLocationButton` | `Boolean` | `true` | If `false` hide the button to move map to the current user's location. +| `showsPointsOfInterest` | `Boolean` | `true` | If `false` points of interest won't be displayed on the map. +| `showsCompass` | `Boolean` | `true` | If `false` compass won't be displayed on the map. +| `showsScale` | `Boolean` | `true` | A Boolean indicating whether the map shows scale information. **Note**: Apple Maps only. +| `showsBuildings` | `Boolean` | `true` | A Boolean indicating whether the map displays extruded building information. +| `showsTraffic` | `Boolean` | `true` | A Boolean value indicating whether the map displays traffic information. +| `showsIndoors` | `Boolean` | `true` | A Boolean indicating whether indoor maps should be enabled. +| `showsIndoorLevelPicker` | `Boolean` | `false` | A Boolean indicating whether indoor level picker should be enabled. **Note:** Google Maps only (either Android or iOS with `PROVIDER_GOOGLE`). +| `zoomEnabled` | `Boolean` | `true` | If `false` the user won't be able to pinch/zoom the map. +| `zoomTapEnabled` | `Boolean` | `true` | If `false` the user won't be able to double tap to zoom the map. **Note:** But it will greatly decrease delay of tap gesture recognition. **Note:** Google Maps on iOS only +| `zoomControlEnabled` | `Boolean` | `true` | If `false` the zoom control at the bottom right of the map won't be visible **Note:** Android only. +| `minZoomLevel` | `Number` | `0` | Minimum zoom value for the map, must be between 0 and 20 +| `maxZoomLevel` | `Number` | `20` | Maximum zoom value for the map, must be between 0 and 20 +| `rotateEnabled` | `Boolean` | `true` | If `false` the user won't be able to pinch/rotate the map. +| `scrollEnabled` | `Boolean` | `true` | If `false` the user won't be able to change the map region being displayed. +| `pitchEnabled` | `Boolean` | `true` | If `false` the user won't be able to adjust the camera’s pitch angle. +| `toolbarEnabled` | `Boolean` | `true` | `Android only` If `false` will hide 'Navigate' and 'Open in Maps' buttons on marker press +| `cacheEnabled` | `Boolean` | `false` | If `true` map will be cached and displayed as an image instead of being interactable, for performance usage. **Note:** Apple Maps only +| `loadingEnabled` | `Boolean` | `false` | If `true` a loading indicator will show while the map is loading. +| `loadingIndicatorColor` | `Color` | `#606060` | Sets loading indicator color, default to `#606060`. +| `loadingBackgroundColor` | `Color` | `#FFFFFF` | Sets loading background color, default to `#FFFFFF`. +| `moveOnMarkerPress` | `Boolean` | `true` | `Android only` If `false` the map won't move when a marker is pressed. +| `legalLabelInsets` | `EdgeInsets` | | If set, changes the position of the "Legal" label link from the OS default. **Note:** iOS only. +| `kmlSrc` | `string` | | The URL from KML file. **Note:** Google Maps and Markers only (either Android or iOS with `PROVIDER_GOOGLE`). +| `compassOffset` | `Point` | | If set, changes the position of the compass. **Note:** iOS Maps only. + + +## Events + +To access event data, you will need to use `e.nativeEvent`. For example, `onPress={e => console.log(e.nativeEvent)}` will log the entire event object to your console. + +| Event Name | Returns | Notes +|---|---|---| +| `onMapReady` | | Callback that is called once the map is fully loaded. +| `onKmlReady` | `KmlContainer` | Callback that is called once the kml is fully loaded. +| `onRegionChange` | `Region` | Callback that is called continuously when the region changes, such as when a user is dragging the map. +| `onRegionChangeComplete` | `Region` | Callback that is called once when the region changes, such as when the user is done moving the map. +| `onUserLocationChange` | `{ coordinate: Location }` | Callback that is called when the underlying map figures our users current location (coordinate also includes isFromMockProvider value for Android API 18 and above). Make sure **showsUserLocation** is set to *true* and that the provider is `"google"`. +| `onPress` | `{ coordinate: LatLng, position: Point }` | Callback that is called when user taps on the map. +| `onPanDrag` | `{ coordinate: LatLng, position: Point }` | Callback that is called when user presses and drags the map. **NOTE**: for iOS `scrollEnabled` should be set to false to trigger the event +| `onPoiClick` | `{ coordinate: LatLng, position: Point, placeId: string, name: string }` | Callback that is called when user click on a POI. +| `onLongPress` | `{ coordinate: LatLng, position: Point }` | Callback that is called when user makes a "long press" somewhere on the map. +| `onMarkerPress` | | Callback that is called when a marker on the map is tapped by the user. +| `onMarkerSelect` | | Callback that is called when a marker on the map becomes selected. This will be called when the callout for that marker is about to be shown. **Note**: iOS only. +| `onMarkerDeselect` | | Callback that is called when a marker on the map becomes deselected. This will be called when the callout for that marker is about to be hidden. **Note**: iOS only. +| `onCalloutPress` | | Callback that is called when a callout is tapped by the user. +| `onMarkerDragStart` | `{ coordinate: LatLng, position: Point }` | Callback that is called when the user initiates a drag on a marker (if it is draggable) +| `onMarkerDrag` | `{ coordinate: LatLng, position: Point }` | Callback called continuously as a marker is dragged +| `onMarkerDragEnd` | `{ coordinate: LatLng, position: Point }` | Callback that is called when a drag on a marker finishes. This is usually the point you will want to setState on the marker's coordinate again +| `onIndoorLevelActivated` | `IndoorLevel` | Callback that is called when a level on indoor building is activated +| `onIndoorBuildingFocused` | `IndoorBuilding` | Callback that is called when a indoor building is focused/unfocused + + + +## Methods + +| Method Name | Arguments | Notes +|---|---|---| +| `getCamera` | | Returns a `Camera` structure indicating the current camera configuration. +| `animateCamera` | `camera: Camera`, `{ duration: Number }` | Animate the camera to a new view. You can pass a partial camera object here; any property not given will remain unmodified. +| `setCamera` | `camera: Camera`, `{ duration: Number }` | Like `animateCamera`, but sets the new view instantly, without an animation. +| `animateToRegion` | `region: Region`, `duration: Number` | +| `animateToNavigation` | `location: LatLng`, `bearing: Number`, `angle: Number`, `duration: Number` | Deprecated. Use `animateCamera` instead. +| `animateToCoordinate` | `coordinate: LatLng`, `duration: Number` | Deprecated. Use `animateCamera` instead. +| `animateToBearing` | `bearing: Number`, `duration: Number` | Deprecated. Use `animateCamera` instead. +| `animateToViewingAngle` | `angle: Number`, `duration: Number` | Deprecated. Use `animateCamera` instead. +| `getMapBoundaries` | | `Promise<{northEast: LatLng, southWest: LatLng}>` +| `setMapBoundaries` | `northEast: LatLng`, `southWest: LatLng` | The boundary is defined by the map's center coordinates, not the device's viewport itself. **Note:** Google Maps only. +| `setIndoorActiveLevelIndex` | `levelIndex: Number` | +| `fitToElements` | `animated: Boolean` | +| `fitToSuppliedMarkers` | `markerIDs: String[], options: { edgePadding: EdgePadding, animated: Boolean }` | If you need to use this in `ComponentDidMount`, make sure you put it in a timeout or it will cause performance problems. +| `fitToCoordinates` | `coordinates: Array, options: { edgePadding: EdgePadding, animated: Boolean }` | If called in `ComponentDidMount` in android, it will cause an exception. It is recommended to call it from the MapView `onLayout` event. +| `pointForCoordinate` | `coordinate: LatLng` | Converts a map coordinate to a view coordinate (`Point`). Returns a `Promise`. +| `coordinateForPoint` | `point: Point` | Converts a view coordinate (`Point`) to a map coordinate. Returns a `Promise`. +| `getMarkersFrames` | `onlyVisible: Boolean` | Get markers' centers and frames in view coordinates. Returns a `Promise<{ "markerID" : { point: Point, frame: Frame } }>`. **Note**: iOS only. + + + +## Types + +``` +type Region { + latitude: Number, + longitude: Number, + latitudeDelta: Number, + longitudeDelta: Number, +} +``` + +``` +type Camera = { + center: { + latitude: number, + longitude: number, + }, + pitch: number, + heading: number + + // Only on iOS MapKit, in meters. The property is ignored by Google Maps. + altitude: number. + + // Only when using Google Maps. + zoom: number +} +``` + +Latitude and longitude are self explanatory while latitudeDelta and longitudeDelta may not. +On the [developer.apple.com](https://developer.apple.com/reference/mapkit/mkcoordinatespan/1452417-latitudedelta) website this is how the "latitudeDelta" property is explained: + +> The amount of north-to-south distance (measured in degrees) to display on the map. Unlike longitudinal distances, which vary based on the latitude, one degree of latitude is always approximately 111 kilometers (69 miles). + +If this is not enough, you can find a [visual explanation on stackoverflow](https://stackoverflow.com/questions/36685372/how-to-zoom-in-out-in-react-native-map/36688156#36688156). + +Note that when using the `Camera`, MapKit on iOS and Google Maps differ in how the height is specified. For a cross-platform app, it is necessary +to specify both the zoom level and the altitude separately. + +``` +type LatLng { + latitude: Number, + longitude: Number, +} +``` + +``` +type Location { + latitude: Number, + longitude: Number, + altitude: Number, + timestamp: Number, //Milliseconds since Unix epoch + accuracy: Number, + altitudeAccuracy: Number, + speed: Number, +} +``` + +``` +type Point { + x: Number, + y: Number, +} +``` + +``` +type Frame { + x: Number, + y: Number, + width: Number, + height: Number, +} +``` + +``` +enum MapType : String { + "standard", + "satellite", + "hybrid", + "terrain" //Android only +} +``` + +``` +type EdgePadding { + top: Number, + right: Number, + bottom: Number, + left: Number +} +``` + +``` +type EdgeInsets { + top: Number, + left: Number, + bottom: Number, + right: Number +} +``` + +``` +type Marker { + id: String, + coordinate: LatLng, + title: String, + description: String +} +``` + +``` +type KmlContainer { + markers: [Marker] +} +``` + +``` +type IndoorBuilding { + underground: boolean, + activeLevelIndex: Number, + levels: Array, +} +``` + +``` +type IndoorLevel { + activeLevelIndex: Number, + name: String, + shortName: String, +} +``` diff --git a/docs/marker.md b/docs/marker.md new file mode 100644 index 0000000..b57a4b3 --- /dev/null +++ b/docs/marker.md @@ -0,0 +1,80 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `title` | `String` | | The title of the marker. This is only used if the component has no children that are a ``, in which case the default callout behavior will be used, which will show both the `title` and the `description`, if provided. +| `description` | `String` | | The description of the marker. This is only used if the component has no children that are a ``, in which case the default callout behavior will be used, which will show both the `title` and the `description`, if provided. +| `image` | `ImageSource` | | A custom image to be used as the marker's icon. Only local image resources are allowed to be used. +| `icon` | `ImageSource` | | Marker icon to render (equivalent to `icon` property of GMSMarker Class). +| `pinColor` | `Color` | | If no custom marker view or custom image is provided, the platform default pin will be used, which can be customized by this color. Ignored if a custom marker is being used.

For Android, the set of available colors is limited. Unsupported colors will fall back to red. See [#887](https://github.com/react-community/react-native-maps/issues/887) for more information. +| `coordinate` | `LatLng` | | The coordinate for the marker. +| `centerOffset` | `Point` | (0, 0) | The offset (in points) at which to display the view.

By default, the center point of an annotation view is placed at the coordinate point of the associated annotation. You can use this property to reposition the annotation view as needed. This x and y offset values are measured in points. Positive offset values move the annotation view down and to the right, while negative values move it up and to the left.

For Google Maps, see the `anchor` prop. +| `calloutOffset` | `Point` | (0, 0) | The offset (in points) at which to place the callout bubble.

This property determines the additional distance by which to move the callout bubble. When this property is set to (0, 0), the anchor point of the callout bubble is placed on the top-center point of the marker view’s frame. Specifying positive offset values moves the callout bubble down and to the right, while specifying negative values moves it up and to the left.

For Google Maps, see the `calloutAnchor` prop. +| `anchor` | `Point` | (0.5, 1) | Sets the anchor point for the marker.

The anchor specifies the point in the icon image that is anchored to the marker's position on the Earth's surface.

The anchor point is specified in the continuous space [0.0, 1.0] x [0.0, 1.0], where (0, 0) is the top-left corner of the image, and (1, 1) is the bottom-right corner. The anchoring point in a W x H image is the nearest discrete grid point in a (W + 1) x (H + 1) grid, obtained by scaling the then rounding. For example, in a 4 x 2 image, the anchor point (0.7, 0.6) resolves to the grid point at (3, 1).

For MapKit on iOS, see the `centerOffset` prop. +| `calloutAnchor` | `Point` | (0.5, 0) | Specifies the point in the marker image at which to anchor the callout when it is displayed. This is specified in the same coordinate system as the anchor. See the `anchor` prop for more details.

The default is the top middle of the image.

For MapKit on iOS, see the `calloutOffset` prop. +| `flat` | `Boolean` | false | Sets whether this marker should be flat against the map true or a billboard facing the camera. +| `identifier` | `String` | | An identifier used to reference this marker at a later date. +| `rotation` | `Float` | 0 | A float number indicating marker's rotation angle, in degrees. +| `draggable` | `` | | This is a non-value based prop. Adding this allows the marker to be draggable (re-positioned). +| `tracksViewChanges` | `Boolean` | true | Sets whether this marker should track view changes. It's recommended to turn it off whenever it's possible to improve custom marker performance. +| `tracksInfoWindowChanges` | `Boolean` | false | Sets whether this marker should track view changes in info window. Enabling it will let marker change content of info window after first render pass, but will lead to decreased performance, so it's recommended to disable it whenever you don't need it. **Note**: iOS Google Maps only. +| `stopPropagation` | `Boolean` | false | Sets whether this marker should propagate `onPress` events. Enabling it will stop the parent `MapView`'s `onPress` from being called. **Note**: iOS only. Android does not propagate `onPress` events. See [#1132](https://github.com/react-community/react-native-maps/issues/1132) for more information. +| `opacity` | `Float` | 1.0 | The marker's opacity between 0.0 and 1.0. + +## Events + +To access event data, you will need to use `e.nativeEvent`. For example, `onPress={e => console.log(e.nativeEvent)}` will log the entire event object to your console. + +| Event Name | Returns | Notes +|---|---|---| +| `onPress` | `{ coordinate: LatLng, position: Point }` | Callback that is called when the user presses on the marker +| `onSelect` | `{ coordinate: LatLng, position: Point }` | Callback that is called when the user selects the marker, before the callout is shown. **Note**: iOS only. +| `onDeselect` | `{ coordinate: LatLng, position: Point }` | Callback that is called when the marker is deselected, before the callout is hidden. **Note**: iOS only. +| `onCalloutPress` | | Callback that is called when the user taps the callout view. +| `onDragStart` | `{ coordinate: LatLng, position: Point }` | Callback that is called when the user initiates a drag on this marker (if it is draggable) +| `onDrag` | `{ coordinate: LatLng, position: Point }` | Callback called continuously as the marker is dragged +| `onDragEnd` | `{ coordinate: LatLng, position: Point }` | Callback that is called when a drag on this marker finishes. This is usually the point you will want to setState on the marker's coordinate again + + +## Methods + +| Method Name | Arguments | Notes +|---|---|---| +| `showCallout` | | Shows the callout for this marker +| `hideCallout` | | Hides the callout for this marker +| `redrawCallout` | | Causes a redraw of the marker's callout. Useful for Google Maps on iOS. **Note**: iOS only. +| `animateMarkerToCoordinate` | `coordinate: LatLng, duration: number` | Animates marker movement. **Note**: Android only +| `redraw` | | Causes a redraw of the marker. Useful when there are updates to the marker and `tracksViewChanges` comes with a cost that is too high. + + + +## Types + +``` +type LatLng { + latitude: Number, + longitude: Number, +} +``` + +``` +type Point { + x: Number, + y: Number, +} +``` + +## Children Components + +Children components can be added within a Marker and rendered content will replace the marker symbol. This is a way of creating custom markers and allowing use of native SVGs. + +Example: +``` + + + SF + + +``` diff --git a/docs/overlay.md b/docs/overlay.md new file mode 100644 index 0000000..a12f8b4 --- /dev/null +++ b/docs/overlay.md @@ -0,0 +1,17 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `image` | `ImageSource` | A custom image to be used as the overlay. Only required local image resources and uri (as for images located in the net) are allowed to be used. +| `bounds` | `Array` | | The coordinates for the image (left-top corner, right-bottom corner). ie.```[[lat, long], [lat, long]]``` + +## Types + +``` +type LatLng = [ + latitude: Number, + longitude: Number, +] +``` diff --git a/docs/polygon.md b/docs/polygon.md new file mode 100644 index 0000000..adbb3bd --- /dev/null +++ b/docs/polygon.md @@ -0,0 +1,33 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `coordinates` | `Array` | (Required) | An array of coordinates to describe the polygon +| `holes` | `Array>` | | A 2d array of coordinates to describe holes of the polygon where each hole has at least 3 points. +| `strokeWidth` | `Number` | `1` | The stroke width to use for the path. +| `strokeColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The stroke color to use for the path. +| `fillColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The fill color to use for the path. +| `lineCap` | `String` | `round` | The line cap style to apply to the open ends of the path. +| `lineJoin` | `Array` | | The line join style to apply to corners of the path. +| `miterLimit` | `Number` | | The limiting value that helps avoid spikes at junctions between connected line segments. The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If the ratio of the miter length—that is, the diagonal length of the miter join—to the line thickness exceeds the miter limit, the joint is converted to a bevel join. The default miter limit is 10, which results in the conversion of miters whose angle at the joint is less than 11 degrees. +| `geodesic` | `Boolean` | | Boolean to indicate whether to draw each segment of the line as a geodesic as opposed to straight lines on the Mercator projection. A geodesic is the shortest path between two points on the Earth's surface. The geodesic curve is constructed assuming the Earth is a sphere. +| `lineDashPhase` | `Number` | `0` | (iOS only) The offset (in points) at which to start drawing the dash pattern. Use this property to start drawing a dashed line partway through a segment or gap. For example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the middle of the first gap. +| `lineDashPattern` | `Array` | `null` | (iOS only) An array of numbers specifying the dash pattern to use for the path. The array contains one or more numbers that indicate the lengths (measured in points) of the line segments and gaps in the pattern. The values in the array alternate, starting with the first line segment length, followed by the first gap length, followed by the second line segment length, and so on. +| `tappable` | `Bool` | false | Boolean to allow a polygon to be tappable and use the onPress function. + +## Events + +| Event Name | Returns | Notes +|---|---|---| +| `onPress` | | Callback that is called when the user presses on the polygon + +## Types + +``` +type LatLng { + latitude: Number, + longitude: Number, +} +``` diff --git a/docs/polyline.md b/docs/polyline.md new file mode 100644 index 0000000..dabf0ce --- /dev/null +++ b/docs/polyline.md @@ -0,0 +1,65 @@ +# `` Component API + +## Props + +| Prop | Type | Default | Note | +|---|---|---|---| +| `coordinates` | `Array` | (Required) | An array of coordinates to describe the polyline +| `strokeWidth` | `Number` | `1` | The stroke width to use for the path. +| `strokeColor` | `String` | `#000, rgba(r,g,b,0.5)` | The stroke color to use for the path. +| `strokeColors` | `Array` | `null` | The stroke colors to use for the path (iOS only). Must be the same length as `coordinates`. +| `lineCap` | `String` | `round` | The line cap style to apply to the open ends of the path. Possible values are `butt`, `round` or `square`. Note: lineCap is not yet supported for GoogleMaps provider on iOS. +| `lineJoin` | `String` | `round` | The line join style to apply to corners of the path. Possible values are `miter`, `round` or `bevel`. +| `miterLimit` | `Number` | | The limiting value that helps avoid spikes at junctions between connected line segments. The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If the ratio of the miter length—that is, the diagonal length of the miter join—to the line thickness exceeds the miter limit, the joint is converted to a bevel join. The default miter limit is 10, which results in the conversion of miters whose angle at the joint is less than 11 degrees. +| `geodesic` | `Boolean` | | Boolean to indicate whether to draw each segment of the line as a geodesic as opposed to straight lines on the Mercator projection. A geodesic is the shortest path between two points on the Earth's surface. The geodesic curve is constructed assuming the Earth is a sphere. +| `lineDashPhase` | `Number` | `0` | (iOS only) The offset (in points) at which to start drawing the dash pattern. Use this property to start drawing a dashed line partway through a segment or gap. For example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the middle of the first gap. +| `lineDashPattern` | `Array` | `null` | An array of numbers specifying the dash pattern to use for the path. The array contains one or more numbers that indicate the lengths (measured in points) of the line segments and gaps in the pattern. The values in the array alternate, starting with the first line segment length, followed by the first gap length, followed by the second line segment length, and so on. +| `tappable` | `Bool` | false | Boolean to allow a polyline to be tappable and use the onPress function. + +## Events + +| Event Name | Returns | Notes +|---|---|---| +| `onPress` | | Callback that is called when the user presses on the polyline + +## Types + +``` +type LatLng { + latitude: Number, + longitude: Number, +} +``` + +## Gradient Polylines (iOS MapKit only) + +Gradient polylines can be created by using the `strokeColors` prop. `strokeColors` must be an array with the same number of elements as `coordinates`. + +Example: + +```js +import MapView, { Polyline } from 'react-native-maps'; + + + + +``` diff --git a/enable-google-maps b/enable-google-maps new file mode 100755 index 0000000..66ec2be --- /dev/null +++ b/enable-google-maps @@ -0,0 +1,15 @@ +#!/bin/bash + +cd "$(dirname "${BASH_SOURCE[0]}")" + +GOOGLE_MAPS_INSTALL_LOCATION=$1 + +if [[ -z "$GOOGLE_MAPS_INSTALL_LOCATION" ]]; then + echo "usage: enable-google-maps " + exit 1 +fi + +cat > lib/ios/User.xcconfig < \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..0f8d593 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..7446fba --- /dev/null +++ b/index.d.ts @@ -0,0 +1,497 @@ +declare module "react-native-maps" { + import * as React from "react"; + import { + Animated, + ImageRequireSource, + ImageURISource, + NativeSyntheticEvent, + ViewProperties + } from "react-native"; + + export interface Region { + latitude: number; + longitude: number; + latitudeDelta: number; + longitudeDelta: number; + } + + export interface LatLng { + latitude: number; + longitude: number; + } + + export interface Camera { + center: LatLng; + heading: number; + pitch: number; + zoom: number; + altitude: number; + } + + export interface Point { + x: number; + y: number; + } + + // helper interface + export interface MapEvent + extends NativeSyntheticEvent< + T & { + coordinate: LatLng; + position: Point; + } + > {} + + export type LineCapType = "butt" | "round" | "square"; + export type LineJoinType = "miter" | "round" | "bevel"; + + // ======================================================================= + // AnimatedRegion + // ======================================================================= + + interface AnimatedRegionTimingConfig + extends Animated.AnimationConfig, + Partial { + easing?: (value: number) => number; + duration?: number; + delay?: number; + } + + interface AnimatedRegionSpringConfig + extends Animated.AnimationConfig, + Partial { + overshootClamping?: boolean; + restDisplacementThreshold?: number; + restSpeedThreshold?: number; + velocity?: number | Point; + bounciness?: number; + speed?: number; + tension?: number; + friction?: number; + stiffness?: number; + mass?: number; + damping?: number; + } + + export class AnimatedRegion extends Animated.AnimatedWithChildren { + latitude: Animated.Value; + longitude: Animated.Value; + latitudeDelta: Animated.Value; + longitudeDelta: Animated.Value; + + constructor(region?: Region); + + setValue(value: Region): void; + setOffset(offset: Region): void; + flattenOffset(): void; + stopAnimation(callback?: (region: Region) => void): void; + addListener(callback: (region: Region) => void): string; + removeListener(id: string): void; + spring(config: AnimatedRegionSpringConfig): Animated.CompositeAnimation; + timing(config: AnimatedRegionTimingConfig): Animated.CompositeAnimation; + } + + // ======================================================================= + // MapView (default export) + // ======================================================================= + + /** + * takeSnapshot options + */ + export interface SnapshotOptions { + /** optional, when omitted the view-width is used */ + width?: number; + /** optional, when omitted the view-height is used */ + height?: number; + /** __iOS only__, optional region to render */ + region?: Region; + /** image formats, defaults to 'png' */ + format?: "png" | "jpg"; + /** image quality: 0..1 (only relevant for jpg, default: 1) */ + quality?: number; + /** result types, defaults to 'file' */ + result?: "file" | "base64"; + } + + /** + * onUserLocationChange parameters + */ + export interface EventUserLocation extends NativeSyntheticEvent<{}> { + nativeEvent: { + coordinate: { + latitude: number; + longitude: number; + altitude: number; + timestamp: number; + accuracy: number; + speed: number; + isFromMockProvider: boolean; + }; + }; + } + + /** + * Map style elements. + * @see https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource + * @see https://developers.google.com/maps/documentation/android-api/styling + */ + export type MapStyleElement = { + featureType?: string; + elementType?: string; + stylers: object[]; + }; + + export type EdgePadding = { + top: Number; + right: Number; + bottom: Number; + left: Number; + }; + + export type EdgeInsets = { + top: Number; + right: Number; + bottom: Number; + left: Number; + }; + + export type KmlMarker = { + id: String; + title: String; + description: String; + coordinate: LatLng; + position: Point; + }; + + /** + * onKmlReady parameter + */ + export interface KmlMapEvent + extends NativeSyntheticEvent<{ markers: KmlMarker[] }> {} + + type MapTypes = + | "standard" + | "satellite" + | "hybrid" + | "terrain" + | "none" + | "mutedStandard"; + + export interface MapViewProps extends ViewProperties { + provider?: "google" | null; + customMapStyle?: MapStyleElement[]; + customMapStyleString?: string; + showsUserLocation?: boolean; + userLocationAnnotationTitle?: string; + showsMyLocationButton?: boolean; + followsUserLocation?: boolean; + showsPointsOfInterest?: boolean; + showsCompass?: boolean; + zoomEnabled?: boolean; + zoomTapEnabled?: boolean; + zoomControlEnabled?: boolean; + rotateEnabled?: boolean; + cacheEnabled?: boolean; + loadingEnabled?: boolean; + loadingBackgroundColor?: string; + loadingIndicatorColor?: string; + scrollEnabled?: boolean; + pitchEnabled?: boolean; + toolbarEnabled?: boolean; + moveOnMarkerPress?: boolean; + showsScale?: boolean; + showsBuildings?: boolean; + showsTraffic?: boolean; + showsIndoors?: boolean; + showsIndoorLevelPicker?: boolean; + mapType?: MapTypes; + region?: Region; + initialRegion?: Region; + camera?: Camera; + initialCamera?: Camera; + liteMode?: boolean; + mapPadding?: EdgePadding; + maxDelta?: number; + minDelta?: number; + legalLabelInsets?: EdgeInsets; + compassOffset?: { x: number; y: number }; + + onMapReady?: () => void; + onKmlReady?: (values: KmlMapEvent) => void; + onRegionChange?: (region: Region) => void; + onRegionChangeComplete?: (region: Region) => void; + onPress?: (event: MapEvent) => void; + onLongPress?: (event: MapEvent) => void; + onUserLocationChange?: (event: EventUserLocation) => void; + onPanDrag?: (event: MapEvent) => void; + onPoiClick?: (event: MapEvent<{ placeId: string; name: string }>) => void; + onMarkerPress?: ( + event: MapEvent<{ action: "marker-press"; id: string }> + ) => void; + onMarkerSelect?: ( + event: MapEvent<{ action: "marker-select"; id: string }> + ) => void; + onMarkerDeselect?: ( + event: MapEvent<{ action: "marker-deselect"; id: string }> + ) => void; + onCalloutPress?: (event: MapEvent<{ action: "callout-press" }>) => void; + onMarkerDragStart?: (event: MapEvent) => void; + onMarkerDrag?: (event: MapEvent) => void; + onMarkerDragEnd?: (event: MapEvent) => void; + + minZoomLevel?: number; + maxZoomLevel?: number; + kmlSrc?: string; + } + + export default class MapView extends React.Component { + getCamera(): Promise; + setCamera(camera: Partial): void; + animateCamera(camera: Partial, opts?: { duration?: number }): void; + animateToNavigation( + location: LatLng, + bearing: number, + angle: number, + duration?: number + ): void; + animateToRegion(region: Region, duration?: number): void; + animateToCoordinate(latLng: LatLng, duration?: number): void; + animateToBearing(bearing: number, duration?: number): void; + animateToViewingAngle(angle: number, duration?: number): void; + fitToElements(animated: boolean): void; + fitToSuppliedMarkers( + markers: string[], + options?: { edgePadding?: EdgePadding; animated?: boolean } + ): void; + fitToCoordinates( + coordinates?: LatLng[], + options?: { edgePadding?: EdgePadding; animated?: boolean } + ): void; + setMapBoundaries(northEast: LatLng, southWest: LatLng): void; + getMapBoundaries(): Promise<{ northEast: LatLng; southWest: LatLng }>; + takeSnapshot(options?: SnapshotOptions): Promise; + pointForCoordinate(coordinate: LatLng): Promise; + coordinateForPoint(point: Point): Promise; + } + + export class MapViewAnimated extends MapView {} + + // ======================================================================= + // Marker + // ======================================================================= + + export interface MarkerProps extends ViewProperties { + identifier?: string; + reuseIdentifier?: string; + title?: string; + description?: string; + image?: ImageURISource | ImageRequireSource; + icon?: ImageURISource | ImageRequireSource; + opacity?: number; + pinColor?: string; + coordinate: LatLng | AnimatedRegion; + centerOffset?: Point; + calloutOffset?: Point; + anchor?: Point; + calloutAnchor?: Point; + flat?: boolean; + draggable?: boolean; + tracksViewChanges?: boolean; + tracksInfoWindowChanges?: boolean; + stopPropagation?: boolean; + onPress?: (event: MapEvent<{ action: "marker-press"; id: string }>) => void; + onSelect?: ( + event: MapEvent<{ action: "marker-select"; id: string }> + ) => void; + onDeselect?: ( + event: MapEvent<{ action: "marker-deselect"; id: string }> + ) => void; + onCalloutPress?: (event: MapEvent<{ action: "callout-press" }>) => void; + onDragStart?: (event: MapEvent) => void; + onDrag?: (event: MapEvent) => void; + onDragEnd?: (event: MapEvent) => void; + + rotation?: number; + zIndex?: number; + } + + export class Marker extends React.Component { + /** + * Shows the callout for this marker + */ + showCallout(): void; + /** + * Hides the callout for this marker + */ + hideCallout(): void; + /** + * Redraws the callout for this marker + * __iOS only__ + */ + redrawCallout(): void; + /** + * Animates marker movement. + * __Android only__ + */ + animateMarkerToCoordinate(coordinate: LatLng, duration?: number): void; + } + + export class MarkerAnimated extends Marker {} + + // ======================================================================= + // Callout + // ======================================================================= + + export interface MapCalloutProps extends ViewProperties { + tooltip?: boolean; + onPress?: (event: MapEvent<{ action: "callout-press" }>) => void; + } + + export class Callout extends React.Component {} + + // ======================================================================= + // CalloutSubview + // ======================================================================= + + export interface MapCalloutSubviewProps extends ViewProperties { + onPress?: (event: MapEvent<{ action: "callout-inside-press" }>) => void; + } + + export class CalloutSubview extends React.Component< + MapCalloutSubviewProps, + any + > {} + + // ======================================================================= + // Polyline + // ======================================================================= + + export interface MapPolylineProps extends ViewProperties { + coordinates: LatLng[]; + onPress?: (event: MapEvent) => void; + tappable?: boolean; + fillColor?: string; + strokeWidth?: number; + strokeColor?: string; + strokeColors?: string[]; + zIndex?: number; + lineCap?: LineCapType; + lineJoin?: LineJoinType; + miterLimit?: number; + geodesic?: boolean; + lineDashPhase?: number; + lineDashPattern?: number[]; + } + + export class Polyline extends React.Component {} + + // ======================================================================= + // Polygon + // ======================================================================= + + export interface MapPolygonProps extends ViewProperties { + coordinates: LatLng[]; + holes?: LatLng[][]; + onPress?: (event: MapEvent) => void; + tappable?: boolean; + strokeWidth?: number; + strokeColor?: string; + fillColor?: string; + zIndex?: number; + lineCap?: LineCapType; + lineJoin?: LineJoinType; + miterLimit?: number; + geodesic?: boolean; + lineDashPhase?: number; + lineDashPattern?: number[]; + } + + export class Polygon extends React.Component {} + + // ======================================================================= + // Circle + // ======================================================================= + + export interface MapCircleProps extends ViewProperties { + center: LatLng; + radius: number; + onPress?: (event: MapEvent) => void; + strokeWidth?: number; + strokeColor?: string; + fillColor?: string; + zIndex?: number; + lineCap?: LineCapType; + lineJoin?: LineJoinType; + miterLimit?: number; + lineDashPhase?: number; + lineDashPattern?: number[]; + } + + export class Circle extends React.Component {} + + // ======================================================================= + // UrlTile & LocalTile + // ======================================================================= + + export interface MapUrlTileProps extends ViewProperties { + urlTemplate: string; + maximumZ?: number; + zIndex?: number; + tileSize?: number; + } + + export class UrlTile extends React.Component {} + + export interface MapLocalTileProps extends ViewProperties { + pathTemplate: string; + tileSize?: number; + zIndex?: number; + } + + export class LocalTile extends React.Component {} + + // ======================================================================= + // WMSTile + // ======================================================================= + + export interface MapWMSTileProps extends ViewProperties { + urlTemplate: string; + maximumZ?: number; + minimumZ?: number; + tileSize: number; + opacity: number; + zIndex?: number; + } + + export class WMSTile extends React.Component {} + // ======================================================================= + // Overlay + // ======================================================================= + + type Coordinate = [number, number]; + + export interface MapOverlayProps extends ViewProperties { + image?: ImageURISource | ImageRequireSource; + bounds: [Coordinate, Coordinate]; + } + + export class Overlay extends React.Component {} + + export class OverlayAnimated extends Overlay {} + + // ======================================================================= + // Constants + // ======================================================================= + + export const MAP_TYPES: { + STANDARD: MapTypes; + SATELLITE: MapTypes; + HYBRID: MapTypes; + TERRAIN: MapTypes; + NONE: MapTypes; + MUTEDSTANDARD: MapTypes; + }; + + export const PROVIDER_DEFAULT: null; + export const PROVIDER_GOOGLE: "google"; +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..534115f --- /dev/null +++ b/index.js @@ -0,0 +1,30 @@ +import MapView, { + Animated, + MAP_TYPES, + ProviderPropType, +} from './lib/components/MapView'; +import Marker from './lib/components/MapMarker.js'; +import Overlay from './lib/components/MapOverlay.js'; + +export { default as Polyline } from './lib/components/MapPolyline.js'; +export { default as Polygon } from './lib/components/MapPolygon.js'; +export { default as Circle } from './lib/components/MapCircle.js'; +export { default as UrlTile } from './lib/components/MapUrlTile.js'; +export { default as WMSTile } from './lib/components/MapWMSTile.js'; +export { default as LocalTile } from './lib/components/MapLocalTile.js'; +export { default as Callout } from './lib/components/MapCallout.js'; +export { + default as CalloutSubview, +} from './lib/components/MapCalloutSubview.js'; +export { default as AnimatedRegion } from './lib/components/AnimatedRegion.js'; + +export { Marker, Overlay }; +export { Animated, MAP_TYPES, ProviderPropType }; + +export const PROVIDER_GOOGLE = MapView.PROVIDER_GOOGLE; +export const PROVIDER_DEFAULT = MapView.PROVIDER_DEFAULT; + +export const MarkerAnimated = Marker.Animated; +export const OverlayAnimated = Overlay.Animated; + +export default MapView; diff --git a/lib/android/.classpath b/lib/android/.classpath new file mode 100644 index 0000000..eb19361 --- /dev/null +++ b/lib/android/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/android/.project b/lib/android/.project new file mode 100644 index 0000000..2a84911 --- /dev/null +++ b/lib/android/.project @@ -0,0 +1,23 @@ + + + react-native-maps-lib + Project react-native-maps-lib created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/lib/android/.settings/org.eclipse.buildship.core.prefs b/lib/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..62e3e7e --- /dev/null +++ b/lib/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=../.. +eclipse.preferences.version=1 diff --git a/lib/android/build.gradle b/lib/android/build.gradle new file mode 100644 index 0000000..b05863b --- /dev/null +++ b/lib/android/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.library' +if (project.hasProperty('POM_ARTIFACT_ID')) { + apply from: 'gradle-maven-push.gradle' +} + +def safeExtGet(prop, fallback) { + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback +} + +android { + compileSdkVersion safeExtGet('compileSdkVersion', 28) + + defaultConfig { + minSdkVersion safeExtGet('minSdkVersion', 16) + targetSdkVersion safeExtGet('targetSdkVersion', 27) + } +} + +dependencies { + implementation('com.facebook.react:react-native:+') { + exclude group: 'com.android.support' + } + implementation "com.android.support:appcompat-v7:${safeExtGet('supportLibVersion', '28.0.0')}" + implementation "com.google.android.gms:play-services-base:${safeExtGet('playServicesVersion', '16.1.0')}" + implementation "com.google.android.gms:play-services-maps:${safeExtGet('playServicesVersion', '16.1.0')}" + implementation 'com.google.maps.android:android-maps-utils:0.5' +} diff --git a/lib/android/build/generated/source/buildConfig/debug/com/airbnb/android/react/maps/BuildConfig.java b/lib/android/build/generated/source/buildConfig/debug/com/airbnb/android/react/maps/BuildConfig.java new file mode 100644 index 0000000..2d99e1e --- /dev/null +++ b/lib/android/build/generated/source/buildConfig/debug/com/airbnb/android/react/maps/BuildConfig.java @@ -0,0 +1,13 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package com.airbnb.android.react.maps; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "com.airbnb.android.react.maps"; + public static final String BUILD_TYPE = "debug"; + public static final String FLAVOR = ""; + public static final int VERSION_CODE = -1; + public static final String VERSION_NAME = ""; +} diff --git a/lib/android/build/generated/source/buildConfig/release/com/airbnb/android/react/maps/BuildConfig.java b/lib/android/build/generated/source/buildConfig/release/com/airbnb/android/react/maps/BuildConfig.java new file mode 100644 index 0000000..0f44d8e --- /dev/null +++ b/lib/android/build/generated/source/buildConfig/release/com/airbnb/android/react/maps/BuildConfig.java @@ -0,0 +1,13 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package com.airbnb.android.react.maps; + +public final class BuildConfig { + public static final boolean DEBUG = false; + public static final String APPLICATION_ID = "com.airbnb.android.react.maps"; + public static final String BUILD_TYPE = "release"; + public static final String FLAVOR = ""; + public static final int VERSION_CODE = -1; + public static final String VERSION_NAME = ""; +} diff --git a/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml new file mode 100644 index 0000000..2f115c6 --- /dev/null +++ b/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output.json b/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output.json new file mode 100644 index 0000000..bc52958 --- /dev/null +++ b/lib/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"AAPT_FRIENDLY_MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":-1,"enabled":true,"outputFile":"react-native-maps-debug.aar","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.airbnb.android.react.maps","split":""}}] \ No newline at end of file diff --git a/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml new file mode 100644 index 0000000..2f115c6 --- /dev/null +++ b/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output.json b/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output.json new file mode 100644 index 0000000..73c326a --- /dev/null +++ b/lib/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"AAPT_FRIENDLY_MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":-1,"enabled":true,"outputFile":"react-native-maps-release.aar","fullName":"release","baseName":"release"},"path":"AndroidManifest.xml","properties":{"packageId":"com.airbnb.android.react.maps","split":""}}] \ No newline at end of file diff --git a/lib/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/lib/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/lib/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lib/android/build/intermediates/annotation_processor_list/release/annotationProcessors.json b/lib/android/build/intermediates/annotation_processor_list/release/annotationProcessors.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/lib/android/build/intermediates/annotation_processor_list/release/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar b/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar new file mode 100644 index 0000000..38034f3 Binary files /dev/null and b/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar differ diff --git a/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/release/generateReleaseRFile/R.jar b/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/release/generateReleaseRFile/R.jar new file mode 100644 index 0000000..7ab676a Binary files /dev/null and b/lib/android/build/intermediates/compile_only_not_namespaced_r_class_jar/release/generateReleaseRFile/R.jar differ diff --git a/lib/android/build/intermediates/full_jar/debug/createFullJarDebug/full.jar b/lib/android/build/intermediates/full_jar/debug/createFullJarDebug/full.jar new file mode 100644 index 0000000..23ab946 Binary files /dev/null and b/lib/android/build/intermediates/full_jar/debug/createFullJarDebug/full.jar differ diff --git a/lib/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar b/lib/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar new file mode 100644 index 0000000..fba4a91 Binary files /dev/null and b/lib/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar differ diff --git a/lib/android/build/intermediates/incremental/debug-mergeJniLibs/merge-state b/lib/android/build/intermediates/incremental/debug-mergeJniLibs/merge-state new file mode 100644 index 0000000..01d8cf1 Binary files /dev/null and b/lib/android/build/intermediates/incremental/debug-mergeJniLibs/merge-state differ diff --git a/lib/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/lib/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml new file mode 100644 index 0000000..c1cdb76 --- /dev/null +++ b/lib/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/lib/android/build/intermediates/incremental/mergeDebugShaders/merger.xml new file mode 100644 index 0000000..45cf307 --- /dev/null +++ b/lib/android/build/intermediates/incremental/mergeDebugShaders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/lib/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml new file mode 100644 index 0000000..4c6f544 --- /dev/null +++ b/lib/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/lib/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml new file mode 100644 index 0000000..e296e2c --- /dev/null +++ b/lib/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/packageDebugAssets/merger.xml b/lib/android/build/intermediates/incremental/packageDebugAssets/merger.xml new file mode 100644 index 0000000..6a2e520 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageDebugAssets/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties b/lib/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties new file mode 100644 index 0000000..0143310 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties @@ -0,0 +1 @@ +#Wed Aug 14 15:43:25 IST 2019 diff --git a/lib/android/build/intermediates/incremental/packageDebugResources/merger.xml b/lib/android/build/intermediates/incremental/packageDebugResources/merger.xml new file mode 100644 index 0000000..6773d06 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageDebugResources/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/packageReleaseAssets/merger.xml b/lib/android/build/intermediates/incremental/packageReleaseAssets/merger.xml new file mode 100644 index 0000000..0b58386 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageReleaseAssets/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/packageReleaseResources/compile-file-map.properties b/lib/android/build/intermediates/incremental/packageReleaseResources/compile-file-map.properties new file mode 100644 index 0000000..8f46d57 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageReleaseResources/compile-file-map.properties @@ -0,0 +1 @@ +#Wed Aug 14 13:58:00 IST 2019 diff --git a/lib/android/build/intermediates/incremental/packageReleaseResources/merger.xml b/lib/android/build/intermediates/incremental/packageReleaseResources/merger.xml new file mode 100644 index 0000000..f940a74 --- /dev/null +++ b/lib/android/build/intermediates/incremental/packageReleaseResources/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/lib/android/build/intermediates/incremental/release-mergeJniLibs/merge-state b/lib/android/build/intermediates/incremental/release-mergeJniLibs/merge-state new file mode 100644 index 0000000..377c742 Binary files /dev/null and b/lib/android/build/intermediates/incremental/release-mergeJniLibs/merge-state differ diff --git a/lib/android/build/intermediates/intermediate-jars/debug/classes.jar b/lib/android/build/intermediates/intermediate-jars/debug/classes.jar new file mode 100644 index 0000000..23ab946 Binary files /dev/null and b/lib/android/build/intermediates/intermediate-jars/debug/classes.jar differ diff --git a/lib/android/build/intermediates/intermediate-jars/debug/res.jar b/lib/android/build/intermediates/intermediate-jars/debug/res.jar new file mode 100644 index 0000000..15cb0ec Binary files /dev/null and b/lib/android/build/intermediates/intermediate-jars/debug/res.jar differ diff --git a/lib/android/build/intermediates/intermediate-jars/release/classes.jar b/lib/android/build/intermediates/intermediate-jars/release/classes.jar new file mode 100644 index 0000000..fba4a91 Binary files /dev/null and b/lib/android/build/intermediates/intermediate-jars/release/classes.jar differ diff --git a/lib/android/build/intermediates/intermediate-jars/release/res.jar b/lib/android/build/intermediates/intermediate-jars/release/res.jar new file mode 100644 index 0000000..15cb0ec Binary files /dev/null and b/lib/android/build/intermediates/intermediate-jars/release/res.jar differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class new file mode 100644 index 0000000..256648c Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class new file mode 100644 index 0000000..f2f2a8f Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class new file mode 100644 index 0000000..b8f876f Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class new file mode 100644 index 0000000..54cc2ef Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class new file mode 100644 index 0000000..1c939eb Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class new file mode 100644 index 0000000..91d9385 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class new file mode 100644 index 0000000..baaa1b2 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class new file mode 100644 index 0000000..a362707 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class new file mode 100644 index 0000000..7ef9d34 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class new file mode 100644 index 0000000..5b74fa6 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class new file mode 100644 index 0000000..cabc795 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class new file mode 100644 index 0000000..7b04dc6 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class new file mode 100644 index 0000000..4cb5bf4 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class new file mode 100644 index 0000000..102aa5e Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class new file mode 100644 index 0000000..48e4c65 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class new file mode 100644 index 0000000..adde54a Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class new file mode 100644 index 0000000..3d9a42a Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class new file mode 100644 index 0000000..8584344 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class new file mode 100644 index 0000000..1deae28 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class new file mode 100644 index 0000000..29ab592 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class new file mode 100644 index 0000000..1a86083 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class new file mode 100644 index 0000000..a9aada5 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class new file mode 100644 index 0000000..62b1077 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class new file mode 100644 index 0000000..ab5f017 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class new file mode 100644 index 0000000..1cdbadb Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class new file mode 100644 index 0000000..1b7b89d Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class new file mode 100644 index 0000000..e7c4a10 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class new file mode 100644 index 0000000..f321894 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class new file mode 100644 index 0000000..b677945 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class new file mode 100644 index 0000000..29c63da Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class new file mode 100644 index 0000000..8448dee Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class new file mode 100644 index 0000000..3b9622d Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class new file mode 100644 index 0000000..d988c60 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class new file mode 100644 index 0000000..3646bce Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class new file mode 100644 index 0000000..7e6602b Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class new file mode 100644 index 0000000..3700e2f Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class new file mode 100644 index 0000000..88cd67b Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class new file mode 100644 index 0000000..1e8139e Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class new file mode 100644 index 0000000..a095ad0 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class new file mode 100644 index 0000000..ad1f7b0 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class new file mode 100644 index 0000000..a572fa0 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class new file mode 100644 index 0000000..cb0b658 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class new file mode 100644 index 0000000..2ef4632 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class new file mode 100644 index 0000000..139d155 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class new file mode 100644 index 0000000..6b8404e Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class new file mode 100644 index 0000000..7843145 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class new file mode 100644 index 0000000..e727ad5 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class new file mode 100644 index 0000000..bac590f Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class new file mode 100644 index 0000000..bf00801 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class new file mode 100644 index 0000000..4ba3ab6 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class new file mode 100644 index 0000000..ae756b4 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class new file mode 100644 index 0000000..10e7ef7 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class new file mode 100644 index 0000000..a639f95 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class new file mode 100644 index 0000000..fdf268d Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class new file mode 100644 index 0000000..bb53114 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class new file mode 100644 index 0000000..e489765 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class new file mode 100644 index 0000000..c68d5d1 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class new file mode 100644 index 0000000..926163c Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class new file mode 100644 index 0000000..2e00e22 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class new file mode 100644 index 0000000..4aa4a92 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class new file mode 100644 index 0000000..ed29491 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class new file mode 100644 index 0000000..5663384 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class differ diff --git a/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class new file mode 100644 index 0000000..2173df9 Binary files /dev/null and b/lib/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class new file mode 100644 index 0000000..256648c Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCallout.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class new file mode 100644 index 0000000..f2f2a8f Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCalloutManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class new file mode 100644 index 0000000..b8f876f Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircle.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class new file mode 100644 index 0000000..54cc2ef Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapCircleManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class new file mode 100644 index 0000000..1c939eb Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapFeature.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class new file mode 100644 index 0000000..91d9385 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLiteManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class new file mode 100644 index 0000000..baaa1b2 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile$AIRMapLocalTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class new file mode 100644 index 0000000..a362707 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTile.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class new file mode 100644 index 0000000..7ef9d34 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapLocalTileManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class new file mode 100644 index 0000000..5b74fa6 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class new file mode 100644 index 0000000..cabc795 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class new file mode 100644 index 0000000..7b04dc6 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker$2.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class new file mode 100644 index 0000000..4cb5bf4 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarker.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class new file mode 100644 index 0000000..102aa5e Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager$AirMapMarkerSharedIcon.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class new file mode 100644 index 0000000..48e4c65 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapMarkerManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class new file mode 100644 index 0000000..adde54a Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class new file mode 100644 index 0000000..3d9a42a Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class new file mode 100644 index 0000000..8584344 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$2.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class new file mode 100644 index 0000000..1deae28 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$3.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class new file mode 100644 index 0000000..29ab592 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$4.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class new file mode 100644 index 0000000..1a86083 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule$5.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class new file mode 100644 index 0000000..a9aada5 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapModule.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class new file mode 100644 index 0000000..62b1077 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlay.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class new file mode 100644 index 0000000..ab5f017 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapOverlayManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class new file mode 100644 index 0000000..1cdbadb Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygon.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class new file mode 100644 index 0000000..1b7b89d Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolygonManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class new file mode 100644 index 0000000..e7c4a10 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolyline.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class new file mode 100644 index 0000000..f321894 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapPolylineManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class new file mode 100644 index 0000000..b677945 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile$AIRMapUrlTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class new file mode 100644 index 0000000..29c63da Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTile.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class new file mode 100644 index 0000000..8448dee Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapUrlTileManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class new file mode 100644 index 0000000..3b9622d Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class new file mode 100644 index 0000000..d988c60 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$10.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class new file mode 100644 index 0000000..3646bce Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$11.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class new file mode 100644 index 0000000..7e6602b Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$12.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class new file mode 100644 index 0000000..3700e2f Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$13.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class new file mode 100644 index 0000000..88cd67b Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$14.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class new file mode 100644 index 0000000..1e8139e Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$15.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class new file mode 100644 index 0000000..a095ad0 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$2.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class new file mode 100644 index 0000000..ad1f7b0 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$3.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class new file mode 100644 index 0000000..a572fa0 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$4.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class new file mode 100644 index 0000000..cb0b658 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$5.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class new file mode 100644 index 0000000..2ef4632 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$6.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class new file mode 100644 index 0000000..139d155 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$7.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class new file mode 100644 index 0000000..6b8404e Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$8.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class new file mode 100644 index 0000000..7843145 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView$9.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class new file mode 100644 index 0000000..e727ad5 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapView.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class new file mode 100644 index 0000000..bac590f Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile$AIRMapGSUrlTileProvider.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class new file mode 100644 index 0000000..bf00801 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTile.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class new file mode 100644 index 0000000..4ba3ab6 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/AirMapWMSTileManager.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class new file mode 100644 index 0000000..81b8736 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/BuildConfig.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class new file mode 100644 index 0000000..10e7ef7 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/FileUtil.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class new file mode 100644 index 0000000..a639f95 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReadable.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class new file mode 100644 index 0000000..fdf268d Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class new file mode 100644 index 0000000..bb53114 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageReader.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class new file mode 100644 index 0000000..e489765 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ImageUtil.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class new file mode 100644 index 0000000..c68d5d1 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/LatLngBoundsUtils.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class new file mode 100644 index 0000000..926163c Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/MapsPackage.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class new file mode 100644 index 0000000..2e00e22 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/RegionChangeEvent.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class new file mode 100644 index 0000000..4aa4a92 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/SizeReportingShadowNode.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class new file mode 100644 index 0000000..ed29491 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewAttacherGroup.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class new file mode 100644 index 0000000..5663384 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker$1.class differ diff --git a/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class new file mode 100644 index 0000000..2173df9 Binary files /dev/null and b/lib/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/airbnb/android/react/maps/ViewChangesTracker.class differ diff --git a/lib/android/build/intermediates/library_assets/debug/packageDebugAssets/out/ula.kml b/lib/android/build/intermediates/library_assets/debug/packageDebugAssets/out/ula.kml new file mode 100644 index 0000000..2504574 --- /dev/null +++ b/lib/android/build/intermediates/library_assets/debug/packageDebugAssets/out/ula.kml @@ -0,0 +1,1214 @@ + + + + + + + + + + + + + + +20171123121441_ULA_PARCIAL + + -18.9193508,-48.2830592 + + -1 + 0 + -1 + + -48.2830592,-18.9193508 + + + CEO-ULA-00001 + + -1 + 0 + -1 + + -48.28328,-18.915815 + + + CEO-ULA-00186 + + -1 + 0 + -1 + + -48.278833,-18.919549 + + + CEO-ULA-00188 + + -1 + 0 + -1 + + -48.289805,-18.913945 + + + CEO-ULA-00229 + + -1 + 0 + -1 + + -48.288815,-18.922615 + + + CEO-ULA-00243 + + -1 + 0 + -1 + + -48.281013,-18.916794 + + + CEO-ULA-00274 + + -1 + 0 + -1 + + -48.276156,-18.91852 + + + CEO-ULA-00275 + + -1 + 0 + -1 + + -48.278656,-18.922156 + + + ST-ULA-0001 + + -1 + 0 + -1 + + -48.283467,-18.91587 + + + ST-ULA-0360 + + -1 + 0 + -1 + + -48.2917338,-18.9200969 + + + ST-ULA-0361 + + -1 + 0 + -1 + + -48.2905979,-18.921816 + + + ST-ULA-0362 + + -1 + 0 + -1 + + -48.2920103,-18.9192301 + + + ST-ULA-0399 + + -1 + 0 + -1 + + -48.29048,-18.9193956 + + + ST-ULA-0400 + + -1 + 0 + -1 + + -48.2906689,-18.918796 + + + ST-ULA-0408 + + -1 + 0 + -1 + + -48.2912278,-18.9170382 + + + CEO-ULA-00391 + + -1 + 0 + -1 + + -48.289628,-18.914507 + + + CEO-ULA-00053 + + -1 + 0 + -1 + + -48.291706,-18.920121 + + + CEO-ULA-00067 + + -1 + 0 + -1 + + -48.29045,-18.91948 + + + CEO-ULA-00288 + + -1 + 0 + -1 + + -48.274365,-18.921111 + + + CEO-ULA-00332 + + -1 + 0 + -1 + + -48.279256,-18.916275 + + + CEO-ULA-00337 + + -1 + 0 + -1 + + -48.280717,-18.916827 + + + CEO-ULA-00350 + + -1 + 0 + -1 + + -48.281085,-18.924567 + + + CEO-ULA-00369 + + -1 + 0 + -1 + + -48.288157,-18.915412 + + + CEO-ULA-00372 + + -1 + 0 + -1 + + -48.282004,-18.923989 + + + CEO-ULA-00379 + + -1 + 0 + -1 + + -48.290547,-18.919788 + + + CEO-ULA-00382 + + -1 + 0 + -1 + + -48.289297,-18.91561 + + + CEO-ULA-00386 + + -1 + 0 + -1 + + -48.280915,-18.910799 + + + CEO-ULA-00388 + + -1 + 0 + -1 + + -48.283811,-18.914334 + + + CEO-ULA-00390 + + -1 + 0 + -1 + + -48.288354,-18.918549 + + + CEO-ULA-00400 + + -1 + 0 + -1 + + -48.283629,-18.921665 + + + CEO-ULA-00394 + + -1 + 0 + -1 + + -48.284537,-18.912023 + + + CEO-ULA-00396 + + -1 + 0 + -1 + + -48.284908,-18.925537 + + + CEO-ULA-00399 + + -1 + 0 + -1 + + -48.283935,-18.925506 + + + CEO-ULA-00417 + + -1 + 0 + -1 + + -48.284404,-18.912391 + + + CEO-ULA-00495 + + -1 + 0 + -1 + + -48.275935,-18.914429 + + + CEO-ULA-00448 + + -1 + 0 + -1 + + -48.280576,-18.921918 + + + CEO-ULA-00449 + + -1 + 0 + -1 + + -48.277405,-18.917667 + + + CEO-ULA-00488 + + -1 + 0 + -1 + + -48.282118,-18.920169 + + + CEO-ULA-00489 + + -1 + 0 + -1 + + -48.280924,-18.916682 + + + CEO-ULA-00491 + + -1 + 0 + -1 + + -48.282753,-18.913711 + + + ST-ULA-2399 + + -1 + 0 + -1 + + -48.2894488,-18.9230852 + + + ST-ULA-2400 + + -1 + 0 + -1 + + -48.2782936,-18.9196916 + + + ST-ULA-2397 + + -1 + 0 + -1 + + -48.2809308,-18.9166838 + + + ST-ULA-2398 + + -1 + 0 + -1 + + -48.2887073,-18.9228568 + + + ST-ULA-2401 + + -1 + 0 + -1 + + -48.2788126,-18.919553 + + + CEO-ULA-00509 + + -1 + 0 + -1 + + -48.280852,-18.919976 + + + CEO-ULA-00531 + + -1 + 0 + -1 + + -48.289429,-18.92309 + + + ST-ULA-1579 + + -1 + 0 + -1 + + -48.2831316,-18.9231769 + + + ST-ULA-1577 + + -1 + 0 + -1 + + -48.2803822,-18.9193287 + + + ST-ULA-1578 + + -1 + 0 + -1 + + -48.281754,-18.9211827 + + + ST-ULA-1545 + + -1 + 0 + -1 + + -48.2798797,-18.9171188 + + + ST-ULA-1551 + + -1 + 0 + -1 + + -48.2822027,-18.9181888 + + + ST-ULA-1576 + + -1 + 0 + -1 + + -48.2791963,-18.917984 + + + ST-ULA-1580 + + -1 + 0 + -1 + + -48.2820288,-18.9267845 + + + ST-ULA-1736 + + -1 + 0 + -1 + + -48.290548,-18.9198029 + + + ST-ULA-1662 + + -1 + 0 + -1 + + -48.2820532,-18.9267959 + + + ST-ULA-1663 + + -1 + 0 + -1 + + -48.2837533,-18.92488 + + + ST-ULA-1735 + + -1 + 0 + -1 + + -48.2904324,-18.919494 + + + ST-ULA-1745 + + -1 + 0 + -1 + + -48.2893041,-18.9156106 + + + ST-ULA-1773 + + -1 + 0 + -1 + + -48.2896346,-18.9144805 + + + ST-ULA-1759 + + -1 + 0 + -1 + + -48.2838156,-18.9143177 + + + ST-ULA-1760 + + -1 + 0 + -1 + + -48.2840708,-18.9135214 + + + ST-ULA-1761 + + -1 + 0 + -1 + + -48.2809102,-18.9108123 + + + ST-ULA-1776 + + -1 + 0 + -1 + + -48.2845163,-18.9120761 + + + ST-ULA-1777 + + -1 + 0 + -1 + + -48.286238,-18.9147202 + + + ST-ULA-1778 + + -1 + 0 + -1 + + -48.2897804,-18.9139702 + + + ST-ULA-1785 + + -1 + 0 + -1 + + -48.2802345,-18.9267323 + + + ST-ULA-1782 + + -1 + 0 + -1 + + -48.2845618,-18.9259192 + + + ST-ULA-1783 + + -1 + 0 + -1 + + -48.2848909,-18.9255362 + + + ST-ULA-1784 + + -1 + 0 + -1 + + -48.2826035,-18.9257531 + + + ST-ULA-1788 + + -1 + 0 + -1 + + -48.283994,-18.9255066 + + + ST-ULA-1789 + + -1 + 0 + -1 + + -48.2880791,-18.92552 + + + ST-ULA-1791 + + -1 + 0 + -1 + + -48.2848777,-18.9255045 + + + ST-ULA-1792 + + -1 + 0 + -1 + + -48.2845053,-18.9269676 + + + ST-ULA-1793 + + -1 + 0 + -1 + + -48.2823102,-18.9267975 + + + ST-ULA-1794 + + -1 + 0 + -1 + + -48.2849364,-18.9255375 + + + ST-ULA-1800 + + -1 + 0 + -1 + + -48.2841773,-18.9227149 + + + ST-ULA-1801 + + -1 + 0 + -1 + + -48.2836987,-18.9216584 + + + ST-ULA-1802 + + -1 + 0 + -1 + + -48.2848919,-18.9255115 + + + ST-ULA-1838 + + -1 + 0 + -1 + + -48.284408,-18.9123794 + + + ST-ULA-1839 + + -1 + 0 + -1 + + -48.2843991,-18.9123761 + + + ST-ULA-1768 + + -1 + 0 + -1 + + -48.2896203,-18.9145271 + + + ST-ULA-1769 + + -1 + 0 + -1 + + -48.2883589,-18.9185316 + + + ST-ULA-1770 + + -1 + 0 + -1 + + -48.2896109,-18.9145329 + + + ST-ULA-1771 + + -1 + 0 + -1 + + -48.2845797,-18.9120706 + + + ST-ULA-1772 + + -1 + 0 + -1 + + -48.2872279,-18.9128471 + + + ST-ULA-1689 + + -1 + 0 + -1 + + -48.2914404,-18.9163817 + + + ST-ULA-1690 + + -1 + 0 + -1 + + -48.2881643,-18.9154096 + + + ST-ULA-1691 + + -1 + 0 + -1 + + -48.2881523,-18.9154079 + + + ST-ULA-1692 + + -1 + 0 + -1 + + -48.2859653,-18.9147849 + + + ST-ULA-1693 + + -1 + 0 + -1 + + -48.2806094,-18.9183195 + + + ST-ULA-1694 + + -1 + 0 + -1 + + -48.2818765,-18.9164378 + + + ST-ULA-1723 + + -1 + 0 + -1 + + -48.2818717,-18.9112605 + + + ST-ULA-1724 + + -1 + 0 + -1 + + -48.2832877,-18.9120452 + + + ST-ULA-1044 + + -1 + 0 + -1 + + -48.2788265,-18.9195413 + + + ST-ULA-1048 + + -1 + 0 + -1 + + -48.2898389,-18.9139479 + + + ST-ULA-1049 + + -1 + 0 + -1 + + -48.2898306,-18.9138754 + + + ST-ULA-1836 + + -1 + 0 + -1 + + -48.2897986,-18.9139428 + + + ST-ULA-1837 + + -1 + 0 + -1 + + -48.2873611,-18.9128968 + + + ST-ULA-1710 + + -1 + 0 + -1 + + -48.2820099,-18.9239905 + + + ST-ULA-1711 + + -1 + 0 + -1 + + -48.2837723,-18.9242837 + + + ST-ULA-1363 + + -1 + 0 + -1 + + -48.2776727,-18.9229224 + + + ST-ULA-1366 + + -1 + 0 + -1 + + -48.276015,-18.9200525 + + + ST-ULA-1406 + + -1 + 0 + -1 + + -48.2743386,-18.921128 + + + ST-ULA-1129 + + -1 + 0 + -1 + + -48.2881549,-18.9223935 + + + ST-ULA-1130 + + -1 + 0 + -1 + + -48.2888228,-18.9226054 + + + ST-ULA-1246 + + -1 + 0 + -1 + + -48.2809791,-18.9170914 + + + ST-ULA-2007 + + -1 + 0 + -1 + + -48.2781596,-18.9186736 + + + ST-ULA-1963 + + -1 + 0 + -1 + + -48.2788194,-18.919549 + + + ST-ULA-1956 + + -1 + 0 + -1 + + -48.2780189,-18.9123572 + + + ST-ULA-1987 + + -1 + 0 + -1 + + -48.2761483,-18.9185129 + + + ST-ULA-2006 + + -1 + 0 + -1 + + -48.2805711,-18.9219041 + + + ST-ULA-2215 + + -1 + 0 + -1 + + -48.2850344,-18.9143632 + + + ST-ULA-2226 + + -1 + 0 + -1 + + -48.2849368,-18.9255278 + + + ST-ULA-2227 + + -1 + 0 + -1 + + -48.2862061,-18.9255751 + + + ST-ULA-2008 + + -1 + 0 + -1 + + -48.2824599,-18.9242629 + + + ST-ULA-2203 + + -1 + 0 + -1 + + -48.280991,-18.9201737 + + + ST-ULA-2206 + + -1 + 0 + -1 + + -48.2803008,-18.9176824 + + + ST-ULA-2207 + + -1 + 0 + -1 + + -48.2809238,-18.9166913 + + + ST-ULA-2209 + + -1 + 0 + -1 + + -48.2807351,-18.9112935 + + + ST-ULA-2214 + + -1 + 0 + -1 + + -48.2827837,-18.9137244 + + + ST-ULA-1669 + + -1 + 0 + -1 + + -48.2764255,-18.9140386 + + + ST-ULA-1477 + + -1 + 0 + -1 + + -48.2894117,-18.9231269 + + + ST-ULA-1478 + + -1 + 0 + -1 + + -48.2899636,-18.9253263 + + + ST-ULA-1480 + + -1 + 0 + -1 + + -48.2897642,-18.9256209 + + + ST-ULA-2268 + + -1 + 0 + -1 + + -48.2743334,-18.921121 + + + ST-ULA-2281 + + -1 + 0 + -1 + + -48.2808588,-18.9199855 + + + ST-ULA-2282 + + -1 + 0 + -1 + + -48.2830492,-18.9193608 + + + ST-ULA-0330 + + -1 + 0 + -1 + + -48.2905731,-18.9197947 + + + CTO-ULA-00159 + + -1 + 0 + -1 + + -48.290652,-18.918802 + + + CTO-ULA-00160 + + -1 + 0 + -1 + + -48.291211,-18.917047 + + + CTO-ULA-00161 + + -1 + 0 + -1 + + -48.290562,-18.921833 + + + CTO-ULA-00162 + + -1 + 0 + -1 + + -48.291992,-18.919241 + + + diff --git a/lib/android/build/intermediates/library_assets/release/packageReleaseAssets/out/ula.kml b/lib/android/build/intermediates/library_assets/release/packageReleaseAssets/out/ula.kml new file mode 100644 index 0000000..2504574 --- /dev/null +++ b/lib/android/build/intermediates/library_assets/release/packageReleaseAssets/out/ula.kml @@ -0,0 +1,1214 @@ + + + + + + + + + + + + + + +20171123121441_ULA_PARCIAL + + -18.9193508,-48.2830592 + + -1 + 0 + -1 + + -48.2830592,-18.9193508 + + + CEO-ULA-00001 + + -1 + 0 + -1 + + -48.28328,-18.915815 + + + CEO-ULA-00186 + + -1 + 0 + -1 + + -48.278833,-18.919549 + + + CEO-ULA-00188 + + -1 + 0 + -1 + + -48.289805,-18.913945 + + + CEO-ULA-00229 + + -1 + 0 + -1 + + -48.288815,-18.922615 + + + CEO-ULA-00243 + + -1 + 0 + -1 + + -48.281013,-18.916794 + + + CEO-ULA-00274 + + -1 + 0 + -1 + + -48.276156,-18.91852 + + + CEO-ULA-00275 + + -1 + 0 + -1 + + -48.278656,-18.922156 + + + ST-ULA-0001 + + -1 + 0 + -1 + + -48.283467,-18.91587 + + + ST-ULA-0360 + + -1 + 0 + -1 + + -48.2917338,-18.9200969 + + + ST-ULA-0361 + + -1 + 0 + -1 + + -48.2905979,-18.921816 + + + ST-ULA-0362 + + -1 + 0 + -1 + + -48.2920103,-18.9192301 + + + ST-ULA-0399 + + -1 + 0 + -1 + + -48.29048,-18.9193956 + + + ST-ULA-0400 + + -1 + 0 + -1 + + -48.2906689,-18.918796 + + + ST-ULA-0408 + + -1 + 0 + -1 + + -48.2912278,-18.9170382 + + + CEO-ULA-00391 + + -1 + 0 + -1 + + -48.289628,-18.914507 + + + CEO-ULA-00053 + + -1 + 0 + -1 + + -48.291706,-18.920121 + + + CEO-ULA-00067 + + -1 + 0 + -1 + + -48.29045,-18.91948 + + + CEO-ULA-00288 + + -1 + 0 + -1 + + -48.274365,-18.921111 + + + CEO-ULA-00332 + + -1 + 0 + -1 + + -48.279256,-18.916275 + + + CEO-ULA-00337 + + -1 + 0 + -1 + + -48.280717,-18.916827 + + + CEO-ULA-00350 + + -1 + 0 + -1 + + -48.281085,-18.924567 + + + CEO-ULA-00369 + + -1 + 0 + -1 + + -48.288157,-18.915412 + + + CEO-ULA-00372 + + -1 + 0 + -1 + + -48.282004,-18.923989 + + + CEO-ULA-00379 + + -1 + 0 + -1 + + -48.290547,-18.919788 + + + CEO-ULA-00382 + + -1 + 0 + -1 + + -48.289297,-18.91561 + + + CEO-ULA-00386 + + -1 + 0 + -1 + + -48.280915,-18.910799 + + + CEO-ULA-00388 + + -1 + 0 + -1 + + -48.283811,-18.914334 + + + CEO-ULA-00390 + + -1 + 0 + -1 + + -48.288354,-18.918549 + + + CEO-ULA-00400 + + -1 + 0 + -1 + + -48.283629,-18.921665 + + + CEO-ULA-00394 + + -1 + 0 + -1 + + -48.284537,-18.912023 + + + CEO-ULA-00396 + + -1 + 0 + -1 + + -48.284908,-18.925537 + + + CEO-ULA-00399 + + -1 + 0 + -1 + + -48.283935,-18.925506 + + + CEO-ULA-00417 + + -1 + 0 + -1 + + -48.284404,-18.912391 + + + CEO-ULA-00495 + + -1 + 0 + -1 + + -48.275935,-18.914429 + + + CEO-ULA-00448 + + -1 + 0 + -1 + + -48.280576,-18.921918 + + + CEO-ULA-00449 + + -1 + 0 + -1 + + -48.277405,-18.917667 + + + CEO-ULA-00488 + + -1 + 0 + -1 + + -48.282118,-18.920169 + + + CEO-ULA-00489 + + -1 + 0 + -1 + + -48.280924,-18.916682 + + + CEO-ULA-00491 + + -1 + 0 + -1 + + -48.282753,-18.913711 + + + ST-ULA-2399 + + -1 + 0 + -1 + + -48.2894488,-18.9230852 + + + ST-ULA-2400 + + -1 + 0 + -1 + + -48.2782936,-18.9196916 + + + ST-ULA-2397 + + -1 + 0 + -1 + + -48.2809308,-18.9166838 + + + ST-ULA-2398 + + -1 + 0 + -1 + + -48.2887073,-18.9228568 + + + ST-ULA-2401 + + -1 + 0 + -1 + + -48.2788126,-18.919553 + + + CEO-ULA-00509 + + -1 + 0 + -1 + + -48.280852,-18.919976 + + + CEO-ULA-00531 + + -1 + 0 + -1 + + -48.289429,-18.92309 + + + ST-ULA-1579 + + -1 + 0 + -1 + + -48.2831316,-18.9231769 + + + ST-ULA-1577 + + -1 + 0 + -1 + + -48.2803822,-18.9193287 + + + ST-ULA-1578 + + -1 + 0 + -1 + + -48.281754,-18.9211827 + + + ST-ULA-1545 + + -1 + 0 + -1 + + -48.2798797,-18.9171188 + + + ST-ULA-1551 + + -1 + 0 + -1 + + -48.2822027,-18.9181888 + + + ST-ULA-1576 + + -1 + 0 + -1 + + -48.2791963,-18.917984 + + + ST-ULA-1580 + + -1 + 0 + -1 + + -48.2820288,-18.9267845 + + + ST-ULA-1736 + + -1 + 0 + -1 + + -48.290548,-18.9198029 + + + ST-ULA-1662 + + -1 + 0 + -1 + + -48.2820532,-18.9267959 + + + ST-ULA-1663 + + -1 + 0 + -1 + + -48.2837533,-18.92488 + + + ST-ULA-1735 + + -1 + 0 + -1 + + -48.2904324,-18.919494 + + + ST-ULA-1745 + + -1 + 0 + -1 + + -48.2893041,-18.9156106 + + + ST-ULA-1773 + + -1 + 0 + -1 + + -48.2896346,-18.9144805 + + + ST-ULA-1759 + + -1 + 0 + -1 + + -48.2838156,-18.9143177 + + + ST-ULA-1760 + + -1 + 0 + -1 + + -48.2840708,-18.9135214 + + + ST-ULA-1761 + + -1 + 0 + -1 + + -48.2809102,-18.9108123 + + + ST-ULA-1776 + + -1 + 0 + -1 + + -48.2845163,-18.9120761 + + + ST-ULA-1777 + + -1 + 0 + -1 + + -48.286238,-18.9147202 + + + ST-ULA-1778 + + -1 + 0 + -1 + + -48.2897804,-18.9139702 + + + ST-ULA-1785 + + -1 + 0 + -1 + + -48.2802345,-18.9267323 + + + ST-ULA-1782 + + -1 + 0 + -1 + + -48.2845618,-18.9259192 + + + ST-ULA-1783 + + -1 + 0 + -1 + + -48.2848909,-18.9255362 + + + ST-ULA-1784 + + -1 + 0 + -1 + + -48.2826035,-18.9257531 + + + ST-ULA-1788 + + -1 + 0 + -1 + + -48.283994,-18.9255066 + + + ST-ULA-1789 + + -1 + 0 + -1 + + -48.2880791,-18.92552 + + + ST-ULA-1791 + + -1 + 0 + -1 + + -48.2848777,-18.9255045 + + + ST-ULA-1792 + + -1 + 0 + -1 + + -48.2845053,-18.9269676 + + + ST-ULA-1793 + + -1 + 0 + -1 + + -48.2823102,-18.9267975 + + + ST-ULA-1794 + + -1 + 0 + -1 + + -48.2849364,-18.9255375 + + + ST-ULA-1800 + + -1 + 0 + -1 + + -48.2841773,-18.9227149 + + + ST-ULA-1801 + + -1 + 0 + -1 + + -48.2836987,-18.9216584 + + + ST-ULA-1802 + + -1 + 0 + -1 + + -48.2848919,-18.9255115 + + + ST-ULA-1838 + + -1 + 0 + -1 + + -48.284408,-18.9123794 + + + ST-ULA-1839 + + -1 + 0 + -1 + + -48.2843991,-18.9123761 + + + ST-ULA-1768 + + -1 + 0 + -1 + + -48.2896203,-18.9145271 + + + ST-ULA-1769 + + -1 + 0 + -1 + + -48.2883589,-18.9185316 + + + ST-ULA-1770 + + -1 + 0 + -1 + + -48.2896109,-18.9145329 + + + ST-ULA-1771 + + -1 + 0 + -1 + + -48.2845797,-18.9120706 + + + ST-ULA-1772 + + -1 + 0 + -1 + + -48.2872279,-18.9128471 + + + ST-ULA-1689 + + -1 + 0 + -1 + + -48.2914404,-18.9163817 + + + ST-ULA-1690 + + -1 + 0 + -1 + + -48.2881643,-18.9154096 + + + ST-ULA-1691 + + -1 + 0 + -1 + + -48.2881523,-18.9154079 + + + ST-ULA-1692 + + -1 + 0 + -1 + + -48.2859653,-18.9147849 + + + ST-ULA-1693 + + -1 + 0 + -1 + + -48.2806094,-18.9183195 + + + ST-ULA-1694 + + -1 + 0 + -1 + + -48.2818765,-18.9164378 + + + ST-ULA-1723 + + -1 + 0 + -1 + + -48.2818717,-18.9112605 + + + ST-ULA-1724 + + -1 + 0 + -1 + + -48.2832877,-18.9120452 + + + ST-ULA-1044 + + -1 + 0 + -1 + + -48.2788265,-18.9195413 + + + ST-ULA-1048 + + -1 + 0 + -1 + + -48.2898389,-18.9139479 + + + ST-ULA-1049 + + -1 + 0 + -1 + + -48.2898306,-18.9138754 + + + ST-ULA-1836 + + -1 + 0 + -1 + + -48.2897986,-18.9139428 + + + ST-ULA-1837 + + -1 + 0 + -1 + + -48.2873611,-18.9128968 + + + ST-ULA-1710 + + -1 + 0 + -1 + + -48.2820099,-18.9239905 + + + ST-ULA-1711 + + -1 + 0 + -1 + + -48.2837723,-18.9242837 + + + ST-ULA-1363 + + -1 + 0 + -1 + + -48.2776727,-18.9229224 + + + ST-ULA-1366 + + -1 + 0 + -1 + + -48.276015,-18.9200525 + + + ST-ULA-1406 + + -1 + 0 + -1 + + -48.2743386,-18.921128 + + + ST-ULA-1129 + + -1 + 0 + -1 + + -48.2881549,-18.9223935 + + + ST-ULA-1130 + + -1 + 0 + -1 + + -48.2888228,-18.9226054 + + + ST-ULA-1246 + + -1 + 0 + -1 + + -48.2809791,-18.9170914 + + + ST-ULA-2007 + + -1 + 0 + -1 + + -48.2781596,-18.9186736 + + + ST-ULA-1963 + + -1 + 0 + -1 + + -48.2788194,-18.919549 + + + ST-ULA-1956 + + -1 + 0 + -1 + + -48.2780189,-18.9123572 + + + ST-ULA-1987 + + -1 + 0 + -1 + + -48.2761483,-18.9185129 + + + ST-ULA-2006 + + -1 + 0 + -1 + + -48.2805711,-18.9219041 + + + ST-ULA-2215 + + -1 + 0 + -1 + + -48.2850344,-18.9143632 + + + ST-ULA-2226 + + -1 + 0 + -1 + + -48.2849368,-18.9255278 + + + ST-ULA-2227 + + -1 + 0 + -1 + + -48.2862061,-18.9255751 + + + ST-ULA-2008 + + -1 + 0 + -1 + + -48.2824599,-18.9242629 + + + ST-ULA-2203 + + -1 + 0 + -1 + + -48.280991,-18.9201737 + + + ST-ULA-2206 + + -1 + 0 + -1 + + -48.2803008,-18.9176824 + + + ST-ULA-2207 + + -1 + 0 + -1 + + -48.2809238,-18.9166913 + + + ST-ULA-2209 + + -1 + 0 + -1 + + -48.2807351,-18.9112935 + + + ST-ULA-2214 + + -1 + 0 + -1 + + -48.2827837,-18.9137244 + + + ST-ULA-1669 + + -1 + 0 + -1 + + -48.2764255,-18.9140386 + + + ST-ULA-1477 + + -1 + 0 + -1 + + -48.2894117,-18.9231269 + + + ST-ULA-1478 + + -1 + 0 + -1 + + -48.2899636,-18.9253263 + + + ST-ULA-1480 + + -1 + 0 + -1 + + -48.2897642,-18.9256209 + + + ST-ULA-2268 + + -1 + 0 + -1 + + -48.2743334,-18.921121 + + + ST-ULA-2281 + + -1 + 0 + -1 + + -48.2808588,-18.9199855 + + + ST-ULA-2282 + + -1 + 0 + -1 + + -48.2830492,-18.9193608 + + + ST-ULA-0330 + + -1 + 0 + -1 + + -48.2905731,-18.9197947 + + + CTO-ULA-00159 + + -1 + 0 + -1 + + -48.290652,-18.918802 + + + CTO-ULA-00160 + + -1 + 0 + -1 + + -48.291211,-18.917047 + + + CTO-ULA-00161 + + -1 + 0 + -1 + + -48.290562,-18.921833 + + + CTO-ULA-00162 + + -1 + 0 + -1 + + -48.291992,-18.919241 + + + diff --git a/lib/android/build/intermediates/library_manifest/debug/AndroidManifest.xml b/lib/android/build/intermediates/library_manifest/debug/AndroidManifest.xml new file mode 100644 index 0000000..2f115c6 --- /dev/null +++ b/lib/android/build/intermediates/library_manifest/debug/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/android/build/intermediates/library_manifest/release/AndroidManifest.xml b/lib/android/build/intermediates/library_manifest/release/AndroidManifest.xml new file mode 100644 index 0000000..2f115c6 --- /dev/null +++ b/lib/android/build/intermediates/library_manifest/release/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/android/build/intermediates/merged_manifests/debug/output.json b/lib/android/build/intermediates/merged_manifests/debug/output.json new file mode 100644 index 0000000..a69fb79 --- /dev/null +++ b/lib/android/build/intermediates/merged_manifests/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":-1,"enabled":true,"outputFile":"react-native-maps-debug.aar","fullName":"debug","baseName":"debug"},"path":"../../library_manifest/debug/AndroidManifest.xml","properties":{"packageId":"com.airbnb.android.react.maps","split":""}}] \ No newline at end of file diff --git a/lib/android/build/intermediates/merged_manifests/release/output.json b/lib/android/build/intermediates/merged_manifests/release/output.json new file mode 100644 index 0000000..8ffd452 --- /dev/null +++ b/lib/android/build/intermediates/merged_manifests/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":-1,"enabled":true,"outputFile":"react-native-maps-release.aar","fullName":"release","baseName":"release"},"path":"../../library_manifest/release/AndroidManifest.xml","properties":{"packageId":"com.airbnb.android.react.maps","split":""}}] \ No newline at end of file diff --git a/lib/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt b/lib/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt new file mode 100644 index 0000000..e5b2454 --- /dev/null +++ b/lib/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt @@ -0,0 +1,1449 @@ +com.airbnb.android.react.maps +anim abc_fade_in +anim abc_fade_out +anim abc_grow_fade_in_from_bottom +anim abc_popup_enter +anim abc_popup_exit +anim abc_shrink_fade_out_from_bottom +anim abc_slide_in_bottom +anim abc_slide_in_top +anim abc_slide_out_bottom +anim abc_slide_out_top +anim abc_tooltip_enter +anim abc_tooltip_exit +anim catalyst_fade_in +anim catalyst_fade_out +anim catalyst_push_up_in +anim catalyst_push_up_out +anim catalyst_slide_down +anim catalyst_slide_up +attr actionBarDivider +attr actionBarItemBackground +attr actionBarPopupTheme +attr actionBarSize +attr actionBarSplitStyle +attr actionBarStyle +attr actionBarTabBarStyle +attr actionBarTabStyle +attr actionBarTabTextStyle +attr actionBarTheme +attr actionBarWidgetTheme +attr actionButtonStyle +attr actionDropDownStyle +attr actionLayout +attr actionMenuTextAppearance +attr actionMenuTextColor +attr actionModeBackground +attr actionModeCloseButtonStyle +attr actionModeCloseDrawable +attr actionModeCopyDrawable +attr actionModeCutDrawable +attr actionModeFindDrawable +attr actionModePasteDrawable +attr actionModePopupWindowStyle +attr actionModeSelectAllDrawable +attr actionModeShareDrawable +attr actionModeSplitBackground +attr actionModeStyle +attr actionModeWebSearchDrawable +attr actionOverflowButtonStyle +attr actionOverflowMenuStyle +attr actionProviderClass +attr actionViewClass +attr activityChooserViewStyle +attr actualImageResource +attr actualImageScaleType +attr actualImageUri +attr alertDialogButtonGroupStyle +attr alertDialogCenterButtons +attr alertDialogStyle +attr alertDialogTheme +attr allowStacking +attr alpha +attr alphabeticModifiers +attr ambientEnabled +attr arrowHeadLength +attr arrowShaftLength +attr autoCompleteTextViewStyle +attr autoSizeMaxTextSize +attr autoSizeMinTextSize +attr autoSizePresetSizes +attr autoSizeStepGranularity +attr autoSizeTextType +attr background +attr backgroundImage +attr backgroundSplit +attr backgroundStacked +attr backgroundTint +attr backgroundTintMode +attr barLength +attr borderlessButtonStyle +attr buttonBarButtonStyle +attr buttonBarNegativeButtonStyle +attr buttonBarNeutralButtonStyle +attr buttonBarPositiveButtonStyle +attr buttonBarStyle +attr buttonGravity +attr buttonIconDimen +attr buttonPanelSideLayout +attr buttonSize +attr buttonStyle +attr buttonStyleSmall +attr buttonTint +attr buttonTintMode +attr cameraBearing +attr cameraMaxZoomPreference +attr cameraMinZoomPreference +attr cameraTargetLat +attr cameraTargetLng +attr cameraTilt +attr cameraZoom +attr checkboxStyle +attr checkedTextViewStyle +attr circleCrop +attr closeIcon +attr closeItemLayout +attr collapseContentDescription +attr collapseIcon +attr color +attr colorAccent +attr colorBackgroundFloating +attr colorButtonNormal +attr colorControlActivated +attr colorControlHighlight +attr colorControlNormal +attr colorError +attr colorPrimary +attr colorPrimaryDark +attr colorScheme +attr colorSwitchThumbNormal +attr commitIcon +attr contentDescription +attr contentInsetEnd +attr contentInsetEndWithActions +attr contentInsetLeft +attr contentInsetRight +attr contentInsetStart +attr contentInsetStartWithNavigation +attr controlBackground +attr coordinatorLayoutStyle +attr customNavigationLayout +attr defaultQueryHint +attr dialogCornerRadius +attr dialogPreferredPadding +attr dialogTheme +attr displayOptions +attr divider +attr dividerHorizontal +attr dividerPadding +attr dividerVertical +attr drawableSize +attr drawerArrowStyle +attr dropDownListViewStyle +attr dropdownListPreferredItemHeight +attr editTextBackground +attr editTextColor +attr editTextStyle +attr elevation +attr expandActivityOverflowButtonDrawable +attr fadeDuration +attr failureImage +attr failureImageScaleType +attr firstBaselineToTopHeight +attr font +attr fontFamily +attr fontProviderAuthority +attr fontProviderCerts +attr fontProviderFetchStrategy +attr fontProviderFetchTimeout +attr fontProviderPackage +attr fontProviderQuery +attr fontStyle +attr fontVariationSettings +attr fontWeight +attr gapBetweenBars +attr goIcon +attr height +attr hideOnContentScroll +attr homeAsUpIndicator +attr homeLayout +attr icon +attr iconTint +attr iconTintMode +attr iconifiedByDefault +attr imageAspectRatio +attr imageAspectRatioAdjust +attr imageButtonStyle +attr indeterminateProgressStyle +attr initialActivityCount +attr isLightTheme +attr itemPadding +attr keylines +attr lastBaselineToBottomHeight +attr latLngBoundsNorthEastLatitude +attr latLngBoundsNorthEastLongitude +attr latLngBoundsSouthWestLatitude +attr latLngBoundsSouthWestLongitude +attr layout +attr layout_anchor +attr layout_anchorGravity +attr layout_behavior +attr layout_dodgeInsetEdges +attr layout_insetEdge +attr layout_keyline +attr lineHeight +attr listChoiceBackgroundIndicator +attr listDividerAlertDialog +attr listItemLayout +attr listLayout +attr listMenuViewStyle +attr listPopupWindowStyle +attr listPreferredItemHeight +attr listPreferredItemHeightLarge +attr listPreferredItemHeightSmall +attr listPreferredItemPaddingLeft +attr listPreferredItemPaddingRight +attr liteMode +attr logo +attr logoDescription +attr mapType +attr maxButtonHeight +attr measureWithLargestChild +attr multiChoiceItemLayout +attr navigationContentDescription +attr navigationIcon +attr navigationMode +attr numericModifiers +attr overlapAnchor +attr overlayImage +attr paddingBottomNoButtons +attr paddingEnd +attr paddingStart +attr paddingTopNoTitle +attr panelBackground +attr panelMenuListTheme +attr panelMenuListWidth +attr placeholderImage +attr placeholderImageScaleType +attr popupMenuStyle +attr popupTheme +attr popupWindowStyle +attr preserveIconSpacing +attr pressedStateOverlayImage +attr progressBarAutoRotateInterval +attr progressBarImage +attr progressBarImageScaleType +attr progressBarPadding +attr progressBarStyle +attr queryBackground +attr queryHint +attr radioButtonStyle +attr ratingBarStyle +attr ratingBarStyleIndicator +attr ratingBarStyleSmall +attr retryImage +attr retryImageScaleType +attr roundAsCircle +attr roundBottomEnd +attr roundBottomLeft +attr roundBottomRight +attr roundBottomStart +attr roundTopEnd +attr roundTopLeft +attr roundTopRight +attr roundTopStart +attr roundWithOverlayColor +attr roundedCornerRadius +attr roundingBorderColor +attr roundingBorderPadding +attr roundingBorderWidth +attr scopeUris +attr searchHintIcon +attr searchIcon +attr searchViewStyle +attr seekBarStyle +attr selectableItemBackground +attr selectableItemBackgroundBorderless +attr showAsAction +attr showDividers +attr showText +attr showTitle +attr singleChoiceItemLayout +attr spinBars +attr spinnerDropDownItemStyle +attr spinnerStyle +attr splitTrack +attr srcCompat +attr state_above_anchor +attr statusBarBackground +attr subMenuArrow +attr submitBackground +attr subtitle +attr subtitleTextAppearance +attr subtitleTextColor +attr subtitleTextStyle +attr suggestionRowLayout +attr switchMinWidth +attr switchPadding +attr switchStyle +attr switchTextAppearance +attr textAllCaps +attr textAppearanceLargePopupMenu +attr textAppearanceListItem +attr textAppearanceListItemSecondary +attr textAppearanceListItemSmall +attr textAppearancePopupMenuHeader +attr textAppearanceSearchResultSubtitle +attr textAppearanceSearchResultTitle +attr textAppearanceSmallPopupMenu +attr textColorAlertDialogListItem +attr textColorSearchUrl +attr theme +attr thickness +attr thumbTextPadding +attr thumbTint +attr thumbTintMode +attr tickMark +attr tickMarkTint +attr tickMarkTintMode +attr tint +attr tintMode +attr title +attr titleMargin +attr titleMarginBottom +attr titleMarginEnd +attr titleMarginStart +attr titleMarginTop +attr titleMargins +attr titleTextAppearance +attr titleTextColor +attr titleTextStyle +attr toolbarNavigationButtonStyle +attr toolbarStyle +attr tooltipForegroundColor +attr tooltipFrameBackground +attr tooltipText +attr track +attr trackTint +attr trackTintMode +attr ttcIndex +attr uiCompass +attr uiMapToolbar +attr uiRotateGestures +attr uiScrollGestures +attr uiScrollGesturesDuringRotateOrZoom +attr uiTiltGestures +attr uiZoomControls +attr uiZoomGestures +attr useViewLifecycle +attr viewAspectRatio +attr viewInflaterClass +attr voiceIcon +attr windowActionBar +attr windowActionBarOverlay +attr windowActionModeOverlay +attr windowFixedHeightMajor +attr windowFixedHeightMinor +attr windowFixedWidthMajor +attr windowFixedWidthMinor +attr windowMinWidthMajor +attr windowMinWidthMinor +attr windowNoTitle +attr zOrderOnTop +bool abc_action_bar_embed_tabs +bool abc_allow_stacked_button_bar +bool abc_config_actionMenuItemAllCaps +color abc_background_cache_hint_selector_material_dark +color abc_background_cache_hint_selector_material_light +color abc_btn_colored_borderless_text_material +color abc_btn_colored_text_material +color abc_color_highlight_material +color abc_hint_foreground_material_dark +color abc_hint_foreground_material_light +color abc_input_method_navigation_guard +color abc_primary_text_disable_only_material_dark +color abc_primary_text_disable_only_material_light +color abc_primary_text_material_dark +color abc_primary_text_material_light +color abc_search_url_text +color abc_search_url_text_normal +color abc_search_url_text_pressed +color abc_search_url_text_selected +color abc_secondary_text_material_dark +color abc_secondary_text_material_light +color abc_tint_btn_checkable +color abc_tint_default +color abc_tint_edittext +color abc_tint_seek_thumb +color abc_tint_spinner +color abc_tint_switch_track +color accent_material_dark +color accent_material_light +color background_floating_material_dark +color background_floating_material_light +color background_material_dark +color background_material_light +color bright_foreground_disabled_material_dark +color bright_foreground_disabled_material_light +color bright_foreground_inverse_material_dark +color bright_foreground_inverse_material_light +color bright_foreground_material_dark +color bright_foreground_material_light +color button_material_dark +color button_material_light +color catalyst_redbox_background +color common_google_signin_btn_text_dark +color common_google_signin_btn_text_dark_default +color common_google_signin_btn_text_dark_disabled +color common_google_signin_btn_text_dark_focused +color common_google_signin_btn_text_dark_pressed +color common_google_signin_btn_text_light +color common_google_signin_btn_text_light_default +color common_google_signin_btn_text_light_disabled +color common_google_signin_btn_text_light_focused +color common_google_signin_btn_text_light_pressed +color common_google_signin_btn_tint +color dim_foreground_disabled_material_dark +color dim_foreground_disabled_material_light +color dim_foreground_material_dark +color dim_foreground_material_light +color error_color_material_dark +color error_color_material_light +color foreground_material_dark +color foreground_material_light +color highlighted_text_material_dark +color highlighted_text_material_light +color material_blue_grey_800 +color material_blue_grey_900 +color material_blue_grey_950 +color material_deep_teal_200 +color material_deep_teal_500 +color material_grey_100 +color material_grey_300 +color material_grey_50 +color material_grey_600 +color material_grey_800 +color material_grey_850 +color material_grey_900 +color notification_action_color_filter +color notification_icon_bg_color +color notification_material_background_media_default_color +color primary_dark_material_dark +color primary_dark_material_light +color primary_material_dark +color primary_material_light +color primary_text_default_material_dark +color primary_text_default_material_light +color primary_text_disabled_material_dark +color primary_text_disabled_material_light +color ripple_material_dark +color ripple_material_light +color secondary_text_default_material_dark +color secondary_text_default_material_light +color secondary_text_disabled_material_dark +color secondary_text_disabled_material_light +color switch_thumb_disabled_material_dark +color switch_thumb_disabled_material_light +color switch_thumb_material_dark +color switch_thumb_material_light +color switch_thumb_normal_material_dark +color switch_thumb_normal_material_light +color tooltip_background_dark +color tooltip_background_light +dimen abc_action_bar_content_inset_material +dimen abc_action_bar_content_inset_with_nav +dimen abc_action_bar_default_height_material +dimen abc_action_bar_default_padding_end_material +dimen abc_action_bar_default_padding_start_material +dimen abc_action_bar_elevation_material +dimen abc_action_bar_icon_vertical_padding_material +dimen abc_action_bar_overflow_padding_end_material +dimen abc_action_bar_overflow_padding_start_material +dimen abc_action_bar_stacked_max_height +dimen abc_action_bar_stacked_tab_max_width +dimen abc_action_bar_subtitle_bottom_margin_material +dimen abc_action_bar_subtitle_top_margin_material +dimen abc_action_button_min_height_material +dimen abc_action_button_min_width_material +dimen abc_action_button_min_width_overflow_material +dimen abc_alert_dialog_button_bar_height +dimen abc_alert_dialog_button_dimen +dimen abc_button_inset_horizontal_material +dimen abc_button_inset_vertical_material +dimen abc_button_padding_horizontal_material +dimen abc_button_padding_vertical_material +dimen abc_cascading_menus_min_smallest_width +dimen abc_config_prefDialogWidth +dimen abc_control_corner_material +dimen abc_control_inset_material +dimen abc_control_padding_material +dimen abc_dialog_corner_radius_material +dimen abc_dialog_fixed_height_major +dimen abc_dialog_fixed_height_minor +dimen abc_dialog_fixed_width_major +dimen abc_dialog_fixed_width_minor +dimen abc_dialog_list_padding_bottom_no_buttons +dimen abc_dialog_list_padding_top_no_title +dimen abc_dialog_min_width_major +dimen abc_dialog_min_width_minor +dimen abc_dialog_padding_material +dimen abc_dialog_padding_top_material +dimen abc_dialog_title_divider_material +dimen abc_disabled_alpha_material_dark +dimen abc_disabled_alpha_material_light +dimen abc_dropdownitem_icon_width +dimen abc_dropdownitem_text_padding_left +dimen abc_dropdownitem_text_padding_right +dimen abc_edit_text_inset_bottom_material +dimen abc_edit_text_inset_horizontal_material +dimen abc_edit_text_inset_top_material +dimen abc_floating_window_z +dimen abc_list_item_padding_horizontal_material +dimen abc_panel_menu_list_width +dimen abc_progress_bar_height_material +dimen abc_search_view_preferred_height +dimen abc_search_view_preferred_width +dimen abc_seekbar_track_background_height_material +dimen abc_seekbar_track_progress_height_material +dimen abc_select_dialog_padding_start_material +dimen abc_switch_padding +dimen abc_text_size_body_1_material +dimen abc_text_size_body_2_material +dimen abc_text_size_button_material +dimen abc_text_size_caption_material +dimen abc_text_size_display_1_material +dimen abc_text_size_display_2_material +dimen abc_text_size_display_3_material +dimen abc_text_size_display_4_material +dimen abc_text_size_headline_material +dimen abc_text_size_large_material +dimen abc_text_size_medium_material +dimen abc_text_size_menu_header_material +dimen abc_text_size_menu_material +dimen abc_text_size_small_material +dimen abc_text_size_subhead_material +dimen abc_text_size_subtitle_material_toolbar +dimen abc_text_size_title_material +dimen abc_text_size_title_material_toolbar +dimen compat_button_inset_horizontal_material +dimen compat_button_inset_vertical_material +dimen compat_button_padding_horizontal_material +dimen compat_button_padding_vertical_material +dimen compat_control_corner_material +dimen compat_notification_large_icon_max_height +dimen compat_notification_large_icon_max_width +dimen disabled_alpha_material_dark +dimen disabled_alpha_material_light +dimen highlight_alpha_material_colored +dimen highlight_alpha_material_dark +dimen highlight_alpha_material_light +dimen hint_alpha_material_dark +dimen hint_alpha_material_light +dimen hint_pressed_alpha_material_dark +dimen hint_pressed_alpha_material_light +dimen notification_action_icon_size +dimen notification_action_text_size +dimen notification_big_circle_margin +dimen notification_content_margin_start +dimen notification_large_icon_height +dimen notification_large_icon_width +dimen notification_main_column_padding_top +dimen notification_media_narrow_margin +dimen notification_right_icon_size +dimen notification_right_side_padding_top +dimen notification_small_icon_background_padding +dimen notification_small_icon_size_as_large +dimen notification_subtext_size +dimen notification_top_pad +dimen notification_top_pad_large_text +dimen subtitle_corner_radius +dimen subtitle_outline_width +dimen subtitle_shadow_offset +dimen subtitle_shadow_radius +dimen tooltip_corner_radius +dimen tooltip_horizontal_padding +dimen tooltip_margin +dimen tooltip_precise_anchor_extra_offset +dimen tooltip_precise_anchor_threshold +dimen tooltip_vertical_padding +dimen tooltip_y_offset_non_touch +dimen tooltip_y_offset_touch +drawable abc_ab_share_pack_mtrl_alpha +drawable abc_action_bar_item_background_material +drawable abc_btn_borderless_material +drawable abc_btn_check_material +drawable abc_btn_check_to_on_mtrl_000 +drawable abc_btn_check_to_on_mtrl_015 +drawable abc_btn_colored_material +drawable abc_btn_default_mtrl_shape +drawable abc_btn_radio_material +drawable abc_btn_radio_to_on_mtrl_000 +drawable abc_btn_radio_to_on_mtrl_015 +drawable abc_btn_switch_to_on_mtrl_00001 +drawable abc_btn_switch_to_on_mtrl_00012 +drawable abc_cab_background_internal_bg +drawable abc_cab_background_top_material +drawable abc_cab_background_top_mtrl_alpha +drawable abc_control_background_material +drawable abc_dialog_material_background +drawable abc_edit_text_material +drawable abc_ic_ab_back_material +drawable abc_ic_arrow_drop_right_black_24dp +drawable abc_ic_clear_material +drawable abc_ic_commit_search_api_mtrl_alpha +drawable abc_ic_go_search_api_material +drawable abc_ic_menu_copy_mtrl_am_alpha +drawable abc_ic_menu_cut_mtrl_alpha +drawable abc_ic_menu_overflow_material +drawable abc_ic_menu_paste_mtrl_am_alpha +drawable abc_ic_menu_selectall_mtrl_alpha +drawable abc_ic_menu_share_mtrl_alpha +drawable abc_ic_search_api_material +drawable abc_ic_star_black_16dp +drawable abc_ic_star_black_36dp +drawable abc_ic_star_black_48dp +drawable abc_ic_star_half_black_16dp +drawable abc_ic_star_half_black_36dp +drawable abc_ic_star_half_black_48dp +drawable abc_ic_voice_search_api_material +drawable abc_item_background_holo_dark +drawable abc_item_background_holo_light +drawable abc_list_divider_material +drawable abc_list_divider_mtrl_alpha +drawable abc_list_focused_holo +drawable abc_list_longpressed_holo +drawable abc_list_pressed_holo_dark +drawable abc_list_pressed_holo_light +drawable abc_list_selector_background_transition_holo_dark +drawable abc_list_selector_background_transition_holo_light +drawable abc_list_selector_disabled_holo_dark +drawable abc_list_selector_disabled_holo_light +drawable abc_list_selector_holo_dark +drawable abc_list_selector_holo_light +drawable abc_menu_hardkey_panel_mtrl_mult +drawable abc_popup_background_mtrl_mult +drawable abc_ratingbar_indicator_material +drawable abc_ratingbar_material +drawable abc_ratingbar_small_material +drawable abc_scrubber_control_off_mtrl_alpha +drawable abc_scrubber_control_to_pressed_mtrl_000 +drawable abc_scrubber_control_to_pressed_mtrl_005 +drawable abc_scrubber_primary_mtrl_alpha +drawable abc_scrubber_track_mtrl_alpha +drawable abc_seekbar_thumb_material +drawable abc_seekbar_tick_mark_material +drawable abc_seekbar_track_material +drawable abc_spinner_mtrl_am_alpha +drawable abc_spinner_textfield_background_material +drawable abc_switch_thumb_material +drawable abc_switch_track_mtrl_alpha +drawable abc_tab_indicator_material +drawable abc_tab_indicator_mtrl_alpha +drawable abc_text_cursor_material +drawable abc_text_select_handle_left_mtrl_dark +drawable abc_text_select_handle_left_mtrl_light +drawable abc_text_select_handle_middle_mtrl_dark +drawable abc_text_select_handle_middle_mtrl_light +drawable abc_text_select_handle_right_mtrl_dark +drawable abc_text_select_handle_right_mtrl_light +drawable abc_textfield_activated_mtrl_alpha +drawable abc_textfield_default_mtrl_alpha +drawable abc_textfield_search_activated_mtrl_alpha +drawable abc_textfield_search_default_mtrl_alpha +drawable abc_textfield_search_material +drawable abc_vector_test +drawable amu_bubble_mask +drawable amu_bubble_shadow +drawable common_full_open_on_phone +drawable common_google_signin_btn_icon_dark +drawable common_google_signin_btn_icon_dark_disabled +drawable common_google_signin_btn_icon_dark_focused +drawable common_google_signin_btn_icon_dark_normal +drawable common_google_signin_btn_icon_dark_normal_background +drawable common_google_signin_btn_icon_dark_pressed +drawable common_google_signin_btn_icon_disabled +drawable common_google_signin_btn_icon_light +drawable common_google_signin_btn_icon_light_disabled +drawable common_google_signin_btn_icon_light_focused +drawable common_google_signin_btn_icon_light_normal +drawable common_google_signin_btn_icon_light_normal_background +drawable common_google_signin_btn_icon_light_pressed +drawable common_google_signin_btn_text_dark +drawable common_google_signin_btn_text_dark_disabled +drawable common_google_signin_btn_text_dark_focused +drawable common_google_signin_btn_text_dark_normal +drawable common_google_signin_btn_text_dark_normal_background +drawable common_google_signin_btn_text_dark_pressed +drawable common_google_signin_btn_text_disabled +drawable common_google_signin_btn_text_light +drawable common_google_signin_btn_text_light_disabled +drawable common_google_signin_btn_text_light_focused +drawable common_google_signin_btn_text_light_normal +drawable common_google_signin_btn_text_light_normal_background +drawable common_google_signin_btn_text_light_pressed +drawable common_ic_googleplayservices +drawable googleg_disabled_color_18 +drawable googleg_standard_color_18 +drawable notification_action_background +drawable notification_bg +drawable notification_bg_low +drawable notification_bg_low_normal +drawable notification_bg_low_pressed +drawable notification_bg_normal +drawable notification_bg_normal_pressed +drawable notification_icon_background +drawable notification_template_icon_bg +drawable notification_template_icon_low_bg +drawable notification_tile_bg +drawable notify_panel_notification_icon_bg +drawable redbox_top_border_background +drawable tooltip_frame_dark +drawable tooltip_frame_light +id accessibility_hint +id accessibility_role +id action0 +id action_bar +id action_bar_activity_content +id action_bar_container +id action_bar_root +id action_bar_spinner +id action_bar_subtitle +id action_bar_title +id action_container +id action_context_bar +id action_divider +id action_image +id action_menu_divider +id action_menu_presenter +id action_mode_bar +id action_mode_bar_stub +id action_mode_close_button +id action_text +id actions +id activity_chooser_view_content +id add +id adjust_height +id adjust_width +id alertTitle +id amu_text +id async +id auto +id blocking +id bottom +id buttonPanel +id cancel_action +id catalyst_redbox_title +id center +id centerCrop +id centerInside +id checkbox +id chronometer +id content +id contentPanel +id custom +id customPanel +id dark +id decor_content_parent +id default_activity_button +id edit_query +id end +id end_padder +id expand_activities_button +id expanded_menu +id fitBottomStart +id fitCenter +id fitEnd +id fitStart +id fitXY +id focusCrop +id forever +id fps_text +id group_divider +id home +id hybrid +id icon +id icon_group +id icon_only +id image +id info +id italic +id left +id light +id line1 +id line3 +id listMode +id list_item +id media_actions +id message +id multiply +id none +id normal +id notification_background +id notification_main_column +id notification_main_column_container +id parentPanel +id progress_circular +id progress_horizontal +id radio +id react_test_id +id right +id right_icon +id right_side +id rn_frame_file +id rn_frame_method +id rn_redbox_copy_button +id rn_redbox_dismiss_button +id rn_redbox_line_separator +id rn_redbox_loading_indicator +id rn_redbox_reload_button +id rn_redbox_report_button +id rn_redbox_report_label +id rn_redbox_stack +id satellite +id screen +id scrollIndicatorDown +id scrollIndicatorUp +id scrollView +id search_badge +id search_bar +id search_button +id search_close_btn +id search_edit_frame +id search_go_btn +id search_mag_icon +id search_plate +id search_src_text +id search_voice_btn +id select_dialog_listview +id shortcut +id spacer +id split_action_bar +id src_atop +id src_in +id src_over +id standard +id start +id status_bar_latest_event_content +id submenuarrow +id submit_area +id tabMode +id tag_transition_group +id tag_unhandled_key_event_manager +id tag_unhandled_key_listeners +id terrain +id text +id text2 +id textSpacerNoButtons +id textSpacerNoTitle +id time +id title +id titleDividerNoCustom +id title_template +id top +id topPanel +id uniform +id up +id view_tag_instance_handle +id view_tag_native_id +id webview +id wide +id window +id wrap_content +integer abc_config_activityDefaultDur +integer abc_config_activityShortDur +integer cancel_button_image_alpha +integer config_tooltipAnimTime +integer google_play_services_version +integer status_bar_notification_info_maxnum +layout abc_action_bar_title_item +layout abc_action_bar_up_container +layout abc_action_menu_item_layout +layout abc_action_menu_layout +layout abc_action_mode_bar +layout abc_action_mode_close_item_material +layout abc_activity_chooser_view +layout abc_activity_chooser_view_list_item +layout abc_alert_dialog_button_bar_material +layout abc_alert_dialog_material +layout abc_alert_dialog_title_material +layout abc_cascading_menu_item_layout +layout abc_dialog_title_material +layout abc_expanded_menu_layout +layout abc_list_menu_item_checkbox +layout abc_list_menu_item_icon +layout abc_list_menu_item_layout +layout abc_list_menu_item_radio +layout abc_popup_menu_header_item_layout +layout abc_popup_menu_item_layout +layout abc_screen_content_include +layout abc_screen_simple +layout abc_screen_simple_overlay_action_mode +layout abc_screen_toolbar +layout abc_search_dropdown_item_icons_2line +layout abc_search_view +layout abc_select_dialog_material +layout abc_tooltip +layout amu_info_window +layout amu_text_bubble +layout amu_webview +layout dev_loading_view +layout fps_view +layout notification_action +layout notification_action_tombstone +layout notification_media_action +layout notification_media_cancel_action +layout notification_template_big_media +layout notification_template_big_media_custom +layout notification_template_big_media_narrow +layout notification_template_big_media_narrow_custom +layout notification_template_custom_big +layout notification_template_icon_group +layout notification_template_lines_media +layout notification_template_media +layout notification_template_media_custom +layout notification_template_part_chronometer +layout notification_template_part_time +layout redbox_item_frame +layout redbox_item_title +layout redbox_view +layout select_dialog_item_material +layout select_dialog_multichoice_material +layout select_dialog_singlechoice_material +layout support_simple_spinner_dropdown_item +raw amu_ballon_gx_prefix +raw amu_basic_folder +raw amu_basic_placemark +raw amu_cdata +raw amu_default_balloon +raw amu_document_nest +raw amu_draw_order_ground_overlay +raw amu_extended_data +raw amu_ground_overlay +raw amu_ground_overlay_color +raw amu_inline_style +raw amu_multigeometry_placemarks +raw amu_multiple_placemarks +raw amu_nested_folders +raw amu_nested_multigeometry +raw amu_poly_style_boolean_alpha +raw amu_poly_style_boolean_numeric +raw amu_unknwown_folder +raw amu_unsupported +raw amu_visibility_ground_overlay +string abc_action_bar_home_description +string abc_action_bar_up_description +string abc_action_menu_overflow_description +string abc_action_mode_done +string abc_activity_chooser_view_see_all +string abc_activitychooserview_choose_application +string abc_capital_off +string abc_capital_on +string abc_font_family_body_1_material +string abc_font_family_body_2_material +string abc_font_family_button_material +string abc_font_family_caption_material +string abc_font_family_display_1_material +string abc_font_family_display_2_material +string abc_font_family_display_3_material +string abc_font_family_display_4_material +string abc_font_family_headline_material +string abc_font_family_menu_material +string abc_font_family_subhead_material +string abc_font_family_title_material +string abc_menu_alt_shortcut_label +string abc_menu_ctrl_shortcut_label +string abc_menu_delete_shortcut_label +string abc_menu_enter_shortcut_label +string abc_menu_function_shortcut_label +string abc_menu_meta_shortcut_label +string abc_menu_shift_shortcut_label +string abc_menu_space_shortcut_label +string abc_menu_sym_shortcut_label +string abc_prepend_shortcut_label +string abc_search_hint +string abc_searchview_description_clear +string abc_searchview_description_query +string abc_searchview_description_search +string abc_searchview_description_submit +string abc_searchview_description_voice +string abc_shareactionprovider_share_with +string abc_shareactionprovider_share_with_application +string abc_toolbar_collapse_description +string adjustable_description +string catalyst_copy_button +string catalyst_debugjs +string catalyst_debugjs_nuclide +string catalyst_debugjs_nuclide_failure +string catalyst_debugjs_off +string catalyst_dismiss_button +string catalyst_element_inspector +string catalyst_heap_capture +string catalyst_hot_module_replacement +string catalyst_hot_module_replacement_off +string catalyst_jsload_error +string catalyst_live_reload +string catalyst_live_reload_off +string catalyst_loading_from_url +string catalyst_perf_monitor +string catalyst_perf_monitor_off +string catalyst_poke_sampling_profiler +string catalyst_reload_button +string catalyst_reloadjs +string catalyst_remotedbg_error +string catalyst_remotedbg_message +string catalyst_report_button +string catalyst_settings +string catalyst_settings_title +string common_google_play_services_enable_button +string common_google_play_services_enable_text +string common_google_play_services_enable_title +string common_google_play_services_install_button +string common_google_play_services_install_text +string common_google_play_services_install_text_phone +string common_google_play_services_install_text_tablet +string common_google_play_services_install_title +string common_google_play_services_notification_channel_name +string common_google_play_services_notification_ticker +string common_google_play_services_unknown_issue +string common_google_play_services_unsupported_text +string common_google_play_services_unsupported_title +string common_google_play_services_update_button +string common_google_play_services_update_text +string common_google_play_services_update_title +string common_google_play_services_updating_text +string common_google_play_services_updating_title +string common_google_play_services_wear_update_text +string common_open_on_phone +string common_signin_button_text +string common_signin_button_text_long +string header_description +string image_button_description +string image_description +string link_description +string search_description +string search_menu_title +string status_bar_notification_info_overflow +style AlertDialog_AppCompat +style AlertDialog_AppCompat_Light +style Animation_AppCompat_Dialog +style Animation_AppCompat_DropDownUp +style Animation_AppCompat_Tooltip +style Animation_Catalyst_RedBox +style Base_AlertDialog_AppCompat +style Base_AlertDialog_AppCompat_Light +style Base_Animation_AppCompat_Dialog +style Base_Animation_AppCompat_DropDownUp +style Base_Animation_AppCompat_Tooltip +style Base_DialogWindowTitleBackground_AppCompat +style Base_DialogWindowTitle_AppCompat +style Base_TextAppearance_AppCompat +style Base_TextAppearance_AppCompat_Body1 +style Base_TextAppearance_AppCompat_Body2 +style Base_TextAppearance_AppCompat_Button +style Base_TextAppearance_AppCompat_Caption +style Base_TextAppearance_AppCompat_Display1 +style Base_TextAppearance_AppCompat_Display2 +style Base_TextAppearance_AppCompat_Display3 +style Base_TextAppearance_AppCompat_Display4 +style Base_TextAppearance_AppCompat_Headline +style Base_TextAppearance_AppCompat_Inverse +style Base_TextAppearance_AppCompat_Large +style Base_TextAppearance_AppCompat_Large_Inverse +style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large +style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small +style Base_TextAppearance_AppCompat_Medium +style Base_TextAppearance_AppCompat_Medium_Inverse +style Base_TextAppearance_AppCompat_Menu +style Base_TextAppearance_AppCompat_SearchResult +style Base_TextAppearance_AppCompat_SearchResult_Subtitle +style Base_TextAppearance_AppCompat_SearchResult_Title +style Base_TextAppearance_AppCompat_Small +style Base_TextAppearance_AppCompat_Small_Inverse +style Base_TextAppearance_AppCompat_Subhead +style Base_TextAppearance_AppCompat_Subhead_Inverse +style Base_TextAppearance_AppCompat_Title +style Base_TextAppearance_AppCompat_Title_Inverse +style Base_TextAppearance_AppCompat_Tooltip +style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu +style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle +style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse +style Base_TextAppearance_AppCompat_Widget_ActionBar_Title +style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse +style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle +style Base_TextAppearance_AppCompat_Widget_ActionMode_Title +style Base_TextAppearance_AppCompat_Widget_Button +style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored +style Base_TextAppearance_AppCompat_Widget_Button_Colored +style Base_TextAppearance_AppCompat_Widget_Button_Inverse +style Base_TextAppearance_AppCompat_Widget_DropDownItem +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small +style Base_TextAppearance_AppCompat_Widget_Switch +style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem +style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item +style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle +style Base_TextAppearance_Widget_AppCompat_Toolbar_Title +style Base_ThemeOverlay_AppCompat +style Base_ThemeOverlay_AppCompat_ActionBar +style Base_ThemeOverlay_AppCompat_Dark +style Base_ThemeOverlay_AppCompat_Dark_ActionBar +style Base_ThemeOverlay_AppCompat_Dialog +style Base_ThemeOverlay_AppCompat_Dialog_Alert +style Base_ThemeOverlay_AppCompat_Light +style Base_Theme_AppCompat +style Base_Theme_AppCompat_CompactMenu +style Base_Theme_AppCompat_Dialog +style Base_Theme_AppCompat_DialogWhenLarge +style Base_Theme_AppCompat_Dialog_Alert +style Base_Theme_AppCompat_Dialog_FixedSize +style Base_Theme_AppCompat_Dialog_MinWidth +style Base_Theme_AppCompat_Light +style Base_Theme_AppCompat_Light_DarkActionBar +style Base_Theme_AppCompat_Light_Dialog +style Base_Theme_AppCompat_Light_DialogWhenLarge +style Base_Theme_AppCompat_Light_Dialog_Alert +style Base_Theme_AppCompat_Light_Dialog_FixedSize +style Base_Theme_AppCompat_Light_Dialog_MinWidth +style Base_V21_ThemeOverlay_AppCompat_Dialog +style Base_V21_Theme_AppCompat +style Base_V21_Theme_AppCompat_Dialog +style Base_V21_Theme_AppCompat_Light +style Base_V21_Theme_AppCompat_Light_Dialog +style Base_V22_Theme_AppCompat +style Base_V22_Theme_AppCompat_Light +style Base_V23_Theme_AppCompat +style Base_V23_Theme_AppCompat_Light +style Base_V26_Theme_AppCompat +style Base_V26_Theme_AppCompat_Light +style Base_V26_Widget_AppCompat_Toolbar +style Base_V28_Theme_AppCompat +style Base_V28_Theme_AppCompat_Light +style Base_V7_ThemeOverlay_AppCompat_Dialog +style Base_V7_Theme_AppCompat +style Base_V7_Theme_AppCompat_Dialog +style Base_V7_Theme_AppCompat_Light +style Base_V7_Theme_AppCompat_Light_Dialog +style Base_V7_Widget_AppCompat_AutoCompleteTextView +style Base_V7_Widget_AppCompat_EditText +style Base_V7_Widget_AppCompat_Toolbar +style Base_Widget_AppCompat_ActionBar +style Base_Widget_AppCompat_ActionBar_Solid +style Base_Widget_AppCompat_ActionBar_TabBar +style Base_Widget_AppCompat_ActionBar_TabText +style Base_Widget_AppCompat_ActionBar_TabView +style Base_Widget_AppCompat_ActionButton +style Base_Widget_AppCompat_ActionButton_CloseMode +style Base_Widget_AppCompat_ActionButton_Overflow +style Base_Widget_AppCompat_ActionMode +style Base_Widget_AppCompat_ActivityChooserView +style Base_Widget_AppCompat_AutoCompleteTextView +style Base_Widget_AppCompat_Button +style Base_Widget_AppCompat_ButtonBar +style Base_Widget_AppCompat_ButtonBar_AlertDialog +style Base_Widget_AppCompat_Button_Borderless +style Base_Widget_AppCompat_Button_Borderless_Colored +style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog +style Base_Widget_AppCompat_Button_Colored +style Base_Widget_AppCompat_Button_Small +style Base_Widget_AppCompat_CompoundButton_CheckBox +style Base_Widget_AppCompat_CompoundButton_RadioButton +style Base_Widget_AppCompat_CompoundButton_Switch +style Base_Widget_AppCompat_DrawerArrowToggle +style Base_Widget_AppCompat_DrawerArrowToggle_Common +style Base_Widget_AppCompat_DropDownItem_Spinner +style Base_Widget_AppCompat_EditText +style Base_Widget_AppCompat_ImageButton +style Base_Widget_AppCompat_Light_ActionBar +style Base_Widget_AppCompat_Light_ActionBar_Solid +style Base_Widget_AppCompat_Light_ActionBar_TabBar +style Base_Widget_AppCompat_Light_ActionBar_TabText +style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse +style Base_Widget_AppCompat_Light_ActionBar_TabView +style Base_Widget_AppCompat_Light_PopupMenu +style Base_Widget_AppCompat_Light_PopupMenu_Overflow +style Base_Widget_AppCompat_ListMenuView +style Base_Widget_AppCompat_ListPopupWindow +style Base_Widget_AppCompat_ListView +style Base_Widget_AppCompat_ListView_DropDown +style Base_Widget_AppCompat_ListView_Menu +style Base_Widget_AppCompat_PopupMenu +style Base_Widget_AppCompat_PopupMenu_Overflow +style Base_Widget_AppCompat_PopupWindow +style Base_Widget_AppCompat_ProgressBar +style Base_Widget_AppCompat_ProgressBar_Horizontal +style Base_Widget_AppCompat_RatingBar +style Base_Widget_AppCompat_RatingBar_Indicator +style Base_Widget_AppCompat_RatingBar_Small +style Base_Widget_AppCompat_SearchView +style Base_Widget_AppCompat_SearchView_ActionBar +style Base_Widget_AppCompat_SeekBar +style Base_Widget_AppCompat_SeekBar_Discrete +style Base_Widget_AppCompat_Spinner +style Base_Widget_AppCompat_Spinner_Underlined +style Base_Widget_AppCompat_TextView_SpinnerItem +style Base_Widget_AppCompat_Toolbar +style Base_Widget_AppCompat_Toolbar_Button_Navigation +style CalendarDatePickerDialog +style CalendarDatePickerStyle +style ClockTimePickerDialog +style ClockTimePickerStyle +style DialogAnimationFade +style DialogAnimationSlide +style Platform_AppCompat +style Platform_AppCompat_Light +style Platform_ThemeOverlay_AppCompat +style Platform_ThemeOverlay_AppCompat_Dark +style Platform_ThemeOverlay_AppCompat_Light +style Platform_V21_AppCompat +style Platform_V21_AppCompat_Light +style Platform_V25_AppCompat +style Platform_V25_AppCompat_Light +style Platform_Widget_AppCompat_Spinner +style RtlOverlay_DialogWindowTitle_AppCompat +style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem +style RtlOverlay_Widget_AppCompat_DialogTitle_Icon +style RtlOverlay_Widget_AppCompat_PopupMenuItem +style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut +style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title +style RtlOverlay_Widget_AppCompat_SearchView_MagIcon +style RtlOverlay_Widget_AppCompat_Search_DropDown +style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 +style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 +style RtlOverlay_Widget_AppCompat_Search_DropDown_Query +style RtlOverlay_Widget_AppCompat_Search_DropDown_Text +style RtlUnderlay_Widget_AppCompat_ActionButton +style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow +style SpinnerDatePickerDialog +style SpinnerDatePickerStyle +style SpinnerTimePickerDialog +style SpinnerTimePickerStyle +style TextAppearance_AppCompat +style TextAppearance_AppCompat_Body1 +style TextAppearance_AppCompat_Body2 +style TextAppearance_AppCompat_Button +style TextAppearance_AppCompat_Caption +style TextAppearance_AppCompat_Display1 +style TextAppearance_AppCompat_Display2 +style TextAppearance_AppCompat_Display3 +style TextAppearance_AppCompat_Display4 +style TextAppearance_AppCompat_Headline +style TextAppearance_AppCompat_Inverse +style TextAppearance_AppCompat_Large +style TextAppearance_AppCompat_Large_Inverse +style TextAppearance_AppCompat_Light_SearchResult_Subtitle +style TextAppearance_AppCompat_Light_SearchResult_Title +style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large +style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small +style TextAppearance_AppCompat_Medium +style TextAppearance_AppCompat_Medium_Inverse +style TextAppearance_AppCompat_Menu +style TextAppearance_AppCompat_SearchResult_Subtitle +style TextAppearance_AppCompat_SearchResult_Title +style TextAppearance_AppCompat_Small +style TextAppearance_AppCompat_Small_Inverse +style TextAppearance_AppCompat_Subhead +style TextAppearance_AppCompat_Subhead_Inverse +style TextAppearance_AppCompat_Title +style TextAppearance_AppCompat_Title_Inverse +style TextAppearance_AppCompat_Tooltip +style TextAppearance_AppCompat_Widget_ActionBar_Menu +style TextAppearance_AppCompat_Widget_ActionBar_Subtitle +style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse +style TextAppearance_AppCompat_Widget_ActionBar_Title +style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse +style TextAppearance_AppCompat_Widget_ActionMode_Subtitle +style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse +style TextAppearance_AppCompat_Widget_ActionMode_Title +style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse +style TextAppearance_AppCompat_Widget_Button +style TextAppearance_AppCompat_Widget_Button_Borderless_Colored +style TextAppearance_AppCompat_Widget_Button_Colored +style TextAppearance_AppCompat_Widget_Button_Inverse +style TextAppearance_AppCompat_Widget_DropDownItem +style TextAppearance_AppCompat_Widget_PopupMenu_Header +style TextAppearance_AppCompat_Widget_PopupMenu_Large +style TextAppearance_AppCompat_Widget_PopupMenu_Small +style TextAppearance_AppCompat_Widget_Switch +style TextAppearance_AppCompat_Widget_TextView_SpinnerItem +style TextAppearance_Compat_Notification +style TextAppearance_Compat_Notification_Info +style TextAppearance_Compat_Notification_Info_Media +style TextAppearance_Compat_Notification_Line2 +style TextAppearance_Compat_Notification_Line2_Media +style TextAppearance_Compat_Notification_Media +style TextAppearance_Compat_Notification_Time +style TextAppearance_Compat_Notification_Time_Media +style TextAppearance_Compat_Notification_Title +style TextAppearance_Compat_Notification_Title_Media +style TextAppearance_Widget_AppCompat_ExpandedMenu_Item +style TextAppearance_Widget_AppCompat_Toolbar_Subtitle +style TextAppearance_Widget_AppCompat_Toolbar_Title +style Theme +style ThemeOverlay_AppCompat +style ThemeOverlay_AppCompat_ActionBar +style ThemeOverlay_AppCompat_Dark +style ThemeOverlay_AppCompat_Dark_ActionBar +style ThemeOverlay_AppCompat_Dialog +style ThemeOverlay_AppCompat_Dialog_Alert +style ThemeOverlay_AppCompat_Light +style Theme_AppCompat +style Theme_AppCompat_CompactMenu +style Theme_AppCompat_DayNight +style Theme_AppCompat_DayNight_DarkActionBar +style Theme_AppCompat_DayNight_Dialog +style Theme_AppCompat_DayNight_DialogWhenLarge +style Theme_AppCompat_DayNight_Dialog_Alert +style Theme_AppCompat_DayNight_Dialog_MinWidth +style Theme_AppCompat_DayNight_NoActionBar +style Theme_AppCompat_Dialog +style Theme_AppCompat_DialogWhenLarge +style Theme_AppCompat_Dialog_Alert +style Theme_AppCompat_Dialog_MinWidth +style Theme_AppCompat_Light +style Theme_AppCompat_Light_DarkActionBar +style Theme_AppCompat_Light_Dialog +style Theme_AppCompat_Light_DialogWhenLarge +style Theme_AppCompat_Light_Dialog_Alert +style Theme_AppCompat_Light_Dialog_MinWidth +style Theme_AppCompat_Light_NoActionBar +style Theme_AppCompat_NoActionBar +style Theme_Catalyst +style Theme_Catalyst_RedBox +style Theme_FullScreenDialog +style Theme_FullScreenDialogAnimatedFade +style Theme_FullScreenDialogAnimatedSlide +style Theme_ReactNative_AppCompat_Light +style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen +style Widget_AppCompat_ActionBar +style Widget_AppCompat_ActionBar_Solid +style Widget_AppCompat_ActionBar_TabBar +style Widget_AppCompat_ActionBar_TabText +style Widget_AppCompat_ActionBar_TabView +style Widget_AppCompat_ActionButton +style Widget_AppCompat_ActionButton_CloseMode +style Widget_AppCompat_ActionButton_Overflow +style Widget_AppCompat_ActionMode +style Widget_AppCompat_ActivityChooserView +style Widget_AppCompat_AutoCompleteTextView +style Widget_AppCompat_Button +style Widget_AppCompat_ButtonBar +style Widget_AppCompat_ButtonBar_AlertDialog +style Widget_AppCompat_Button_Borderless +style Widget_AppCompat_Button_Borderless_Colored +style Widget_AppCompat_Button_ButtonBar_AlertDialog +style Widget_AppCompat_Button_Colored +style Widget_AppCompat_Button_Small +style Widget_AppCompat_CompoundButton_CheckBox +style Widget_AppCompat_CompoundButton_RadioButton +style Widget_AppCompat_CompoundButton_Switch +style Widget_AppCompat_DrawerArrowToggle +style Widget_AppCompat_DropDownItem_Spinner +style Widget_AppCompat_EditText +style Widget_AppCompat_ImageButton +style Widget_AppCompat_Light_ActionBar +style Widget_AppCompat_Light_ActionBar_Solid +style Widget_AppCompat_Light_ActionBar_Solid_Inverse +style Widget_AppCompat_Light_ActionBar_TabBar +style Widget_AppCompat_Light_ActionBar_TabBar_Inverse +style Widget_AppCompat_Light_ActionBar_TabText +style Widget_AppCompat_Light_ActionBar_TabText_Inverse +style Widget_AppCompat_Light_ActionBar_TabView +style Widget_AppCompat_Light_ActionBar_TabView_Inverse +style Widget_AppCompat_Light_ActionButton +style Widget_AppCompat_Light_ActionButton_CloseMode +style Widget_AppCompat_Light_ActionButton_Overflow +style Widget_AppCompat_Light_ActionMode_Inverse +style Widget_AppCompat_Light_ActivityChooserView +style Widget_AppCompat_Light_AutoCompleteTextView +style Widget_AppCompat_Light_DropDownItem_Spinner +style Widget_AppCompat_Light_ListPopupWindow +style Widget_AppCompat_Light_ListView_DropDown +style Widget_AppCompat_Light_PopupMenu +style Widget_AppCompat_Light_PopupMenu_Overflow +style Widget_AppCompat_Light_SearchView +style Widget_AppCompat_Light_Spinner_DropDown_ActionBar +style Widget_AppCompat_ListMenuView +style Widget_AppCompat_ListPopupWindow +style Widget_AppCompat_ListView +style Widget_AppCompat_ListView_DropDown +style Widget_AppCompat_ListView_Menu +style Widget_AppCompat_PopupMenu +style Widget_AppCompat_PopupMenu_Overflow +style Widget_AppCompat_PopupWindow +style Widget_AppCompat_ProgressBar +style Widget_AppCompat_ProgressBar_Horizontal +style Widget_AppCompat_RatingBar +style Widget_AppCompat_RatingBar_Indicator +style Widget_AppCompat_RatingBar_Small +style Widget_AppCompat_SearchView +style Widget_AppCompat_SearchView_ActionBar +style Widget_AppCompat_SeekBar +style Widget_AppCompat_SeekBar_Discrete +style Widget_AppCompat_Spinner +style Widget_AppCompat_Spinner_DropDown +style Widget_AppCompat_Spinner_DropDown_ActionBar +style Widget_AppCompat_Spinner_Underlined +style Widget_AppCompat_TextView_SpinnerItem +style Widget_AppCompat_Toolbar +style Widget_AppCompat_Toolbar_Button_Navigation +style Widget_Compat_NotificationActionContainer +style Widget_Compat_NotificationActionText +style Widget_Support_CoordinatorLayout +style amu_Bubble_TextAppearance_Dark +style amu_Bubble_TextAppearance_Light +style amu_ClusterIcon_TextAppearance +style redboxButton +styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle +styleable ActionBarLayout android_layout_gravity +styleable ActionMenuItemView android_minWidth +styleable ActionMenuView +styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle +styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount +styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout +styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible +styleable AnimatedStateListDrawableItem android_drawable android_id +styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId +styleable AppCompatImageView android_src srcCompat tint tintMode +styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode +styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance +styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps +styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle +styleable ButtonBarLayout allowStacking +styleable ColorStateListItem alpha android_alpha android_color +styleable CompoundButton android_button buttonTint buttonTintMode +styleable CoordinatorLayout keylines statusBarBackground +styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline +styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness +styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery +styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex +styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio +styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type +styleable GradientColorItem android_color android_offset +styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers +styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width +styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset +styleable LoadingImageView circleCrop imageAspectRatio imageAspectRatioAdjust +styleable MapAttrs ambientEnabled cameraBearing cameraMaxZoomPreference cameraMinZoomPreference cameraTargetLat cameraTargetLng cameraTilt cameraZoom latLngBoundsNorthEastLatitude latLngBoundsNorthEastLongitude latLngBoundsSouthWestLatitude latLngBoundsSouthWestLongitude liteMode mapType uiCompass uiMapToolbar uiRotateGestures uiScrollGestures uiScrollGesturesDuringRotateOrZoom uiTiltGestures uiZoomControls uiZoomGestures useViewLifecycle zOrderOnTop +styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible +styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText +styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow +styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor +styleable PopupWindowBackgroundState state_above_anchor +styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle +styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon +styleable SignInButton buttonSize colorScheme scopeUris +styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio +styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme +styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible +styleable StateListDrawableItem android_drawable +styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode +styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textSize android_textStyle android_typeface fontFamily textAllCaps +styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor +styleable View android_focusable android_theme paddingEnd paddingStart theme +styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode +styleable ViewStubCompat android_id android_inflatedId android_layout +xml rn_dev_preferences diff --git a/lib/android/build/intermediates/res/symbol-table-with-package/release/package-aware-r.txt b/lib/android/build/intermediates/res/symbol-table-with-package/release/package-aware-r.txt new file mode 100644 index 0000000..e5b2454 --- /dev/null +++ b/lib/android/build/intermediates/res/symbol-table-with-package/release/package-aware-r.txt @@ -0,0 +1,1449 @@ +com.airbnb.android.react.maps +anim abc_fade_in +anim abc_fade_out +anim abc_grow_fade_in_from_bottom +anim abc_popup_enter +anim abc_popup_exit +anim abc_shrink_fade_out_from_bottom +anim abc_slide_in_bottom +anim abc_slide_in_top +anim abc_slide_out_bottom +anim abc_slide_out_top +anim abc_tooltip_enter +anim abc_tooltip_exit +anim catalyst_fade_in +anim catalyst_fade_out +anim catalyst_push_up_in +anim catalyst_push_up_out +anim catalyst_slide_down +anim catalyst_slide_up +attr actionBarDivider +attr actionBarItemBackground +attr actionBarPopupTheme +attr actionBarSize +attr actionBarSplitStyle +attr actionBarStyle +attr actionBarTabBarStyle +attr actionBarTabStyle +attr actionBarTabTextStyle +attr actionBarTheme +attr actionBarWidgetTheme +attr actionButtonStyle +attr actionDropDownStyle +attr actionLayout +attr actionMenuTextAppearance +attr actionMenuTextColor +attr actionModeBackground +attr actionModeCloseButtonStyle +attr actionModeCloseDrawable +attr actionModeCopyDrawable +attr actionModeCutDrawable +attr actionModeFindDrawable +attr actionModePasteDrawable +attr actionModePopupWindowStyle +attr actionModeSelectAllDrawable +attr actionModeShareDrawable +attr actionModeSplitBackground +attr actionModeStyle +attr actionModeWebSearchDrawable +attr actionOverflowButtonStyle +attr actionOverflowMenuStyle +attr actionProviderClass +attr actionViewClass +attr activityChooserViewStyle +attr actualImageResource +attr actualImageScaleType +attr actualImageUri +attr alertDialogButtonGroupStyle +attr alertDialogCenterButtons +attr alertDialogStyle +attr alertDialogTheme +attr allowStacking +attr alpha +attr alphabeticModifiers +attr ambientEnabled +attr arrowHeadLength +attr arrowShaftLength +attr autoCompleteTextViewStyle +attr autoSizeMaxTextSize +attr autoSizeMinTextSize +attr autoSizePresetSizes +attr autoSizeStepGranularity +attr autoSizeTextType +attr background +attr backgroundImage +attr backgroundSplit +attr backgroundStacked +attr backgroundTint +attr backgroundTintMode +attr barLength +attr borderlessButtonStyle +attr buttonBarButtonStyle +attr buttonBarNegativeButtonStyle +attr buttonBarNeutralButtonStyle +attr buttonBarPositiveButtonStyle +attr buttonBarStyle +attr buttonGravity +attr buttonIconDimen +attr buttonPanelSideLayout +attr buttonSize +attr buttonStyle +attr buttonStyleSmall +attr buttonTint +attr buttonTintMode +attr cameraBearing +attr cameraMaxZoomPreference +attr cameraMinZoomPreference +attr cameraTargetLat +attr cameraTargetLng +attr cameraTilt +attr cameraZoom +attr checkboxStyle +attr checkedTextViewStyle +attr circleCrop +attr closeIcon +attr closeItemLayout +attr collapseContentDescription +attr collapseIcon +attr color +attr colorAccent +attr colorBackgroundFloating +attr colorButtonNormal +attr colorControlActivated +attr colorControlHighlight +attr colorControlNormal +attr colorError +attr colorPrimary +attr colorPrimaryDark +attr colorScheme +attr colorSwitchThumbNormal +attr commitIcon +attr contentDescription +attr contentInsetEnd +attr contentInsetEndWithActions +attr contentInsetLeft +attr contentInsetRight +attr contentInsetStart +attr contentInsetStartWithNavigation +attr controlBackground +attr coordinatorLayoutStyle +attr customNavigationLayout +attr defaultQueryHint +attr dialogCornerRadius +attr dialogPreferredPadding +attr dialogTheme +attr displayOptions +attr divider +attr dividerHorizontal +attr dividerPadding +attr dividerVertical +attr drawableSize +attr drawerArrowStyle +attr dropDownListViewStyle +attr dropdownListPreferredItemHeight +attr editTextBackground +attr editTextColor +attr editTextStyle +attr elevation +attr expandActivityOverflowButtonDrawable +attr fadeDuration +attr failureImage +attr failureImageScaleType +attr firstBaselineToTopHeight +attr font +attr fontFamily +attr fontProviderAuthority +attr fontProviderCerts +attr fontProviderFetchStrategy +attr fontProviderFetchTimeout +attr fontProviderPackage +attr fontProviderQuery +attr fontStyle +attr fontVariationSettings +attr fontWeight +attr gapBetweenBars +attr goIcon +attr height +attr hideOnContentScroll +attr homeAsUpIndicator +attr homeLayout +attr icon +attr iconTint +attr iconTintMode +attr iconifiedByDefault +attr imageAspectRatio +attr imageAspectRatioAdjust +attr imageButtonStyle +attr indeterminateProgressStyle +attr initialActivityCount +attr isLightTheme +attr itemPadding +attr keylines +attr lastBaselineToBottomHeight +attr latLngBoundsNorthEastLatitude +attr latLngBoundsNorthEastLongitude +attr latLngBoundsSouthWestLatitude +attr latLngBoundsSouthWestLongitude +attr layout +attr layout_anchor +attr layout_anchorGravity +attr layout_behavior +attr layout_dodgeInsetEdges +attr layout_insetEdge +attr layout_keyline +attr lineHeight +attr listChoiceBackgroundIndicator +attr listDividerAlertDialog +attr listItemLayout +attr listLayout +attr listMenuViewStyle +attr listPopupWindowStyle +attr listPreferredItemHeight +attr listPreferredItemHeightLarge +attr listPreferredItemHeightSmall +attr listPreferredItemPaddingLeft +attr listPreferredItemPaddingRight +attr liteMode +attr logo +attr logoDescription +attr mapType +attr maxButtonHeight +attr measureWithLargestChild +attr multiChoiceItemLayout +attr navigationContentDescription +attr navigationIcon +attr navigationMode +attr numericModifiers +attr overlapAnchor +attr overlayImage +attr paddingBottomNoButtons +attr paddingEnd +attr paddingStart +attr paddingTopNoTitle +attr panelBackground +attr panelMenuListTheme +attr panelMenuListWidth +attr placeholderImage +attr placeholderImageScaleType +attr popupMenuStyle +attr popupTheme +attr popupWindowStyle +attr preserveIconSpacing +attr pressedStateOverlayImage +attr progressBarAutoRotateInterval +attr progressBarImage +attr progressBarImageScaleType +attr progressBarPadding +attr progressBarStyle +attr queryBackground +attr queryHint +attr radioButtonStyle +attr ratingBarStyle +attr ratingBarStyleIndicator +attr ratingBarStyleSmall +attr retryImage +attr retryImageScaleType +attr roundAsCircle +attr roundBottomEnd +attr roundBottomLeft +attr roundBottomRight +attr roundBottomStart +attr roundTopEnd +attr roundTopLeft +attr roundTopRight +attr roundTopStart +attr roundWithOverlayColor +attr roundedCornerRadius +attr roundingBorderColor +attr roundingBorderPadding +attr roundingBorderWidth +attr scopeUris +attr searchHintIcon +attr searchIcon +attr searchViewStyle +attr seekBarStyle +attr selectableItemBackground +attr selectableItemBackgroundBorderless +attr showAsAction +attr showDividers +attr showText +attr showTitle +attr singleChoiceItemLayout +attr spinBars +attr spinnerDropDownItemStyle +attr spinnerStyle +attr splitTrack +attr srcCompat +attr state_above_anchor +attr statusBarBackground +attr subMenuArrow +attr submitBackground +attr subtitle +attr subtitleTextAppearance +attr subtitleTextColor +attr subtitleTextStyle +attr suggestionRowLayout +attr switchMinWidth +attr switchPadding +attr switchStyle +attr switchTextAppearance +attr textAllCaps +attr textAppearanceLargePopupMenu +attr textAppearanceListItem +attr textAppearanceListItemSecondary +attr textAppearanceListItemSmall +attr textAppearancePopupMenuHeader +attr textAppearanceSearchResultSubtitle +attr textAppearanceSearchResultTitle +attr textAppearanceSmallPopupMenu +attr textColorAlertDialogListItem +attr textColorSearchUrl +attr theme +attr thickness +attr thumbTextPadding +attr thumbTint +attr thumbTintMode +attr tickMark +attr tickMarkTint +attr tickMarkTintMode +attr tint +attr tintMode +attr title +attr titleMargin +attr titleMarginBottom +attr titleMarginEnd +attr titleMarginStart +attr titleMarginTop +attr titleMargins +attr titleTextAppearance +attr titleTextColor +attr titleTextStyle +attr toolbarNavigationButtonStyle +attr toolbarStyle +attr tooltipForegroundColor +attr tooltipFrameBackground +attr tooltipText +attr track +attr trackTint +attr trackTintMode +attr ttcIndex +attr uiCompass +attr uiMapToolbar +attr uiRotateGestures +attr uiScrollGestures +attr uiScrollGesturesDuringRotateOrZoom +attr uiTiltGestures +attr uiZoomControls +attr uiZoomGestures +attr useViewLifecycle +attr viewAspectRatio +attr viewInflaterClass +attr voiceIcon +attr windowActionBar +attr windowActionBarOverlay +attr windowActionModeOverlay +attr windowFixedHeightMajor +attr windowFixedHeightMinor +attr windowFixedWidthMajor +attr windowFixedWidthMinor +attr windowMinWidthMajor +attr windowMinWidthMinor +attr windowNoTitle +attr zOrderOnTop +bool abc_action_bar_embed_tabs +bool abc_allow_stacked_button_bar +bool abc_config_actionMenuItemAllCaps +color abc_background_cache_hint_selector_material_dark +color abc_background_cache_hint_selector_material_light +color abc_btn_colored_borderless_text_material +color abc_btn_colored_text_material +color abc_color_highlight_material +color abc_hint_foreground_material_dark +color abc_hint_foreground_material_light +color abc_input_method_navigation_guard +color abc_primary_text_disable_only_material_dark +color abc_primary_text_disable_only_material_light +color abc_primary_text_material_dark +color abc_primary_text_material_light +color abc_search_url_text +color abc_search_url_text_normal +color abc_search_url_text_pressed +color abc_search_url_text_selected +color abc_secondary_text_material_dark +color abc_secondary_text_material_light +color abc_tint_btn_checkable +color abc_tint_default +color abc_tint_edittext +color abc_tint_seek_thumb +color abc_tint_spinner +color abc_tint_switch_track +color accent_material_dark +color accent_material_light +color background_floating_material_dark +color background_floating_material_light +color background_material_dark +color background_material_light +color bright_foreground_disabled_material_dark +color bright_foreground_disabled_material_light +color bright_foreground_inverse_material_dark +color bright_foreground_inverse_material_light +color bright_foreground_material_dark +color bright_foreground_material_light +color button_material_dark +color button_material_light +color catalyst_redbox_background +color common_google_signin_btn_text_dark +color common_google_signin_btn_text_dark_default +color common_google_signin_btn_text_dark_disabled +color common_google_signin_btn_text_dark_focused +color common_google_signin_btn_text_dark_pressed +color common_google_signin_btn_text_light +color common_google_signin_btn_text_light_default +color common_google_signin_btn_text_light_disabled +color common_google_signin_btn_text_light_focused +color common_google_signin_btn_text_light_pressed +color common_google_signin_btn_tint +color dim_foreground_disabled_material_dark +color dim_foreground_disabled_material_light +color dim_foreground_material_dark +color dim_foreground_material_light +color error_color_material_dark +color error_color_material_light +color foreground_material_dark +color foreground_material_light +color highlighted_text_material_dark +color highlighted_text_material_light +color material_blue_grey_800 +color material_blue_grey_900 +color material_blue_grey_950 +color material_deep_teal_200 +color material_deep_teal_500 +color material_grey_100 +color material_grey_300 +color material_grey_50 +color material_grey_600 +color material_grey_800 +color material_grey_850 +color material_grey_900 +color notification_action_color_filter +color notification_icon_bg_color +color notification_material_background_media_default_color +color primary_dark_material_dark +color primary_dark_material_light +color primary_material_dark +color primary_material_light +color primary_text_default_material_dark +color primary_text_default_material_light +color primary_text_disabled_material_dark +color primary_text_disabled_material_light +color ripple_material_dark +color ripple_material_light +color secondary_text_default_material_dark +color secondary_text_default_material_light +color secondary_text_disabled_material_dark +color secondary_text_disabled_material_light +color switch_thumb_disabled_material_dark +color switch_thumb_disabled_material_light +color switch_thumb_material_dark +color switch_thumb_material_light +color switch_thumb_normal_material_dark +color switch_thumb_normal_material_light +color tooltip_background_dark +color tooltip_background_light +dimen abc_action_bar_content_inset_material +dimen abc_action_bar_content_inset_with_nav +dimen abc_action_bar_default_height_material +dimen abc_action_bar_default_padding_end_material +dimen abc_action_bar_default_padding_start_material +dimen abc_action_bar_elevation_material +dimen abc_action_bar_icon_vertical_padding_material +dimen abc_action_bar_overflow_padding_end_material +dimen abc_action_bar_overflow_padding_start_material +dimen abc_action_bar_stacked_max_height +dimen abc_action_bar_stacked_tab_max_width +dimen abc_action_bar_subtitle_bottom_margin_material +dimen abc_action_bar_subtitle_top_margin_material +dimen abc_action_button_min_height_material +dimen abc_action_button_min_width_material +dimen abc_action_button_min_width_overflow_material +dimen abc_alert_dialog_button_bar_height +dimen abc_alert_dialog_button_dimen +dimen abc_button_inset_horizontal_material +dimen abc_button_inset_vertical_material +dimen abc_button_padding_horizontal_material +dimen abc_button_padding_vertical_material +dimen abc_cascading_menus_min_smallest_width +dimen abc_config_prefDialogWidth +dimen abc_control_corner_material +dimen abc_control_inset_material +dimen abc_control_padding_material +dimen abc_dialog_corner_radius_material +dimen abc_dialog_fixed_height_major +dimen abc_dialog_fixed_height_minor +dimen abc_dialog_fixed_width_major +dimen abc_dialog_fixed_width_minor +dimen abc_dialog_list_padding_bottom_no_buttons +dimen abc_dialog_list_padding_top_no_title +dimen abc_dialog_min_width_major +dimen abc_dialog_min_width_minor +dimen abc_dialog_padding_material +dimen abc_dialog_padding_top_material +dimen abc_dialog_title_divider_material +dimen abc_disabled_alpha_material_dark +dimen abc_disabled_alpha_material_light +dimen abc_dropdownitem_icon_width +dimen abc_dropdownitem_text_padding_left +dimen abc_dropdownitem_text_padding_right +dimen abc_edit_text_inset_bottom_material +dimen abc_edit_text_inset_horizontal_material +dimen abc_edit_text_inset_top_material +dimen abc_floating_window_z +dimen abc_list_item_padding_horizontal_material +dimen abc_panel_menu_list_width +dimen abc_progress_bar_height_material +dimen abc_search_view_preferred_height +dimen abc_search_view_preferred_width +dimen abc_seekbar_track_background_height_material +dimen abc_seekbar_track_progress_height_material +dimen abc_select_dialog_padding_start_material +dimen abc_switch_padding +dimen abc_text_size_body_1_material +dimen abc_text_size_body_2_material +dimen abc_text_size_button_material +dimen abc_text_size_caption_material +dimen abc_text_size_display_1_material +dimen abc_text_size_display_2_material +dimen abc_text_size_display_3_material +dimen abc_text_size_display_4_material +dimen abc_text_size_headline_material +dimen abc_text_size_large_material +dimen abc_text_size_medium_material +dimen abc_text_size_menu_header_material +dimen abc_text_size_menu_material +dimen abc_text_size_small_material +dimen abc_text_size_subhead_material +dimen abc_text_size_subtitle_material_toolbar +dimen abc_text_size_title_material +dimen abc_text_size_title_material_toolbar +dimen compat_button_inset_horizontal_material +dimen compat_button_inset_vertical_material +dimen compat_button_padding_horizontal_material +dimen compat_button_padding_vertical_material +dimen compat_control_corner_material +dimen compat_notification_large_icon_max_height +dimen compat_notification_large_icon_max_width +dimen disabled_alpha_material_dark +dimen disabled_alpha_material_light +dimen highlight_alpha_material_colored +dimen highlight_alpha_material_dark +dimen highlight_alpha_material_light +dimen hint_alpha_material_dark +dimen hint_alpha_material_light +dimen hint_pressed_alpha_material_dark +dimen hint_pressed_alpha_material_light +dimen notification_action_icon_size +dimen notification_action_text_size +dimen notification_big_circle_margin +dimen notification_content_margin_start +dimen notification_large_icon_height +dimen notification_large_icon_width +dimen notification_main_column_padding_top +dimen notification_media_narrow_margin +dimen notification_right_icon_size +dimen notification_right_side_padding_top +dimen notification_small_icon_background_padding +dimen notification_small_icon_size_as_large +dimen notification_subtext_size +dimen notification_top_pad +dimen notification_top_pad_large_text +dimen subtitle_corner_radius +dimen subtitle_outline_width +dimen subtitle_shadow_offset +dimen subtitle_shadow_radius +dimen tooltip_corner_radius +dimen tooltip_horizontal_padding +dimen tooltip_margin +dimen tooltip_precise_anchor_extra_offset +dimen tooltip_precise_anchor_threshold +dimen tooltip_vertical_padding +dimen tooltip_y_offset_non_touch +dimen tooltip_y_offset_touch +drawable abc_ab_share_pack_mtrl_alpha +drawable abc_action_bar_item_background_material +drawable abc_btn_borderless_material +drawable abc_btn_check_material +drawable abc_btn_check_to_on_mtrl_000 +drawable abc_btn_check_to_on_mtrl_015 +drawable abc_btn_colored_material +drawable abc_btn_default_mtrl_shape +drawable abc_btn_radio_material +drawable abc_btn_radio_to_on_mtrl_000 +drawable abc_btn_radio_to_on_mtrl_015 +drawable abc_btn_switch_to_on_mtrl_00001 +drawable abc_btn_switch_to_on_mtrl_00012 +drawable abc_cab_background_internal_bg +drawable abc_cab_background_top_material +drawable abc_cab_background_top_mtrl_alpha +drawable abc_control_background_material +drawable abc_dialog_material_background +drawable abc_edit_text_material +drawable abc_ic_ab_back_material +drawable abc_ic_arrow_drop_right_black_24dp +drawable abc_ic_clear_material +drawable abc_ic_commit_search_api_mtrl_alpha +drawable abc_ic_go_search_api_material +drawable abc_ic_menu_copy_mtrl_am_alpha +drawable abc_ic_menu_cut_mtrl_alpha +drawable abc_ic_menu_overflow_material +drawable abc_ic_menu_paste_mtrl_am_alpha +drawable abc_ic_menu_selectall_mtrl_alpha +drawable abc_ic_menu_share_mtrl_alpha +drawable abc_ic_search_api_material +drawable abc_ic_star_black_16dp +drawable abc_ic_star_black_36dp +drawable abc_ic_star_black_48dp +drawable abc_ic_star_half_black_16dp +drawable abc_ic_star_half_black_36dp +drawable abc_ic_star_half_black_48dp +drawable abc_ic_voice_search_api_material +drawable abc_item_background_holo_dark +drawable abc_item_background_holo_light +drawable abc_list_divider_material +drawable abc_list_divider_mtrl_alpha +drawable abc_list_focused_holo +drawable abc_list_longpressed_holo +drawable abc_list_pressed_holo_dark +drawable abc_list_pressed_holo_light +drawable abc_list_selector_background_transition_holo_dark +drawable abc_list_selector_background_transition_holo_light +drawable abc_list_selector_disabled_holo_dark +drawable abc_list_selector_disabled_holo_light +drawable abc_list_selector_holo_dark +drawable abc_list_selector_holo_light +drawable abc_menu_hardkey_panel_mtrl_mult +drawable abc_popup_background_mtrl_mult +drawable abc_ratingbar_indicator_material +drawable abc_ratingbar_material +drawable abc_ratingbar_small_material +drawable abc_scrubber_control_off_mtrl_alpha +drawable abc_scrubber_control_to_pressed_mtrl_000 +drawable abc_scrubber_control_to_pressed_mtrl_005 +drawable abc_scrubber_primary_mtrl_alpha +drawable abc_scrubber_track_mtrl_alpha +drawable abc_seekbar_thumb_material +drawable abc_seekbar_tick_mark_material +drawable abc_seekbar_track_material +drawable abc_spinner_mtrl_am_alpha +drawable abc_spinner_textfield_background_material +drawable abc_switch_thumb_material +drawable abc_switch_track_mtrl_alpha +drawable abc_tab_indicator_material +drawable abc_tab_indicator_mtrl_alpha +drawable abc_text_cursor_material +drawable abc_text_select_handle_left_mtrl_dark +drawable abc_text_select_handle_left_mtrl_light +drawable abc_text_select_handle_middle_mtrl_dark +drawable abc_text_select_handle_middle_mtrl_light +drawable abc_text_select_handle_right_mtrl_dark +drawable abc_text_select_handle_right_mtrl_light +drawable abc_textfield_activated_mtrl_alpha +drawable abc_textfield_default_mtrl_alpha +drawable abc_textfield_search_activated_mtrl_alpha +drawable abc_textfield_search_default_mtrl_alpha +drawable abc_textfield_search_material +drawable abc_vector_test +drawable amu_bubble_mask +drawable amu_bubble_shadow +drawable common_full_open_on_phone +drawable common_google_signin_btn_icon_dark +drawable common_google_signin_btn_icon_dark_disabled +drawable common_google_signin_btn_icon_dark_focused +drawable common_google_signin_btn_icon_dark_normal +drawable common_google_signin_btn_icon_dark_normal_background +drawable common_google_signin_btn_icon_dark_pressed +drawable common_google_signin_btn_icon_disabled +drawable common_google_signin_btn_icon_light +drawable common_google_signin_btn_icon_light_disabled +drawable common_google_signin_btn_icon_light_focused +drawable common_google_signin_btn_icon_light_normal +drawable common_google_signin_btn_icon_light_normal_background +drawable common_google_signin_btn_icon_light_pressed +drawable common_google_signin_btn_text_dark +drawable common_google_signin_btn_text_dark_disabled +drawable common_google_signin_btn_text_dark_focused +drawable common_google_signin_btn_text_dark_normal +drawable common_google_signin_btn_text_dark_normal_background +drawable common_google_signin_btn_text_dark_pressed +drawable common_google_signin_btn_text_disabled +drawable common_google_signin_btn_text_light +drawable common_google_signin_btn_text_light_disabled +drawable common_google_signin_btn_text_light_focused +drawable common_google_signin_btn_text_light_normal +drawable common_google_signin_btn_text_light_normal_background +drawable common_google_signin_btn_text_light_pressed +drawable common_ic_googleplayservices +drawable googleg_disabled_color_18 +drawable googleg_standard_color_18 +drawable notification_action_background +drawable notification_bg +drawable notification_bg_low +drawable notification_bg_low_normal +drawable notification_bg_low_pressed +drawable notification_bg_normal +drawable notification_bg_normal_pressed +drawable notification_icon_background +drawable notification_template_icon_bg +drawable notification_template_icon_low_bg +drawable notification_tile_bg +drawable notify_panel_notification_icon_bg +drawable redbox_top_border_background +drawable tooltip_frame_dark +drawable tooltip_frame_light +id accessibility_hint +id accessibility_role +id action0 +id action_bar +id action_bar_activity_content +id action_bar_container +id action_bar_root +id action_bar_spinner +id action_bar_subtitle +id action_bar_title +id action_container +id action_context_bar +id action_divider +id action_image +id action_menu_divider +id action_menu_presenter +id action_mode_bar +id action_mode_bar_stub +id action_mode_close_button +id action_text +id actions +id activity_chooser_view_content +id add +id adjust_height +id adjust_width +id alertTitle +id amu_text +id async +id auto +id blocking +id bottom +id buttonPanel +id cancel_action +id catalyst_redbox_title +id center +id centerCrop +id centerInside +id checkbox +id chronometer +id content +id contentPanel +id custom +id customPanel +id dark +id decor_content_parent +id default_activity_button +id edit_query +id end +id end_padder +id expand_activities_button +id expanded_menu +id fitBottomStart +id fitCenter +id fitEnd +id fitStart +id fitXY +id focusCrop +id forever +id fps_text +id group_divider +id home +id hybrid +id icon +id icon_group +id icon_only +id image +id info +id italic +id left +id light +id line1 +id line3 +id listMode +id list_item +id media_actions +id message +id multiply +id none +id normal +id notification_background +id notification_main_column +id notification_main_column_container +id parentPanel +id progress_circular +id progress_horizontal +id radio +id react_test_id +id right +id right_icon +id right_side +id rn_frame_file +id rn_frame_method +id rn_redbox_copy_button +id rn_redbox_dismiss_button +id rn_redbox_line_separator +id rn_redbox_loading_indicator +id rn_redbox_reload_button +id rn_redbox_report_button +id rn_redbox_report_label +id rn_redbox_stack +id satellite +id screen +id scrollIndicatorDown +id scrollIndicatorUp +id scrollView +id search_badge +id search_bar +id search_button +id search_close_btn +id search_edit_frame +id search_go_btn +id search_mag_icon +id search_plate +id search_src_text +id search_voice_btn +id select_dialog_listview +id shortcut +id spacer +id split_action_bar +id src_atop +id src_in +id src_over +id standard +id start +id status_bar_latest_event_content +id submenuarrow +id submit_area +id tabMode +id tag_transition_group +id tag_unhandled_key_event_manager +id tag_unhandled_key_listeners +id terrain +id text +id text2 +id textSpacerNoButtons +id textSpacerNoTitle +id time +id title +id titleDividerNoCustom +id title_template +id top +id topPanel +id uniform +id up +id view_tag_instance_handle +id view_tag_native_id +id webview +id wide +id window +id wrap_content +integer abc_config_activityDefaultDur +integer abc_config_activityShortDur +integer cancel_button_image_alpha +integer config_tooltipAnimTime +integer google_play_services_version +integer status_bar_notification_info_maxnum +layout abc_action_bar_title_item +layout abc_action_bar_up_container +layout abc_action_menu_item_layout +layout abc_action_menu_layout +layout abc_action_mode_bar +layout abc_action_mode_close_item_material +layout abc_activity_chooser_view +layout abc_activity_chooser_view_list_item +layout abc_alert_dialog_button_bar_material +layout abc_alert_dialog_material +layout abc_alert_dialog_title_material +layout abc_cascading_menu_item_layout +layout abc_dialog_title_material +layout abc_expanded_menu_layout +layout abc_list_menu_item_checkbox +layout abc_list_menu_item_icon +layout abc_list_menu_item_layout +layout abc_list_menu_item_radio +layout abc_popup_menu_header_item_layout +layout abc_popup_menu_item_layout +layout abc_screen_content_include +layout abc_screen_simple +layout abc_screen_simple_overlay_action_mode +layout abc_screen_toolbar +layout abc_search_dropdown_item_icons_2line +layout abc_search_view +layout abc_select_dialog_material +layout abc_tooltip +layout amu_info_window +layout amu_text_bubble +layout amu_webview +layout dev_loading_view +layout fps_view +layout notification_action +layout notification_action_tombstone +layout notification_media_action +layout notification_media_cancel_action +layout notification_template_big_media +layout notification_template_big_media_custom +layout notification_template_big_media_narrow +layout notification_template_big_media_narrow_custom +layout notification_template_custom_big +layout notification_template_icon_group +layout notification_template_lines_media +layout notification_template_media +layout notification_template_media_custom +layout notification_template_part_chronometer +layout notification_template_part_time +layout redbox_item_frame +layout redbox_item_title +layout redbox_view +layout select_dialog_item_material +layout select_dialog_multichoice_material +layout select_dialog_singlechoice_material +layout support_simple_spinner_dropdown_item +raw amu_ballon_gx_prefix +raw amu_basic_folder +raw amu_basic_placemark +raw amu_cdata +raw amu_default_balloon +raw amu_document_nest +raw amu_draw_order_ground_overlay +raw amu_extended_data +raw amu_ground_overlay +raw amu_ground_overlay_color +raw amu_inline_style +raw amu_multigeometry_placemarks +raw amu_multiple_placemarks +raw amu_nested_folders +raw amu_nested_multigeometry +raw amu_poly_style_boolean_alpha +raw amu_poly_style_boolean_numeric +raw amu_unknwown_folder +raw amu_unsupported +raw amu_visibility_ground_overlay +string abc_action_bar_home_description +string abc_action_bar_up_description +string abc_action_menu_overflow_description +string abc_action_mode_done +string abc_activity_chooser_view_see_all +string abc_activitychooserview_choose_application +string abc_capital_off +string abc_capital_on +string abc_font_family_body_1_material +string abc_font_family_body_2_material +string abc_font_family_button_material +string abc_font_family_caption_material +string abc_font_family_display_1_material +string abc_font_family_display_2_material +string abc_font_family_display_3_material +string abc_font_family_display_4_material +string abc_font_family_headline_material +string abc_font_family_menu_material +string abc_font_family_subhead_material +string abc_font_family_title_material +string abc_menu_alt_shortcut_label +string abc_menu_ctrl_shortcut_label +string abc_menu_delete_shortcut_label +string abc_menu_enter_shortcut_label +string abc_menu_function_shortcut_label +string abc_menu_meta_shortcut_label +string abc_menu_shift_shortcut_label +string abc_menu_space_shortcut_label +string abc_menu_sym_shortcut_label +string abc_prepend_shortcut_label +string abc_search_hint +string abc_searchview_description_clear +string abc_searchview_description_query +string abc_searchview_description_search +string abc_searchview_description_submit +string abc_searchview_description_voice +string abc_shareactionprovider_share_with +string abc_shareactionprovider_share_with_application +string abc_toolbar_collapse_description +string adjustable_description +string catalyst_copy_button +string catalyst_debugjs +string catalyst_debugjs_nuclide +string catalyst_debugjs_nuclide_failure +string catalyst_debugjs_off +string catalyst_dismiss_button +string catalyst_element_inspector +string catalyst_heap_capture +string catalyst_hot_module_replacement +string catalyst_hot_module_replacement_off +string catalyst_jsload_error +string catalyst_live_reload +string catalyst_live_reload_off +string catalyst_loading_from_url +string catalyst_perf_monitor +string catalyst_perf_monitor_off +string catalyst_poke_sampling_profiler +string catalyst_reload_button +string catalyst_reloadjs +string catalyst_remotedbg_error +string catalyst_remotedbg_message +string catalyst_report_button +string catalyst_settings +string catalyst_settings_title +string common_google_play_services_enable_button +string common_google_play_services_enable_text +string common_google_play_services_enable_title +string common_google_play_services_install_button +string common_google_play_services_install_text +string common_google_play_services_install_text_phone +string common_google_play_services_install_text_tablet +string common_google_play_services_install_title +string common_google_play_services_notification_channel_name +string common_google_play_services_notification_ticker +string common_google_play_services_unknown_issue +string common_google_play_services_unsupported_text +string common_google_play_services_unsupported_title +string common_google_play_services_update_button +string common_google_play_services_update_text +string common_google_play_services_update_title +string common_google_play_services_updating_text +string common_google_play_services_updating_title +string common_google_play_services_wear_update_text +string common_open_on_phone +string common_signin_button_text +string common_signin_button_text_long +string header_description +string image_button_description +string image_description +string link_description +string search_description +string search_menu_title +string status_bar_notification_info_overflow +style AlertDialog_AppCompat +style AlertDialog_AppCompat_Light +style Animation_AppCompat_Dialog +style Animation_AppCompat_DropDownUp +style Animation_AppCompat_Tooltip +style Animation_Catalyst_RedBox +style Base_AlertDialog_AppCompat +style Base_AlertDialog_AppCompat_Light +style Base_Animation_AppCompat_Dialog +style Base_Animation_AppCompat_DropDownUp +style Base_Animation_AppCompat_Tooltip +style Base_DialogWindowTitleBackground_AppCompat +style Base_DialogWindowTitle_AppCompat +style Base_TextAppearance_AppCompat +style Base_TextAppearance_AppCompat_Body1 +style Base_TextAppearance_AppCompat_Body2 +style Base_TextAppearance_AppCompat_Button +style Base_TextAppearance_AppCompat_Caption +style Base_TextAppearance_AppCompat_Display1 +style Base_TextAppearance_AppCompat_Display2 +style Base_TextAppearance_AppCompat_Display3 +style Base_TextAppearance_AppCompat_Display4 +style Base_TextAppearance_AppCompat_Headline +style Base_TextAppearance_AppCompat_Inverse +style Base_TextAppearance_AppCompat_Large +style Base_TextAppearance_AppCompat_Large_Inverse +style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large +style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small +style Base_TextAppearance_AppCompat_Medium +style Base_TextAppearance_AppCompat_Medium_Inverse +style Base_TextAppearance_AppCompat_Menu +style Base_TextAppearance_AppCompat_SearchResult +style Base_TextAppearance_AppCompat_SearchResult_Subtitle +style Base_TextAppearance_AppCompat_SearchResult_Title +style Base_TextAppearance_AppCompat_Small +style Base_TextAppearance_AppCompat_Small_Inverse +style Base_TextAppearance_AppCompat_Subhead +style Base_TextAppearance_AppCompat_Subhead_Inverse +style Base_TextAppearance_AppCompat_Title +style Base_TextAppearance_AppCompat_Title_Inverse +style Base_TextAppearance_AppCompat_Tooltip +style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu +style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle +style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse +style Base_TextAppearance_AppCompat_Widget_ActionBar_Title +style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse +style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle +style Base_TextAppearance_AppCompat_Widget_ActionMode_Title +style Base_TextAppearance_AppCompat_Widget_Button +style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored +style Base_TextAppearance_AppCompat_Widget_Button_Colored +style Base_TextAppearance_AppCompat_Widget_Button_Inverse +style Base_TextAppearance_AppCompat_Widget_DropDownItem +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large +style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small +style Base_TextAppearance_AppCompat_Widget_Switch +style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem +style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item +style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle +style Base_TextAppearance_Widget_AppCompat_Toolbar_Title +style Base_ThemeOverlay_AppCompat +style Base_ThemeOverlay_AppCompat_ActionBar +style Base_ThemeOverlay_AppCompat_Dark +style Base_ThemeOverlay_AppCompat_Dark_ActionBar +style Base_ThemeOverlay_AppCompat_Dialog +style Base_ThemeOverlay_AppCompat_Dialog_Alert +style Base_ThemeOverlay_AppCompat_Light +style Base_Theme_AppCompat +style Base_Theme_AppCompat_CompactMenu +style Base_Theme_AppCompat_Dialog +style Base_Theme_AppCompat_DialogWhenLarge +style Base_Theme_AppCompat_Dialog_Alert +style Base_Theme_AppCompat_Dialog_FixedSize +style Base_Theme_AppCompat_Dialog_MinWidth +style Base_Theme_AppCompat_Light +style Base_Theme_AppCompat_Light_DarkActionBar +style Base_Theme_AppCompat_Light_Dialog +style Base_Theme_AppCompat_Light_DialogWhenLarge +style Base_Theme_AppCompat_Light_Dialog_Alert +style Base_Theme_AppCompat_Light_Dialog_FixedSize +style Base_Theme_AppCompat_Light_Dialog_MinWidth +style Base_V21_ThemeOverlay_AppCompat_Dialog +style Base_V21_Theme_AppCompat +style Base_V21_Theme_AppCompat_Dialog +style Base_V21_Theme_AppCompat_Light +style Base_V21_Theme_AppCompat_Light_Dialog +style Base_V22_Theme_AppCompat +style Base_V22_Theme_AppCompat_Light +style Base_V23_Theme_AppCompat +style Base_V23_Theme_AppCompat_Light +style Base_V26_Theme_AppCompat +style Base_V26_Theme_AppCompat_Light +style Base_V26_Widget_AppCompat_Toolbar +style Base_V28_Theme_AppCompat +style Base_V28_Theme_AppCompat_Light +style Base_V7_ThemeOverlay_AppCompat_Dialog +style Base_V7_Theme_AppCompat +style Base_V7_Theme_AppCompat_Dialog +style Base_V7_Theme_AppCompat_Light +style Base_V7_Theme_AppCompat_Light_Dialog +style Base_V7_Widget_AppCompat_AutoCompleteTextView +style Base_V7_Widget_AppCompat_EditText +style Base_V7_Widget_AppCompat_Toolbar +style Base_Widget_AppCompat_ActionBar +style Base_Widget_AppCompat_ActionBar_Solid +style Base_Widget_AppCompat_ActionBar_TabBar +style Base_Widget_AppCompat_ActionBar_TabText +style Base_Widget_AppCompat_ActionBar_TabView +style Base_Widget_AppCompat_ActionButton +style Base_Widget_AppCompat_ActionButton_CloseMode +style Base_Widget_AppCompat_ActionButton_Overflow +style Base_Widget_AppCompat_ActionMode +style Base_Widget_AppCompat_ActivityChooserView +style Base_Widget_AppCompat_AutoCompleteTextView +style Base_Widget_AppCompat_Button +style Base_Widget_AppCompat_ButtonBar +style Base_Widget_AppCompat_ButtonBar_AlertDialog +style Base_Widget_AppCompat_Button_Borderless +style Base_Widget_AppCompat_Button_Borderless_Colored +style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog +style Base_Widget_AppCompat_Button_Colored +style Base_Widget_AppCompat_Button_Small +style Base_Widget_AppCompat_CompoundButton_CheckBox +style Base_Widget_AppCompat_CompoundButton_RadioButton +style Base_Widget_AppCompat_CompoundButton_Switch +style Base_Widget_AppCompat_DrawerArrowToggle +style Base_Widget_AppCompat_DrawerArrowToggle_Common +style Base_Widget_AppCompat_DropDownItem_Spinner +style Base_Widget_AppCompat_EditText +style Base_Widget_AppCompat_ImageButton +style Base_Widget_AppCompat_Light_ActionBar +style Base_Widget_AppCompat_Light_ActionBar_Solid +style Base_Widget_AppCompat_Light_ActionBar_TabBar +style Base_Widget_AppCompat_Light_ActionBar_TabText +style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse +style Base_Widget_AppCompat_Light_ActionBar_TabView +style Base_Widget_AppCompat_Light_PopupMenu +style Base_Widget_AppCompat_Light_PopupMenu_Overflow +style Base_Widget_AppCompat_ListMenuView +style Base_Widget_AppCompat_ListPopupWindow +style Base_Widget_AppCompat_ListView +style Base_Widget_AppCompat_ListView_DropDown +style Base_Widget_AppCompat_ListView_Menu +style Base_Widget_AppCompat_PopupMenu +style Base_Widget_AppCompat_PopupMenu_Overflow +style Base_Widget_AppCompat_PopupWindow +style Base_Widget_AppCompat_ProgressBar +style Base_Widget_AppCompat_ProgressBar_Horizontal +style Base_Widget_AppCompat_RatingBar +style Base_Widget_AppCompat_RatingBar_Indicator +style Base_Widget_AppCompat_RatingBar_Small +style Base_Widget_AppCompat_SearchView +style Base_Widget_AppCompat_SearchView_ActionBar +style Base_Widget_AppCompat_SeekBar +style Base_Widget_AppCompat_SeekBar_Discrete +style Base_Widget_AppCompat_Spinner +style Base_Widget_AppCompat_Spinner_Underlined +style Base_Widget_AppCompat_TextView_SpinnerItem +style Base_Widget_AppCompat_Toolbar +style Base_Widget_AppCompat_Toolbar_Button_Navigation +style CalendarDatePickerDialog +style CalendarDatePickerStyle +style ClockTimePickerDialog +style ClockTimePickerStyle +style DialogAnimationFade +style DialogAnimationSlide +style Platform_AppCompat +style Platform_AppCompat_Light +style Platform_ThemeOverlay_AppCompat +style Platform_ThemeOverlay_AppCompat_Dark +style Platform_ThemeOverlay_AppCompat_Light +style Platform_V21_AppCompat +style Platform_V21_AppCompat_Light +style Platform_V25_AppCompat +style Platform_V25_AppCompat_Light +style Platform_Widget_AppCompat_Spinner +style RtlOverlay_DialogWindowTitle_AppCompat +style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem +style RtlOverlay_Widget_AppCompat_DialogTitle_Icon +style RtlOverlay_Widget_AppCompat_PopupMenuItem +style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut +style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text +style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title +style RtlOverlay_Widget_AppCompat_SearchView_MagIcon +style RtlOverlay_Widget_AppCompat_Search_DropDown +style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 +style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 +style RtlOverlay_Widget_AppCompat_Search_DropDown_Query +style RtlOverlay_Widget_AppCompat_Search_DropDown_Text +style RtlUnderlay_Widget_AppCompat_ActionButton +style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow +style SpinnerDatePickerDialog +style SpinnerDatePickerStyle +style SpinnerTimePickerDialog +style SpinnerTimePickerStyle +style TextAppearance_AppCompat +style TextAppearance_AppCompat_Body1 +style TextAppearance_AppCompat_Body2 +style TextAppearance_AppCompat_Button +style TextAppearance_AppCompat_Caption +style TextAppearance_AppCompat_Display1 +style TextAppearance_AppCompat_Display2 +style TextAppearance_AppCompat_Display3 +style TextAppearance_AppCompat_Display4 +style TextAppearance_AppCompat_Headline +style TextAppearance_AppCompat_Inverse +style TextAppearance_AppCompat_Large +style TextAppearance_AppCompat_Large_Inverse +style TextAppearance_AppCompat_Light_SearchResult_Subtitle +style TextAppearance_AppCompat_Light_SearchResult_Title +style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large +style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small +style TextAppearance_AppCompat_Medium +style TextAppearance_AppCompat_Medium_Inverse +style TextAppearance_AppCompat_Menu +style TextAppearance_AppCompat_SearchResult_Subtitle +style TextAppearance_AppCompat_SearchResult_Title +style TextAppearance_AppCompat_Small +style TextAppearance_AppCompat_Small_Inverse +style TextAppearance_AppCompat_Subhead +style TextAppearance_AppCompat_Subhead_Inverse +style TextAppearance_AppCompat_Title +style TextAppearance_AppCompat_Title_Inverse +style TextAppearance_AppCompat_Tooltip +style TextAppearance_AppCompat_Widget_ActionBar_Menu +style TextAppearance_AppCompat_Widget_ActionBar_Subtitle +style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse +style TextAppearance_AppCompat_Widget_ActionBar_Title +style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse +style TextAppearance_AppCompat_Widget_ActionMode_Subtitle +style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse +style TextAppearance_AppCompat_Widget_ActionMode_Title +style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse +style TextAppearance_AppCompat_Widget_Button +style TextAppearance_AppCompat_Widget_Button_Borderless_Colored +style TextAppearance_AppCompat_Widget_Button_Colored +style TextAppearance_AppCompat_Widget_Button_Inverse +style TextAppearance_AppCompat_Widget_DropDownItem +style TextAppearance_AppCompat_Widget_PopupMenu_Header +style TextAppearance_AppCompat_Widget_PopupMenu_Large +style TextAppearance_AppCompat_Widget_PopupMenu_Small +style TextAppearance_AppCompat_Widget_Switch +style TextAppearance_AppCompat_Widget_TextView_SpinnerItem +style TextAppearance_Compat_Notification +style TextAppearance_Compat_Notification_Info +style TextAppearance_Compat_Notification_Info_Media +style TextAppearance_Compat_Notification_Line2 +style TextAppearance_Compat_Notification_Line2_Media +style TextAppearance_Compat_Notification_Media +style TextAppearance_Compat_Notification_Time +style TextAppearance_Compat_Notification_Time_Media +style TextAppearance_Compat_Notification_Title +style TextAppearance_Compat_Notification_Title_Media +style TextAppearance_Widget_AppCompat_ExpandedMenu_Item +style TextAppearance_Widget_AppCompat_Toolbar_Subtitle +style TextAppearance_Widget_AppCompat_Toolbar_Title +style Theme +style ThemeOverlay_AppCompat +style ThemeOverlay_AppCompat_ActionBar +style ThemeOverlay_AppCompat_Dark +style ThemeOverlay_AppCompat_Dark_ActionBar +style ThemeOverlay_AppCompat_Dialog +style ThemeOverlay_AppCompat_Dialog_Alert +style ThemeOverlay_AppCompat_Light +style Theme_AppCompat +style Theme_AppCompat_CompactMenu +style Theme_AppCompat_DayNight +style Theme_AppCompat_DayNight_DarkActionBar +style Theme_AppCompat_DayNight_Dialog +style Theme_AppCompat_DayNight_DialogWhenLarge +style Theme_AppCompat_DayNight_Dialog_Alert +style Theme_AppCompat_DayNight_Dialog_MinWidth +style Theme_AppCompat_DayNight_NoActionBar +style Theme_AppCompat_Dialog +style Theme_AppCompat_DialogWhenLarge +style Theme_AppCompat_Dialog_Alert +style Theme_AppCompat_Dialog_MinWidth +style Theme_AppCompat_Light +style Theme_AppCompat_Light_DarkActionBar +style Theme_AppCompat_Light_Dialog +style Theme_AppCompat_Light_DialogWhenLarge +style Theme_AppCompat_Light_Dialog_Alert +style Theme_AppCompat_Light_Dialog_MinWidth +style Theme_AppCompat_Light_NoActionBar +style Theme_AppCompat_NoActionBar +style Theme_Catalyst +style Theme_Catalyst_RedBox +style Theme_FullScreenDialog +style Theme_FullScreenDialogAnimatedFade +style Theme_FullScreenDialogAnimatedSlide +style Theme_ReactNative_AppCompat_Light +style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen +style Widget_AppCompat_ActionBar +style Widget_AppCompat_ActionBar_Solid +style Widget_AppCompat_ActionBar_TabBar +style Widget_AppCompat_ActionBar_TabText +style Widget_AppCompat_ActionBar_TabView +style Widget_AppCompat_ActionButton +style Widget_AppCompat_ActionButton_CloseMode +style Widget_AppCompat_ActionButton_Overflow +style Widget_AppCompat_ActionMode +style Widget_AppCompat_ActivityChooserView +style Widget_AppCompat_AutoCompleteTextView +style Widget_AppCompat_Button +style Widget_AppCompat_ButtonBar +style Widget_AppCompat_ButtonBar_AlertDialog +style Widget_AppCompat_Button_Borderless +style Widget_AppCompat_Button_Borderless_Colored +style Widget_AppCompat_Button_ButtonBar_AlertDialog +style Widget_AppCompat_Button_Colored +style Widget_AppCompat_Button_Small +style Widget_AppCompat_CompoundButton_CheckBox +style Widget_AppCompat_CompoundButton_RadioButton +style Widget_AppCompat_CompoundButton_Switch +style Widget_AppCompat_DrawerArrowToggle +style Widget_AppCompat_DropDownItem_Spinner +style Widget_AppCompat_EditText +style Widget_AppCompat_ImageButton +style Widget_AppCompat_Light_ActionBar +style Widget_AppCompat_Light_ActionBar_Solid +style Widget_AppCompat_Light_ActionBar_Solid_Inverse +style Widget_AppCompat_Light_ActionBar_TabBar +style Widget_AppCompat_Light_ActionBar_TabBar_Inverse +style Widget_AppCompat_Light_ActionBar_TabText +style Widget_AppCompat_Light_ActionBar_TabText_Inverse +style Widget_AppCompat_Light_ActionBar_TabView +style Widget_AppCompat_Light_ActionBar_TabView_Inverse +style Widget_AppCompat_Light_ActionButton +style Widget_AppCompat_Light_ActionButton_CloseMode +style Widget_AppCompat_Light_ActionButton_Overflow +style Widget_AppCompat_Light_ActionMode_Inverse +style Widget_AppCompat_Light_ActivityChooserView +style Widget_AppCompat_Light_AutoCompleteTextView +style Widget_AppCompat_Light_DropDownItem_Spinner +style Widget_AppCompat_Light_ListPopupWindow +style Widget_AppCompat_Light_ListView_DropDown +style Widget_AppCompat_Light_PopupMenu +style Widget_AppCompat_Light_PopupMenu_Overflow +style Widget_AppCompat_Light_SearchView +style Widget_AppCompat_Light_Spinner_DropDown_ActionBar +style Widget_AppCompat_ListMenuView +style Widget_AppCompat_ListPopupWindow +style Widget_AppCompat_ListView +style Widget_AppCompat_ListView_DropDown +style Widget_AppCompat_ListView_Menu +style Widget_AppCompat_PopupMenu +style Widget_AppCompat_PopupMenu_Overflow +style Widget_AppCompat_PopupWindow +style Widget_AppCompat_ProgressBar +style Widget_AppCompat_ProgressBar_Horizontal +style Widget_AppCompat_RatingBar +style Widget_AppCompat_RatingBar_Indicator +style Widget_AppCompat_RatingBar_Small +style Widget_AppCompat_SearchView +style Widget_AppCompat_SearchView_ActionBar +style Widget_AppCompat_SeekBar +style Widget_AppCompat_SeekBar_Discrete +style Widget_AppCompat_Spinner +style Widget_AppCompat_Spinner_DropDown +style Widget_AppCompat_Spinner_DropDown_ActionBar +style Widget_AppCompat_Spinner_Underlined +style Widget_AppCompat_TextView_SpinnerItem +style Widget_AppCompat_Toolbar +style Widget_AppCompat_Toolbar_Button_Navigation +style Widget_Compat_NotificationActionContainer +style Widget_Compat_NotificationActionText +style Widget_Support_CoordinatorLayout +style amu_Bubble_TextAppearance_Dark +style amu_Bubble_TextAppearance_Light +style amu_ClusterIcon_TextAppearance +style redboxButton +styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle +styleable ActionBarLayout android_layout_gravity +styleable ActionMenuItemView android_minWidth +styleable ActionMenuView +styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle +styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount +styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout +styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible +styleable AnimatedStateListDrawableItem android_drawable android_id +styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId +styleable AppCompatImageView android_src srcCompat tint tintMode +styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode +styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance +styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps +styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle +styleable ButtonBarLayout allowStacking +styleable ColorStateListItem alpha android_alpha android_color +styleable CompoundButton android_button buttonTint buttonTintMode +styleable CoordinatorLayout keylines statusBarBackground +styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline +styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness +styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery +styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex +styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio +styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type +styleable GradientColorItem android_color android_offset +styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers +styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width +styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset +styleable LoadingImageView circleCrop imageAspectRatio imageAspectRatioAdjust +styleable MapAttrs ambientEnabled cameraBearing cameraMaxZoomPreference cameraMinZoomPreference cameraTargetLat cameraTargetLng cameraTilt cameraZoom latLngBoundsNorthEastLatitude latLngBoundsNorthEastLongitude latLngBoundsSouthWestLatitude latLngBoundsSouthWestLongitude liteMode mapType uiCompass uiMapToolbar uiRotateGestures uiScrollGestures uiScrollGesturesDuringRotateOrZoom uiTiltGestures uiZoomControls uiZoomGestures useViewLifecycle zOrderOnTop +styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible +styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText +styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow +styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor +styleable PopupWindowBackgroundState state_above_anchor +styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle +styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon +styleable SignInButton buttonSize colorScheme scopeUris +styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio +styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme +styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible +styleable StateListDrawableItem android_drawable +styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode +styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textSize android_textStyle android_typeface fontFamily textAllCaps +styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor +styleable View android_focusable android_theme paddingEnd paddingStart theme +styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode +styleable ViewStubCompat android_id android_inflatedId android_layout +xml rn_dev_preferences diff --git a/lib/android/build/intermediates/symbols/debug/R.txt b/lib/android/build/intermediates/symbols/debug/R.txt new file mode 100644 index 0000000..9e79991 --- /dev/null +++ b/lib/android/build/intermediates/symbols/debug/R.txt @@ -0,0 +1,1953 @@ +int anim abc_fade_in 0x7f010001 +int anim abc_fade_out 0x7f010002 +int anim abc_grow_fade_in_from_bottom 0x7f010003 +int anim abc_popup_enter 0x7f010004 +int anim abc_popup_exit 0x7f010005 +int anim abc_shrink_fade_out_from_bottom 0x7f010006 +int anim abc_slide_in_bottom 0x7f010007 +int anim abc_slide_in_top 0x7f010008 +int anim abc_slide_out_bottom 0x7f010009 +int anim abc_slide_out_top 0x7f01000a +int anim abc_tooltip_enter 0x7f01000b +int anim abc_tooltip_exit 0x7f01000c +int anim catalyst_fade_in 0x7f01000d +int anim catalyst_fade_out 0x7f01000e +int anim catalyst_push_up_in 0x7f01000f +int anim catalyst_push_up_out 0x7f010010 +int anim catalyst_slide_down 0x7f010011 +int anim catalyst_slide_up 0x7f010012 +int attr actionBarDivider 0x7f040001 +int attr actionBarItemBackground 0x7f040002 +int attr actionBarPopupTheme 0x7f040003 +int attr actionBarSize 0x7f040004 +int attr actionBarSplitStyle 0x7f040005 +int attr actionBarStyle 0x7f040006 +int attr actionBarTabBarStyle 0x7f040007 +int attr actionBarTabStyle 0x7f040008 +int attr actionBarTabTextStyle 0x7f040009 +int attr actionBarTheme 0x7f04000a +int attr actionBarWidgetTheme 0x7f04000b +int attr actionButtonStyle 0x7f04000c +int attr actionDropDownStyle 0x7f04000d +int attr actionLayout 0x7f04000e +int attr actionMenuTextAppearance 0x7f04000f +int attr actionMenuTextColor 0x7f040010 +int attr actionModeBackground 0x7f040011 +int attr actionModeCloseButtonStyle 0x7f040012 +int attr actionModeCloseDrawable 0x7f040013 +int attr actionModeCopyDrawable 0x7f040014 +int attr actionModeCutDrawable 0x7f040015 +int attr actionModeFindDrawable 0x7f040016 +int attr actionModePasteDrawable 0x7f040017 +int attr actionModePopupWindowStyle 0x7f040018 +int attr actionModeSelectAllDrawable 0x7f040019 +int attr actionModeShareDrawable 0x7f04001a +int attr actionModeSplitBackground 0x7f04001b +int attr actionModeStyle 0x7f04001c +int attr actionModeWebSearchDrawable 0x7f04001d +int attr actionOverflowButtonStyle 0x7f04001e +int attr actionOverflowMenuStyle 0x7f04001f +int attr actionProviderClass 0x7f040020 +int attr actionViewClass 0x7f040021 +int attr activityChooserViewStyle 0x7f040022 +int attr actualImageResource 0x7f040023 +int attr actualImageScaleType 0x7f040024 +int attr actualImageUri 0x7f040025 +int attr alertDialogButtonGroupStyle 0x7f040026 +int attr alertDialogCenterButtons 0x7f040027 +int attr alertDialogStyle 0x7f040028 +int attr alertDialogTheme 0x7f040029 +int attr allowStacking 0x7f04002a +int attr alpha 0x7f04002b +int attr alphabeticModifiers 0x7f04002c +int attr ambientEnabled 0x7f04002d +int attr arrowHeadLength 0x7f04002e +int attr arrowShaftLength 0x7f04002f +int attr autoCompleteTextViewStyle 0x7f040030 +int attr autoSizeMaxTextSize 0x7f040031 +int attr autoSizeMinTextSize 0x7f040032 +int attr autoSizePresetSizes 0x7f040033 +int attr autoSizeStepGranularity 0x7f040034 +int attr autoSizeTextType 0x7f040035 +int attr background 0x7f040036 +int attr backgroundImage 0x7f040037 +int attr backgroundSplit 0x7f040038 +int attr backgroundStacked 0x7f040039 +int attr backgroundTint 0x7f04003a +int attr backgroundTintMode 0x7f04003b +int attr barLength 0x7f04003c +int attr borderlessButtonStyle 0x7f04003d +int attr buttonBarButtonStyle 0x7f04003e +int attr buttonBarNegativeButtonStyle 0x7f04003f +int attr buttonBarNeutralButtonStyle 0x7f040040 +int attr buttonBarPositiveButtonStyle 0x7f040041 +int attr buttonBarStyle 0x7f040042 +int attr buttonGravity 0x7f040043 +int attr buttonIconDimen 0x7f040044 +int attr buttonPanelSideLayout 0x7f040045 +int attr buttonSize 0x7f040046 +int attr buttonStyle 0x7f040047 +int attr buttonStyleSmall 0x7f040048 +int attr buttonTint 0x7f040049 +int attr buttonTintMode 0x7f04004a +int attr cameraBearing 0x7f04004b +int attr cameraMaxZoomPreference 0x7f04004c +int attr cameraMinZoomPreference 0x7f04004d +int attr cameraTargetLat 0x7f04004e +int attr cameraTargetLng 0x7f04004f +int attr cameraTilt 0x7f040050 +int attr cameraZoom 0x7f040051 +int attr checkboxStyle 0x7f040052 +int attr checkedTextViewStyle 0x7f040053 +int attr circleCrop 0x7f040054 +int attr closeIcon 0x7f040055 +int attr closeItemLayout 0x7f040056 +int attr collapseContentDescription 0x7f040057 +int attr collapseIcon 0x7f040058 +int attr color 0x7f040059 +int attr colorAccent 0x7f04005a +int attr colorBackgroundFloating 0x7f04005b +int attr colorButtonNormal 0x7f04005c +int attr colorControlActivated 0x7f04005d +int attr colorControlHighlight 0x7f04005e +int attr colorControlNormal 0x7f04005f +int attr colorError 0x7f040060 +int attr colorPrimary 0x7f040061 +int attr colorPrimaryDark 0x7f040062 +int attr colorScheme 0x7f040063 +int attr colorSwitchThumbNormal 0x7f040064 +int attr commitIcon 0x7f040065 +int attr contentDescription 0x7f040066 +int attr contentInsetEnd 0x7f040067 +int attr contentInsetEndWithActions 0x7f040068 +int attr contentInsetLeft 0x7f040069 +int attr contentInsetRight 0x7f04006a +int attr contentInsetStart 0x7f04006b +int attr contentInsetStartWithNavigation 0x7f04006c +int attr controlBackground 0x7f04006d +int attr coordinatorLayoutStyle 0x7f04006e +int attr customNavigationLayout 0x7f04006f +int attr defaultQueryHint 0x7f040070 +int attr dialogCornerRadius 0x7f040071 +int attr dialogPreferredPadding 0x7f040072 +int attr dialogTheme 0x7f040073 +int attr displayOptions 0x7f040074 +int attr divider 0x7f040075 +int attr dividerHorizontal 0x7f040076 +int attr dividerPadding 0x7f040077 +int attr dividerVertical 0x7f040078 +int attr drawableSize 0x7f040079 +int attr drawerArrowStyle 0x7f04007a +int attr dropDownListViewStyle 0x7f04007b +int attr dropdownListPreferredItemHeight 0x7f04007c +int attr editTextBackground 0x7f04007d +int attr editTextColor 0x7f04007e +int attr editTextStyle 0x7f04007f +int attr elevation 0x7f040080 +int attr expandActivityOverflowButtonDrawable 0x7f040081 +int attr fadeDuration 0x7f040082 +int attr failureImage 0x7f040083 +int attr failureImageScaleType 0x7f040084 +int attr firstBaselineToTopHeight 0x7f040085 +int attr font 0x7f040086 +int attr fontFamily 0x7f040087 +int attr fontProviderAuthority 0x7f040088 +int attr fontProviderCerts 0x7f040089 +int attr fontProviderFetchStrategy 0x7f04008a +int attr fontProviderFetchTimeout 0x7f04008b +int attr fontProviderPackage 0x7f04008c +int attr fontProviderQuery 0x7f04008d +int attr fontStyle 0x7f04008e +int attr fontVariationSettings 0x7f04008f +int attr fontWeight 0x7f040090 +int attr gapBetweenBars 0x7f040091 +int attr goIcon 0x7f040092 +int attr height 0x7f040093 +int attr hideOnContentScroll 0x7f040094 +int attr homeAsUpIndicator 0x7f040095 +int attr homeLayout 0x7f040096 +int attr icon 0x7f040097 +int attr iconTint 0x7f040098 +int attr iconTintMode 0x7f040099 +int attr iconifiedByDefault 0x7f04009a +int attr imageAspectRatio 0x7f04009b +int attr imageAspectRatioAdjust 0x7f04009c +int attr imageButtonStyle 0x7f04009d +int attr indeterminateProgressStyle 0x7f04009e +int attr initialActivityCount 0x7f04009f +int attr isLightTheme 0x7f0400a0 +int attr itemPadding 0x7f0400a1 +int attr keylines 0x7f0400a2 +int attr lastBaselineToBottomHeight 0x7f0400a3 +int attr latLngBoundsNorthEastLatitude 0x7f0400a4 +int attr latLngBoundsNorthEastLongitude 0x7f0400a5 +int attr latLngBoundsSouthWestLatitude 0x7f0400a6 +int attr latLngBoundsSouthWestLongitude 0x7f0400a7 +int attr layout 0x7f0400a8 +int attr layout_anchor 0x7f0400a9 +int attr layout_anchorGravity 0x7f0400aa +int attr layout_behavior 0x7f0400ab +int attr layout_dodgeInsetEdges 0x7f0400ac +int attr layout_insetEdge 0x7f0400ad +int attr layout_keyline 0x7f0400ae +int attr lineHeight 0x7f0400af +int attr listChoiceBackgroundIndicator 0x7f0400b0 +int attr listDividerAlertDialog 0x7f0400b1 +int attr listItemLayout 0x7f0400b2 +int attr listLayout 0x7f0400b3 +int attr listMenuViewStyle 0x7f0400b4 +int attr listPopupWindowStyle 0x7f0400b5 +int attr listPreferredItemHeight 0x7f0400b6 +int attr listPreferredItemHeightLarge 0x7f0400b7 +int attr listPreferredItemHeightSmall 0x7f0400b8 +int attr listPreferredItemPaddingLeft 0x7f0400b9 +int attr listPreferredItemPaddingRight 0x7f0400ba +int attr liteMode 0x7f0400bb +int attr logo 0x7f0400bc +int attr logoDescription 0x7f0400bd +int attr mapType 0x7f0400be +int attr maxButtonHeight 0x7f0400bf +int attr measureWithLargestChild 0x7f0400c0 +int attr multiChoiceItemLayout 0x7f0400c1 +int attr navigationContentDescription 0x7f0400c2 +int attr navigationIcon 0x7f0400c3 +int attr navigationMode 0x7f0400c4 +int attr numericModifiers 0x7f0400c5 +int attr overlapAnchor 0x7f0400c6 +int attr overlayImage 0x7f0400c7 +int attr paddingBottomNoButtons 0x7f0400c8 +int attr paddingEnd 0x7f0400c9 +int attr paddingStart 0x7f0400ca +int attr paddingTopNoTitle 0x7f0400cb +int attr panelBackground 0x7f0400cc +int attr panelMenuListTheme 0x7f0400cd +int attr panelMenuListWidth 0x7f0400ce +int attr placeholderImage 0x7f0400cf +int attr placeholderImageScaleType 0x7f0400d0 +int attr popupMenuStyle 0x7f0400d1 +int attr popupTheme 0x7f0400d2 +int attr popupWindowStyle 0x7f0400d3 +int attr preserveIconSpacing 0x7f0400d4 +int attr pressedStateOverlayImage 0x7f0400d5 +int attr progressBarAutoRotateInterval 0x7f0400d6 +int attr progressBarImage 0x7f0400d7 +int attr progressBarImageScaleType 0x7f0400d8 +int attr progressBarPadding 0x7f0400d9 +int attr progressBarStyle 0x7f0400da +int attr queryBackground 0x7f0400db +int attr queryHint 0x7f0400dc +int attr radioButtonStyle 0x7f0400dd +int attr ratingBarStyle 0x7f0400de +int attr ratingBarStyleIndicator 0x7f0400df +int attr ratingBarStyleSmall 0x7f0400e0 +int attr retryImage 0x7f0400e1 +int attr retryImageScaleType 0x7f0400e2 +int attr roundAsCircle 0x7f0400e3 +int attr roundBottomEnd 0x7f0400e4 +int attr roundBottomLeft 0x7f0400e5 +int attr roundBottomRight 0x7f0400e6 +int attr roundBottomStart 0x7f0400e7 +int attr roundTopEnd 0x7f0400e8 +int attr roundTopLeft 0x7f0400e9 +int attr roundTopRight 0x7f0400ea +int attr roundTopStart 0x7f0400eb +int attr roundWithOverlayColor 0x7f0400ec +int attr roundedCornerRadius 0x7f0400ed +int attr roundingBorderColor 0x7f0400ee +int attr roundingBorderPadding 0x7f0400ef +int attr roundingBorderWidth 0x7f0400f0 +int attr scopeUris 0x7f0400f1 +int attr searchHintIcon 0x7f0400f2 +int attr searchIcon 0x7f0400f3 +int attr searchViewStyle 0x7f0400f4 +int attr seekBarStyle 0x7f0400f5 +int attr selectableItemBackground 0x7f0400f6 +int attr selectableItemBackgroundBorderless 0x7f0400f7 +int attr showAsAction 0x7f0400f8 +int attr showDividers 0x7f0400f9 +int attr showText 0x7f0400fa +int attr showTitle 0x7f0400fb +int attr singleChoiceItemLayout 0x7f0400fc +int attr spinBars 0x7f0400fd +int attr spinnerDropDownItemStyle 0x7f0400fe +int attr spinnerStyle 0x7f0400ff +int attr splitTrack 0x7f040100 +int attr srcCompat 0x7f040101 +int attr state_above_anchor 0x7f040102 +int attr statusBarBackground 0x7f040103 +int attr subMenuArrow 0x7f040104 +int attr submitBackground 0x7f040105 +int attr subtitle 0x7f040106 +int attr subtitleTextAppearance 0x7f040107 +int attr subtitleTextColor 0x7f040108 +int attr subtitleTextStyle 0x7f040109 +int attr suggestionRowLayout 0x7f04010a +int attr switchMinWidth 0x7f04010b +int attr switchPadding 0x7f04010c +int attr switchStyle 0x7f04010d +int attr switchTextAppearance 0x7f04010e +int attr textAllCaps 0x7f04010f +int attr textAppearanceLargePopupMenu 0x7f040110 +int attr textAppearanceListItem 0x7f040111 +int attr textAppearanceListItemSecondary 0x7f040112 +int attr textAppearanceListItemSmall 0x7f040113 +int attr textAppearancePopupMenuHeader 0x7f040114 +int attr textAppearanceSearchResultSubtitle 0x7f040115 +int attr textAppearanceSearchResultTitle 0x7f040116 +int attr textAppearanceSmallPopupMenu 0x7f040117 +int attr textColorAlertDialogListItem 0x7f040118 +int attr textColorSearchUrl 0x7f040119 +int attr theme 0x7f04011a +int attr thickness 0x7f04011b +int attr thumbTextPadding 0x7f04011c +int attr thumbTint 0x7f04011d +int attr thumbTintMode 0x7f04011e +int attr tickMark 0x7f04011f +int attr tickMarkTint 0x7f040120 +int attr tickMarkTintMode 0x7f040121 +int attr tint 0x7f040122 +int attr tintMode 0x7f040123 +int attr title 0x7f040124 +int attr titleMargin 0x7f040125 +int attr titleMarginBottom 0x7f040126 +int attr titleMarginEnd 0x7f040127 +int attr titleMarginStart 0x7f040128 +int attr titleMarginTop 0x7f040129 +int attr titleMargins 0x7f04012a +int attr titleTextAppearance 0x7f04012b +int attr titleTextColor 0x7f04012c +int attr titleTextStyle 0x7f04012d +int attr toolbarNavigationButtonStyle 0x7f04012e +int attr toolbarStyle 0x7f04012f +int attr tooltipForegroundColor 0x7f040130 +int attr tooltipFrameBackground 0x7f040131 +int attr tooltipText 0x7f040132 +int attr track 0x7f040133 +int attr trackTint 0x7f040134 +int attr trackTintMode 0x7f040135 +int attr ttcIndex 0x7f040136 +int attr uiCompass 0x7f040137 +int attr uiMapToolbar 0x7f040138 +int attr uiRotateGestures 0x7f040139 +int attr uiScrollGestures 0x7f04013a +int attr uiScrollGesturesDuringRotateOrZoom 0x7f04013b +int attr uiTiltGestures 0x7f04013c +int attr uiZoomControls 0x7f04013d +int attr uiZoomGestures 0x7f04013e +int attr useViewLifecycle 0x7f04013f +int attr viewAspectRatio 0x7f040140 +int attr viewInflaterClass 0x7f040141 +int attr voiceIcon 0x7f040142 +int attr windowActionBar 0x7f040143 +int attr windowActionBarOverlay 0x7f040144 +int attr windowActionModeOverlay 0x7f040145 +int attr windowFixedHeightMajor 0x7f040146 +int attr windowFixedHeightMinor 0x7f040147 +int attr windowFixedWidthMajor 0x7f040148 +int attr windowFixedWidthMinor 0x7f040149 +int attr windowMinWidthMajor 0x7f04014a +int attr windowMinWidthMinor 0x7f04014b +int attr windowNoTitle 0x7f04014c +int attr zOrderOnTop 0x7f04014d +int bool abc_action_bar_embed_tabs 0x7f050001 +int bool abc_allow_stacked_button_bar 0x7f050002 +int bool abc_config_actionMenuItemAllCaps 0x7f050003 +int color abc_background_cache_hint_selector_material_dark 0x7f060001 +int color abc_background_cache_hint_selector_material_light 0x7f060002 +int color abc_btn_colored_borderless_text_material 0x7f060003 +int color abc_btn_colored_text_material 0x7f060004 +int color abc_color_highlight_material 0x7f060005 +int color abc_hint_foreground_material_dark 0x7f060006 +int color abc_hint_foreground_material_light 0x7f060007 +int color abc_input_method_navigation_guard 0x7f060008 +int color abc_primary_text_disable_only_material_dark 0x7f060009 +int color abc_primary_text_disable_only_material_light 0x7f06000a +int color abc_primary_text_material_dark 0x7f06000b +int color abc_primary_text_material_light 0x7f06000c +int color abc_search_url_text 0x7f06000d +int color abc_search_url_text_normal 0x7f06000e +int color abc_search_url_text_pressed 0x7f06000f +int color abc_search_url_text_selected 0x7f060010 +int color abc_secondary_text_material_dark 0x7f060011 +int color abc_secondary_text_material_light 0x7f060012 +int color abc_tint_btn_checkable 0x7f060013 +int color abc_tint_default 0x7f060014 +int color abc_tint_edittext 0x7f060015 +int color abc_tint_seek_thumb 0x7f060016 +int color abc_tint_spinner 0x7f060017 +int color abc_tint_switch_track 0x7f060018 +int color accent_material_dark 0x7f060019 +int color accent_material_light 0x7f06001a +int color background_floating_material_dark 0x7f06001b +int color background_floating_material_light 0x7f06001c +int color background_material_dark 0x7f06001d +int color background_material_light 0x7f06001e +int color bright_foreground_disabled_material_dark 0x7f06001f +int color bright_foreground_disabled_material_light 0x7f060020 +int color bright_foreground_inverse_material_dark 0x7f060021 +int color bright_foreground_inverse_material_light 0x7f060022 +int color bright_foreground_material_dark 0x7f060023 +int color bright_foreground_material_light 0x7f060024 +int color button_material_dark 0x7f060025 +int color button_material_light 0x7f060026 +int color catalyst_redbox_background 0x7f060027 +int color common_google_signin_btn_text_dark 0x7f060028 +int color common_google_signin_btn_text_dark_default 0x7f060029 +int color common_google_signin_btn_text_dark_disabled 0x7f06002a +int color common_google_signin_btn_text_dark_focused 0x7f06002b +int color common_google_signin_btn_text_dark_pressed 0x7f06002c +int color common_google_signin_btn_text_light 0x7f06002d +int color common_google_signin_btn_text_light_default 0x7f06002e +int color common_google_signin_btn_text_light_disabled 0x7f06002f +int color common_google_signin_btn_text_light_focused 0x7f060030 +int color common_google_signin_btn_text_light_pressed 0x7f060031 +int color common_google_signin_btn_tint 0x7f060032 +int color dim_foreground_disabled_material_dark 0x7f060033 +int color dim_foreground_disabled_material_light 0x7f060034 +int color dim_foreground_material_dark 0x7f060035 +int color dim_foreground_material_light 0x7f060036 +int color error_color_material_dark 0x7f060037 +int color error_color_material_light 0x7f060038 +int color foreground_material_dark 0x7f060039 +int color foreground_material_light 0x7f06003a +int color highlighted_text_material_dark 0x7f06003b +int color highlighted_text_material_light 0x7f06003c +int color material_blue_grey_800 0x7f06003d +int color material_blue_grey_900 0x7f06003e +int color material_blue_grey_950 0x7f06003f +int color material_deep_teal_200 0x7f060040 +int color material_deep_teal_500 0x7f060041 +int color material_grey_100 0x7f060042 +int color material_grey_300 0x7f060043 +int color material_grey_50 0x7f060044 +int color material_grey_600 0x7f060045 +int color material_grey_800 0x7f060046 +int color material_grey_850 0x7f060047 +int color material_grey_900 0x7f060048 +int color notification_action_color_filter 0x7f060049 +int color notification_icon_bg_color 0x7f06004a +int color notification_material_background_media_default_color 0x7f06004b +int color primary_dark_material_dark 0x7f06004c +int color primary_dark_material_light 0x7f06004d +int color primary_material_dark 0x7f06004e +int color primary_material_light 0x7f06004f +int color primary_text_default_material_dark 0x7f060050 +int color primary_text_default_material_light 0x7f060051 +int color primary_text_disabled_material_dark 0x7f060052 +int color primary_text_disabled_material_light 0x7f060053 +int color ripple_material_dark 0x7f060054 +int color ripple_material_light 0x7f060055 +int color secondary_text_default_material_dark 0x7f060056 +int color secondary_text_default_material_light 0x7f060057 +int color secondary_text_disabled_material_dark 0x7f060058 +int color secondary_text_disabled_material_light 0x7f060059 +int color switch_thumb_disabled_material_dark 0x7f06005a +int color switch_thumb_disabled_material_light 0x7f06005b +int color switch_thumb_material_dark 0x7f06005c +int color switch_thumb_material_light 0x7f06005d +int color switch_thumb_normal_material_dark 0x7f06005e +int color switch_thumb_normal_material_light 0x7f06005f +int color tooltip_background_dark 0x7f060060 +int color tooltip_background_light 0x7f060061 +int dimen abc_action_bar_content_inset_material 0x7f070001 +int dimen abc_action_bar_content_inset_with_nav 0x7f070002 +int dimen abc_action_bar_default_height_material 0x7f070003 +int dimen abc_action_bar_default_padding_end_material 0x7f070004 +int dimen abc_action_bar_default_padding_start_material 0x7f070005 +int dimen abc_action_bar_elevation_material 0x7f070006 +int dimen abc_action_bar_icon_vertical_padding_material 0x7f070007 +int dimen abc_action_bar_overflow_padding_end_material 0x7f070008 +int dimen abc_action_bar_overflow_padding_start_material 0x7f070009 +int dimen abc_action_bar_stacked_max_height 0x7f07000a +int dimen abc_action_bar_stacked_tab_max_width 0x7f07000b +int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f07000c +int dimen abc_action_bar_subtitle_top_margin_material 0x7f07000d +int dimen abc_action_button_min_height_material 0x7f07000e +int dimen abc_action_button_min_width_material 0x7f07000f +int dimen abc_action_button_min_width_overflow_material 0x7f070010 +int dimen abc_alert_dialog_button_bar_height 0x7f070011 +int dimen abc_alert_dialog_button_dimen 0x7f070012 +int dimen abc_button_inset_horizontal_material 0x7f070013 +int dimen abc_button_inset_vertical_material 0x7f070014 +int dimen abc_button_padding_horizontal_material 0x7f070015 +int dimen abc_button_padding_vertical_material 0x7f070016 +int dimen abc_cascading_menus_min_smallest_width 0x7f070017 +int dimen abc_config_prefDialogWidth 0x7f070018 +int dimen abc_control_corner_material 0x7f070019 +int dimen abc_control_inset_material 0x7f07001a +int dimen abc_control_padding_material 0x7f07001b +int dimen abc_dialog_corner_radius_material 0x7f07001c +int dimen abc_dialog_fixed_height_major 0x7f07001d +int dimen abc_dialog_fixed_height_minor 0x7f07001e +int dimen abc_dialog_fixed_width_major 0x7f07001f +int dimen abc_dialog_fixed_width_minor 0x7f070020 +int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f070021 +int dimen abc_dialog_list_padding_top_no_title 0x7f070022 +int dimen abc_dialog_min_width_major 0x7f070023 +int dimen abc_dialog_min_width_minor 0x7f070024 +int dimen abc_dialog_padding_material 0x7f070025 +int dimen abc_dialog_padding_top_material 0x7f070026 +int dimen abc_dialog_title_divider_material 0x7f070027 +int dimen abc_disabled_alpha_material_dark 0x7f070028 +int dimen abc_disabled_alpha_material_light 0x7f070029 +int dimen abc_dropdownitem_icon_width 0x7f07002a +int dimen abc_dropdownitem_text_padding_left 0x7f07002b +int dimen abc_dropdownitem_text_padding_right 0x7f07002c +int dimen abc_edit_text_inset_bottom_material 0x7f07002d +int dimen abc_edit_text_inset_horizontal_material 0x7f07002e +int dimen abc_edit_text_inset_top_material 0x7f07002f +int dimen abc_floating_window_z 0x7f070030 +int dimen abc_list_item_padding_horizontal_material 0x7f070031 +int dimen abc_panel_menu_list_width 0x7f070032 +int dimen abc_progress_bar_height_material 0x7f070033 +int dimen abc_search_view_preferred_height 0x7f070034 +int dimen abc_search_view_preferred_width 0x7f070035 +int dimen abc_seekbar_track_background_height_material 0x7f070036 +int dimen abc_seekbar_track_progress_height_material 0x7f070037 +int dimen abc_select_dialog_padding_start_material 0x7f070038 +int dimen abc_switch_padding 0x7f070039 +int dimen abc_text_size_body_1_material 0x7f07003a +int dimen abc_text_size_body_2_material 0x7f07003b +int dimen abc_text_size_button_material 0x7f07003c +int dimen abc_text_size_caption_material 0x7f07003d +int dimen abc_text_size_display_1_material 0x7f07003e +int dimen abc_text_size_display_2_material 0x7f07003f +int dimen abc_text_size_display_3_material 0x7f070040 +int dimen abc_text_size_display_4_material 0x7f070041 +int dimen abc_text_size_headline_material 0x7f070042 +int dimen abc_text_size_large_material 0x7f070043 +int dimen abc_text_size_medium_material 0x7f070044 +int dimen abc_text_size_menu_header_material 0x7f070045 +int dimen abc_text_size_menu_material 0x7f070046 +int dimen abc_text_size_small_material 0x7f070047 +int dimen abc_text_size_subhead_material 0x7f070048 +int dimen abc_text_size_subtitle_material_toolbar 0x7f070049 +int dimen abc_text_size_title_material 0x7f07004a +int dimen abc_text_size_title_material_toolbar 0x7f07004b +int dimen compat_button_inset_horizontal_material 0x7f07004c +int dimen compat_button_inset_vertical_material 0x7f07004d +int dimen compat_button_padding_horizontal_material 0x7f07004e +int dimen compat_button_padding_vertical_material 0x7f07004f +int dimen compat_control_corner_material 0x7f070050 +int dimen compat_notification_large_icon_max_height 0x7f070051 +int dimen compat_notification_large_icon_max_width 0x7f070052 +int dimen disabled_alpha_material_dark 0x7f070053 +int dimen disabled_alpha_material_light 0x7f070054 +int dimen highlight_alpha_material_colored 0x7f070055 +int dimen highlight_alpha_material_dark 0x7f070056 +int dimen highlight_alpha_material_light 0x7f070057 +int dimen hint_alpha_material_dark 0x7f070058 +int dimen hint_alpha_material_light 0x7f070059 +int dimen hint_pressed_alpha_material_dark 0x7f07005a +int dimen hint_pressed_alpha_material_light 0x7f07005b +int dimen notification_action_icon_size 0x7f07005c +int dimen notification_action_text_size 0x7f07005d +int dimen notification_big_circle_margin 0x7f07005e +int dimen notification_content_margin_start 0x7f07005f +int dimen notification_large_icon_height 0x7f070060 +int dimen notification_large_icon_width 0x7f070061 +int dimen notification_main_column_padding_top 0x7f070062 +int dimen notification_media_narrow_margin 0x7f070063 +int dimen notification_right_icon_size 0x7f070064 +int dimen notification_right_side_padding_top 0x7f070065 +int dimen notification_small_icon_background_padding 0x7f070066 +int dimen notification_small_icon_size_as_large 0x7f070067 +int dimen notification_subtext_size 0x7f070068 +int dimen notification_top_pad 0x7f070069 +int dimen notification_top_pad_large_text 0x7f07006a +int dimen subtitle_corner_radius 0x7f07006b +int dimen subtitle_outline_width 0x7f07006c +int dimen subtitle_shadow_offset 0x7f07006d +int dimen subtitle_shadow_radius 0x7f07006e +int dimen tooltip_corner_radius 0x7f07006f +int dimen tooltip_horizontal_padding 0x7f070070 +int dimen tooltip_margin 0x7f070071 +int dimen tooltip_precise_anchor_extra_offset 0x7f070072 +int dimen tooltip_precise_anchor_threshold 0x7f070073 +int dimen tooltip_vertical_padding 0x7f070074 +int dimen tooltip_y_offset_non_touch 0x7f070075 +int dimen tooltip_y_offset_touch 0x7f070076 +int drawable abc_ab_share_pack_mtrl_alpha 0x7f080001 +int drawable abc_action_bar_item_background_material 0x7f080002 +int drawable abc_btn_borderless_material 0x7f080003 +int drawable abc_btn_check_material 0x7f080004 +int drawable abc_btn_check_to_on_mtrl_000 0x7f080005 +int drawable abc_btn_check_to_on_mtrl_015 0x7f080006 +int drawable abc_btn_colored_material 0x7f080007 +int drawable abc_btn_default_mtrl_shape 0x7f080008 +int drawable abc_btn_radio_material 0x7f080009 +int drawable abc_btn_radio_to_on_mtrl_000 0x7f08000a +int drawable abc_btn_radio_to_on_mtrl_015 0x7f08000b +int drawable abc_btn_switch_to_on_mtrl_00001 0x7f08000c +int drawable abc_btn_switch_to_on_mtrl_00012 0x7f08000d +int drawable abc_cab_background_internal_bg 0x7f08000e +int drawable abc_cab_background_top_material 0x7f08000f +int drawable abc_cab_background_top_mtrl_alpha 0x7f080010 +int drawable abc_control_background_material 0x7f080011 +int drawable abc_dialog_material_background 0x7f080012 +int drawable abc_edit_text_material 0x7f080013 +int drawable abc_ic_ab_back_material 0x7f080014 +int drawable abc_ic_arrow_drop_right_black_24dp 0x7f080015 +int drawable abc_ic_clear_material 0x7f080016 +int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f080017 +int drawable abc_ic_go_search_api_material 0x7f080018 +int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f080019 +int drawable abc_ic_menu_cut_mtrl_alpha 0x7f08001a +int drawable abc_ic_menu_overflow_material 0x7f08001b +int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f08001c +int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f08001d +int drawable abc_ic_menu_share_mtrl_alpha 0x7f08001e +int drawable abc_ic_search_api_material 0x7f08001f +int drawable abc_ic_star_black_16dp 0x7f080020 +int drawable abc_ic_star_black_36dp 0x7f080021 +int drawable abc_ic_star_black_48dp 0x7f080022 +int drawable abc_ic_star_half_black_16dp 0x7f080023 +int drawable abc_ic_star_half_black_36dp 0x7f080024 +int drawable abc_ic_star_half_black_48dp 0x7f080025 +int drawable abc_ic_voice_search_api_material 0x7f080026 +int drawable abc_item_background_holo_dark 0x7f080027 +int drawable abc_item_background_holo_light 0x7f080028 +int drawable abc_list_divider_material 0x7f080029 +int drawable abc_list_divider_mtrl_alpha 0x7f08002a +int drawable abc_list_focused_holo 0x7f08002b +int drawable abc_list_longpressed_holo 0x7f08002c +int drawable abc_list_pressed_holo_dark 0x7f08002d +int drawable abc_list_pressed_holo_light 0x7f08002e +int drawable abc_list_selector_background_transition_holo_dark 0x7f08002f +int drawable abc_list_selector_background_transition_holo_light 0x7f080030 +int drawable abc_list_selector_disabled_holo_dark 0x7f080031 +int drawable abc_list_selector_disabled_holo_light 0x7f080032 +int drawable abc_list_selector_holo_dark 0x7f080033 +int drawable abc_list_selector_holo_light 0x7f080034 +int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f080035 +int drawable abc_popup_background_mtrl_mult 0x7f080036 +int drawable abc_ratingbar_indicator_material 0x7f080037 +int drawable abc_ratingbar_material 0x7f080038 +int drawable abc_ratingbar_small_material 0x7f080039 +int drawable abc_scrubber_control_off_mtrl_alpha 0x7f08003a +int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f08003b +int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f08003c +int drawable abc_scrubber_primary_mtrl_alpha 0x7f08003d +int drawable abc_scrubber_track_mtrl_alpha 0x7f08003e +int drawable abc_seekbar_thumb_material 0x7f08003f +int drawable abc_seekbar_tick_mark_material 0x7f080040 +int drawable abc_seekbar_track_material 0x7f080041 +int drawable abc_spinner_mtrl_am_alpha 0x7f080042 +int drawable abc_spinner_textfield_background_material 0x7f080043 +int drawable abc_switch_thumb_material 0x7f080044 +int drawable abc_switch_track_mtrl_alpha 0x7f080045 +int drawable abc_tab_indicator_material 0x7f080046 +int drawable abc_tab_indicator_mtrl_alpha 0x7f080047 +int drawable abc_text_cursor_material 0x7f080048 +int drawable abc_text_select_handle_left_mtrl_dark 0x7f080049 +int drawable abc_text_select_handle_left_mtrl_light 0x7f08004a +int drawable abc_text_select_handle_middle_mtrl_dark 0x7f08004b +int drawable abc_text_select_handle_middle_mtrl_light 0x7f08004c +int drawable abc_text_select_handle_right_mtrl_dark 0x7f08004d +int drawable abc_text_select_handle_right_mtrl_light 0x7f08004e +int drawable abc_textfield_activated_mtrl_alpha 0x7f08004f +int drawable abc_textfield_default_mtrl_alpha 0x7f080050 +int drawable abc_textfield_search_activated_mtrl_alpha 0x7f080051 +int drawable abc_textfield_search_default_mtrl_alpha 0x7f080052 +int drawable abc_textfield_search_material 0x7f080053 +int drawable abc_vector_test 0x7f080054 +int drawable amu_bubble_mask 0x7f080055 +int drawable amu_bubble_shadow 0x7f080056 +int drawable common_full_open_on_phone 0x7f080057 +int drawable common_google_signin_btn_icon_dark 0x7f080058 +int drawable common_google_signin_btn_icon_dark_disabled 0x7f080059 +int drawable common_google_signin_btn_icon_dark_focused 0x7f08005a +int drawable common_google_signin_btn_icon_dark_normal 0x7f08005b +int drawable common_google_signin_btn_icon_dark_normal_background 0x7f08005c +int drawable common_google_signin_btn_icon_dark_pressed 0x7f08005d +int drawable common_google_signin_btn_icon_disabled 0x7f08005e +int drawable common_google_signin_btn_icon_light 0x7f08005f +int drawable common_google_signin_btn_icon_light_disabled 0x7f080060 +int drawable common_google_signin_btn_icon_light_focused 0x7f080061 +int drawable common_google_signin_btn_icon_light_normal 0x7f080062 +int drawable common_google_signin_btn_icon_light_normal_background 0x7f080063 +int drawable common_google_signin_btn_icon_light_pressed 0x7f080064 +int drawable common_google_signin_btn_text_dark 0x7f080065 +int drawable common_google_signin_btn_text_dark_disabled 0x7f080066 +int drawable common_google_signin_btn_text_dark_focused 0x7f080067 +int drawable common_google_signin_btn_text_dark_normal 0x7f080068 +int drawable common_google_signin_btn_text_dark_normal_background 0x7f080069 +int drawable common_google_signin_btn_text_dark_pressed 0x7f08006a +int drawable common_google_signin_btn_text_disabled 0x7f08006b +int drawable common_google_signin_btn_text_light 0x7f08006c +int drawable common_google_signin_btn_text_light_disabled 0x7f08006d +int drawable common_google_signin_btn_text_light_focused 0x7f08006e +int drawable common_google_signin_btn_text_light_normal 0x7f08006f +int drawable common_google_signin_btn_text_light_normal_background 0x7f080070 +int drawable common_google_signin_btn_text_light_pressed 0x7f080071 +int drawable common_ic_googleplayservices 0x7f080072 +int drawable googleg_disabled_color_18 0x7f080073 +int drawable googleg_standard_color_18 0x7f080074 +int drawable notification_action_background 0x7f080075 +int drawable notification_bg 0x7f080076 +int drawable notification_bg_low 0x7f080077 +int drawable notification_bg_low_normal 0x7f080078 +int drawable notification_bg_low_pressed 0x7f080079 +int drawable notification_bg_normal 0x7f08007a +int drawable notification_bg_normal_pressed 0x7f08007b +int drawable notification_icon_background 0x7f08007c +int drawable notification_template_icon_bg 0x7f08007d +int drawable notification_template_icon_low_bg 0x7f08007e +int drawable notification_tile_bg 0x7f08007f +int drawable notify_panel_notification_icon_bg 0x7f080080 +int drawable redbox_top_border_background 0x7f080081 +int drawable tooltip_frame_dark 0x7f080082 +int drawable tooltip_frame_light 0x7f080083 +int id accessibility_hint 0x7f0b0001 +int id accessibility_role 0x7f0b0002 +int id action0 0x7f0b0003 +int id action_bar 0x7f0b0004 +int id action_bar_activity_content 0x7f0b0005 +int id action_bar_container 0x7f0b0006 +int id action_bar_root 0x7f0b0007 +int id action_bar_spinner 0x7f0b0008 +int id action_bar_subtitle 0x7f0b0009 +int id action_bar_title 0x7f0b000a +int id action_container 0x7f0b000b +int id action_context_bar 0x7f0b000c +int id action_divider 0x7f0b000d +int id action_image 0x7f0b000e +int id action_menu_divider 0x7f0b000f +int id action_menu_presenter 0x7f0b0010 +int id action_mode_bar 0x7f0b0011 +int id action_mode_bar_stub 0x7f0b0012 +int id action_mode_close_button 0x7f0b0013 +int id action_text 0x7f0b0014 +int id actions 0x7f0b0015 +int id activity_chooser_view_content 0x7f0b0016 +int id add 0x7f0b0017 +int id adjust_height 0x7f0b0018 +int id adjust_width 0x7f0b0019 +int id alertTitle 0x7f0b001a +int id amu_text 0x7f0b001b +int id async 0x7f0b001c +int id auto 0x7f0b001d +int id blocking 0x7f0b001e +int id bottom 0x7f0b001f +int id buttonPanel 0x7f0b0020 +int id cancel_action 0x7f0b0021 +int id catalyst_redbox_title 0x7f0b0022 +int id center 0x7f0b0023 +int id centerCrop 0x7f0b0024 +int id centerInside 0x7f0b0025 +int id checkbox 0x7f0b0026 +int id chronometer 0x7f0b0027 +int id content 0x7f0b0028 +int id contentPanel 0x7f0b0029 +int id custom 0x7f0b002a +int id customPanel 0x7f0b002b +int id dark 0x7f0b002c +int id decor_content_parent 0x7f0b002d +int id default_activity_button 0x7f0b002e +int id edit_query 0x7f0b002f +int id end 0x7f0b0030 +int id end_padder 0x7f0b0031 +int id expand_activities_button 0x7f0b0032 +int id expanded_menu 0x7f0b0033 +int id fitBottomStart 0x7f0b0034 +int id fitCenter 0x7f0b0035 +int id fitEnd 0x7f0b0036 +int id fitStart 0x7f0b0037 +int id fitXY 0x7f0b0038 +int id focusCrop 0x7f0b0039 +int id forever 0x7f0b003a +int id fps_text 0x7f0b003b +int id group_divider 0x7f0b003c +int id home 0x7f0b003d +int id hybrid 0x7f0b003e +int id icon 0x7f0b003f +int id icon_group 0x7f0b0040 +int id icon_only 0x7f0b0041 +int id image 0x7f0b0042 +int id info 0x7f0b0043 +int id italic 0x7f0b0044 +int id left 0x7f0b0045 +int id light 0x7f0b0046 +int id line1 0x7f0b0047 +int id line3 0x7f0b0048 +int id listMode 0x7f0b0049 +int id list_item 0x7f0b004a +int id media_actions 0x7f0b004b +int id message 0x7f0b004c +int id multiply 0x7f0b004d +int id none 0x7f0b004e +int id normal 0x7f0b004f +int id notification_background 0x7f0b0050 +int id notification_main_column 0x7f0b0051 +int id notification_main_column_container 0x7f0b0052 +int id parentPanel 0x7f0b0053 +int id progress_circular 0x7f0b0054 +int id progress_horizontal 0x7f0b0055 +int id radio 0x7f0b0056 +int id react_test_id 0x7f0b0057 +int id right 0x7f0b0058 +int id right_icon 0x7f0b0059 +int id right_side 0x7f0b005a +int id rn_frame_file 0x7f0b005b +int id rn_frame_method 0x7f0b005c +int id rn_redbox_copy_button 0x7f0b005d +int id rn_redbox_dismiss_button 0x7f0b005e +int id rn_redbox_line_separator 0x7f0b005f +int id rn_redbox_loading_indicator 0x7f0b0060 +int id rn_redbox_reload_button 0x7f0b0061 +int id rn_redbox_report_button 0x7f0b0062 +int id rn_redbox_report_label 0x7f0b0063 +int id rn_redbox_stack 0x7f0b0064 +int id satellite 0x7f0b0065 +int id screen 0x7f0b0066 +int id scrollIndicatorDown 0x7f0b0067 +int id scrollIndicatorUp 0x7f0b0068 +int id scrollView 0x7f0b0069 +int id search_badge 0x7f0b006a +int id search_bar 0x7f0b006b +int id search_button 0x7f0b006c +int id search_close_btn 0x7f0b006d +int id search_edit_frame 0x7f0b006e +int id search_go_btn 0x7f0b006f +int id search_mag_icon 0x7f0b0070 +int id search_plate 0x7f0b0071 +int id search_src_text 0x7f0b0072 +int id search_voice_btn 0x7f0b0073 +int id select_dialog_listview 0x7f0b0074 +int id shortcut 0x7f0b0075 +int id spacer 0x7f0b0076 +int id split_action_bar 0x7f0b0077 +int id src_atop 0x7f0b0078 +int id src_in 0x7f0b0079 +int id src_over 0x7f0b007a +int id standard 0x7f0b007b +int id start 0x7f0b007c +int id status_bar_latest_event_content 0x7f0b007d +int id submenuarrow 0x7f0b007e +int id submit_area 0x7f0b007f +int id tabMode 0x7f0b0080 +int id tag_transition_group 0x7f0b0081 +int id tag_unhandled_key_event_manager 0x7f0b0082 +int id tag_unhandled_key_listeners 0x7f0b0083 +int id terrain 0x7f0b0084 +int id text 0x7f0b0085 +int id text2 0x7f0b0086 +int id textSpacerNoButtons 0x7f0b0087 +int id textSpacerNoTitle 0x7f0b0088 +int id time 0x7f0b0089 +int id title 0x7f0b008a +int id titleDividerNoCustom 0x7f0b008b +int id title_template 0x7f0b008c +int id top 0x7f0b008d +int id topPanel 0x7f0b008e +int id uniform 0x7f0b008f +int id up 0x7f0b0090 +int id view_tag_instance_handle 0x7f0b0091 +int id view_tag_native_id 0x7f0b0092 +int id webview 0x7f0b0093 +int id wide 0x7f0b0094 +int id window 0x7f0b0095 +int id wrap_content 0x7f0b0096 +int integer abc_config_activityDefaultDur 0x7f0c0001 +int integer abc_config_activityShortDur 0x7f0c0002 +int integer cancel_button_image_alpha 0x7f0c0003 +int integer config_tooltipAnimTime 0x7f0c0004 +int integer google_play_services_version 0x7f0c0005 +int integer status_bar_notification_info_maxnum 0x7f0c0006 +int layout abc_action_bar_title_item 0x7f0e0001 +int layout abc_action_bar_up_container 0x7f0e0002 +int layout abc_action_menu_item_layout 0x7f0e0003 +int layout abc_action_menu_layout 0x7f0e0004 +int layout abc_action_mode_bar 0x7f0e0005 +int layout abc_action_mode_close_item_material 0x7f0e0006 +int layout abc_activity_chooser_view 0x7f0e0007 +int layout abc_activity_chooser_view_list_item 0x7f0e0008 +int layout abc_alert_dialog_button_bar_material 0x7f0e0009 +int layout abc_alert_dialog_material 0x7f0e000a +int layout abc_alert_dialog_title_material 0x7f0e000b +int layout abc_cascading_menu_item_layout 0x7f0e000c +int layout abc_dialog_title_material 0x7f0e000d +int layout abc_expanded_menu_layout 0x7f0e000e +int layout abc_list_menu_item_checkbox 0x7f0e000f +int layout abc_list_menu_item_icon 0x7f0e0010 +int layout abc_list_menu_item_layout 0x7f0e0011 +int layout abc_list_menu_item_radio 0x7f0e0012 +int layout abc_popup_menu_header_item_layout 0x7f0e0013 +int layout abc_popup_menu_item_layout 0x7f0e0014 +int layout abc_screen_content_include 0x7f0e0015 +int layout abc_screen_simple 0x7f0e0016 +int layout abc_screen_simple_overlay_action_mode 0x7f0e0017 +int layout abc_screen_toolbar 0x7f0e0018 +int layout abc_search_dropdown_item_icons_2line 0x7f0e0019 +int layout abc_search_view 0x7f0e001a +int layout abc_select_dialog_material 0x7f0e001b +int layout abc_tooltip 0x7f0e001c +int layout amu_info_window 0x7f0e001d +int layout amu_text_bubble 0x7f0e001e +int layout amu_webview 0x7f0e001f +int layout dev_loading_view 0x7f0e0020 +int layout fps_view 0x7f0e0021 +int layout notification_action 0x7f0e0022 +int layout notification_action_tombstone 0x7f0e0023 +int layout notification_media_action 0x7f0e0024 +int layout notification_media_cancel_action 0x7f0e0025 +int layout notification_template_big_media 0x7f0e0026 +int layout notification_template_big_media_custom 0x7f0e0027 +int layout notification_template_big_media_narrow 0x7f0e0028 +int layout notification_template_big_media_narrow_custom 0x7f0e0029 +int layout notification_template_custom_big 0x7f0e002a +int layout notification_template_icon_group 0x7f0e002b +int layout notification_template_lines_media 0x7f0e002c +int layout notification_template_media 0x7f0e002d +int layout notification_template_media_custom 0x7f0e002e +int layout notification_template_part_chronometer 0x7f0e002f +int layout notification_template_part_time 0x7f0e0030 +int layout redbox_item_frame 0x7f0e0031 +int layout redbox_item_title 0x7f0e0032 +int layout redbox_view 0x7f0e0033 +int layout select_dialog_item_material 0x7f0e0034 +int layout select_dialog_multichoice_material 0x7f0e0035 +int layout select_dialog_singlechoice_material 0x7f0e0036 +int layout support_simple_spinner_dropdown_item 0x7f0e0037 +int raw amu_ballon_gx_prefix 0x7f130001 +int raw amu_basic_folder 0x7f130002 +int raw amu_basic_placemark 0x7f130003 +int raw amu_cdata 0x7f130004 +int raw amu_default_balloon 0x7f130005 +int raw amu_document_nest 0x7f130006 +int raw amu_draw_order_ground_overlay 0x7f130007 +int raw amu_extended_data 0x7f130008 +int raw amu_ground_overlay 0x7f130009 +int raw amu_ground_overlay_color 0x7f13000a +int raw amu_inline_style 0x7f13000b +int raw amu_multigeometry_placemarks 0x7f13000c +int raw amu_multiple_placemarks 0x7f13000d +int raw amu_nested_folders 0x7f13000e +int raw amu_nested_multigeometry 0x7f13000f +int raw amu_poly_style_boolean_alpha 0x7f130010 +int raw amu_poly_style_boolean_numeric 0x7f130011 +int raw amu_unknwown_folder 0x7f130012 +int raw amu_unsupported 0x7f130013 +int raw amu_visibility_ground_overlay 0x7f130014 +int string abc_action_bar_home_description 0x7f140001 +int string abc_action_bar_up_description 0x7f140002 +int string abc_action_menu_overflow_description 0x7f140003 +int string abc_action_mode_done 0x7f140004 +int string abc_activity_chooser_view_see_all 0x7f140005 +int string abc_activitychooserview_choose_application 0x7f140006 +int string abc_capital_off 0x7f140007 +int string abc_capital_on 0x7f140008 +int string abc_font_family_body_1_material 0x7f140009 +int string abc_font_family_body_2_material 0x7f14000a +int string abc_font_family_button_material 0x7f14000b +int string abc_font_family_caption_material 0x7f14000c +int string abc_font_family_display_1_material 0x7f14000d +int string abc_font_family_display_2_material 0x7f14000e +int string abc_font_family_display_3_material 0x7f14000f +int string abc_font_family_display_4_material 0x7f140010 +int string abc_font_family_headline_material 0x7f140011 +int string abc_font_family_menu_material 0x7f140012 +int string abc_font_family_subhead_material 0x7f140013 +int string abc_font_family_title_material 0x7f140014 +int string abc_menu_alt_shortcut_label 0x7f140015 +int string abc_menu_ctrl_shortcut_label 0x7f140016 +int string abc_menu_delete_shortcut_label 0x7f140017 +int string abc_menu_enter_shortcut_label 0x7f140018 +int string abc_menu_function_shortcut_label 0x7f140019 +int string abc_menu_meta_shortcut_label 0x7f14001a +int string abc_menu_shift_shortcut_label 0x7f14001b +int string abc_menu_space_shortcut_label 0x7f14001c +int string abc_menu_sym_shortcut_label 0x7f14001d +int string abc_prepend_shortcut_label 0x7f14001e +int string abc_search_hint 0x7f14001f +int string abc_searchview_description_clear 0x7f140020 +int string abc_searchview_description_query 0x7f140021 +int string abc_searchview_description_search 0x7f140022 +int string abc_searchview_description_submit 0x7f140023 +int string abc_searchview_description_voice 0x7f140024 +int string abc_shareactionprovider_share_with 0x7f140025 +int string abc_shareactionprovider_share_with_application 0x7f140026 +int string abc_toolbar_collapse_description 0x7f140027 +int string adjustable_description 0x7f140028 +int string catalyst_copy_button 0x7f140029 +int string catalyst_debugjs 0x7f14002a +int string catalyst_debugjs_nuclide 0x7f14002b +int string catalyst_debugjs_nuclide_failure 0x7f14002c +int string catalyst_debugjs_off 0x7f14002d +int string catalyst_dismiss_button 0x7f14002e +int string catalyst_element_inspector 0x7f14002f +int string catalyst_heap_capture 0x7f140030 +int string catalyst_hot_module_replacement 0x7f140031 +int string catalyst_hot_module_replacement_off 0x7f140032 +int string catalyst_jsload_error 0x7f140033 +int string catalyst_live_reload 0x7f140034 +int string catalyst_live_reload_off 0x7f140035 +int string catalyst_loading_from_url 0x7f140036 +int string catalyst_perf_monitor 0x7f140037 +int string catalyst_perf_monitor_off 0x7f140038 +int string catalyst_poke_sampling_profiler 0x7f140039 +int string catalyst_reload_button 0x7f14003a +int string catalyst_reloadjs 0x7f14003b +int string catalyst_remotedbg_error 0x7f14003c +int string catalyst_remotedbg_message 0x7f14003d +int string catalyst_report_button 0x7f14003e +int string catalyst_settings 0x7f14003f +int string catalyst_settings_title 0x7f140040 +int string common_google_play_services_enable_button 0x7f140041 +int string common_google_play_services_enable_text 0x7f140042 +int string common_google_play_services_enable_title 0x7f140043 +int string common_google_play_services_install_button 0x7f140044 +int string common_google_play_services_install_text 0x7f140045 +int string common_google_play_services_install_text_phone 0x7f140046 +int string common_google_play_services_install_text_tablet 0x7f140047 +int string common_google_play_services_install_title 0x7f140048 +int string common_google_play_services_notification_channel_name 0x7f140049 +int string common_google_play_services_notification_ticker 0x7f14004a +int string common_google_play_services_unknown_issue 0x7f14004b +int string common_google_play_services_unsupported_text 0x7f14004c +int string common_google_play_services_unsupported_title 0x7f14004d +int string common_google_play_services_update_button 0x7f14004e +int string common_google_play_services_update_text 0x7f14004f +int string common_google_play_services_update_title 0x7f140050 +int string common_google_play_services_updating_text 0x7f140051 +int string common_google_play_services_updating_title 0x7f140052 +int string common_google_play_services_wear_update_text 0x7f140053 +int string common_open_on_phone 0x7f140054 +int string common_signin_button_text 0x7f140055 +int string common_signin_button_text_long 0x7f140056 +int string header_description 0x7f140057 +int string image_button_description 0x7f140058 +int string image_description 0x7f140059 +int string link_description 0x7f14005a +int string search_description 0x7f14005b +int string search_menu_title 0x7f14005c +int string status_bar_notification_info_overflow 0x7f14005d +int style AlertDialog_AppCompat 0x7f150001 +int style AlertDialog_AppCompat_Light 0x7f150002 +int style Animation_AppCompat_Dialog 0x7f150003 +int style Animation_AppCompat_DropDownUp 0x7f150004 +int style Animation_AppCompat_Tooltip 0x7f150005 +int style Animation_Catalyst_RedBox 0x7f150006 +int style Base_AlertDialog_AppCompat 0x7f150007 +int style Base_AlertDialog_AppCompat_Light 0x7f150008 +int style Base_Animation_AppCompat_Dialog 0x7f150009 +int style Base_Animation_AppCompat_DropDownUp 0x7f15000a +int style Base_Animation_AppCompat_Tooltip 0x7f15000b +int style Base_DialogWindowTitleBackground_AppCompat 0x7f15000c +int style Base_DialogWindowTitle_AppCompat 0x7f15000d +int style Base_TextAppearance_AppCompat 0x7f15000e +int style Base_TextAppearance_AppCompat_Body1 0x7f15000f +int style Base_TextAppearance_AppCompat_Body2 0x7f150010 +int style Base_TextAppearance_AppCompat_Button 0x7f150011 +int style Base_TextAppearance_AppCompat_Caption 0x7f150012 +int style Base_TextAppearance_AppCompat_Display1 0x7f150013 +int style Base_TextAppearance_AppCompat_Display2 0x7f150014 +int style Base_TextAppearance_AppCompat_Display3 0x7f150015 +int style Base_TextAppearance_AppCompat_Display4 0x7f150016 +int style Base_TextAppearance_AppCompat_Headline 0x7f150017 +int style Base_TextAppearance_AppCompat_Inverse 0x7f150018 +int style Base_TextAppearance_AppCompat_Large 0x7f150019 +int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f15001a +int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f15001b +int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f15001c +int style Base_TextAppearance_AppCompat_Medium 0x7f15001d +int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f15001e +int style Base_TextAppearance_AppCompat_Menu 0x7f15001f +int style Base_TextAppearance_AppCompat_SearchResult 0x7f150020 +int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f150021 +int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f150022 +int style Base_TextAppearance_AppCompat_Small 0x7f150023 +int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f150024 +int style Base_TextAppearance_AppCompat_Subhead 0x7f150025 +int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f150026 +int style Base_TextAppearance_AppCompat_Title 0x7f150027 +int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f150028 +int style Base_TextAppearance_AppCompat_Tooltip 0x7f150029 +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f15002a +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f15002b +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f15002c +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f15002d +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f15002e +int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f15002f +int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f150030 +int style Base_TextAppearance_AppCompat_Widget_Button 0x7f150031 +int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f150032 +int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f150033 +int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f150034 +int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f150035 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f150036 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f150037 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f150038 +int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f150039 +int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f15003a +int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f15003b +int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f15003c +int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f15003d +int style Base_ThemeOverlay_AppCompat 0x7f15003e +int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f15003f +int style Base_ThemeOverlay_AppCompat_Dark 0x7f150040 +int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150041 +int style Base_ThemeOverlay_AppCompat_Dialog 0x7f150042 +int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f150043 +int style Base_ThemeOverlay_AppCompat_Light 0x7f150044 +int style Base_Theme_AppCompat 0x7f150045 +int style Base_Theme_AppCompat_CompactMenu 0x7f150046 +int style Base_Theme_AppCompat_Dialog 0x7f150047 +int style Base_Theme_AppCompat_DialogWhenLarge 0x7f150048 +int style Base_Theme_AppCompat_Dialog_Alert 0x7f150049 +int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f15004a +int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f15004b +int style Base_Theme_AppCompat_Light 0x7f15004c +int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f15004d +int style Base_Theme_AppCompat_Light_Dialog 0x7f15004e +int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f15004f +int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f150050 +int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f150051 +int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f150052 +int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f150053 +int style Base_V21_Theme_AppCompat 0x7f150054 +int style Base_V21_Theme_AppCompat_Dialog 0x7f150055 +int style Base_V21_Theme_AppCompat_Light 0x7f150056 +int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f150057 +int style Base_V22_Theme_AppCompat 0x7f150058 +int style Base_V22_Theme_AppCompat_Light 0x7f150059 +int style Base_V23_Theme_AppCompat 0x7f15005a +int style Base_V23_Theme_AppCompat_Light 0x7f15005b +int style Base_V26_Theme_AppCompat 0x7f15005c +int style Base_V26_Theme_AppCompat_Light 0x7f15005d +int style Base_V26_Widget_AppCompat_Toolbar 0x7f15005e +int style Base_V28_Theme_AppCompat 0x7f15005f +int style Base_V28_Theme_AppCompat_Light 0x7f150060 +int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f150061 +int style Base_V7_Theme_AppCompat 0x7f150062 +int style Base_V7_Theme_AppCompat_Dialog 0x7f150063 +int style Base_V7_Theme_AppCompat_Light 0x7f150064 +int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f150065 +int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f150066 +int style Base_V7_Widget_AppCompat_EditText 0x7f150067 +int style Base_V7_Widget_AppCompat_Toolbar 0x7f150068 +int style Base_Widget_AppCompat_ActionBar 0x7f150069 +int style Base_Widget_AppCompat_ActionBar_Solid 0x7f15006a +int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f15006b +int style Base_Widget_AppCompat_ActionBar_TabText 0x7f15006c +int style Base_Widget_AppCompat_ActionBar_TabView 0x7f15006d +int style Base_Widget_AppCompat_ActionButton 0x7f15006e +int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f15006f +int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f150070 +int style Base_Widget_AppCompat_ActionMode 0x7f150071 +int style Base_Widget_AppCompat_ActivityChooserView 0x7f150072 +int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f150073 +int style Base_Widget_AppCompat_Button 0x7f150074 +int style Base_Widget_AppCompat_ButtonBar 0x7f150075 +int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f150076 +int style Base_Widget_AppCompat_Button_Borderless 0x7f150077 +int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f150078 +int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150079 +int style Base_Widget_AppCompat_Button_Colored 0x7f15007a +int style Base_Widget_AppCompat_Button_Small 0x7f15007b +int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f15007c +int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f15007d +int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f15007e +int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f15007f +int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f150080 +int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f150081 +int style Base_Widget_AppCompat_EditText 0x7f150082 +int style Base_Widget_AppCompat_ImageButton 0x7f150083 +int style Base_Widget_AppCompat_Light_ActionBar 0x7f150084 +int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f150085 +int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f150086 +int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f150087 +int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150088 +int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f150089 +int style Base_Widget_AppCompat_Light_PopupMenu 0x7f15008a +int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f15008b +int style Base_Widget_AppCompat_ListMenuView 0x7f15008c +int style Base_Widget_AppCompat_ListPopupWindow 0x7f15008d +int style Base_Widget_AppCompat_ListView 0x7f15008e +int style Base_Widget_AppCompat_ListView_DropDown 0x7f15008f +int style Base_Widget_AppCompat_ListView_Menu 0x7f150090 +int style Base_Widget_AppCompat_PopupMenu 0x7f150091 +int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f150092 +int style Base_Widget_AppCompat_PopupWindow 0x7f150093 +int style Base_Widget_AppCompat_ProgressBar 0x7f150094 +int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f150095 +int style Base_Widget_AppCompat_RatingBar 0x7f150096 +int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f150097 +int style Base_Widget_AppCompat_RatingBar_Small 0x7f150098 +int style Base_Widget_AppCompat_SearchView 0x7f150099 +int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f15009a +int style Base_Widget_AppCompat_SeekBar 0x7f15009b +int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f15009c +int style Base_Widget_AppCompat_Spinner 0x7f15009d +int style Base_Widget_AppCompat_Spinner_Underlined 0x7f15009e +int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f15009f +int style Base_Widget_AppCompat_Toolbar 0x7f1500a0 +int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f1500a1 +int style CalendarDatePickerDialog 0x7f1500a2 +int style CalendarDatePickerStyle 0x7f1500a3 +int style ClockTimePickerDialog 0x7f1500a4 +int style ClockTimePickerStyle 0x7f1500a5 +int style DialogAnimationFade 0x7f1500a6 +int style DialogAnimationSlide 0x7f1500a7 +int style Platform_AppCompat 0x7f1500a8 +int style Platform_AppCompat_Light 0x7f1500a9 +int style Platform_ThemeOverlay_AppCompat 0x7f1500aa +int style Platform_ThemeOverlay_AppCompat_Dark 0x7f1500ab +int style Platform_ThemeOverlay_AppCompat_Light 0x7f1500ac +int style Platform_V21_AppCompat 0x7f1500ad +int style Platform_V21_AppCompat_Light 0x7f1500ae +int style Platform_V25_AppCompat 0x7f1500af +int style Platform_V25_AppCompat_Light 0x7f1500b0 +int style Platform_Widget_AppCompat_Spinner 0x7f1500b1 +int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f1500b2 +int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f1500b3 +int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f1500b4 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f1500b5 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f1500b6 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f1500b7 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f1500b8 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f1500b9 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f1500ba +int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f1500bb +int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f1500bc +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f1500bd +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f1500be +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f1500bf +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f1500c0 +int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f1500c1 +int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f1500c2 +int style SpinnerDatePickerDialog 0x7f1500c3 +int style SpinnerDatePickerStyle 0x7f1500c4 +int style SpinnerTimePickerDialog 0x7f1500c5 +int style SpinnerTimePickerStyle 0x7f1500c6 +int style TextAppearance_AppCompat 0x7f1500c7 +int style TextAppearance_AppCompat_Body1 0x7f1500c8 +int style TextAppearance_AppCompat_Body2 0x7f1500c9 +int style TextAppearance_AppCompat_Button 0x7f1500ca +int style TextAppearance_AppCompat_Caption 0x7f1500cb +int style TextAppearance_AppCompat_Display1 0x7f1500cc +int style TextAppearance_AppCompat_Display2 0x7f1500cd +int style TextAppearance_AppCompat_Display3 0x7f1500ce +int style TextAppearance_AppCompat_Display4 0x7f1500cf +int style TextAppearance_AppCompat_Headline 0x7f1500d0 +int style TextAppearance_AppCompat_Inverse 0x7f1500d1 +int style TextAppearance_AppCompat_Large 0x7f1500d2 +int style TextAppearance_AppCompat_Large_Inverse 0x7f1500d3 +int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f1500d4 +int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f1500d5 +int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f1500d6 +int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f1500d7 +int style TextAppearance_AppCompat_Medium 0x7f1500d8 +int style TextAppearance_AppCompat_Medium_Inverse 0x7f1500d9 +int style TextAppearance_AppCompat_Menu 0x7f1500da +int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f1500db +int style TextAppearance_AppCompat_SearchResult_Title 0x7f1500dc +int style TextAppearance_AppCompat_Small 0x7f1500dd +int style TextAppearance_AppCompat_Small_Inverse 0x7f1500de +int style TextAppearance_AppCompat_Subhead 0x7f1500df +int style TextAppearance_AppCompat_Subhead_Inverse 0x7f1500e0 +int style TextAppearance_AppCompat_Title 0x7f1500e1 +int style TextAppearance_AppCompat_Title_Inverse 0x7f1500e2 +int style TextAppearance_AppCompat_Tooltip 0x7f1500e3 +int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f1500e4 +int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f1500e5 +int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f1500e6 +int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f1500e7 +int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f1500e8 +int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f1500e9 +int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f1500ea +int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f1500eb +int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f1500ec +int style TextAppearance_AppCompat_Widget_Button 0x7f1500ed +int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f1500ee +int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f1500ef +int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f1500f0 +int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f1500f1 +int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f1500f2 +int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f1500f3 +int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f1500f4 +int style TextAppearance_AppCompat_Widget_Switch 0x7f1500f5 +int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f1500f6 +int style TextAppearance_Compat_Notification 0x7f1500f7 +int style TextAppearance_Compat_Notification_Info 0x7f1500f8 +int style TextAppearance_Compat_Notification_Info_Media 0x7f1500f9 +int style TextAppearance_Compat_Notification_Line2 0x7f1500fa +int style TextAppearance_Compat_Notification_Line2_Media 0x7f1500fb +int style TextAppearance_Compat_Notification_Media 0x7f1500fc +int style TextAppearance_Compat_Notification_Time 0x7f1500fd +int style TextAppearance_Compat_Notification_Time_Media 0x7f1500fe +int style TextAppearance_Compat_Notification_Title 0x7f1500ff +int style TextAppearance_Compat_Notification_Title_Media 0x7f150100 +int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f150101 +int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f150102 +int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f150103 +int style Theme 0x7f150104 +int style ThemeOverlay_AppCompat 0x7f150105 +int style ThemeOverlay_AppCompat_ActionBar 0x7f150106 +int style ThemeOverlay_AppCompat_Dark 0x7f150107 +int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150108 +int style ThemeOverlay_AppCompat_Dialog 0x7f150109 +int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f15010a +int style ThemeOverlay_AppCompat_Light 0x7f15010b +int style Theme_AppCompat 0x7f15010c +int style Theme_AppCompat_CompactMenu 0x7f15010d +int style Theme_AppCompat_DayNight 0x7f15010e +int style Theme_AppCompat_DayNight_DarkActionBar 0x7f15010f +int style Theme_AppCompat_DayNight_Dialog 0x7f150110 +int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f150111 +int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f150112 +int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f150113 +int style Theme_AppCompat_DayNight_NoActionBar 0x7f150114 +int style Theme_AppCompat_Dialog 0x7f150115 +int style Theme_AppCompat_DialogWhenLarge 0x7f150116 +int style Theme_AppCompat_Dialog_Alert 0x7f150117 +int style Theme_AppCompat_Dialog_MinWidth 0x7f150118 +int style Theme_AppCompat_Light 0x7f150119 +int style Theme_AppCompat_Light_DarkActionBar 0x7f15011a +int style Theme_AppCompat_Light_Dialog 0x7f15011b +int style Theme_AppCompat_Light_DialogWhenLarge 0x7f15011c +int style Theme_AppCompat_Light_Dialog_Alert 0x7f15011d +int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f15011e +int style Theme_AppCompat_Light_NoActionBar 0x7f15011f +int style Theme_AppCompat_NoActionBar 0x7f150120 +int style Theme_Catalyst 0x7f150121 +int style Theme_Catalyst_RedBox 0x7f150122 +int style Theme_FullScreenDialog 0x7f150123 +int style Theme_FullScreenDialogAnimatedFade 0x7f150124 +int style Theme_FullScreenDialogAnimatedSlide 0x7f150125 +int style Theme_ReactNative_AppCompat_Light 0x7f150126 +int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x7f150127 +int style Widget_AppCompat_ActionBar 0x7f150128 +int style Widget_AppCompat_ActionBar_Solid 0x7f150129 +int style Widget_AppCompat_ActionBar_TabBar 0x7f15012a +int style Widget_AppCompat_ActionBar_TabText 0x7f15012b +int style Widget_AppCompat_ActionBar_TabView 0x7f15012c +int style Widget_AppCompat_ActionButton 0x7f15012d +int style Widget_AppCompat_ActionButton_CloseMode 0x7f15012e +int style Widget_AppCompat_ActionButton_Overflow 0x7f15012f +int style Widget_AppCompat_ActionMode 0x7f150130 +int style Widget_AppCompat_ActivityChooserView 0x7f150131 +int style Widget_AppCompat_AutoCompleteTextView 0x7f150132 +int style Widget_AppCompat_Button 0x7f150133 +int style Widget_AppCompat_ButtonBar 0x7f150134 +int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f150135 +int style Widget_AppCompat_Button_Borderless 0x7f150136 +int style Widget_AppCompat_Button_Borderless_Colored 0x7f150137 +int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150138 +int style Widget_AppCompat_Button_Colored 0x7f150139 +int style Widget_AppCompat_Button_Small 0x7f15013a +int style Widget_AppCompat_CompoundButton_CheckBox 0x7f15013b +int style Widget_AppCompat_CompoundButton_RadioButton 0x7f15013c +int style Widget_AppCompat_CompoundButton_Switch 0x7f15013d +int style Widget_AppCompat_DrawerArrowToggle 0x7f15013e +int style Widget_AppCompat_DropDownItem_Spinner 0x7f15013f +int style Widget_AppCompat_EditText 0x7f150140 +int style Widget_AppCompat_ImageButton 0x7f150141 +int style Widget_AppCompat_Light_ActionBar 0x7f150142 +int style Widget_AppCompat_Light_ActionBar_Solid 0x7f150143 +int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f150144 +int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f150145 +int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f150146 +int style Widget_AppCompat_Light_ActionBar_TabText 0x7f150147 +int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150148 +int style Widget_AppCompat_Light_ActionBar_TabView 0x7f150149 +int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f15014a +int style Widget_AppCompat_Light_ActionButton 0x7f15014b +int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f15014c +int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f15014d +int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f15014e +int style Widget_AppCompat_Light_ActivityChooserView 0x7f15014f +int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f150150 +int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f150151 +int style Widget_AppCompat_Light_ListPopupWindow 0x7f150152 +int style Widget_AppCompat_Light_ListView_DropDown 0x7f150153 +int style Widget_AppCompat_Light_PopupMenu 0x7f150154 +int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f150155 +int style Widget_AppCompat_Light_SearchView 0x7f150156 +int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f150157 +int style Widget_AppCompat_ListMenuView 0x7f150158 +int style Widget_AppCompat_ListPopupWindow 0x7f150159 +int style Widget_AppCompat_ListView 0x7f15015a +int style Widget_AppCompat_ListView_DropDown 0x7f15015b +int style Widget_AppCompat_ListView_Menu 0x7f15015c +int style Widget_AppCompat_PopupMenu 0x7f15015d +int style Widget_AppCompat_PopupMenu_Overflow 0x7f15015e +int style Widget_AppCompat_PopupWindow 0x7f15015f +int style Widget_AppCompat_ProgressBar 0x7f150160 +int style Widget_AppCompat_ProgressBar_Horizontal 0x7f150161 +int style Widget_AppCompat_RatingBar 0x7f150162 +int style Widget_AppCompat_RatingBar_Indicator 0x7f150163 +int style Widget_AppCompat_RatingBar_Small 0x7f150164 +int style Widget_AppCompat_SearchView 0x7f150165 +int style Widget_AppCompat_SearchView_ActionBar 0x7f150166 +int style Widget_AppCompat_SeekBar 0x7f150167 +int style Widget_AppCompat_SeekBar_Discrete 0x7f150168 +int style Widget_AppCompat_Spinner 0x7f150169 +int style Widget_AppCompat_Spinner_DropDown 0x7f15016a +int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f15016b +int style Widget_AppCompat_Spinner_Underlined 0x7f15016c +int style Widget_AppCompat_TextView_SpinnerItem 0x7f15016d +int style Widget_AppCompat_Toolbar 0x7f15016e +int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f15016f +int style Widget_Compat_NotificationActionContainer 0x7f150170 +int style Widget_Compat_NotificationActionText 0x7f150171 +int style Widget_Support_CoordinatorLayout 0x7f150172 +int style amu_Bubble_TextAppearance_Dark 0x7f150173 +int style amu_Bubble_TextAppearance_Light 0x7f150174 +int style amu_ClusterIcon_TextAppearance 0x7f150175 +int style redboxButton 0x7f150176 +int[] styleable ActionBar { 0x7f040036, 0x7f040038, 0x7f040039, 0x7f040067, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006b, 0x7f04006c, 0x7f04006f, 0x7f040074, 0x7f040075, 0x7f040080, 0x7f040093, 0x7f040094, 0x7f040095, 0x7f040096, 0x7f040097, 0x7f04009e, 0x7f0400a1, 0x7f0400bc, 0x7f0400c4, 0x7f0400d2, 0x7f0400d9, 0x7f0400da, 0x7f040106, 0x7f040109, 0x7f040124, 0x7f04012d } +int styleable ActionBar_background 0 +int styleable ActionBar_backgroundSplit 1 +int styleable ActionBar_backgroundStacked 2 +int styleable ActionBar_contentInsetEnd 3 +int styleable ActionBar_contentInsetEndWithActions 4 +int styleable ActionBar_contentInsetLeft 5 +int styleable ActionBar_contentInsetRight 6 +int styleable ActionBar_contentInsetStart 7 +int styleable ActionBar_contentInsetStartWithNavigation 8 +int styleable ActionBar_customNavigationLayout 9 +int styleable ActionBar_displayOptions 10 +int styleable ActionBar_divider 11 +int styleable ActionBar_elevation 12 +int styleable ActionBar_height 13 +int styleable ActionBar_hideOnContentScroll 14 +int styleable ActionBar_homeAsUpIndicator 15 +int styleable ActionBar_homeLayout 16 +int styleable ActionBar_icon 17 +int styleable ActionBar_indeterminateProgressStyle 18 +int styleable ActionBar_itemPadding 19 +int styleable ActionBar_logo 20 +int styleable ActionBar_navigationMode 21 +int styleable ActionBar_popupTheme 22 +int styleable ActionBar_progressBarPadding 23 +int styleable ActionBar_progressBarStyle 24 +int styleable ActionBar_subtitle 25 +int styleable ActionBar_subtitleTextStyle 26 +int styleable ActionBar_title 27 +int styleable ActionBar_titleTextStyle 28 +int[] styleable ActionBarLayout { 0x10100b3 } +int styleable ActionBarLayout_android_layout_gravity 0 +int[] styleable ActionMenuItemView { 0x101013f } +int styleable ActionMenuItemView_android_minWidth 0 +int[] styleable ActionMenuView { } +int[] styleable ActionMode { 0x7f040036, 0x7f040038, 0x7f040056, 0x7f040093, 0x7f040109, 0x7f04012d } +int styleable ActionMode_background 0 +int styleable ActionMode_backgroundSplit 1 +int styleable ActionMode_closeItemLayout 2 +int styleable ActionMode_height 3 +int styleable ActionMode_subtitleTextStyle 4 +int styleable ActionMode_titleTextStyle 5 +int[] styleable ActivityChooserView { 0x7f040081, 0x7f04009f } +int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 +int styleable ActivityChooserView_initialActivityCount 1 +int[] styleable AlertDialog { 0x10100f2, 0x7f040044, 0x7f040045, 0x7f0400b2, 0x7f0400b3, 0x7f0400c1, 0x7f0400fb, 0x7f0400fc } +int styleable AlertDialog_android_layout 0 +int styleable AlertDialog_buttonIconDimen 1 +int styleable AlertDialog_buttonPanelSideLayout 2 +int styleable AlertDialog_listItemLayout 3 +int styleable AlertDialog_listLayout 4 +int styleable AlertDialog_multiChoiceItemLayout 5 +int styleable AlertDialog_showTitle 6 +int styleable AlertDialog_singleChoiceItemLayout 7 +int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } +int styleable AnimatedStateListDrawableCompat_android_constantSize 0 +int styleable AnimatedStateListDrawableCompat_android_dither 1 +int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2 +int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3 +int styleable AnimatedStateListDrawableCompat_android_variablePadding 4 +int styleable AnimatedStateListDrawableCompat_android_visible 5 +int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 } +int styleable AnimatedStateListDrawableItem_android_drawable 0 +int styleable AnimatedStateListDrawableItem_android_id 1 +int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 } +int styleable AnimatedStateListDrawableTransition_android_drawable 0 +int styleable AnimatedStateListDrawableTransition_android_fromId 1 +int styleable AnimatedStateListDrawableTransition_android_reversible 2 +int styleable AnimatedStateListDrawableTransition_android_toId 3 +int[] styleable AppCompatImageView { 0x1010119, 0x7f040101, 0x7f040122, 0x7f040123 } +int styleable AppCompatImageView_android_src 0 +int styleable AppCompatImageView_srcCompat 1 +int styleable AppCompatImageView_tint 2 +int styleable AppCompatImageView_tintMode 3 +int[] styleable AppCompatSeekBar { 0x1010142, 0x7f04011f, 0x7f040120, 0x7f040121 } +int styleable AppCompatSeekBar_android_thumb 0 +int styleable AppCompatSeekBar_tickMark 1 +int styleable AppCompatSeekBar_tickMarkTint 2 +int styleable AppCompatSeekBar_tickMarkTintMode 3 +int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 } +int styleable AppCompatTextHelper_android_drawableBottom 0 +int styleable AppCompatTextHelper_android_drawableEnd 1 +int styleable AppCompatTextHelper_android_drawableLeft 2 +int styleable AppCompatTextHelper_android_drawableRight 3 +int styleable AppCompatTextHelper_android_drawableStart 4 +int styleable AppCompatTextHelper_android_drawableTop 5 +int styleable AppCompatTextHelper_android_textAppearance 6 +int[] styleable AppCompatTextView { 0x1010034, 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040034, 0x7f040035, 0x7f040085, 0x7f040087, 0x7f0400a3, 0x7f0400af, 0x7f04010f } +int styleable AppCompatTextView_android_textAppearance 0 +int styleable AppCompatTextView_autoSizeMaxTextSize 1 +int styleable AppCompatTextView_autoSizeMinTextSize 2 +int styleable AppCompatTextView_autoSizePresetSizes 3 +int styleable AppCompatTextView_autoSizeStepGranularity 4 +int styleable AppCompatTextView_autoSizeTextType 5 +int styleable AppCompatTextView_firstBaselineToTopHeight 6 +int styleable AppCompatTextView_fontFamily 7 +int styleable AppCompatTextView_lastBaselineToBottomHeight 8 +int styleable AppCompatTextView_lineHeight 9 +int styleable AppCompatTextView_textAllCaps 10 +int[] styleable AppCompatTheme { 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000d, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f04001f, 0x7f040022, 0x7f040026, 0x7f040027, 0x7f040028, 0x7f040029, 0x10100ae, 0x1010057, 0x7f040030, 0x7f04003d, 0x7f04003e, 0x7f04003f, 0x7f040040, 0x7f040041, 0x7f040042, 0x7f040047, 0x7f040048, 0x7f040052, 0x7f040053, 0x7f04005a, 0x7f04005b, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f040062, 0x7f040064, 0x7f04006d, 0x7f040071, 0x7f040072, 0x7f040073, 0x7f040076, 0x7f040078, 0x7f04007b, 0x7f04007c, 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040095, 0x7f04009d, 0x7f0400b0, 0x7f0400b1, 0x7f0400b4, 0x7f0400b5, 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, 0x7f0400ba, 0x7f0400cc, 0x7f0400cd, 0x7f0400ce, 0x7f0400d1, 0x7f0400d3, 0x7f0400dd, 0x7f0400de, 0x7f0400df, 0x7f0400e0, 0x7f0400f4, 0x7f0400f5, 0x7f0400f6, 0x7f0400f7, 0x7f0400fe, 0x7f0400ff, 0x7f04010d, 0x7f040110, 0x7f040111, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040115, 0x7f040116, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040141, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148, 0x7f040149, 0x7f04014a, 0x7f04014b, 0x7f04014c } +int styleable AppCompatTheme_actionBarDivider 0 +int styleable AppCompatTheme_actionBarItemBackground 1 +int styleable AppCompatTheme_actionBarPopupTheme 2 +int styleable AppCompatTheme_actionBarSize 3 +int styleable AppCompatTheme_actionBarSplitStyle 4 +int styleable AppCompatTheme_actionBarStyle 5 +int styleable AppCompatTheme_actionBarTabBarStyle 6 +int styleable AppCompatTheme_actionBarTabStyle 7 +int styleable AppCompatTheme_actionBarTabTextStyle 8 +int styleable AppCompatTheme_actionBarTheme 9 +int styleable AppCompatTheme_actionBarWidgetTheme 10 +int styleable AppCompatTheme_actionButtonStyle 11 +int styleable AppCompatTheme_actionDropDownStyle 12 +int styleable AppCompatTheme_actionMenuTextAppearance 13 +int styleable AppCompatTheme_actionMenuTextColor 14 +int styleable AppCompatTheme_actionModeBackground 15 +int styleable AppCompatTheme_actionModeCloseButtonStyle 16 +int styleable AppCompatTheme_actionModeCloseDrawable 17 +int styleable AppCompatTheme_actionModeCopyDrawable 18 +int styleable AppCompatTheme_actionModeCutDrawable 19 +int styleable AppCompatTheme_actionModeFindDrawable 20 +int styleable AppCompatTheme_actionModePasteDrawable 21 +int styleable AppCompatTheme_actionModePopupWindowStyle 22 +int styleable AppCompatTheme_actionModeSelectAllDrawable 23 +int styleable AppCompatTheme_actionModeShareDrawable 24 +int styleable AppCompatTheme_actionModeSplitBackground 25 +int styleable AppCompatTheme_actionModeStyle 26 +int styleable AppCompatTheme_actionModeWebSearchDrawable 27 +int styleable AppCompatTheme_actionOverflowButtonStyle 28 +int styleable AppCompatTheme_actionOverflowMenuStyle 29 +int styleable AppCompatTheme_activityChooserViewStyle 30 +int styleable AppCompatTheme_alertDialogButtonGroupStyle 31 +int styleable AppCompatTheme_alertDialogCenterButtons 32 +int styleable AppCompatTheme_alertDialogStyle 33 +int styleable AppCompatTheme_alertDialogTheme 34 +int styleable AppCompatTheme_android_windowAnimationStyle 35 +int styleable AppCompatTheme_android_windowIsFloating 36 +int styleable AppCompatTheme_autoCompleteTextViewStyle 37 +int styleable AppCompatTheme_borderlessButtonStyle 38 +int styleable AppCompatTheme_buttonBarButtonStyle 39 +int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 +int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 +int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 +int styleable AppCompatTheme_buttonBarStyle 43 +int styleable AppCompatTheme_buttonStyle 44 +int styleable AppCompatTheme_buttonStyleSmall 45 +int styleable AppCompatTheme_checkboxStyle 46 +int styleable AppCompatTheme_checkedTextViewStyle 47 +int styleable AppCompatTheme_colorAccent 48 +int styleable AppCompatTheme_colorBackgroundFloating 49 +int styleable AppCompatTheme_colorButtonNormal 50 +int styleable AppCompatTheme_colorControlActivated 51 +int styleable AppCompatTheme_colorControlHighlight 52 +int styleable AppCompatTheme_colorControlNormal 53 +int styleable AppCompatTheme_colorError 54 +int styleable AppCompatTheme_colorPrimary 55 +int styleable AppCompatTheme_colorPrimaryDark 56 +int styleable AppCompatTheme_colorSwitchThumbNormal 57 +int styleable AppCompatTheme_controlBackground 58 +int styleable AppCompatTheme_dialogCornerRadius 59 +int styleable AppCompatTheme_dialogPreferredPadding 60 +int styleable AppCompatTheme_dialogTheme 61 +int styleable AppCompatTheme_dividerHorizontal 62 +int styleable AppCompatTheme_dividerVertical 63 +int styleable AppCompatTheme_dropDownListViewStyle 64 +int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 +int styleable AppCompatTheme_editTextBackground 66 +int styleable AppCompatTheme_editTextColor 67 +int styleable AppCompatTheme_editTextStyle 68 +int styleable AppCompatTheme_homeAsUpIndicator 69 +int styleable AppCompatTheme_imageButtonStyle 70 +int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 +int styleable AppCompatTheme_listDividerAlertDialog 72 +int styleable AppCompatTheme_listMenuViewStyle 73 +int styleable AppCompatTheme_listPopupWindowStyle 74 +int styleable AppCompatTheme_listPreferredItemHeight 75 +int styleable AppCompatTheme_listPreferredItemHeightLarge 76 +int styleable AppCompatTheme_listPreferredItemHeightSmall 77 +int styleable AppCompatTheme_listPreferredItemPaddingLeft 78 +int styleable AppCompatTheme_listPreferredItemPaddingRight 79 +int styleable AppCompatTheme_panelBackground 80 +int styleable AppCompatTheme_panelMenuListTheme 81 +int styleable AppCompatTheme_panelMenuListWidth 82 +int styleable AppCompatTheme_popupMenuStyle 83 +int styleable AppCompatTheme_popupWindowStyle 84 +int styleable AppCompatTheme_radioButtonStyle 85 +int styleable AppCompatTheme_ratingBarStyle 86 +int styleable AppCompatTheme_ratingBarStyleIndicator 87 +int styleable AppCompatTheme_ratingBarStyleSmall 88 +int styleable AppCompatTheme_searchViewStyle 89 +int styleable AppCompatTheme_seekBarStyle 90 +int styleable AppCompatTheme_selectableItemBackground 91 +int styleable AppCompatTheme_selectableItemBackgroundBorderless 92 +int styleable AppCompatTheme_spinnerDropDownItemStyle 93 +int styleable AppCompatTheme_spinnerStyle 94 +int styleable AppCompatTheme_switchStyle 95 +int styleable AppCompatTheme_textAppearanceLargePopupMenu 96 +int styleable AppCompatTheme_textAppearanceListItem 97 +int styleable AppCompatTheme_textAppearanceListItemSecondary 98 +int styleable AppCompatTheme_textAppearanceListItemSmall 99 +int styleable AppCompatTheme_textAppearancePopupMenuHeader 100 +int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101 +int styleable AppCompatTheme_textAppearanceSearchResultTitle 102 +int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103 +int styleable AppCompatTheme_textColorAlertDialogListItem 104 +int styleable AppCompatTheme_textColorSearchUrl 105 +int styleable AppCompatTheme_toolbarNavigationButtonStyle 106 +int styleable AppCompatTheme_toolbarStyle 107 +int styleable AppCompatTheme_tooltipForegroundColor 108 +int styleable AppCompatTheme_tooltipFrameBackground 109 +int styleable AppCompatTheme_viewInflaterClass 110 +int styleable AppCompatTheme_windowActionBar 111 +int styleable AppCompatTheme_windowActionBarOverlay 112 +int styleable AppCompatTheme_windowActionModeOverlay 113 +int styleable AppCompatTheme_windowFixedHeightMajor 114 +int styleable AppCompatTheme_windowFixedHeightMinor 115 +int styleable AppCompatTheme_windowFixedWidthMajor 116 +int styleable AppCompatTheme_windowFixedWidthMinor 117 +int styleable AppCompatTheme_windowMinWidthMajor 118 +int styleable AppCompatTheme_windowMinWidthMinor 119 +int styleable AppCompatTheme_windowNoTitle 120 +int[] styleable ButtonBarLayout { 0x7f04002a } +int styleable ButtonBarLayout_allowStacking 0 +int[] styleable ColorStateListItem { 0x7f04002b, 0x101031f, 0x10101a5 } +int styleable ColorStateListItem_alpha 0 +int styleable ColorStateListItem_android_alpha 1 +int styleable ColorStateListItem_android_color 2 +int[] styleable CompoundButton { 0x1010107, 0x7f040049, 0x7f04004a } +int styleable CompoundButton_android_button 0 +int styleable CompoundButton_buttonTint 1 +int styleable CompoundButton_buttonTintMode 2 +int[] styleable CoordinatorLayout { 0x7f0400a2, 0x7f040103 } +int styleable CoordinatorLayout_keylines 0 +int styleable CoordinatorLayout_statusBarBackground 1 +int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x7f0400a9, 0x7f0400aa, 0x7f0400ab, 0x7f0400ac, 0x7f0400ad, 0x7f0400ae } +int styleable CoordinatorLayout_Layout_android_layout_gravity 0 +int styleable CoordinatorLayout_Layout_layout_anchor 1 +int styleable CoordinatorLayout_Layout_layout_anchorGravity 2 +int styleable CoordinatorLayout_Layout_layout_behavior 3 +int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4 +int styleable CoordinatorLayout_Layout_layout_insetEdge 5 +int styleable CoordinatorLayout_Layout_layout_keyline 6 +int[] styleable DrawerArrowToggle { 0x7f04002e, 0x7f04002f, 0x7f04003c, 0x7f040059, 0x7f040079, 0x7f040091, 0x7f0400fd, 0x7f04011b } +int styleable DrawerArrowToggle_arrowHeadLength 0 +int styleable DrawerArrowToggle_arrowShaftLength 1 +int styleable DrawerArrowToggle_barLength 2 +int styleable DrawerArrowToggle_color 3 +int styleable DrawerArrowToggle_drawableSize 4 +int styleable DrawerArrowToggle_gapBetweenBars 5 +int styleable DrawerArrowToggle_spinBars 6 +int styleable DrawerArrowToggle_thickness 7 +int[] styleable FontFamily { 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f04008d } +int styleable FontFamily_fontProviderAuthority 0 +int styleable FontFamily_fontProviderCerts 1 +int styleable FontFamily_fontProviderFetchStrategy 2 +int styleable FontFamily_fontProviderFetchTimeout 3 +int styleable FontFamily_fontProviderPackage 4 +int styleable FontFamily_fontProviderQuery 5 +int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x7f040086, 0x7f04008e, 0x7f04008f, 0x7f040090, 0x7f040136 } +int styleable FontFamilyFont_android_font 0 +int styleable FontFamilyFont_android_fontStyle 1 +int styleable FontFamilyFont_android_fontVariationSettings 2 +int styleable FontFamilyFont_android_fontWeight 3 +int styleable FontFamilyFont_android_ttcIndex 4 +int styleable FontFamilyFont_font 5 +int styleable FontFamilyFont_fontStyle 6 +int styleable FontFamilyFont_fontVariationSettings 7 +int styleable FontFamilyFont_fontWeight 8 +int styleable FontFamilyFont_ttcIndex 9 +int[] styleable GenericDraweeHierarchy { 0x7f040024, 0x7f040037, 0x7f040082, 0x7f040083, 0x7f040084, 0x7f0400c7, 0x7f0400cf, 0x7f0400d0, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400e4, 0x7f0400e5, 0x7f0400e6, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ea, 0x7f0400eb, 0x7f0400ec, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f0400f0, 0x7f040140 } +int styleable GenericDraweeHierarchy_actualImageScaleType 0 +int styleable GenericDraweeHierarchy_backgroundImage 1 +int styleable GenericDraweeHierarchy_fadeDuration 2 +int styleable GenericDraweeHierarchy_failureImage 3 +int styleable GenericDraweeHierarchy_failureImageScaleType 4 +int styleable GenericDraweeHierarchy_overlayImage 5 +int styleable GenericDraweeHierarchy_placeholderImage 6 +int styleable GenericDraweeHierarchy_placeholderImageScaleType 7 +int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8 +int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9 +int styleable GenericDraweeHierarchy_progressBarImage 10 +int styleable GenericDraweeHierarchy_progressBarImageScaleType 11 +int styleable GenericDraweeHierarchy_retryImage 12 +int styleable GenericDraweeHierarchy_retryImageScaleType 13 +int styleable GenericDraweeHierarchy_roundAsCircle 14 +int styleable GenericDraweeHierarchy_roundBottomEnd 15 +int styleable GenericDraweeHierarchy_roundBottomLeft 16 +int styleable GenericDraweeHierarchy_roundBottomRight 17 +int styleable GenericDraweeHierarchy_roundBottomStart 18 +int styleable GenericDraweeHierarchy_roundTopEnd 19 +int styleable GenericDraweeHierarchy_roundTopLeft 20 +int styleable GenericDraweeHierarchy_roundTopRight 21 +int styleable GenericDraweeHierarchy_roundTopStart 22 +int styleable GenericDraweeHierarchy_roundWithOverlayColor 23 +int styleable GenericDraweeHierarchy_roundedCornerRadius 24 +int styleable GenericDraweeHierarchy_roundingBorderColor 25 +int styleable GenericDraweeHierarchy_roundingBorderPadding 26 +int styleable GenericDraweeHierarchy_roundingBorderWidth 27 +int styleable GenericDraweeHierarchy_viewAspectRatio 28 +int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 } +int styleable GradientColor_android_centerColor 0 +int styleable GradientColor_android_centerX 1 +int styleable GradientColor_android_centerY 2 +int styleable GradientColor_android_endColor 3 +int styleable GradientColor_android_endX 4 +int styleable GradientColor_android_endY 5 +int styleable GradientColor_android_gradientRadius 6 +int styleable GradientColor_android_startColor 7 +int styleable GradientColor_android_startX 8 +int styleable GradientColor_android_startY 9 +int styleable GradientColor_android_tileMode 10 +int styleable GradientColor_android_type 11 +int[] styleable GradientColorItem { 0x10101a5, 0x1010514 } +int styleable GradientColorItem_android_color 0 +int styleable GradientColorItem_android_offset 1 +int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x7f040075, 0x7f040077, 0x7f0400c0, 0x7f0400f9 } +int styleable LinearLayoutCompat_android_baselineAligned 0 +int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1 +int styleable LinearLayoutCompat_android_gravity 2 +int styleable LinearLayoutCompat_android_orientation 3 +int styleable LinearLayoutCompat_android_weightSum 4 +int styleable LinearLayoutCompat_divider 5 +int styleable LinearLayoutCompat_dividerPadding 6 +int styleable LinearLayoutCompat_measureWithLargestChild 7 +int styleable LinearLayoutCompat_showDividers 8 +int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 } +int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 +int styleable LinearLayoutCompat_Layout_android_layout_height 1 +int styleable LinearLayoutCompat_Layout_android_layout_weight 2 +int styleable LinearLayoutCompat_Layout_android_layout_width 3 +int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad } +int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 +int styleable ListPopupWindow_android_dropDownVerticalOffset 1 +int[] styleable LoadingImageView { 0x7f040054, 0x7f04009b, 0x7f04009c } +int styleable LoadingImageView_circleCrop 0 +int styleable LoadingImageView_imageAspectRatio 1 +int styleable LoadingImageView_imageAspectRatioAdjust 2 +int[] styleable MapAttrs { 0x7f04002d, 0x7f04004b, 0x7f04004c, 0x7f04004d, 0x7f04004e, 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f0400a4, 0x7f0400a5, 0x7f0400a6, 0x7f0400a7, 0x7f0400bb, 0x7f0400be, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f04014d } +int styleable MapAttrs_ambientEnabled 0 +int styleable MapAttrs_cameraBearing 1 +int styleable MapAttrs_cameraMaxZoomPreference 2 +int styleable MapAttrs_cameraMinZoomPreference 3 +int styleable MapAttrs_cameraTargetLat 4 +int styleable MapAttrs_cameraTargetLng 5 +int styleable MapAttrs_cameraTilt 6 +int styleable MapAttrs_cameraZoom 7 +int styleable MapAttrs_latLngBoundsNorthEastLatitude 8 +int styleable MapAttrs_latLngBoundsNorthEastLongitude 9 +int styleable MapAttrs_latLngBoundsSouthWestLatitude 10 +int styleable MapAttrs_latLngBoundsSouthWestLongitude 11 +int styleable MapAttrs_liteMode 12 +int styleable MapAttrs_mapType 13 +int styleable MapAttrs_uiCompass 14 +int styleable MapAttrs_uiMapToolbar 15 +int styleable MapAttrs_uiRotateGestures 16 +int styleable MapAttrs_uiScrollGestures 17 +int styleable MapAttrs_uiScrollGesturesDuringRotateOrZoom 18 +int styleable MapAttrs_uiTiltGestures 19 +int styleable MapAttrs_uiZoomControls 20 +int styleable MapAttrs_uiZoomGestures 21 +int styleable MapAttrs_useViewLifecycle 22 +int styleable MapAttrs_zOrderOnTop 23 +int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 } +int styleable MenuGroup_android_checkableBehavior 0 +int styleable MenuGroup_android_enabled 1 +int styleable MenuGroup_android_id 2 +int styleable MenuGroup_android_menuCategory 3 +int styleable MenuGroup_android_orderInCategory 4 +int styleable MenuGroup_android_visible 5 +int[] styleable MenuItem { 0x7f04000e, 0x7f040020, 0x7f040021, 0x7f04002c, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x7f040066, 0x7f040098, 0x7f040099, 0x7f0400c5, 0x7f0400f8, 0x7f040132 } +int styleable MenuItem_actionLayout 0 +int styleable MenuItem_actionProviderClass 1 +int styleable MenuItem_actionViewClass 2 +int styleable MenuItem_alphabeticModifiers 3 +int styleable MenuItem_android_alphabeticShortcut 4 +int styleable MenuItem_android_checkable 5 +int styleable MenuItem_android_checked 6 +int styleable MenuItem_android_enabled 7 +int styleable MenuItem_android_icon 8 +int styleable MenuItem_android_id 9 +int styleable MenuItem_android_menuCategory 10 +int styleable MenuItem_android_numericShortcut 11 +int styleable MenuItem_android_onClick 12 +int styleable MenuItem_android_orderInCategory 13 +int styleable MenuItem_android_title 14 +int styleable MenuItem_android_titleCondensed 15 +int styleable MenuItem_android_visible 16 +int styleable MenuItem_contentDescription 17 +int styleable MenuItem_iconTint 18 +int styleable MenuItem_iconTintMode 19 +int styleable MenuItem_numericModifiers 20 +int styleable MenuItem_showAsAction 21 +int styleable MenuItem_tooltipText 22 +int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x7f0400d4, 0x7f040104 } +int styleable MenuView_android_headerBackground 0 +int styleable MenuView_android_horizontalDivider 1 +int styleable MenuView_android_itemBackground 2 +int styleable MenuView_android_itemIconDisabledAlpha 3 +int styleable MenuView_android_itemTextAppearance 4 +int styleable MenuView_android_verticalDivider 5 +int styleable MenuView_android_windowAnimationStyle 6 +int styleable MenuView_preserveIconSpacing 7 +int styleable MenuView_subMenuArrow 8 +int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x7f0400c6 } +int styleable PopupWindow_android_popupAnimationStyle 0 +int styleable PopupWindow_android_popupBackground 1 +int styleable PopupWindow_overlapAnchor 2 +int[] styleable PopupWindowBackgroundState { 0x7f040102 } +int styleable PopupWindowBackgroundState_state_above_anchor 0 +int[] styleable RecycleListView { 0x7f0400c8, 0x7f0400cb } +int styleable RecycleListView_paddingBottomNoButtons 0 +int styleable RecycleListView_paddingTopNoTitle 1 +int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x7f040055, 0x7f040065, 0x7f040070, 0x7f040092, 0x7f04009a, 0x7f0400a8, 0x7f0400db, 0x7f0400dc, 0x7f0400f2, 0x7f0400f3, 0x7f040105, 0x7f04010a, 0x7f040142 } +int styleable SearchView_android_focusable 0 +int styleable SearchView_android_imeOptions 1 +int styleable SearchView_android_inputType 2 +int styleable SearchView_android_maxWidth 3 +int styleable SearchView_closeIcon 4 +int styleable SearchView_commitIcon 5 +int styleable SearchView_defaultQueryHint 6 +int styleable SearchView_goIcon 7 +int styleable SearchView_iconifiedByDefault 8 +int styleable SearchView_layout 9 +int styleable SearchView_queryBackground 10 +int styleable SearchView_queryHint 11 +int styleable SearchView_searchHintIcon 12 +int styleable SearchView_searchIcon 13 +int styleable SearchView_submitBackground 14 +int styleable SearchView_suggestionRowLayout 15 +int styleable SearchView_voiceIcon 16 +int[] styleable SignInButton { 0x7f040046, 0x7f040063, 0x7f0400f1 } +int styleable SignInButton_buttonSize 0 +int styleable SignInButton_colorScheme 1 +int styleable SignInButton_scopeUris 2 +int[] styleable SimpleDraweeView { 0x7f040023, 0x7f040024, 0x7f040025, 0x7f040037, 0x7f040082, 0x7f040083, 0x7f040084, 0x7f0400c7, 0x7f0400cf, 0x7f0400d0, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400e4, 0x7f0400e5, 0x7f0400e6, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ea, 0x7f0400eb, 0x7f0400ec, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f0400f0, 0x7f040140 } +int styleable SimpleDraweeView_actualImageResource 0 +int styleable SimpleDraweeView_actualImageScaleType 1 +int styleable SimpleDraweeView_actualImageUri 2 +int styleable SimpleDraweeView_backgroundImage 3 +int styleable SimpleDraweeView_fadeDuration 4 +int styleable SimpleDraweeView_failureImage 5 +int styleable SimpleDraweeView_failureImageScaleType 6 +int styleable SimpleDraweeView_overlayImage 7 +int styleable SimpleDraweeView_placeholderImage 8 +int styleable SimpleDraweeView_placeholderImageScaleType 9 +int styleable SimpleDraweeView_pressedStateOverlayImage 10 +int styleable SimpleDraweeView_progressBarAutoRotateInterval 11 +int styleable SimpleDraweeView_progressBarImage 12 +int styleable SimpleDraweeView_progressBarImageScaleType 13 +int styleable SimpleDraweeView_retryImage 14 +int styleable SimpleDraweeView_retryImageScaleType 15 +int styleable SimpleDraweeView_roundAsCircle 16 +int styleable SimpleDraweeView_roundBottomEnd 17 +int styleable SimpleDraweeView_roundBottomLeft 18 +int styleable SimpleDraweeView_roundBottomRight 19 +int styleable SimpleDraweeView_roundBottomStart 20 +int styleable SimpleDraweeView_roundTopEnd 21 +int styleable SimpleDraweeView_roundTopLeft 22 +int styleable SimpleDraweeView_roundTopRight 23 +int styleable SimpleDraweeView_roundTopStart 24 +int styleable SimpleDraweeView_roundWithOverlayColor 25 +int styleable SimpleDraweeView_roundedCornerRadius 26 +int styleable SimpleDraweeView_roundingBorderColor 27 +int styleable SimpleDraweeView_roundingBorderPadding 28 +int styleable SimpleDraweeView_roundingBorderWidth 29 +int styleable SimpleDraweeView_viewAspectRatio 30 +int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x7f0400d2 } +int styleable Spinner_android_dropDownWidth 0 +int styleable Spinner_android_entries 1 +int styleable Spinner_android_popupBackground 2 +int styleable Spinner_android_prompt 3 +int styleable Spinner_popupTheme 4 +int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } +int styleable StateListDrawable_android_constantSize 0 +int styleable StateListDrawable_android_dither 1 +int styleable StateListDrawable_android_enterFadeDuration 2 +int styleable StateListDrawable_android_exitFadeDuration 3 +int styleable StateListDrawable_android_variablePadding 4 +int styleable StateListDrawable_android_visible 5 +int[] styleable StateListDrawableItem { 0x1010199 } +int styleable StateListDrawableItem_android_drawable 0 +int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x7f0400fa, 0x7f040100, 0x7f04010b, 0x7f04010c, 0x7f04010e, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f040133, 0x7f040134, 0x7f040135 } +int styleable SwitchCompat_android_textOff 0 +int styleable SwitchCompat_android_textOn 1 +int styleable SwitchCompat_android_thumb 2 +int styleable SwitchCompat_showText 3 +int styleable SwitchCompat_splitTrack 4 +int styleable SwitchCompat_switchMinWidth 5 +int styleable SwitchCompat_switchPadding 6 +int styleable SwitchCompat_switchTextAppearance 7 +int styleable SwitchCompat_thumbTextPadding 8 +int styleable SwitchCompat_thumbTint 9 +int styleable SwitchCompat_thumbTintMode 10 +int styleable SwitchCompat_track 11 +int styleable SwitchCompat_trackTint 12 +int styleable SwitchCompat_trackTintMode 13 +int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010095, 0x1010097, 0x1010096, 0x7f040087, 0x7f04010f } +int styleable TextAppearance_android_fontFamily 0 +int styleable TextAppearance_android_shadowColor 1 +int styleable TextAppearance_android_shadowDx 2 +int styleable TextAppearance_android_shadowDy 3 +int styleable TextAppearance_android_shadowRadius 4 +int styleable TextAppearance_android_textColor 5 +int styleable TextAppearance_android_textColorHint 6 +int styleable TextAppearance_android_textColorLink 7 +int styleable TextAppearance_android_textSize 8 +int styleable TextAppearance_android_textStyle 9 +int styleable TextAppearance_android_typeface 10 +int styleable TextAppearance_fontFamily 11 +int styleable TextAppearance_textAllCaps 12 +int[] styleable Toolbar { 0x10100af, 0x1010140, 0x7f040043, 0x7f040057, 0x7f040058, 0x7f040067, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006b, 0x7f04006c, 0x7f0400bc, 0x7f0400bd, 0x7f0400bf, 0x7f0400c2, 0x7f0400c3, 0x7f0400d2, 0x7f040106, 0x7f040107, 0x7f040108, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c } +int styleable Toolbar_android_gravity 0 +int styleable Toolbar_android_minHeight 1 +int styleable Toolbar_buttonGravity 2 +int styleable Toolbar_collapseContentDescription 3 +int styleable Toolbar_collapseIcon 4 +int styleable Toolbar_contentInsetEnd 5 +int styleable Toolbar_contentInsetEndWithActions 6 +int styleable Toolbar_contentInsetLeft 7 +int styleable Toolbar_contentInsetRight 8 +int styleable Toolbar_contentInsetStart 9 +int styleable Toolbar_contentInsetStartWithNavigation 10 +int styleable Toolbar_logo 11 +int styleable Toolbar_logoDescription 12 +int styleable Toolbar_maxButtonHeight 13 +int styleable Toolbar_navigationContentDescription 14 +int styleable Toolbar_navigationIcon 15 +int styleable Toolbar_popupTheme 16 +int styleable Toolbar_subtitle 17 +int styleable Toolbar_subtitleTextAppearance 18 +int styleable Toolbar_subtitleTextColor 19 +int styleable Toolbar_title 20 +int styleable Toolbar_titleMargin 21 +int styleable Toolbar_titleMarginBottom 22 +int styleable Toolbar_titleMarginEnd 23 +int styleable Toolbar_titleMarginStart 24 +int styleable Toolbar_titleMarginTop 25 +int styleable Toolbar_titleMargins 26 +int styleable Toolbar_titleTextAppearance 27 +int styleable Toolbar_titleTextColor 28 +int[] styleable View { 0x10100da, 0x1010000, 0x7f0400c9, 0x7f0400ca, 0x7f04011a } +int styleable View_android_focusable 0 +int styleable View_android_theme 1 +int styleable View_paddingEnd 2 +int styleable View_paddingStart 3 +int styleable View_theme 4 +int[] styleable ViewBackgroundHelper { 0x10100d4, 0x7f04003a, 0x7f04003b } +int styleable ViewBackgroundHelper_android_background 0 +int styleable ViewBackgroundHelper_backgroundTint 1 +int styleable ViewBackgroundHelper_backgroundTintMode 2 +int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 } +int styleable ViewStubCompat_android_id 0 +int styleable ViewStubCompat_android_inflatedId 1 +int styleable ViewStubCompat_android_layout 2 +int xml rn_dev_preferences 0x7f180001 diff --git a/lib/android/build/intermediates/symbols/release/R.txt b/lib/android/build/intermediates/symbols/release/R.txt new file mode 100644 index 0000000..9e79991 --- /dev/null +++ b/lib/android/build/intermediates/symbols/release/R.txt @@ -0,0 +1,1953 @@ +int anim abc_fade_in 0x7f010001 +int anim abc_fade_out 0x7f010002 +int anim abc_grow_fade_in_from_bottom 0x7f010003 +int anim abc_popup_enter 0x7f010004 +int anim abc_popup_exit 0x7f010005 +int anim abc_shrink_fade_out_from_bottom 0x7f010006 +int anim abc_slide_in_bottom 0x7f010007 +int anim abc_slide_in_top 0x7f010008 +int anim abc_slide_out_bottom 0x7f010009 +int anim abc_slide_out_top 0x7f01000a +int anim abc_tooltip_enter 0x7f01000b +int anim abc_tooltip_exit 0x7f01000c +int anim catalyst_fade_in 0x7f01000d +int anim catalyst_fade_out 0x7f01000e +int anim catalyst_push_up_in 0x7f01000f +int anim catalyst_push_up_out 0x7f010010 +int anim catalyst_slide_down 0x7f010011 +int anim catalyst_slide_up 0x7f010012 +int attr actionBarDivider 0x7f040001 +int attr actionBarItemBackground 0x7f040002 +int attr actionBarPopupTheme 0x7f040003 +int attr actionBarSize 0x7f040004 +int attr actionBarSplitStyle 0x7f040005 +int attr actionBarStyle 0x7f040006 +int attr actionBarTabBarStyle 0x7f040007 +int attr actionBarTabStyle 0x7f040008 +int attr actionBarTabTextStyle 0x7f040009 +int attr actionBarTheme 0x7f04000a +int attr actionBarWidgetTheme 0x7f04000b +int attr actionButtonStyle 0x7f04000c +int attr actionDropDownStyle 0x7f04000d +int attr actionLayout 0x7f04000e +int attr actionMenuTextAppearance 0x7f04000f +int attr actionMenuTextColor 0x7f040010 +int attr actionModeBackground 0x7f040011 +int attr actionModeCloseButtonStyle 0x7f040012 +int attr actionModeCloseDrawable 0x7f040013 +int attr actionModeCopyDrawable 0x7f040014 +int attr actionModeCutDrawable 0x7f040015 +int attr actionModeFindDrawable 0x7f040016 +int attr actionModePasteDrawable 0x7f040017 +int attr actionModePopupWindowStyle 0x7f040018 +int attr actionModeSelectAllDrawable 0x7f040019 +int attr actionModeShareDrawable 0x7f04001a +int attr actionModeSplitBackground 0x7f04001b +int attr actionModeStyle 0x7f04001c +int attr actionModeWebSearchDrawable 0x7f04001d +int attr actionOverflowButtonStyle 0x7f04001e +int attr actionOverflowMenuStyle 0x7f04001f +int attr actionProviderClass 0x7f040020 +int attr actionViewClass 0x7f040021 +int attr activityChooserViewStyle 0x7f040022 +int attr actualImageResource 0x7f040023 +int attr actualImageScaleType 0x7f040024 +int attr actualImageUri 0x7f040025 +int attr alertDialogButtonGroupStyle 0x7f040026 +int attr alertDialogCenterButtons 0x7f040027 +int attr alertDialogStyle 0x7f040028 +int attr alertDialogTheme 0x7f040029 +int attr allowStacking 0x7f04002a +int attr alpha 0x7f04002b +int attr alphabeticModifiers 0x7f04002c +int attr ambientEnabled 0x7f04002d +int attr arrowHeadLength 0x7f04002e +int attr arrowShaftLength 0x7f04002f +int attr autoCompleteTextViewStyle 0x7f040030 +int attr autoSizeMaxTextSize 0x7f040031 +int attr autoSizeMinTextSize 0x7f040032 +int attr autoSizePresetSizes 0x7f040033 +int attr autoSizeStepGranularity 0x7f040034 +int attr autoSizeTextType 0x7f040035 +int attr background 0x7f040036 +int attr backgroundImage 0x7f040037 +int attr backgroundSplit 0x7f040038 +int attr backgroundStacked 0x7f040039 +int attr backgroundTint 0x7f04003a +int attr backgroundTintMode 0x7f04003b +int attr barLength 0x7f04003c +int attr borderlessButtonStyle 0x7f04003d +int attr buttonBarButtonStyle 0x7f04003e +int attr buttonBarNegativeButtonStyle 0x7f04003f +int attr buttonBarNeutralButtonStyle 0x7f040040 +int attr buttonBarPositiveButtonStyle 0x7f040041 +int attr buttonBarStyle 0x7f040042 +int attr buttonGravity 0x7f040043 +int attr buttonIconDimen 0x7f040044 +int attr buttonPanelSideLayout 0x7f040045 +int attr buttonSize 0x7f040046 +int attr buttonStyle 0x7f040047 +int attr buttonStyleSmall 0x7f040048 +int attr buttonTint 0x7f040049 +int attr buttonTintMode 0x7f04004a +int attr cameraBearing 0x7f04004b +int attr cameraMaxZoomPreference 0x7f04004c +int attr cameraMinZoomPreference 0x7f04004d +int attr cameraTargetLat 0x7f04004e +int attr cameraTargetLng 0x7f04004f +int attr cameraTilt 0x7f040050 +int attr cameraZoom 0x7f040051 +int attr checkboxStyle 0x7f040052 +int attr checkedTextViewStyle 0x7f040053 +int attr circleCrop 0x7f040054 +int attr closeIcon 0x7f040055 +int attr closeItemLayout 0x7f040056 +int attr collapseContentDescription 0x7f040057 +int attr collapseIcon 0x7f040058 +int attr color 0x7f040059 +int attr colorAccent 0x7f04005a +int attr colorBackgroundFloating 0x7f04005b +int attr colorButtonNormal 0x7f04005c +int attr colorControlActivated 0x7f04005d +int attr colorControlHighlight 0x7f04005e +int attr colorControlNormal 0x7f04005f +int attr colorError 0x7f040060 +int attr colorPrimary 0x7f040061 +int attr colorPrimaryDark 0x7f040062 +int attr colorScheme 0x7f040063 +int attr colorSwitchThumbNormal 0x7f040064 +int attr commitIcon 0x7f040065 +int attr contentDescription 0x7f040066 +int attr contentInsetEnd 0x7f040067 +int attr contentInsetEndWithActions 0x7f040068 +int attr contentInsetLeft 0x7f040069 +int attr contentInsetRight 0x7f04006a +int attr contentInsetStart 0x7f04006b +int attr contentInsetStartWithNavigation 0x7f04006c +int attr controlBackground 0x7f04006d +int attr coordinatorLayoutStyle 0x7f04006e +int attr customNavigationLayout 0x7f04006f +int attr defaultQueryHint 0x7f040070 +int attr dialogCornerRadius 0x7f040071 +int attr dialogPreferredPadding 0x7f040072 +int attr dialogTheme 0x7f040073 +int attr displayOptions 0x7f040074 +int attr divider 0x7f040075 +int attr dividerHorizontal 0x7f040076 +int attr dividerPadding 0x7f040077 +int attr dividerVertical 0x7f040078 +int attr drawableSize 0x7f040079 +int attr drawerArrowStyle 0x7f04007a +int attr dropDownListViewStyle 0x7f04007b +int attr dropdownListPreferredItemHeight 0x7f04007c +int attr editTextBackground 0x7f04007d +int attr editTextColor 0x7f04007e +int attr editTextStyle 0x7f04007f +int attr elevation 0x7f040080 +int attr expandActivityOverflowButtonDrawable 0x7f040081 +int attr fadeDuration 0x7f040082 +int attr failureImage 0x7f040083 +int attr failureImageScaleType 0x7f040084 +int attr firstBaselineToTopHeight 0x7f040085 +int attr font 0x7f040086 +int attr fontFamily 0x7f040087 +int attr fontProviderAuthority 0x7f040088 +int attr fontProviderCerts 0x7f040089 +int attr fontProviderFetchStrategy 0x7f04008a +int attr fontProviderFetchTimeout 0x7f04008b +int attr fontProviderPackage 0x7f04008c +int attr fontProviderQuery 0x7f04008d +int attr fontStyle 0x7f04008e +int attr fontVariationSettings 0x7f04008f +int attr fontWeight 0x7f040090 +int attr gapBetweenBars 0x7f040091 +int attr goIcon 0x7f040092 +int attr height 0x7f040093 +int attr hideOnContentScroll 0x7f040094 +int attr homeAsUpIndicator 0x7f040095 +int attr homeLayout 0x7f040096 +int attr icon 0x7f040097 +int attr iconTint 0x7f040098 +int attr iconTintMode 0x7f040099 +int attr iconifiedByDefault 0x7f04009a +int attr imageAspectRatio 0x7f04009b +int attr imageAspectRatioAdjust 0x7f04009c +int attr imageButtonStyle 0x7f04009d +int attr indeterminateProgressStyle 0x7f04009e +int attr initialActivityCount 0x7f04009f +int attr isLightTheme 0x7f0400a0 +int attr itemPadding 0x7f0400a1 +int attr keylines 0x7f0400a2 +int attr lastBaselineToBottomHeight 0x7f0400a3 +int attr latLngBoundsNorthEastLatitude 0x7f0400a4 +int attr latLngBoundsNorthEastLongitude 0x7f0400a5 +int attr latLngBoundsSouthWestLatitude 0x7f0400a6 +int attr latLngBoundsSouthWestLongitude 0x7f0400a7 +int attr layout 0x7f0400a8 +int attr layout_anchor 0x7f0400a9 +int attr layout_anchorGravity 0x7f0400aa +int attr layout_behavior 0x7f0400ab +int attr layout_dodgeInsetEdges 0x7f0400ac +int attr layout_insetEdge 0x7f0400ad +int attr layout_keyline 0x7f0400ae +int attr lineHeight 0x7f0400af +int attr listChoiceBackgroundIndicator 0x7f0400b0 +int attr listDividerAlertDialog 0x7f0400b1 +int attr listItemLayout 0x7f0400b2 +int attr listLayout 0x7f0400b3 +int attr listMenuViewStyle 0x7f0400b4 +int attr listPopupWindowStyle 0x7f0400b5 +int attr listPreferredItemHeight 0x7f0400b6 +int attr listPreferredItemHeightLarge 0x7f0400b7 +int attr listPreferredItemHeightSmall 0x7f0400b8 +int attr listPreferredItemPaddingLeft 0x7f0400b9 +int attr listPreferredItemPaddingRight 0x7f0400ba +int attr liteMode 0x7f0400bb +int attr logo 0x7f0400bc +int attr logoDescription 0x7f0400bd +int attr mapType 0x7f0400be +int attr maxButtonHeight 0x7f0400bf +int attr measureWithLargestChild 0x7f0400c0 +int attr multiChoiceItemLayout 0x7f0400c1 +int attr navigationContentDescription 0x7f0400c2 +int attr navigationIcon 0x7f0400c3 +int attr navigationMode 0x7f0400c4 +int attr numericModifiers 0x7f0400c5 +int attr overlapAnchor 0x7f0400c6 +int attr overlayImage 0x7f0400c7 +int attr paddingBottomNoButtons 0x7f0400c8 +int attr paddingEnd 0x7f0400c9 +int attr paddingStart 0x7f0400ca +int attr paddingTopNoTitle 0x7f0400cb +int attr panelBackground 0x7f0400cc +int attr panelMenuListTheme 0x7f0400cd +int attr panelMenuListWidth 0x7f0400ce +int attr placeholderImage 0x7f0400cf +int attr placeholderImageScaleType 0x7f0400d0 +int attr popupMenuStyle 0x7f0400d1 +int attr popupTheme 0x7f0400d2 +int attr popupWindowStyle 0x7f0400d3 +int attr preserveIconSpacing 0x7f0400d4 +int attr pressedStateOverlayImage 0x7f0400d5 +int attr progressBarAutoRotateInterval 0x7f0400d6 +int attr progressBarImage 0x7f0400d7 +int attr progressBarImageScaleType 0x7f0400d8 +int attr progressBarPadding 0x7f0400d9 +int attr progressBarStyle 0x7f0400da +int attr queryBackground 0x7f0400db +int attr queryHint 0x7f0400dc +int attr radioButtonStyle 0x7f0400dd +int attr ratingBarStyle 0x7f0400de +int attr ratingBarStyleIndicator 0x7f0400df +int attr ratingBarStyleSmall 0x7f0400e0 +int attr retryImage 0x7f0400e1 +int attr retryImageScaleType 0x7f0400e2 +int attr roundAsCircle 0x7f0400e3 +int attr roundBottomEnd 0x7f0400e4 +int attr roundBottomLeft 0x7f0400e5 +int attr roundBottomRight 0x7f0400e6 +int attr roundBottomStart 0x7f0400e7 +int attr roundTopEnd 0x7f0400e8 +int attr roundTopLeft 0x7f0400e9 +int attr roundTopRight 0x7f0400ea +int attr roundTopStart 0x7f0400eb +int attr roundWithOverlayColor 0x7f0400ec +int attr roundedCornerRadius 0x7f0400ed +int attr roundingBorderColor 0x7f0400ee +int attr roundingBorderPadding 0x7f0400ef +int attr roundingBorderWidth 0x7f0400f0 +int attr scopeUris 0x7f0400f1 +int attr searchHintIcon 0x7f0400f2 +int attr searchIcon 0x7f0400f3 +int attr searchViewStyle 0x7f0400f4 +int attr seekBarStyle 0x7f0400f5 +int attr selectableItemBackground 0x7f0400f6 +int attr selectableItemBackgroundBorderless 0x7f0400f7 +int attr showAsAction 0x7f0400f8 +int attr showDividers 0x7f0400f9 +int attr showText 0x7f0400fa +int attr showTitle 0x7f0400fb +int attr singleChoiceItemLayout 0x7f0400fc +int attr spinBars 0x7f0400fd +int attr spinnerDropDownItemStyle 0x7f0400fe +int attr spinnerStyle 0x7f0400ff +int attr splitTrack 0x7f040100 +int attr srcCompat 0x7f040101 +int attr state_above_anchor 0x7f040102 +int attr statusBarBackground 0x7f040103 +int attr subMenuArrow 0x7f040104 +int attr submitBackground 0x7f040105 +int attr subtitle 0x7f040106 +int attr subtitleTextAppearance 0x7f040107 +int attr subtitleTextColor 0x7f040108 +int attr subtitleTextStyle 0x7f040109 +int attr suggestionRowLayout 0x7f04010a +int attr switchMinWidth 0x7f04010b +int attr switchPadding 0x7f04010c +int attr switchStyle 0x7f04010d +int attr switchTextAppearance 0x7f04010e +int attr textAllCaps 0x7f04010f +int attr textAppearanceLargePopupMenu 0x7f040110 +int attr textAppearanceListItem 0x7f040111 +int attr textAppearanceListItemSecondary 0x7f040112 +int attr textAppearanceListItemSmall 0x7f040113 +int attr textAppearancePopupMenuHeader 0x7f040114 +int attr textAppearanceSearchResultSubtitle 0x7f040115 +int attr textAppearanceSearchResultTitle 0x7f040116 +int attr textAppearanceSmallPopupMenu 0x7f040117 +int attr textColorAlertDialogListItem 0x7f040118 +int attr textColorSearchUrl 0x7f040119 +int attr theme 0x7f04011a +int attr thickness 0x7f04011b +int attr thumbTextPadding 0x7f04011c +int attr thumbTint 0x7f04011d +int attr thumbTintMode 0x7f04011e +int attr tickMark 0x7f04011f +int attr tickMarkTint 0x7f040120 +int attr tickMarkTintMode 0x7f040121 +int attr tint 0x7f040122 +int attr tintMode 0x7f040123 +int attr title 0x7f040124 +int attr titleMargin 0x7f040125 +int attr titleMarginBottom 0x7f040126 +int attr titleMarginEnd 0x7f040127 +int attr titleMarginStart 0x7f040128 +int attr titleMarginTop 0x7f040129 +int attr titleMargins 0x7f04012a +int attr titleTextAppearance 0x7f04012b +int attr titleTextColor 0x7f04012c +int attr titleTextStyle 0x7f04012d +int attr toolbarNavigationButtonStyle 0x7f04012e +int attr toolbarStyle 0x7f04012f +int attr tooltipForegroundColor 0x7f040130 +int attr tooltipFrameBackground 0x7f040131 +int attr tooltipText 0x7f040132 +int attr track 0x7f040133 +int attr trackTint 0x7f040134 +int attr trackTintMode 0x7f040135 +int attr ttcIndex 0x7f040136 +int attr uiCompass 0x7f040137 +int attr uiMapToolbar 0x7f040138 +int attr uiRotateGestures 0x7f040139 +int attr uiScrollGestures 0x7f04013a +int attr uiScrollGesturesDuringRotateOrZoom 0x7f04013b +int attr uiTiltGestures 0x7f04013c +int attr uiZoomControls 0x7f04013d +int attr uiZoomGestures 0x7f04013e +int attr useViewLifecycle 0x7f04013f +int attr viewAspectRatio 0x7f040140 +int attr viewInflaterClass 0x7f040141 +int attr voiceIcon 0x7f040142 +int attr windowActionBar 0x7f040143 +int attr windowActionBarOverlay 0x7f040144 +int attr windowActionModeOverlay 0x7f040145 +int attr windowFixedHeightMajor 0x7f040146 +int attr windowFixedHeightMinor 0x7f040147 +int attr windowFixedWidthMajor 0x7f040148 +int attr windowFixedWidthMinor 0x7f040149 +int attr windowMinWidthMajor 0x7f04014a +int attr windowMinWidthMinor 0x7f04014b +int attr windowNoTitle 0x7f04014c +int attr zOrderOnTop 0x7f04014d +int bool abc_action_bar_embed_tabs 0x7f050001 +int bool abc_allow_stacked_button_bar 0x7f050002 +int bool abc_config_actionMenuItemAllCaps 0x7f050003 +int color abc_background_cache_hint_selector_material_dark 0x7f060001 +int color abc_background_cache_hint_selector_material_light 0x7f060002 +int color abc_btn_colored_borderless_text_material 0x7f060003 +int color abc_btn_colored_text_material 0x7f060004 +int color abc_color_highlight_material 0x7f060005 +int color abc_hint_foreground_material_dark 0x7f060006 +int color abc_hint_foreground_material_light 0x7f060007 +int color abc_input_method_navigation_guard 0x7f060008 +int color abc_primary_text_disable_only_material_dark 0x7f060009 +int color abc_primary_text_disable_only_material_light 0x7f06000a +int color abc_primary_text_material_dark 0x7f06000b +int color abc_primary_text_material_light 0x7f06000c +int color abc_search_url_text 0x7f06000d +int color abc_search_url_text_normal 0x7f06000e +int color abc_search_url_text_pressed 0x7f06000f +int color abc_search_url_text_selected 0x7f060010 +int color abc_secondary_text_material_dark 0x7f060011 +int color abc_secondary_text_material_light 0x7f060012 +int color abc_tint_btn_checkable 0x7f060013 +int color abc_tint_default 0x7f060014 +int color abc_tint_edittext 0x7f060015 +int color abc_tint_seek_thumb 0x7f060016 +int color abc_tint_spinner 0x7f060017 +int color abc_tint_switch_track 0x7f060018 +int color accent_material_dark 0x7f060019 +int color accent_material_light 0x7f06001a +int color background_floating_material_dark 0x7f06001b +int color background_floating_material_light 0x7f06001c +int color background_material_dark 0x7f06001d +int color background_material_light 0x7f06001e +int color bright_foreground_disabled_material_dark 0x7f06001f +int color bright_foreground_disabled_material_light 0x7f060020 +int color bright_foreground_inverse_material_dark 0x7f060021 +int color bright_foreground_inverse_material_light 0x7f060022 +int color bright_foreground_material_dark 0x7f060023 +int color bright_foreground_material_light 0x7f060024 +int color button_material_dark 0x7f060025 +int color button_material_light 0x7f060026 +int color catalyst_redbox_background 0x7f060027 +int color common_google_signin_btn_text_dark 0x7f060028 +int color common_google_signin_btn_text_dark_default 0x7f060029 +int color common_google_signin_btn_text_dark_disabled 0x7f06002a +int color common_google_signin_btn_text_dark_focused 0x7f06002b +int color common_google_signin_btn_text_dark_pressed 0x7f06002c +int color common_google_signin_btn_text_light 0x7f06002d +int color common_google_signin_btn_text_light_default 0x7f06002e +int color common_google_signin_btn_text_light_disabled 0x7f06002f +int color common_google_signin_btn_text_light_focused 0x7f060030 +int color common_google_signin_btn_text_light_pressed 0x7f060031 +int color common_google_signin_btn_tint 0x7f060032 +int color dim_foreground_disabled_material_dark 0x7f060033 +int color dim_foreground_disabled_material_light 0x7f060034 +int color dim_foreground_material_dark 0x7f060035 +int color dim_foreground_material_light 0x7f060036 +int color error_color_material_dark 0x7f060037 +int color error_color_material_light 0x7f060038 +int color foreground_material_dark 0x7f060039 +int color foreground_material_light 0x7f06003a +int color highlighted_text_material_dark 0x7f06003b +int color highlighted_text_material_light 0x7f06003c +int color material_blue_grey_800 0x7f06003d +int color material_blue_grey_900 0x7f06003e +int color material_blue_grey_950 0x7f06003f +int color material_deep_teal_200 0x7f060040 +int color material_deep_teal_500 0x7f060041 +int color material_grey_100 0x7f060042 +int color material_grey_300 0x7f060043 +int color material_grey_50 0x7f060044 +int color material_grey_600 0x7f060045 +int color material_grey_800 0x7f060046 +int color material_grey_850 0x7f060047 +int color material_grey_900 0x7f060048 +int color notification_action_color_filter 0x7f060049 +int color notification_icon_bg_color 0x7f06004a +int color notification_material_background_media_default_color 0x7f06004b +int color primary_dark_material_dark 0x7f06004c +int color primary_dark_material_light 0x7f06004d +int color primary_material_dark 0x7f06004e +int color primary_material_light 0x7f06004f +int color primary_text_default_material_dark 0x7f060050 +int color primary_text_default_material_light 0x7f060051 +int color primary_text_disabled_material_dark 0x7f060052 +int color primary_text_disabled_material_light 0x7f060053 +int color ripple_material_dark 0x7f060054 +int color ripple_material_light 0x7f060055 +int color secondary_text_default_material_dark 0x7f060056 +int color secondary_text_default_material_light 0x7f060057 +int color secondary_text_disabled_material_dark 0x7f060058 +int color secondary_text_disabled_material_light 0x7f060059 +int color switch_thumb_disabled_material_dark 0x7f06005a +int color switch_thumb_disabled_material_light 0x7f06005b +int color switch_thumb_material_dark 0x7f06005c +int color switch_thumb_material_light 0x7f06005d +int color switch_thumb_normal_material_dark 0x7f06005e +int color switch_thumb_normal_material_light 0x7f06005f +int color tooltip_background_dark 0x7f060060 +int color tooltip_background_light 0x7f060061 +int dimen abc_action_bar_content_inset_material 0x7f070001 +int dimen abc_action_bar_content_inset_with_nav 0x7f070002 +int dimen abc_action_bar_default_height_material 0x7f070003 +int dimen abc_action_bar_default_padding_end_material 0x7f070004 +int dimen abc_action_bar_default_padding_start_material 0x7f070005 +int dimen abc_action_bar_elevation_material 0x7f070006 +int dimen abc_action_bar_icon_vertical_padding_material 0x7f070007 +int dimen abc_action_bar_overflow_padding_end_material 0x7f070008 +int dimen abc_action_bar_overflow_padding_start_material 0x7f070009 +int dimen abc_action_bar_stacked_max_height 0x7f07000a +int dimen abc_action_bar_stacked_tab_max_width 0x7f07000b +int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f07000c +int dimen abc_action_bar_subtitle_top_margin_material 0x7f07000d +int dimen abc_action_button_min_height_material 0x7f07000e +int dimen abc_action_button_min_width_material 0x7f07000f +int dimen abc_action_button_min_width_overflow_material 0x7f070010 +int dimen abc_alert_dialog_button_bar_height 0x7f070011 +int dimen abc_alert_dialog_button_dimen 0x7f070012 +int dimen abc_button_inset_horizontal_material 0x7f070013 +int dimen abc_button_inset_vertical_material 0x7f070014 +int dimen abc_button_padding_horizontal_material 0x7f070015 +int dimen abc_button_padding_vertical_material 0x7f070016 +int dimen abc_cascading_menus_min_smallest_width 0x7f070017 +int dimen abc_config_prefDialogWidth 0x7f070018 +int dimen abc_control_corner_material 0x7f070019 +int dimen abc_control_inset_material 0x7f07001a +int dimen abc_control_padding_material 0x7f07001b +int dimen abc_dialog_corner_radius_material 0x7f07001c +int dimen abc_dialog_fixed_height_major 0x7f07001d +int dimen abc_dialog_fixed_height_minor 0x7f07001e +int dimen abc_dialog_fixed_width_major 0x7f07001f +int dimen abc_dialog_fixed_width_minor 0x7f070020 +int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f070021 +int dimen abc_dialog_list_padding_top_no_title 0x7f070022 +int dimen abc_dialog_min_width_major 0x7f070023 +int dimen abc_dialog_min_width_minor 0x7f070024 +int dimen abc_dialog_padding_material 0x7f070025 +int dimen abc_dialog_padding_top_material 0x7f070026 +int dimen abc_dialog_title_divider_material 0x7f070027 +int dimen abc_disabled_alpha_material_dark 0x7f070028 +int dimen abc_disabled_alpha_material_light 0x7f070029 +int dimen abc_dropdownitem_icon_width 0x7f07002a +int dimen abc_dropdownitem_text_padding_left 0x7f07002b +int dimen abc_dropdownitem_text_padding_right 0x7f07002c +int dimen abc_edit_text_inset_bottom_material 0x7f07002d +int dimen abc_edit_text_inset_horizontal_material 0x7f07002e +int dimen abc_edit_text_inset_top_material 0x7f07002f +int dimen abc_floating_window_z 0x7f070030 +int dimen abc_list_item_padding_horizontal_material 0x7f070031 +int dimen abc_panel_menu_list_width 0x7f070032 +int dimen abc_progress_bar_height_material 0x7f070033 +int dimen abc_search_view_preferred_height 0x7f070034 +int dimen abc_search_view_preferred_width 0x7f070035 +int dimen abc_seekbar_track_background_height_material 0x7f070036 +int dimen abc_seekbar_track_progress_height_material 0x7f070037 +int dimen abc_select_dialog_padding_start_material 0x7f070038 +int dimen abc_switch_padding 0x7f070039 +int dimen abc_text_size_body_1_material 0x7f07003a +int dimen abc_text_size_body_2_material 0x7f07003b +int dimen abc_text_size_button_material 0x7f07003c +int dimen abc_text_size_caption_material 0x7f07003d +int dimen abc_text_size_display_1_material 0x7f07003e +int dimen abc_text_size_display_2_material 0x7f07003f +int dimen abc_text_size_display_3_material 0x7f070040 +int dimen abc_text_size_display_4_material 0x7f070041 +int dimen abc_text_size_headline_material 0x7f070042 +int dimen abc_text_size_large_material 0x7f070043 +int dimen abc_text_size_medium_material 0x7f070044 +int dimen abc_text_size_menu_header_material 0x7f070045 +int dimen abc_text_size_menu_material 0x7f070046 +int dimen abc_text_size_small_material 0x7f070047 +int dimen abc_text_size_subhead_material 0x7f070048 +int dimen abc_text_size_subtitle_material_toolbar 0x7f070049 +int dimen abc_text_size_title_material 0x7f07004a +int dimen abc_text_size_title_material_toolbar 0x7f07004b +int dimen compat_button_inset_horizontal_material 0x7f07004c +int dimen compat_button_inset_vertical_material 0x7f07004d +int dimen compat_button_padding_horizontal_material 0x7f07004e +int dimen compat_button_padding_vertical_material 0x7f07004f +int dimen compat_control_corner_material 0x7f070050 +int dimen compat_notification_large_icon_max_height 0x7f070051 +int dimen compat_notification_large_icon_max_width 0x7f070052 +int dimen disabled_alpha_material_dark 0x7f070053 +int dimen disabled_alpha_material_light 0x7f070054 +int dimen highlight_alpha_material_colored 0x7f070055 +int dimen highlight_alpha_material_dark 0x7f070056 +int dimen highlight_alpha_material_light 0x7f070057 +int dimen hint_alpha_material_dark 0x7f070058 +int dimen hint_alpha_material_light 0x7f070059 +int dimen hint_pressed_alpha_material_dark 0x7f07005a +int dimen hint_pressed_alpha_material_light 0x7f07005b +int dimen notification_action_icon_size 0x7f07005c +int dimen notification_action_text_size 0x7f07005d +int dimen notification_big_circle_margin 0x7f07005e +int dimen notification_content_margin_start 0x7f07005f +int dimen notification_large_icon_height 0x7f070060 +int dimen notification_large_icon_width 0x7f070061 +int dimen notification_main_column_padding_top 0x7f070062 +int dimen notification_media_narrow_margin 0x7f070063 +int dimen notification_right_icon_size 0x7f070064 +int dimen notification_right_side_padding_top 0x7f070065 +int dimen notification_small_icon_background_padding 0x7f070066 +int dimen notification_small_icon_size_as_large 0x7f070067 +int dimen notification_subtext_size 0x7f070068 +int dimen notification_top_pad 0x7f070069 +int dimen notification_top_pad_large_text 0x7f07006a +int dimen subtitle_corner_radius 0x7f07006b +int dimen subtitle_outline_width 0x7f07006c +int dimen subtitle_shadow_offset 0x7f07006d +int dimen subtitle_shadow_radius 0x7f07006e +int dimen tooltip_corner_radius 0x7f07006f +int dimen tooltip_horizontal_padding 0x7f070070 +int dimen tooltip_margin 0x7f070071 +int dimen tooltip_precise_anchor_extra_offset 0x7f070072 +int dimen tooltip_precise_anchor_threshold 0x7f070073 +int dimen tooltip_vertical_padding 0x7f070074 +int dimen tooltip_y_offset_non_touch 0x7f070075 +int dimen tooltip_y_offset_touch 0x7f070076 +int drawable abc_ab_share_pack_mtrl_alpha 0x7f080001 +int drawable abc_action_bar_item_background_material 0x7f080002 +int drawable abc_btn_borderless_material 0x7f080003 +int drawable abc_btn_check_material 0x7f080004 +int drawable abc_btn_check_to_on_mtrl_000 0x7f080005 +int drawable abc_btn_check_to_on_mtrl_015 0x7f080006 +int drawable abc_btn_colored_material 0x7f080007 +int drawable abc_btn_default_mtrl_shape 0x7f080008 +int drawable abc_btn_radio_material 0x7f080009 +int drawable abc_btn_radio_to_on_mtrl_000 0x7f08000a +int drawable abc_btn_radio_to_on_mtrl_015 0x7f08000b +int drawable abc_btn_switch_to_on_mtrl_00001 0x7f08000c +int drawable abc_btn_switch_to_on_mtrl_00012 0x7f08000d +int drawable abc_cab_background_internal_bg 0x7f08000e +int drawable abc_cab_background_top_material 0x7f08000f +int drawable abc_cab_background_top_mtrl_alpha 0x7f080010 +int drawable abc_control_background_material 0x7f080011 +int drawable abc_dialog_material_background 0x7f080012 +int drawable abc_edit_text_material 0x7f080013 +int drawable abc_ic_ab_back_material 0x7f080014 +int drawable abc_ic_arrow_drop_right_black_24dp 0x7f080015 +int drawable abc_ic_clear_material 0x7f080016 +int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f080017 +int drawable abc_ic_go_search_api_material 0x7f080018 +int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f080019 +int drawable abc_ic_menu_cut_mtrl_alpha 0x7f08001a +int drawable abc_ic_menu_overflow_material 0x7f08001b +int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f08001c +int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f08001d +int drawable abc_ic_menu_share_mtrl_alpha 0x7f08001e +int drawable abc_ic_search_api_material 0x7f08001f +int drawable abc_ic_star_black_16dp 0x7f080020 +int drawable abc_ic_star_black_36dp 0x7f080021 +int drawable abc_ic_star_black_48dp 0x7f080022 +int drawable abc_ic_star_half_black_16dp 0x7f080023 +int drawable abc_ic_star_half_black_36dp 0x7f080024 +int drawable abc_ic_star_half_black_48dp 0x7f080025 +int drawable abc_ic_voice_search_api_material 0x7f080026 +int drawable abc_item_background_holo_dark 0x7f080027 +int drawable abc_item_background_holo_light 0x7f080028 +int drawable abc_list_divider_material 0x7f080029 +int drawable abc_list_divider_mtrl_alpha 0x7f08002a +int drawable abc_list_focused_holo 0x7f08002b +int drawable abc_list_longpressed_holo 0x7f08002c +int drawable abc_list_pressed_holo_dark 0x7f08002d +int drawable abc_list_pressed_holo_light 0x7f08002e +int drawable abc_list_selector_background_transition_holo_dark 0x7f08002f +int drawable abc_list_selector_background_transition_holo_light 0x7f080030 +int drawable abc_list_selector_disabled_holo_dark 0x7f080031 +int drawable abc_list_selector_disabled_holo_light 0x7f080032 +int drawable abc_list_selector_holo_dark 0x7f080033 +int drawable abc_list_selector_holo_light 0x7f080034 +int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f080035 +int drawable abc_popup_background_mtrl_mult 0x7f080036 +int drawable abc_ratingbar_indicator_material 0x7f080037 +int drawable abc_ratingbar_material 0x7f080038 +int drawable abc_ratingbar_small_material 0x7f080039 +int drawable abc_scrubber_control_off_mtrl_alpha 0x7f08003a +int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f08003b +int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f08003c +int drawable abc_scrubber_primary_mtrl_alpha 0x7f08003d +int drawable abc_scrubber_track_mtrl_alpha 0x7f08003e +int drawable abc_seekbar_thumb_material 0x7f08003f +int drawable abc_seekbar_tick_mark_material 0x7f080040 +int drawable abc_seekbar_track_material 0x7f080041 +int drawable abc_spinner_mtrl_am_alpha 0x7f080042 +int drawable abc_spinner_textfield_background_material 0x7f080043 +int drawable abc_switch_thumb_material 0x7f080044 +int drawable abc_switch_track_mtrl_alpha 0x7f080045 +int drawable abc_tab_indicator_material 0x7f080046 +int drawable abc_tab_indicator_mtrl_alpha 0x7f080047 +int drawable abc_text_cursor_material 0x7f080048 +int drawable abc_text_select_handle_left_mtrl_dark 0x7f080049 +int drawable abc_text_select_handle_left_mtrl_light 0x7f08004a +int drawable abc_text_select_handle_middle_mtrl_dark 0x7f08004b +int drawable abc_text_select_handle_middle_mtrl_light 0x7f08004c +int drawable abc_text_select_handle_right_mtrl_dark 0x7f08004d +int drawable abc_text_select_handle_right_mtrl_light 0x7f08004e +int drawable abc_textfield_activated_mtrl_alpha 0x7f08004f +int drawable abc_textfield_default_mtrl_alpha 0x7f080050 +int drawable abc_textfield_search_activated_mtrl_alpha 0x7f080051 +int drawable abc_textfield_search_default_mtrl_alpha 0x7f080052 +int drawable abc_textfield_search_material 0x7f080053 +int drawable abc_vector_test 0x7f080054 +int drawable amu_bubble_mask 0x7f080055 +int drawable amu_bubble_shadow 0x7f080056 +int drawable common_full_open_on_phone 0x7f080057 +int drawable common_google_signin_btn_icon_dark 0x7f080058 +int drawable common_google_signin_btn_icon_dark_disabled 0x7f080059 +int drawable common_google_signin_btn_icon_dark_focused 0x7f08005a +int drawable common_google_signin_btn_icon_dark_normal 0x7f08005b +int drawable common_google_signin_btn_icon_dark_normal_background 0x7f08005c +int drawable common_google_signin_btn_icon_dark_pressed 0x7f08005d +int drawable common_google_signin_btn_icon_disabled 0x7f08005e +int drawable common_google_signin_btn_icon_light 0x7f08005f +int drawable common_google_signin_btn_icon_light_disabled 0x7f080060 +int drawable common_google_signin_btn_icon_light_focused 0x7f080061 +int drawable common_google_signin_btn_icon_light_normal 0x7f080062 +int drawable common_google_signin_btn_icon_light_normal_background 0x7f080063 +int drawable common_google_signin_btn_icon_light_pressed 0x7f080064 +int drawable common_google_signin_btn_text_dark 0x7f080065 +int drawable common_google_signin_btn_text_dark_disabled 0x7f080066 +int drawable common_google_signin_btn_text_dark_focused 0x7f080067 +int drawable common_google_signin_btn_text_dark_normal 0x7f080068 +int drawable common_google_signin_btn_text_dark_normal_background 0x7f080069 +int drawable common_google_signin_btn_text_dark_pressed 0x7f08006a +int drawable common_google_signin_btn_text_disabled 0x7f08006b +int drawable common_google_signin_btn_text_light 0x7f08006c +int drawable common_google_signin_btn_text_light_disabled 0x7f08006d +int drawable common_google_signin_btn_text_light_focused 0x7f08006e +int drawable common_google_signin_btn_text_light_normal 0x7f08006f +int drawable common_google_signin_btn_text_light_normal_background 0x7f080070 +int drawable common_google_signin_btn_text_light_pressed 0x7f080071 +int drawable common_ic_googleplayservices 0x7f080072 +int drawable googleg_disabled_color_18 0x7f080073 +int drawable googleg_standard_color_18 0x7f080074 +int drawable notification_action_background 0x7f080075 +int drawable notification_bg 0x7f080076 +int drawable notification_bg_low 0x7f080077 +int drawable notification_bg_low_normal 0x7f080078 +int drawable notification_bg_low_pressed 0x7f080079 +int drawable notification_bg_normal 0x7f08007a +int drawable notification_bg_normal_pressed 0x7f08007b +int drawable notification_icon_background 0x7f08007c +int drawable notification_template_icon_bg 0x7f08007d +int drawable notification_template_icon_low_bg 0x7f08007e +int drawable notification_tile_bg 0x7f08007f +int drawable notify_panel_notification_icon_bg 0x7f080080 +int drawable redbox_top_border_background 0x7f080081 +int drawable tooltip_frame_dark 0x7f080082 +int drawable tooltip_frame_light 0x7f080083 +int id accessibility_hint 0x7f0b0001 +int id accessibility_role 0x7f0b0002 +int id action0 0x7f0b0003 +int id action_bar 0x7f0b0004 +int id action_bar_activity_content 0x7f0b0005 +int id action_bar_container 0x7f0b0006 +int id action_bar_root 0x7f0b0007 +int id action_bar_spinner 0x7f0b0008 +int id action_bar_subtitle 0x7f0b0009 +int id action_bar_title 0x7f0b000a +int id action_container 0x7f0b000b +int id action_context_bar 0x7f0b000c +int id action_divider 0x7f0b000d +int id action_image 0x7f0b000e +int id action_menu_divider 0x7f0b000f +int id action_menu_presenter 0x7f0b0010 +int id action_mode_bar 0x7f0b0011 +int id action_mode_bar_stub 0x7f0b0012 +int id action_mode_close_button 0x7f0b0013 +int id action_text 0x7f0b0014 +int id actions 0x7f0b0015 +int id activity_chooser_view_content 0x7f0b0016 +int id add 0x7f0b0017 +int id adjust_height 0x7f0b0018 +int id adjust_width 0x7f0b0019 +int id alertTitle 0x7f0b001a +int id amu_text 0x7f0b001b +int id async 0x7f0b001c +int id auto 0x7f0b001d +int id blocking 0x7f0b001e +int id bottom 0x7f0b001f +int id buttonPanel 0x7f0b0020 +int id cancel_action 0x7f0b0021 +int id catalyst_redbox_title 0x7f0b0022 +int id center 0x7f0b0023 +int id centerCrop 0x7f0b0024 +int id centerInside 0x7f0b0025 +int id checkbox 0x7f0b0026 +int id chronometer 0x7f0b0027 +int id content 0x7f0b0028 +int id contentPanel 0x7f0b0029 +int id custom 0x7f0b002a +int id customPanel 0x7f0b002b +int id dark 0x7f0b002c +int id decor_content_parent 0x7f0b002d +int id default_activity_button 0x7f0b002e +int id edit_query 0x7f0b002f +int id end 0x7f0b0030 +int id end_padder 0x7f0b0031 +int id expand_activities_button 0x7f0b0032 +int id expanded_menu 0x7f0b0033 +int id fitBottomStart 0x7f0b0034 +int id fitCenter 0x7f0b0035 +int id fitEnd 0x7f0b0036 +int id fitStart 0x7f0b0037 +int id fitXY 0x7f0b0038 +int id focusCrop 0x7f0b0039 +int id forever 0x7f0b003a +int id fps_text 0x7f0b003b +int id group_divider 0x7f0b003c +int id home 0x7f0b003d +int id hybrid 0x7f0b003e +int id icon 0x7f0b003f +int id icon_group 0x7f0b0040 +int id icon_only 0x7f0b0041 +int id image 0x7f0b0042 +int id info 0x7f0b0043 +int id italic 0x7f0b0044 +int id left 0x7f0b0045 +int id light 0x7f0b0046 +int id line1 0x7f0b0047 +int id line3 0x7f0b0048 +int id listMode 0x7f0b0049 +int id list_item 0x7f0b004a +int id media_actions 0x7f0b004b +int id message 0x7f0b004c +int id multiply 0x7f0b004d +int id none 0x7f0b004e +int id normal 0x7f0b004f +int id notification_background 0x7f0b0050 +int id notification_main_column 0x7f0b0051 +int id notification_main_column_container 0x7f0b0052 +int id parentPanel 0x7f0b0053 +int id progress_circular 0x7f0b0054 +int id progress_horizontal 0x7f0b0055 +int id radio 0x7f0b0056 +int id react_test_id 0x7f0b0057 +int id right 0x7f0b0058 +int id right_icon 0x7f0b0059 +int id right_side 0x7f0b005a +int id rn_frame_file 0x7f0b005b +int id rn_frame_method 0x7f0b005c +int id rn_redbox_copy_button 0x7f0b005d +int id rn_redbox_dismiss_button 0x7f0b005e +int id rn_redbox_line_separator 0x7f0b005f +int id rn_redbox_loading_indicator 0x7f0b0060 +int id rn_redbox_reload_button 0x7f0b0061 +int id rn_redbox_report_button 0x7f0b0062 +int id rn_redbox_report_label 0x7f0b0063 +int id rn_redbox_stack 0x7f0b0064 +int id satellite 0x7f0b0065 +int id screen 0x7f0b0066 +int id scrollIndicatorDown 0x7f0b0067 +int id scrollIndicatorUp 0x7f0b0068 +int id scrollView 0x7f0b0069 +int id search_badge 0x7f0b006a +int id search_bar 0x7f0b006b +int id search_button 0x7f0b006c +int id search_close_btn 0x7f0b006d +int id search_edit_frame 0x7f0b006e +int id search_go_btn 0x7f0b006f +int id search_mag_icon 0x7f0b0070 +int id search_plate 0x7f0b0071 +int id search_src_text 0x7f0b0072 +int id search_voice_btn 0x7f0b0073 +int id select_dialog_listview 0x7f0b0074 +int id shortcut 0x7f0b0075 +int id spacer 0x7f0b0076 +int id split_action_bar 0x7f0b0077 +int id src_atop 0x7f0b0078 +int id src_in 0x7f0b0079 +int id src_over 0x7f0b007a +int id standard 0x7f0b007b +int id start 0x7f0b007c +int id status_bar_latest_event_content 0x7f0b007d +int id submenuarrow 0x7f0b007e +int id submit_area 0x7f0b007f +int id tabMode 0x7f0b0080 +int id tag_transition_group 0x7f0b0081 +int id tag_unhandled_key_event_manager 0x7f0b0082 +int id tag_unhandled_key_listeners 0x7f0b0083 +int id terrain 0x7f0b0084 +int id text 0x7f0b0085 +int id text2 0x7f0b0086 +int id textSpacerNoButtons 0x7f0b0087 +int id textSpacerNoTitle 0x7f0b0088 +int id time 0x7f0b0089 +int id title 0x7f0b008a +int id titleDividerNoCustom 0x7f0b008b +int id title_template 0x7f0b008c +int id top 0x7f0b008d +int id topPanel 0x7f0b008e +int id uniform 0x7f0b008f +int id up 0x7f0b0090 +int id view_tag_instance_handle 0x7f0b0091 +int id view_tag_native_id 0x7f0b0092 +int id webview 0x7f0b0093 +int id wide 0x7f0b0094 +int id window 0x7f0b0095 +int id wrap_content 0x7f0b0096 +int integer abc_config_activityDefaultDur 0x7f0c0001 +int integer abc_config_activityShortDur 0x7f0c0002 +int integer cancel_button_image_alpha 0x7f0c0003 +int integer config_tooltipAnimTime 0x7f0c0004 +int integer google_play_services_version 0x7f0c0005 +int integer status_bar_notification_info_maxnum 0x7f0c0006 +int layout abc_action_bar_title_item 0x7f0e0001 +int layout abc_action_bar_up_container 0x7f0e0002 +int layout abc_action_menu_item_layout 0x7f0e0003 +int layout abc_action_menu_layout 0x7f0e0004 +int layout abc_action_mode_bar 0x7f0e0005 +int layout abc_action_mode_close_item_material 0x7f0e0006 +int layout abc_activity_chooser_view 0x7f0e0007 +int layout abc_activity_chooser_view_list_item 0x7f0e0008 +int layout abc_alert_dialog_button_bar_material 0x7f0e0009 +int layout abc_alert_dialog_material 0x7f0e000a +int layout abc_alert_dialog_title_material 0x7f0e000b +int layout abc_cascading_menu_item_layout 0x7f0e000c +int layout abc_dialog_title_material 0x7f0e000d +int layout abc_expanded_menu_layout 0x7f0e000e +int layout abc_list_menu_item_checkbox 0x7f0e000f +int layout abc_list_menu_item_icon 0x7f0e0010 +int layout abc_list_menu_item_layout 0x7f0e0011 +int layout abc_list_menu_item_radio 0x7f0e0012 +int layout abc_popup_menu_header_item_layout 0x7f0e0013 +int layout abc_popup_menu_item_layout 0x7f0e0014 +int layout abc_screen_content_include 0x7f0e0015 +int layout abc_screen_simple 0x7f0e0016 +int layout abc_screen_simple_overlay_action_mode 0x7f0e0017 +int layout abc_screen_toolbar 0x7f0e0018 +int layout abc_search_dropdown_item_icons_2line 0x7f0e0019 +int layout abc_search_view 0x7f0e001a +int layout abc_select_dialog_material 0x7f0e001b +int layout abc_tooltip 0x7f0e001c +int layout amu_info_window 0x7f0e001d +int layout amu_text_bubble 0x7f0e001e +int layout amu_webview 0x7f0e001f +int layout dev_loading_view 0x7f0e0020 +int layout fps_view 0x7f0e0021 +int layout notification_action 0x7f0e0022 +int layout notification_action_tombstone 0x7f0e0023 +int layout notification_media_action 0x7f0e0024 +int layout notification_media_cancel_action 0x7f0e0025 +int layout notification_template_big_media 0x7f0e0026 +int layout notification_template_big_media_custom 0x7f0e0027 +int layout notification_template_big_media_narrow 0x7f0e0028 +int layout notification_template_big_media_narrow_custom 0x7f0e0029 +int layout notification_template_custom_big 0x7f0e002a +int layout notification_template_icon_group 0x7f0e002b +int layout notification_template_lines_media 0x7f0e002c +int layout notification_template_media 0x7f0e002d +int layout notification_template_media_custom 0x7f0e002e +int layout notification_template_part_chronometer 0x7f0e002f +int layout notification_template_part_time 0x7f0e0030 +int layout redbox_item_frame 0x7f0e0031 +int layout redbox_item_title 0x7f0e0032 +int layout redbox_view 0x7f0e0033 +int layout select_dialog_item_material 0x7f0e0034 +int layout select_dialog_multichoice_material 0x7f0e0035 +int layout select_dialog_singlechoice_material 0x7f0e0036 +int layout support_simple_spinner_dropdown_item 0x7f0e0037 +int raw amu_ballon_gx_prefix 0x7f130001 +int raw amu_basic_folder 0x7f130002 +int raw amu_basic_placemark 0x7f130003 +int raw amu_cdata 0x7f130004 +int raw amu_default_balloon 0x7f130005 +int raw amu_document_nest 0x7f130006 +int raw amu_draw_order_ground_overlay 0x7f130007 +int raw amu_extended_data 0x7f130008 +int raw amu_ground_overlay 0x7f130009 +int raw amu_ground_overlay_color 0x7f13000a +int raw amu_inline_style 0x7f13000b +int raw amu_multigeometry_placemarks 0x7f13000c +int raw amu_multiple_placemarks 0x7f13000d +int raw amu_nested_folders 0x7f13000e +int raw amu_nested_multigeometry 0x7f13000f +int raw amu_poly_style_boolean_alpha 0x7f130010 +int raw amu_poly_style_boolean_numeric 0x7f130011 +int raw amu_unknwown_folder 0x7f130012 +int raw amu_unsupported 0x7f130013 +int raw amu_visibility_ground_overlay 0x7f130014 +int string abc_action_bar_home_description 0x7f140001 +int string abc_action_bar_up_description 0x7f140002 +int string abc_action_menu_overflow_description 0x7f140003 +int string abc_action_mode_done 0x7f140004 +int string abc_activity_chooser_view_see_all 0x7f140005 +int string abc_activitychooserview_choose_application 0x7f140006 +int string abc_capital_off 0x7f140007 +int string abc_capital_on 0x7f140008 +int string abc_font_family_body_1_material 0x7f140009 +int string abc_font_family_body_2_material 0x7f14000a +int string abc_font_family_button_material 0x7f14000b +int string abc_font_family_caption_material 0x7f14000c +int string abc_font_family_display_1_material 0x7f14000d +int string abc_font_family_display_2_material 0x7f14000e +int string abc_font_family_display_3_material 0x7f14000f +int string abc_font_family_display_4_material 0x7f140010 +int string abc_font_family_headline_material 0x7f140011 +int string abc_font_family_menu_material 0x7f140012 +int string abc_font_family_subhead_material 0x7f140013 +int string abc_font_family_title_material 0x7f140014 +int string abc_menu_alt_shortcut_label 0x7f140015 +int string abc_menu_ctrl_shortcut_label 0x7f140016 +int string abc_menu_delete_shortcut_label 0x7f140017 +int string abc_menu_enter_shortcut_label 0x7f140018 +int string abc_menu_function_shortcut_label 0x7f140019 +int string abc_menu_meta_shortcut_label 0x7f14001a +int string abc_menu_shift_shortcut_label 0x7f14001b +int string abc_menu_space_shortcut_label 0x7f14001c +int string abc_menu_sym_shortcut_label 0x7f14001d +int string abc_prepend_shortcut_label 0x7f14001e +int string abc_search_hint 0x7f14001f +int string abc_searchview_description_clear 0x7f140020 +int string abc_searchview_description_query 0x7f140021 +int string abc_searchview_description_search 0x7f140022 +int string abc_searchview_description_submit 0x7f140023 +int string abc_searchview_description_voice 0x7f140024 +int string abc_shareactionprovider_share_with 0x7f140025 +int string abc_shareactionprovider_share_with_application 0x7f140026 +int string abc_toolbar_collapse_description 0x7f140027 +int string adjustable_description 0x7f140028 +int string catalyst_copy_button 0x7f140029 +int string catalyst_debugjs 0x7f14002a +int string catalyst_debugjs_nuclide 0x7f14002b +int string catalyst_debugjs_nuclide_failure 0x7f14002c +int string catalyst_debugjs_off 0x7f14002d +int string catalyst_dismiss_button 0x7f14002e +int string catalyst_element_inspector 0x7f14002f +int string catalyst_heap_capture 0x7f140030 +int string catalyst_hot_module_replacement 0x7f140031 +int string catalyst_hot_module_replacement_off 0x7f140032 +int string catalyst_jsload_error 0x7f140033 +int string catalyst_live_reload 0x7f140034 +int string catalyst_live_reload_off 0x7f140035 +int string catalyst_loading_from_url 0x7f140036 +int string catalyst_perf_monitor 0x7f140037 +int string catalyst_perf_monitor_off 0x7f140038 +int string catalyst_poke_sampling_profiler 0x7f140039 +int string catalyst_reload_button 0x7f14003a +int string catalyst_reloadjs 0x7f14003b +int string catalyst_remotedbg_error 0x7f14003c +int string catalyst_remotedbg_message 0x7f14003d +int string catalyst_report_button 0x7f14003e +int string catalyst_settings 0x7f14003f +int string catalyst_settings_title 0x7f140040 +int string common_google_play_services_enable_button 0x7f140041 +int string common_google_play_services_enable_text 0x7f140042 +int string common_google_play_services_enable_title 0x7f140043 +int string common_google_play_services_install_button 0x7f140044 +int string common_google_play_services_install_text 0x7f140045 +int string common_google_play_services_install_text_phone 0x7f140046 +int string common_google_play_services_install_text_tablet 0x7f140047 +int string common_google_play_services_install_title 0x7f140048 +int string common_google_play_services_notification_channel_name 0x7f140049 +int string common_google_play_services_notification_ticker 0x7f14004a +int string common_google_play_services_unknown_issue 0x7f14004b +int string common_google_play_services_unsupported_text 0x7f14004c +int string common_google_play_services_unsupported_title 0x7f14004d +int string common_google_play_services_update_button 0x7f14004e +int string common_google_play_services_update_text 0x7f14004f +int string common_google_play_services_update_title 0x7f140050 +int string common_google_play_services_updating_text 0x7f140051 +int string common_google_play_services_updating_title 0x7f140052 +int string common_google_play_services_wear_update_text 0x7f140053 +int string common_open_on_phone 0x7f140054 +int string common_signin_button_text 0x7f140055 +int string common_signin_button_text_long 0x7f140056 +int string header_description 0x7f140057 +int string image_button_description 0x7f140058 +int string image_description 0x7f140059 +int string link_description 0x7f14005a +int string search_description 0x7f14005b +int string search_menu_title 0x7f14005c +int string status_bar_notification_info_overflow 0x7f14005d +int style AlertDialog_AppCompat 0x7f150001 +int style AlertDialog_AppCompat_Light 0x7f150002 +int style Animation_AppCompat_Dialog 0x7f150003 +int style Animation_AppCompat_DropDownUp 0x7f150004 +int style Animation_AppCompat_Tooltip 0x7f150005 +int style Animation_Catalyst_RedBox 0x7f150006 +int style Base_AlertDialog_AppCompat 0x7f150007 +int style Base_AlertDialog_AppCompat_Light 0x7f150008 +int style Base_Animation_AppCompat_Dialog 0x7f150009 +int style Base_Animation_AppCompat_DropDownUp 0x7f15000a +int style Base_Animation_AppCompat_Tooltip 0x7f15000b +int style Base_DialogWindowTitleBackground_AppCompat 0x7f15000c +int style Base_DialogWindowTitle_AppCompat 0x7f15000d +int style Base_TextAppearance_AppCompat 0x7f15000e +int style Base_TextAppearance_AppCompat_Body1 0x7f15000f +int style Base_TextAppearance_AppCompat_Body2 0x7f150010 +int style Base_TextAppearance_AppCompat_Button 0x7f150011 +int style Base_TextAppearance_AppCompat_Caption 0x7f150012 +int style Base_TextAppearance_AppCompat_Display1 0x7f150013 +int style Base_TextAppearance_AppCompat_Display2 0x7f150014 +int style Base_TextAppearance_AppCompat_Display3 0x7f150015 +int style Base_TextAppearance_AppCompat_Display4 0x7f150016 +int style Base_TextAppearance_AppCompat_Headline 0x7f150017 +int style Base_TextAppearance_AppCompat_Inverse 0x7f150018 +int style Base_TextAppearance_AppCompat_Large 0x7f150019 +int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f15001a +int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f15001b +int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f15001c +int style Base_TextAppearance_AppCompat_Medium 0x7f15001d +int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f15001e +int style Base_TextAppearance_AppCompat_Menu 0x7f15001f +int style Base_TextAppearance_AppCompat_SearchResult 0x7f150020 +int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f150021 +int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f150022 +int style Base_TextAppearance_AppCompat_Small 0x7f150023 +int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f150024 +int style Base_TextAppearance_AppCompat_Subhead 0x7f150025 +int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f150026 +int style Base_TextAppearance_AppCompat_Title 0x7f150027 +int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f150028 +int style Base_TextAppearance_AppCompat_Tooltip 0x7f150029 +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f15002a +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f15002b +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f15002c +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f15002d +int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f15002e +int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f15002f +int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f150030 +int style Base_TextAppearance_AppCompat_Widget_Button 0x7f150031 +int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f150032 +int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f150033 +int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f150034 +int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f150035 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f150036 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f150037 +int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f150038 +int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f150039 +int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f15003a +int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f15003b +int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f15003c +int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f15003d +int style Base_ThemeOverlay_AppCompat 0x7f15003e +int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f15003f +int style Base_ThemeOverlay_AppCompat_Dark 0x7f150040 +int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150041 +int style Base_ThemeOverlay_AppCompat_Dialog 0x7f150042 +int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f150043 +int style Base_ThemeOverlay_AppCompat_Light 0x7f150044 +int style Base_Theme_AppCompat 0x7f150045 +int style Base_Theme_AppCompat_CompactMenu 0x7f150046 +int style Base_Theme_AppCompat_Dialog 0x7f150047 +int style Base_Theme_AppCompat_DialogWhenLarge 0x7f150048 +int style Base_Theme_AppCompat_Dialog_Alert 0x7f150049 +int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f15004a +int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f15004b +int style Base_Theme_AppCompat_Light 0x7f15004c +int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f15004d +int style Base_Theme_AppCompat_Light_Dialog 0x7f15004e +int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f15004f +int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f150050 +int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f150051 +int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f150052 +int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f150053 +int style Base_V21_Theme_AppCompat 0x7f150054 +int style Base_V21_Theme_AppCompat_Dialog 0x7f150055 +int style Base_V21_Theme_AppCompat_Light 0x7f150056 +int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f150057 +int style Base_V22_Theme_AppCompat 0x7f150058 +int style Base_V22_Theme_AppCompat_Light 0x7f150059 +int style Base_V23_Theme_AppCompat 0x7f15005a +int style Base_V23_Theme_AppCompat_Light 0x7f15005b +int style Base_V26_Theme_AppCompat 0x7f15005c +int style Base_V26_Theme_AppCompat_Light 0x7f15005d +int style Base_V26_Widget_AppCompat_Toolbar 0x7f15005e +int style Base_V28_Theme_AppCompat 0x7f15005f +int style Base_V28_Theme_AppCompat_Light 0x7f150060 +int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f150061 +int style Base_V7_Theme_AppCompat 0x7f150062 +int style Base_V7_Theme_AppCompat_Dialog 0x7f150063 +int style Base_V7_Theme_AppCompat_Light 0x7f150064 +int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f150065 +int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f150066 +int style Base_V7_Widget_AppCompat_EditText 0x7f150067 +int style Base_V7_Widget_AppCompat_Toolbar 0x7f150068 +int style Base_Widget_AppCompat_ActionBar 0x7f150069 +int style Base_Widget_AppCompat_ActionBar_Solid 0x7f15006a +int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f15006b +int style Base_Widget_AppCompat_ActionBar_TabText 0x7f15006c +int style Base_Widget_AppCompat_ActionBar_TabView 0x7f15006d +int style Base_Widget_AppCompat_ActionButton 0x7f15006e +int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f15006f +int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f150070 +int style Base_Widget_AppCompat_ActionMode 0x7f150071 +int style Base_Widget_AppCompat_ActivityChooserView 0x7f150072 +int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f150073 +int style Base_Widget_AppCompat_Button 0x7f150074 +int style Base_Widget_AppCompat_ButtonBar 0x7f150075 +int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f150076 +int style Base_Widget_AppCompat_Button_Borderless 0x7f150077 +int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f150078 +int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150079 +int style Base_Widget_AppCompat_Button_Colored 0x7f15007a +int style Base_Widget_AppCompat_Button_Small 0x7f15007b +int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f15007c +int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f15007d +int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f15007e +int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f15007f +int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f150080 +int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f150081 +int style Base_Widget_AppCompat_EditText 0x7f150082 +int style Base_Widget_AppCompat_ImageButton 0x7f150083 +int style Base_Widget_AppCompat_Light_ActionBar 0x7f150084 +int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f150085 +int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f150086 +int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f150087 +int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150088 +int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f150089 +int style Base_Widget_AppCompat_Light_PopupMenu 0x7f15008a +int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f15008b +int style Base_Widget_AppCompat_ListMenuView 0x7f15008c +int style Base_Widget_AppCompat_ListPopupWindow 0x7f15008d +int style Base_Widget_AppCompat_ListView 0x7f15008e +int style Base_Widget_AppCompat_ListView_DropDown 0x7f15008f +int style Base_Widget_AppCompat_ListView_Menu 0x7f150090 +int style Base_Widget_AppCompat_PopupMenu 0x7f150091 +int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f150092 +int style Base_Widget_AppCompat_PopupWindow 0x7f150093 +int style Base_Widget_AppCompat_ProgressBar 0x7f150094 +int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f150095 +int style Base_Widget_AppCompat_RatingBar 0x7f150096 +int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f150097 +int style Base_Widget_AppCompat_RatingBar_Small 0x7f150098 +int style Base_Widget_AppCompat_SearchView 0x7f150099 +int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f15009a +int style Base_Widget_AppCompat_SeekBar 0x7f15009b +int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f15009c +int style Base_Widget_AppCompat_Spinner 0x7f15009d +int style Base_Widget_AppCompat_Spinner_Underlined 0x7f15009e +int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f15009f +int style Base_Widget_AppCompat_Toolbar 0x7f1500a0 +int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f1500a1 +int style CalendarDatePickerDialog 0x7f1500a2 +int style CalendarDatePickerStyle 0x7f1500a3 +int style ClockTimePickerDialog 0x7f1500a4 +int style ClockTimePickerStyle 0x7f1500a5 +int style DialogAnimationFade 0x7f1500a6 +int style DialogAnimationSlide 0x7f1500a7 +int style Platform_AppCompat 0x7f1500a8 +int style Platform_AppCompat_Light 0x7f1500a9 +int style Platform_ThemeOverlay_AppCompat 0x7f1500aa +int style Platform_ThemeOverlay_AppCompat_Dark 0x7f1500ab +int style Platform_ThemeOverlay_AppCompat_Light 0x7f1500ac +int style Platform_V21_AppCompat 0x7f1500ad +int style Platform_V21_AppCompat_Light 0x7f1500ae +int style Platform_V25_AppCompat 0x7f1500af +int style Platform_V25_AppCompat_Light 0x7f1500b0 +int style Platform_Widget_AppCompat_Spinner 0x7f1500b1 +int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f1500b2 +int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f1500b3 +int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f1500b4 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f1500b5 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f1500b6 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f1500b7 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f1500b8 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f1500b9 +int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f1500ba +int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f1500bb +int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f1500bc +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f1500bd +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f1500be +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f1500bf +int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f1500c0 +int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f1500c1 +int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f1500c2 +int style SpinnerDatePickerDialog 0x7f1500c3 +int style SpinnerDatePickerStyle 0x7f1500c4 +int style SpinnerTimePickerDialog 0x7f1500c5 +int style SpinnerTimePickerStyle 0x7f1500c6 +int style TextAppearance_AppCompat 0x7f1500c7 +int style TextAppearance_AppCompat_Body1 0x7f1500c8 +int style TextAppearance_AppCompat_Body2 0x7f1500c9 +int style TextAppearance_AppCompat_Button 0x7f1500ca +int style TextAppearance_AppCompat_Caption 0x7f1500cb +int style TextAppearance_AppCompat_Display1 0x7f1500cc +int style TextAppearance_AppCompat_Display2 0x7f1500cd +int style TextAppearance_AppCompat_Display3 0x7f1500ce +int style TextAppearance_AppCompat_Display4 0x7f1500cf +int style TextAppearance_AppCompat_Headline 0x7f1500d0 +int style TextAppearance_AppCompat_Inverse 0x7f1500d1 +int style TextAppearance_AppCompat_Large 0x7f1500d2 +int style TextAppearance_AppCompat_Large_Inverse 0x7f1500d3 +int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f1500d4 +int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f1500d5 +int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f1500d6 +int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f1500d7 +int style TextAppearance_AppCompat_Medium 0x7f1500d8 +int style TextAppearance_AppCompat_Medium_Inverse 0x7f1500d9 +int style TextAppearance_AppCompat_Menu 0x7f1500da +int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f1500db +int style TextAppearance_AppCompat_SearchResult_Title 0x7f1500dc +int style TextAppearance_AppCompat_Small 0x7f1500dd +int style TextAppearance_AppCompat_Small_Inverse 0x7f1500de +int style TextAppearance_AppCompat_Subhead 0x7f1500df +int style TextAppearance_AppCompat_Subhead_Inverse 0x7f1500e0 +int style TextAppearance_AppCompat_Title 0x7f1500e1 +int style TextAppearance_AppCompat_Title_Inverse 0x7f1500e2 +int style TextAppearance_AppCompat_Tooltip 0x7f1500e3 +int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f1500e4 +int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f1500e5 +int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f1500e6 +int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f1500e7 +int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f1500e8 +int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f1500e9 +int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f1500ea +int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f1500eb +int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f1500ec +int style TextAppearance_AppCompat_Widget_Button 0x7f1500ed +int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f1500ee +int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f1500ef +int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f1500f0 +int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f1500f1 +int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f1500f2 +int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f1500f3 +int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f1500f4 +int style TextAppearance_AppCompat_Widget_Switch 0x7f1500f5 +int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f1500f6 +int style TextAppearance_Compat_Notification 0x7f1500f7 +int style TextAppearance_Compat_Notification_Info 0x7f1500f8 +int style TextAppearance_Compat_Notification_Info_Media 0x7f1500f9 +int style TextAppearance_Compat_Notification_Line2 0x7f1500fa +int style TextAppearance_Compat_Notification_Line2_Media 0x7f1500fb +int style TextAppearance_Compat_Notification_Media 0x7f1500fc +int style TextAppearance_Compat_Notification_Time 0x7f1500fd +int style TextAppearance_Compat_Notification_Time_Media 0x7f1500fe +int style TextAppearance_Compat_Notification_Title 0x7f1500ff +int style TextAppearance_Compat_Notification_Title_Media 0x7f150100 +int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f150101 +int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f150102 +int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f150103 +int style Theme 0x7f150104 +int style ThemeOverlay_AppCompat 0x7f150105 +int style ThemeOverlay_AppCompat_ActionBar 0x7f150106 +int style ThemeOverlay_AppCompat_Dark 0x7f150107 +int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150108 +int style ThemeOverlay_AppCompat_Dialog 0x7f150109 +int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f15010a +int style ThemeOverlay_AppCompat_Light 0x7f15010b +int style Theme_AppCompat 0x7f15010c +int style Theme_AppCompat_CompactMenu 0x7f15010d +int style Theme_AppCompat_DayNight 0x7f15010e +int style Theme_AppCompat_DayNight_DarkActionBar 0x7f15010f +int style Theme_AppCompat_DayNight_Dialog 0x7f150110 +int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f150111 +int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f150112 +int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f150113 +int style Theme_AppCompat_DayNight_NoActionBar 0x7f150114 +int style Theme_AppCompat_Dialog 0x7f150115 +int style Theme_AppCompat_DialogWhenLarge 0x7f150116 +int style Theme_AppCompat_Dialog_Alert 0x7f150117 +int style Theme_AppCompat_Dialog_MinWidth 0x7f150118 +int style Theme_AppCompat_Light 0x7f150119 +int style Theme_AppCompat_Light_DarkActionBar 0x7f15011a +int style Theme_AppCompat_Light_Dialog 0x7f15011b +int style Theme_AppCompat_Light_DialogWhenLarge 0x7f15011c +int style Theme_AppCompat_Light_Dialog_Alert 0x7f15011d +int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f15011e +int style Theme_AppCompat_Light_NoActionBar 0x7f15011f +int style Theme_AppCompat_NoActionBar 0x7f150120 +int style Theme_Catalyst 0x7f150121 +int style Theme_Catalyst_RedBox 0x7f150122 +int style Theme_FullScreenDialog 0x7f150123 +int style Theme_FullScreenDialogAnimatedFade 0x7f150124 +int style Theme_FullScreenDialogAnimatedSlide 0x7f150125 +int style Theme_ReactNative_AppCompat_Light 0x7f150126 +int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x7f150127 +int style Widget_AppCompat_ActionBar 0x7f150128 +int style Widget_AppCompat_ActionBar_Solid 0x7f150129 +int style Widget_AppCompat_ActionBar_TabBar 0x7f15012a +int style Widget_AppCompat_ActionBar_TabText 0x7f15012b +int style Widget_AppCompat_ActionBar_TabView 0x7f15012c +int style Widget_AppCompat_ActionButton 0x7f15012d +int style Widget_AppCompat_ActionButton_CloseMode 0x7f15012e +int style Widget_AppCompat_ActionButton_Overflow 0x7f15012f +int style Widget_AppCompat_ActionMode 0x7f150130 +int style Widget_AppCompat_ActivityChooserView 0x7f150131 +int style Widget_AppCompat_AutoCompleteTextView 0x7f150132 +int style Widget_AppCompat_Button 0x7f150133 +int style Widget_AppCompat_ButtonBar 0x7f150134 +int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f150135 +int style Widget_AppCompat_Button_Borderless 0x7f150136 +int style Widget_AppCompat_Button_Borderless_Colored 0x7f150137 +int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150138 +int style Widget_AppCompat_Button_Colored 0x7f150139 +int style Widget_AppCompat_Button_Small 0x7f15013a +int style Widget_AppCompat_CompoundButton_CheckBox 0x7f15013b +int style Widget_AppCompat_CompoundButton_RadioButton 0x7f15013c +int style Widget_AppCompat_CompoundButton_Switch 0x7f15013d +int style Widget_AppCompat_DrawerArrowToggle 0x7f15013e +int style Widget_AppCompat_DropDownItem_Spinner 0x7f15013f +int style Widget_AppCompat_EditText 0x7f150140 +int style Widget_AppCompat_ImageButton 0x7f150141 +int style Widget_AppCompat_Light_ActionBar 0x7f150142 +int style Widget_AppCompat_Light_ActionBar_Solid 0x7f150143 +int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f150144 +int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f150145 +int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f150146 +int style Widget_AppCompat_Light_ActionBar_TabText 0x7f150147 +int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150148 +int style Widget_AppCompat_Light_ActionBar_TabView 0x7f150149 +int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f15014a +int style Widget_AppCompat_Light_ActionButton 0x7f15014b +int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f15014c +int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f15014d +int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f15014e +int style Widget_AppCompat_Light_ActivityChooserView 0x7f15014f +int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f150150 +int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f150151 +int style Widget_AppCompat_Light_ListPopupWindow 0x7f150152 +int style Widget_AppCompat_Light_ListView_DropDown 0x7f150153 +int style Widget_AppCompat_Light_PopupMenu 0x7f150154 +int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f150155 +int style Widget_AppCompat_Light_SearchView 0x7f150156 +int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f150157 +int style Widget_AppCompat_ListMenuView 0x7f150158 +int style Widget_AppCompat_ListPopupWindow 0x7f150159 +int style Widget_AppCompat_ListView 0x7f15015a +int style Widget_AppCompat_ListView_DropDown 0x7f15015b +int style Widget_AppCompat_ListView_Menu 0x7f15015c +int style Widget_AppCompat_PopupMenu 0x7f15015d +int style Widget_AppCompat_PopupMenu_Overflow 0x7f15015e +int style Widget_AppCompat_PopupWindow 0x7f15015f +int style Widget_AppCompat_ProgressBar 0x7f150160 +int style Widget_AppCompat_ProgressBar_Horizontal 0x7f150161 +int style Widget_AppCompat_RatingBar 0x7f150162 +int style Widget_AppCompat_RatingBar_Indicator 0x7f150163 +int style Widget_AppCompat_RatingBar_Small 0x7f150164 +int style Widget_AppCompat_SearchView 0x7f150165 +int style Widget_AppCompat_SearchView_ActionBar 0x7f150166 +int style Widget_AppCompat_SeekBar 0x7f150167 +int style Widget_AppCompat_SeekBar_Discrete 0x7f150168 +int style Widget_AppCompat_Spinner 0x7f150169 +int style Widget_AppCompat_Spinner_DropDown 0x7f15016a +int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f15016b +int style Widget_AppCompat_Spinner_Underlined 0x7f15016c +int style Widget_AppCompat_TextView_SpinnerItem 0x7f15016d +int style Widget_AppCompat_Toolbar 0x7f15016e +int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f15016f +int style Widget_Compat_NotificationActionContainer 0x7f150170 +int style Widget_Compat_NotificationActionText 0x7f150171 +int style Widget_Support_CoordinatorLayout 0x7f150172 +int style amu_Bubble_TextAppearance_Dark 0x7f150173 +int style amu_Bubble_TextAppearance_Light 0x7f150174 +int style amu_ClusterIcon_TextAppearance 0x7f150175 +int style redboxButton 0x7f150176 +int[] styleable ActionBar { 0x7f040036, 0x7f040038, 0x7f040039, 0x7f040067, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006b, 0x7f04006c, 0x7f04006f, 0x7f040074, 0x7f040075, 0x7f040080, 0x7f040093, 0x7f040094, 0x7f040095, 0x7f040096, 0x7f040097, 0x7f04009e, 0x7f0400a1, 0x7f0400bc, 0x7f0400c4, 0x7f0400d2, 0x7f0400d9, 0x7f0400da, 0x7f040106, 0x7f040109, 0x7f040124, 0x7f04012d } +int styleable ActionBar_background 0 +int styleable ActionBar_backgroundSplit 1 +int styleable ActionBar_backgroundStacked 2 +int styleable ActionBar_contentInsetEnd 3 +int styleable ActionBar_contentInsetEndWithActions 4 +int styleable ActionBar_contentInsetLeft 5 +int styleable ActionBar_contentInsetRight 6 +int styleable ActionBar_contentInsetStart 7 +int styleable ActionBar_contentInsetStartWithNavigation 8 +int styleable ActionBar_customNavigationLayout 9 +int styleable ActionBar_displayOptions 10 +int styleable ActionBar_divider 11 +int styleable ActionBar_elevation 12 +int styleable ActionBar_height 13 +int styleable ActionBar_hideOnContentScroll 14 +int styleable ActionBar_homeAsUpIndicator 15 +int styleable ActionBar_homeLayout 16 +int styleable ActionBar_icon 17 +int styleable ActionBar_indeterminateProgressStyle 18 +int styleable ActionBar_itemPadding 19 +int styleable ActionBar_logo 20 +int styleable ActionBar_navigationMode 21 +int styleable ActionBar_popupTheme 22 +int styleable ActionBar_progressBarPadding 23 +int styleable ActionBar_progressBarStyle 24 +int styleable ActionBar_subtitle 25 +int styleable ActionBar_subtitleTextStyle 26 +int styleable ActionBar_title 27 +int styleable ActionBar_titleTextStyle 28 +int[] styleable ActionBarLayout { 0x10100b3 } +int styleable ActionBarLayout_android_layout_gravity 0 +int[] styleable ActionMenuItemView { 0x101013f } +int styleable ActionMenuItemView_android_minWidth 0 +int[] styleable ActionMenuView { } +int[] styleable ActionMode { 0x7f040036, 0x7f040038, 0x7f040056, 0x7f040093, 0x7f040109, 0x7f04012d } +int styleable ActionMode_background 0 +int styleable ActionMode_backgroundSplit 1 +int styleable ActionMode_closeItemLayout 2 +int styleable ActionMode_height 3 +int styleable ActionMode_subtitleTextStyle 4 +int styleable ActionMode_titleTextStyle 5 +int[] styleable ActivityChooserView { 0x7f040081, 0x7f04009f } +int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 +int styleable ActivityChooserView_initialActivityCount 1 +int[] styleable AlertDialog { 0x10100f2, 0x7f040044, 0x7f040045, 0x7f0400b2, 0x7f0400b3, 0x7f0400c1, 0x7f0400fb, 0x7f0400fc } +int styleable AlertDialog_android_layout 0 +int styleable AlertDialog_buttonIconDimen 1 +int styleable AlertDialog_buttonPanelSideLayout 2 +int styleable AlertDialog_listItemLayout 3 +int styleable AlertDialog_listLayout 4 +int styleable AlertDialog_multiChoiceItemLayout 5 +int styleable AlertDialog_showTitle 6 +int styleable AlertDialog_singleChoiceItemLayout 7 +int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } +int styleable AnimatedStateListDrawableCompat_android_constantSize 0 +int styleable AnimatedStateListDrawableCompat_android_dither 1 +int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2 +int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3 +int styleable AnimatedStateListDrawableCompat_android_variablePadding 4 +int styleable AnimatedStateListDrawableCompat_android_visible 5 +int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 } +int styleable AnimatedStateListDrawableItem_android_drawable 0 +int styleable AnimatedStateListDrawableItem_android_id 1 +int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 } +int styleable AnimatedStateListDrawableTransition_android_drawable 0 +int styleable AnimatedStateListDrawableTransition_android_fromId 1 +int styleable AnimatedStateListDrawableTransition_android_reversible 2 +int styleable AnimatedStateListDrawableTransition_android_toId 3 +int[] styleable AppCompatImageView { 0x1010119, 0x7f040101, 0x7f040122, 0x7f040123 } +int styleable AppCompatImageView_android_src 0 +int styleable AppCompatImageView_srcCompat 1 +int styleable AppCompatImageView_tint 2 +int styleable AppCompatImageView_tintMode 3 +int[] styleable AppCompatSeekBar { 0x1010142, 0x7f04011f, 0x7f040120, 0x7f040121 } +int styleable AppCompatSeekBar_android_thumb 0 +int styleable AppCompatSeekBar_tickMark 1 +int styleable AppCompatSeekBar_tickMarkTint 2 +int styleable AppCompatSeekBar_tickMarkTintMode 3 +int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 } +int styleable AppCompatTextHelper_android_drawableBottom 0 +int styleable AppCompatTextHelper_android_drawableEnd 1 +int styleable AppCompatTextHelper_android_drawableLeft 2 +int styleable AppCompatTextHelper_android_drawableRight 3 +int styleable AppCompatTextHelper_android_drawableStart 4 +int styleable AppCompatTextHelper_android_drawableTop 5 +int styleable AppCompatTextHelper_android_textAppearance 6 +int[] styleable AppCompatTextView { 0x1010034, 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040034, 0x7f040035, 0x7f040085, 0x7f040087, 0x7f0400a3, 0x7f0400af, 0x7f04010f } +int styleable AppCompatTextView_android_textAppearance 0 +int styleable AppCompatTextView_autoSizeMaxTextSize 1 +int styleable AppCompatTextView_autoSizeMinTextSize 2 +int styleable AppCompatTextView_autoSizePresetSizes 3 +int styleable AppCompatTextView_autoSizeStepGranularity 4 +int styleable AppCompatTextView_autoSizeTextType 5 +int styleable AppCompatTextView_firstBaselineToTopHeight 6 +int styleable AppCompatTextView_fontFamily 7 +int styleable AppCompatTextView_lastBaselineToBottomHeight 8 +int styleable AppCompatTextView_lineHeight 9 +int styleable AppCompatTextView_textAllCaps 10 +int[] styleable AppCompatTheme { 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000d, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f04001f, 0x7f040022, 0x7f040026, 0x7f040027, 0x7f040028, 0x7f040029, 0x10100ae, 0x1010057, 0x7f040030, 0x7f04003d, 0x7f04003e, 0x7f04003f, 0x7f040040, 0x7f040041, 0x7f040042, 0x7f040047, 0x7f040048, 0x7f040052, 0x7f040053, 0x7f04005a, 0x7f04005b, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f040062, 0x7f040064, 0x7f04006d, 0x7f040071, 0x7f040072, 0x7f040073, 0x7f040076, 0x7f040078, 0x7f04007b, 0x7f04007c, 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040095, 0x7f04009d, 0x7f0400b0, 0x7f0400b1, 0x7f0400b4, 0x7f0400b5, 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, 0x7f0400ba, 0x7f0400cc, 0x7f0400cd, 0x7f0400ce, 0x7f0400d1, 0x7f0400d3, 0x7f0400dd, 0x7f0400de, 0x7f0400df, 0x7f0400e0, 0x7f0400f4, 0x7f0400f5, 0x7f0400f6, 0x7f0400f7, 0x7f0400fe, 0x7f0400ff, 0x7f04010d, 0x7f040110, 0x7f040111, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040115, 0x7f040116, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040141, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148, 0x7f040149, 0x7f04014a, 0x7f04014b, 0x7f04014c } +int styleable AppCompatTheme_actionBarDivider 0 +int styleable AppCompatTheme_actionBarItemBackground 1 +int styleable AppCompatTheme_actionBarPopupTheme 2 +int styleable AppCompatTheme_actionBarSize 3 +int styleable AppCompatTheme_actionBarSplitStyle 4 +int styleable AppCompatTheme_actionBarStyle 5 +int styleable AppCompatTheme_actionBarTabBarStyle 6 +int styleable AppCompatTheme_actionBarTabStyle 7 +int styleable AppCompatTheme_actionBarTabTextStyle 8 +int styleable AppCompatTheme_actionBarTheme 9 +int styleable AppCompatTheme_actionBarWidgetTheme 10 +int styleable AppCompatTheme_actionButtonStyle 11 +int styleable AppCompatTheme_actionDropDownStyle 12 +int styleable AppCompatTheme_actionMenuTextAppearance 13 +int styleable AppCompatTheme_actionMenuTextColor 14 +int styleable AppCompatTheme_actionModeBackground 15 +int styleable AppCompatTheme_actionModeCloseButtonStyle 16 +int styleable AppCompatTheme_actionModeCloseDrawable 17 +int styleable AppCompatTheme_actionModeCopyDrawable 18 +int styleable AppCompatTheme_actionModeCutDrawable 19 +int styleable AppCompatTheme_actionModeFindDrawable 20 +int styleable AppCompatTheme_actionModePasteDrawable 21 +int styleable AppCompatTheme_actionModePopupWindowStyle 22 +int styleable AppCompatTheme_actionModeSelectAllDrawable 23 +int styleable AppCompatTheme_actionModeShareDrawable 24 +int styleable AppCompatTheme_actionModeSplitBackground 25 +int styleable AppCompatTheme_actionModeStyle 26 +int styleable AppCompatTheme_actionModeWebSearchDrawable 27 +int styleable AppCompatTheme_actionOverflowButtonStyle 28 +int styleable AppCompatTheme_actionOverflowMenuStyle 29 +int styleable AppCompatTheme_activityChooserViewStyle 30 +int styleable AppCompatTheme_alertDialogButtonGroupStyle 31 +int styleable AppCompatTheme_alertDialogCenterButtons 32 +int styleable AppCompatTheme_alertDialogStyle 33 +int styleable AppCompatTheme_alertDialogTheme 34 +int styleable AppCompatTheme_android_windowAnimationStyle 35 +int styleable AppCompatTheme_android_windowIsFloating 36 +int styleable AppCompatTheme_autoCompleteTextViewStyle 37 +int styleable AppCompatTheme_borderlessButtonStyle 38 +int styleable AppCompatTheme_buttonBarButtonStyle 39 +int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 +int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 +int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 +int styleable AppCompatTheme_buttonBarStyle 43 +int styleable AppCompatTheme_buttonStyle 44 +int styleable AppCompatTheme_buttonStyleSmall 45 +int styleable AppCompatTheme_checkboxStyle 46 +int styleable AppCompatTheme_checkedTextViewStyle 47 +int styleable AppCompatTheme_colorAccent 48 +int styleable AppCompatTheme_colorBackgroundFloating 49 +int styleable AppCompatTheme_colorButtonNormal 50 +int styleable AppCompatTheme_colorControlActivated 51 +int styleable AppCompatTheme_colorControlHighlight 52 +int styleable AppCompatTheme_colorControlNormal 53 +int styleable AppCompatTheme_colorError 54 +int styleable AppCompatTheme_colorPrimary 55 +int styleable AppCompatTheme_colorPrimaryDark 56 +int styleable AppCompatTheme_colorSwitchThumbNormal 57 +int styleable AppCompatTheme_controlBackground 58 +int styleable AppCompatTheme_dialogCornerRadius 59 +int styleable AppCompatTheme_dialogPreferredPadding 60 +int styleable AppCompatTheme_dialogTheme 61 +int styleable AppCompatTheme_dividerHorizontal 62 +int styleable AppCompatTheme_dividerVertical 63 +int styleable AppCompatTheme_dropDownListViewStyle 64 +int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 +int styleable AppCompatTheme_editTextBackground 66 +int styleable AppCompatTheme_editTextColor 67 +int styleable AppCompatTheme_editTextStyle 68 +int styleable AppCompatTheme_homeAsUpIndicator 69 +int styleable AppCompatTheme_imageButtonStyle 70 +int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 +int styleable AppCompatTheme_listDividerAlertDialog 72 +int styleable AppCompatTheme_listMenuViewStyle 73 +int styleable AppCompatTheme_listPopupWindowStyle 74 +int styleable AppCompatTheme_listPreferredItemHeight 75 +int styleable AppCompatTheme_listPreferredItemHeightLarge 76 +int styleable AppCompatTheme_listPreferredItemHeightSmall 77 +int styleable AppCompatTheme_listPreferredItemPaddingLeft 78 +int styleable AppCompatTheme_listPreferredItemPaddingRight 79 +int styleable AppCompatTheme_panelBackground 80 +int styleable AppCompatTheme_panelMenuListTheme 81 +int styleable AppCompatTheme_panelMenuListWidth 82 +int styleable AppCompatTheme_popupMenuStyle 83 +int styleable AppCompatTheme_popupWindowStyle 84 +int styleable AppCompatTheme_radioButtonStyle 85 +int styleable AppCompatTheme_ratingBarStyle 86 +int styleable AppCompatTheme_ratingBarStyleIndicator 87 +int styleable AppCompatTheme_ratingBarStyleSmall 88 +int styleable AppCompatTheme_searchViewStyle 89 +int styleable AppCompatTheme_seekBarStyle 90 +int styleable AppCompatTheme_selectableItemBackground 91 +int styleable AppCompatTheme_selectableItemBackgroundBorderless 92 +int styleable AppCompatTheme_spinnerDropDownItemStyle 93 +int styleable AppCompatTheme_spinnerStyle 94 +int styleable AppCompatTheme_switchStyle 95 +int styleable AppCompatTheme_textAppearanceLargePopupMenu 96 +int styleable AppCompatTheme_textAppearanceListItem 97 +int styleable AppCompatTheme_textAppearanceListItemSecondary 98 +int styleable AppCompatTheme_textAppearanceListItemSmall 99 +int styleable AppCompatTheme_textAppearancePopupMenuHeader 100 +int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101 +int styleable AppCompatTheme_textAppearanceSearchResultTitle 102 +int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103 +int styleable AppCompatTheme_textColorAlertDialogListItem 104 +int styleable AppCompatTheme_textColorSearchUrl 105 +int styleable AppCompatTheme_toolbarNavigationButtonStyle 106 +int styleable AppCompatTheme_toolbarStyle 107 +int styleable AppCompatTheme_tooltipForegroundColor 108 +int styleable AppCompatTheme_tooltipFrameBackground 109 +int styleable AppCompatTheme_viewInflaterClass 110 +int styleable AppCompatTheme_windowActionBar 111 +int styleable AppCompatTheme_windowActionBarOverlay 112 +int styleable AppCompatTheme_windowActionModeOverlay 113 +int styleable AppCompatTheme_windowFixedHeightMajor 114 +int styleable AppCompatTheme_windowFixedHeightMinor 115 +int styleable AppCompatTheme_windowFixedWidthMajor 116 +int styleable AppCompatTheme_windowFixedWidthMinor 117 +int styleable AppCompatTheme_windowMinWidthMajor 118 +int styleable AppCompatTheme_windowMinWidthMinor 119 +int styleable AppCompatTheme_windowNoTitle 120 +int[] styleable ButtonBarLayout { 0x7f04002a } +int styleable ButtonBarLayout_allowStacking 0 +int[] styleable ColorStateListItem { 0x7f04002b, 0x101031f, 0x10101a5 } +int styleable ColorStateListItem_alpha 0 +int styleable ColorStateListItem_android_alpha 1 +int styleable ColorStateListItem_android_color 2 +int[] styleable CompoundButton { 0x1010107, 0x7f040049, 0x7f04004a } +int styleable CompoundButton_android_button 0 +int styleable CompoundButton_buttonTint 1 +int styleable CompoundButton_buttonTintMode 2 +int[] styleable CoordinatorLayout { 0x7f0400a2, 0x7f040103 } +int styleable CoordinatorLayout_keylines 0 +int styleable CoordinatorLayout_statusBarBackground 1 +int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x7f0400a9, 0x7f0400aa, 0x7f0400ab, 0x7f0400ac, 0x7f0400ad, 0x7f0400ae } +int styleable CoordinatorLayout_Layout_android_layout_gravity 0 +int styleable CoordinatorLayout_Layout_layout_anchor 1 +int styleable CoordinatorLayout_Layout_layout_anchorGravity 2 +int styleable CoordinatorLayout_Layout_layout_behavior 3 +int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4 +int styleable CoordinatorLayout_Layout_layout_insetEdge 5 +int styleable CoordinatorLayout_Layout_layout_keyline 6 +int[] styleable DrawerArrowToggle { 0x7f04002e, 0x7f04002f, 0x7f04003c, 0x7f040059, 0x7f040079, 0x7f040091, 0x7f0400fd, 0x7f04011b } +int styleable DrawerArrowToggle_arrowHeadLength 0 +int styleable DrawerArrowToggle_arrowShaftLength 1 +int styleable DrawerArrowToggle_barLength 2 +int styleable DrawerArrowToggle_color 3 +int styleable DrawerArrowToggle_drawableSize 4 +int styleable DrawerArrowToggle_gapBetweenBars 5 +int styleable DrawerArrowToggle_spinBars 6 +int styleable DrawerArrowToggle_thickness 7 +int[] styleable FontFamily { 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f04008d } +int styleable FontFamily_fontProviderAuthority 0 +int styleable FontFamily_fontProviderCerts 1 +int styleable FontFamily_fontProviderFetchStrategy 2 +int styleable FontFamily_fontProviderFetchTimeout 3 +int styleable FontFamily_fontProviderPackage 4 +int styleable FontFamily_fontProviderQuery 5 +int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x7f040086, 0x7f04008e, 0x7f04008f, 0x7f040090, 0x7f040136 } +int styleable FontFamilyFont_android_font 0 +int styleable FontFamilyFont_android_fontStyle 1 +int styleable FontFamilyFont_android_fontVariationSettings 2 +int styleable FontFamilyFont_android_fontWeight 3 +int styleable FontFamilyFont_android_ttcIndex 4 +int styleable FontFamilyFont_font 5 +int styleable FontFamilyFont_fontStyle 6 +int styleable FontFamilyFont_fontVariationSettings 7 +int styleable FontFamilyFont_fontWeight 8 +int styleable FontFamilyFont_ttcIndex 9 +int[] styleable GenericDraweeHierarchy { 0x7f040024, 0x7f040037, 0x7f040082, 0x7f040083, 0x7f040084, 0x7f0400c7, 0x7f0400cf, 0x7f0400d0, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400e4, 0x7f0400e5, 0x7f0400e6, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ea, 0x7f0400eb, 0x7f0400ec, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f0400f0, 0x7f040140 } +int styleable GenericDraweeHierarchy_actualImageScaleType 0 +int styleable GenericDraweeHierarchy_backgroundImage 1 +int styleable GenericDraweeHierarchy_fadeDuration 2 +int styleable GenericDraweeHierarchy_failureImage 3 +int styleable GenericDraweeHierarchy_failureImageScaleType 4 +int styleable GenericDraweeHierarchy_overlayImage 5 +int styleable GenericDraweeHierarchy_placeholderImage 6 +int styleable GenericDraweeHierarchy_placeholderImageScaleType 7 +int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8 +int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9 +int styleable GenericDraweeHierarchy_progressBarImage 10 +int styleable GenericDraweeHierarchy_progressBarImageScaleType 11 +int styleable GenericDraweeHierarchy_retryImage 12 +int styleable GenericDraweeHierarchy_retryImageScaleType 13 +int styleable GenericDraweeHierarchy_roundAsCircle 14 +int styleable GenericDraweeHierarchy_roundBottomEnd 15 +int styleable GenericDraweeHierarchy_roundBottomLeft 16 +int styleable GenericDraweeHierarchy_roundBottomRight 17 +int styleable GenericDraweeHierarchy_roundBottomStart 18 +int styleable GenericDraweeHierarchy_roundTopEnd 19 +int styleable GenericDraweeHierarchy_roundTopLeft 20 +int styleable GenericDraweeHierarchy_roundTopRight 21 +int styleable GenericDraweeHierarchy_roundTopStart 22 +int styleable GenericDraweeHierarchy_roundWithOverlayColor 23 +int styleable GenericDraweeHierarchy_roundedCornerRadius 24 +int styleable GenericDraweeHierarchy_roundingBorderColor 25 +int styleable GenericDraweeHierarchy_roundingBorderPadding 26 +int styleable GenericDraweeHierarchy_roundingBorderWidth 27 +int styleable GenericDraweeHierarchy_viewAspectRatio 28 +int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 } +int styleable GradientColor_android_centerColor 0 +int styleable GradientColor_android_centerX 1 +int styleable GradientColor_android_centerY 2 +int styleable GradientColor_android_endColor 3 +int styleable GradientColor_android_endX 4 +int styleable GradientColor_android_endY 5 +int styleable GradientColor_android_gradientRadius 6 +int styleable GradientColor_android_startColor 7 +int styleable GradientColor_android_startX 8 +int styleable GradientColor_android_startY 9 +int styleable GradientColor_android_tileMode 10 +int styleable GradientColor_android_type 11 +int[] styleable GradientColorItem { 0x10101a5, 0x1010514 } +int styleable GradientColorItem_android_color 0 +int styleable GradientColorItem_android_offset 1 +int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x7f040075, 0x7f040077, 0x7f0400c0, 0x7f0400f9 } +int styleable LinearLayoutCompat_android_baselineAligned 0 +int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1 +int styleable LinearLayoutCompat_android_gravity 2 +int styleable LinearLayoutCompat_android_orientation 3 +int styleable LinearLayoutCompat_android_weightSum 4 +int styleable LinearLayoutCompat_divider 5 +int styleable LinearLayoutCompat_dividerPadding 6 +int styleable LinearLayoutCompat_measureWithLargestChild 7 +int styleable LinearLayoutCompat_showDividers 8 +int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 } +int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 +int styleable LinearLayoutCompat_Layout_android_layout_height 1 +int styleable LinearLayoutCompat_Layout_android_layout_weight 2 +int styleable LinearLayoutCompat_Layout_android_layout_width 3 +int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad } +int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 +int styleable ListPopupWindow_android_dropDownVerticalOffset 1 +int[] styleable LoadingImageView { 0x7f040054, 0x7f04009b, 0x7f04009c } +int styleable LoadingImageView_circleCrop 0 +int styleable LoadingImageView_imageAspectRatio 1 +int styleable LoadingImageView_imageAspectRatioAdjust 2 +int[] styleable MapAttrs { 0x7f04002d, 0x7f04004b, 0x7f04004c, 0x7f04004d, 0x7f04004e, 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f0400a4, 0x7f0400a5, 0x7f0400a6, 0x7f0400a7, 0x7f0400bb, 0x7f0400be, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f04014d } +int styleable MapAttrs_ambientEnabled 0 +int styleable MapAttrs_cameraBearing 1 +int styleable MapAttrs_cameraMaxZoomPreference 2 +int styleable MapAttrs_cameraMinZoomPreference 3 +int styleable MapAttrs_cameraTargetLat 4 +int styleable MapAttrs_cameraTargetLng 5 +int styleable MapAttrs_cameraTilt 6 +int styleable MapAttrs_cameraZoom 7 +int styleable MapAttrs_latLngBoundsNorthEastLatitude 8 +int styleable MapAttrs_latLngBoundsNorthEastLongitude 9 +int styleable MapAttrs_latLngBoundsSouthWestLatitude 10 +int styleable MapAttrs_latLngBoundsSouthWestLongitude 11 +int styleable MapAttrs_liteMode 12 +int styleable MapAttrs_mapType 13 +int styleable MapAttrs_uiCompass 14 +int styleable MapAttrs_uiMapToolbar 15 +int styleable MapAttrs_uiRotateGestures 16 +int styleable MapAttrs_uiScrollGestures 17 +int styleable MapAttrs_uiScrollGesturesDuringRotateOrZoom 18 +int styleable MapAttrs_uiTiltGestures 19 +int styleable MapAttrs_uiZoomControls 20 +int styleable MapAttrs_uiZoomGestures 21 +int styleable MapAttrs_useViewLifecycle 22 +int styleable MapAttrs_zOrderOnTop 23 +int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 } +int styleable MenuGroup_android_checkableBehavior 0 +int styleable MenuGroup_android_enabled 1 +int styleable MenuGroup_android_id 2 +int styleable MenuGroup_android_menuCategory 3 +int styleable MenuGroup_android_orderInCategory 4 +int styleable MenuGroup_android_visible 5 +int[] styleable MenuItem { 0x7f04000e, 0x7f040020, 0x7f040021, 0x7f04002c, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x7f040066, 0x7f040098, 0x7f040099, 0x7f0400c5, 0x7f0400f8, 0x7f040132 } +int styleable MenuItem_actionLayout 0 +int styleable MenuItem_actionProviderClass 1 +int styleable MenuItem_actionViewClass 2 +int styleable MenuItem_alphabeticModifiers 3 +int styleable MenuItem_android_alphabeticShortcut 4 +int styleable MenuItem_android_checkable 5 +int styleable MenuItem_android_checked 6 +int styleable MenuItem_android_enabled 7 +int styleable MenuItem_android_icon 8 +int styleable MenuItem_android_id 9 +int styleable MenuItem_android_menuCategory 10 +int styleable MenuItem_android_numericShortcut 11 +int styleable MenuItem_android_onClick 12 +int styleable MenuItem_android_orderInCategory 13 +int styleable MenuItem_android_title 14 +int styleable MenuItem_android_titleCondensed 15 +int styleable MenuItem_android_visible 16 +int styleable MenuItem_contentDescription 17 +int styleable MenuItem_iconTint 18 +int styleable MenuItem_iconTintMode 19 +int styleable MenuItem_numericModifiers 20 +int styleable MenuItem_showAsAction 21 +int styleable MenuItem_tooltipText 22 +int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x7f0400d4, 0x7f040104 } +int styleable MenuView_android_headerBackground 0 +int styleable MenuView_android_horizontalDivider 1 +int styleable MenuView_android_itemBackground 2 +int styleable MenuView_android_itemIconDisabledAlpha 3 +int styleable MenuView_android_itemTextAppearance 4 +int styleable MenuView_android_verticalDivider 5 +int styleable MenuView_android_windowAnimationStyle 6 +int styleable MenuView_preserveIconSpacing 7 +int styleable MenuView_subMenuArrow 8 +int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x7f0400c6 } +int styleable PopupWindow_android_popupAnimationStyle 0 +int styleable PopupWindow_android_popupBackground 1 +int styleable PopupWindow_overlapAnchor 2 +int[] styleable PopupWindowBackgroundState { 0x7f040102 } +int styleable PopupWindowBackgroundState_state_above_anchor 0 +int[] styleable RecycleListView { 0x7f0400c8, 0x7f0400cb } +int styleable RecycleListView_paddingBottomNoButtons 0 +int styleable RecycleListView_paddingTopNoTitle 1 +int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x7f040055, 0x7f040065, 0x7f040070, 0x7f040092, 0x7f04009a, 0x7f0400a8, 0x7f0400db, 0x7f0400dc, 0x7f0400f2, 0x7f0400f3, 0x7f040105, 0x7f04010a, 0x7f040142 } +int styleable SearchView_android_focusable 0 +int styleable SearchView_android_imeOptions 1 +int styleable SearchView_android_inputType 2 +int styleable SearchView_android_maxWidth 3 +int styleable SearchView_closeIcon 4 +int styleable SearchView_commitIcon 5 +int styleable SearchView_defaultQueryHint 6 +int styleable SearchView_goIcon 7 +int styleable SearchView_iconifiedByDefault 8 +int styleable SearchView_layout 9 +int styleable SearchView_queryBackground 10 +int styleable SearchView_queryHint 11 +int styleable SearchView_searchHintIcon 12 +int styleable SearchView_searchIcon 13 +int styleable SearchView_submitBackground 14 +int styleable SearchView_suggestionRowLayout 15 +int styleable SearchView_voiceIcon 16 +int[] styleable SignInButton { 0x7f040046, 0x7f040063, 0x7f0400f1 } +int styleable SignInButton_buttonSize 0 +int styleable SignInButton_colorScheme 1 +int styleable SignInButton_scopeUris 2 +int[] styleable SimpleDraweeView { 0x7f040023, 0x7f040024, 0x7f040025, 0x7f040037, 0x7f040082, 0x7f040083, 0x7f040084, 0x7f0400c7, 0x7f0400cf, 0x7f0400d0, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400e4, 0x7f0400e5, 0x7f0400e6, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ea, 0x7f0400eb, 0x7f0400ec, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f0400f0, 0x7f040140 } +int styleable SimpleDraweeView_actualImageResource 0 +int styleable SimpleDraweeView_actualImageScaleType 1 +int styleable SimpleDraweeView_actualImageUri 2 +int styleable SimpleDraweeView_backgroundImage 3 +int styleable SimpleDraweeView_fadeDuration 4 +int styleable SimpleDraweeView_failureImage 5 +int styleable SimpleDraweeView_failureImageScaleType 6 +int styleable SimpleDraweeView_overlayImage 7 +int styleable SimpleDraweeView_placeholderImage 8 +int styleable SimpleDraweeView_placeholderImageScaleType 9 +int styleable SimpleDraweeView_pressedStateOverlayImage 10 +int styleable SimpleDraweeView_progressBarAutoRotateInterval 11 +int styleable SimpleDraweeView_progressBarImage 12 +int styleable SimpleDraweeView_progressBarImageScaleType 13 +int styleable SimpleDraweeView_retryImage 14 +int styleable SimpleDraweeView_retryImageScaleType 15 +int styleable SimpleDraweeView_roundAsCircle 16 +int styleable SimpleDraweeView_roundBottomEnd 17 +int styleable SimpleDraweeView_roundBottomLeft 18 +int styleable SimpleDraweeView_roundBottomRight 19 +int styleable SimpleDraweeView_roundBottomStart 20 +int styleable SimpleDraweeView_roundTopEnd 21 +int styleable SimpleDraweeView_roundTopLeft 22 +int styleable SimpleDraweeView_roundTopRight 23 +int styleable SimpleDraweeView_roundTopStart 24 +int styleable SimpleDraweeView_roundWithOverlayColor 25 +int styleable SimpleDraweeView_roundedCornerRadius 26 +int styleable SimpleDraweeView_roundingBorderColor 27 +int styleable SimpleDraweeView_roundingBorderPadding 28 +int styleable SimpleDraweeView_roundingBorderWidth 29 +int styleable SimpleDraweeView_viewAspectRatio 30 +int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x7f0400d2 } +int styleable Spinner_android_dropDownWidth 0 +int styleable Spinner_android_entries 1 +int styleable Spinner_android_popupBackground 2 +int styleable Spinner_android_prompt 3 +int styleable Spinner_popupTheme 4 +int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } +int styleable StateListDrawable_android_constantSize 0 +int styleable StateListDrawable_android_dither 1 +int styleable StateListDrawable_android_enterFadeDuration 2 +int styleable StateListDrawable_android_exitFadeDuration 3 +int styleable StateListDrawable_android_variablePadding 4 +int styleable StateListDrawable_android_visible 5 +int[] styleable StateListDrawableItem { 0x1010199 } +int styleable StateListDrawableItem_android_drawable 0 +int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x7f0400fa, 0x7f040100, 0x7f04010b, 0x7f04010c, 0x7f04010e, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f040133, 0x7f040134, 0x7f040135 } +int styleable SwitchCompat_android_textOff 0 +int styleable SwitchCompat_android_textOn 1 +int styleable SwitchCompat_android_thumb 2 +int styleable SwitchCompat_showText 3 +int styleable SwitchCompat_splitTrack 4 +int styleable SwitchCompat_switchMinWidth 5 +int styleable SwitchCompat_switchPadding 6 +int styleable SwitchCompat_switchTextAppearance 7 +int styleable SwitchCompat_thumbTextPadding 8 +int styleable SwitchCompat_thumbTint 9 +int styleable SwitchCompat_thumbTintMode 10 +int styleable SwitchCompat_track 11 +int styleable SwitchCompat_trackTint 12 +int styleable SwitchCompat_trackTintMode 13 +int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010095, 0x1010097, 0x1010096, 0x7f040087, 0x7f04010f } +int styleable TextAppearance_android_fontFamily 0 +int styleable TextAppearance_android_shadowColor 1 +int styleable TextAppearance_android_shadowDx 2 +int styleable TextAppearance_android_shadowDy 3 +int styleable TextAppearance_android_shadowRadius 4 +int styleable TextAppearance_android_textColor 5 +int styleable TextAppearance_android_textColorHint 6 +int styleable TextAppearance_android_textColorLink 7 +int styleable TextAppearance_android_textSize 8 +int styleable TextAppearance_android_textStyle 9 +int styleable TextAppearance_android_typeface 10 +int styleable TextAppearance_fontFamily 11 +int styleable TextAppearance_textAllCaps 12 +int[] styleable Toolbar { 0x10100af, 0x1010140, 0x7f040043, 0x7f040057, 0x7f040058, 0x7f040067, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006b, 0x7f04006c, 0x7f0400bc, 0x7f0400bd, 0x7f0400bf, 0x7f0400c2, 0x7f0400c3, 0x7f0400d2, 0x7f040106, 0x7f040107, 0x7f040108, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c } +int styleable Toolbar_android_gravity 0 +int styleable Toolbar_android_minHeight 1 +int styleable Toolbar_buttonGravity 2 +int styleable Toolbar_collapseContentDescription 3 +int styleable Toolbar_collapseIcon 4 +int styleable Toolbar_contentInsetEnd 5 +int styleable Toolbar_contentInsetEndWithActions 6 +int styleable Toolbar_contentInsetLeft 7 +int styleable Toolbar_contentInsetRight 8 +int styleable Toolbar_contentInsetStart 9 +int styleable Toolbar_contentInsetStartWithNavigation 10 +int styleable Toolbar_logo 11 +int styleable Toolbar_logoDescription 12 +int styleable Toolbar_maxButtonHeight 13 +int styleable Toolbar_navigationContentDescription 14 +int styleable Toolbar_navigationIcon 15 +int styleable Toolbar_popupTheme 16 +int styleable Toolbar_subtitle 17 +int styleable Toolbar_subtitleTextAppearance 18 +int styleable Toolbar_subtitleTextColor 19 +int styleable Toolbar_title 20 +int styleable Toolbar_titleMargin 21 +int styleable Toolbar_titleMarginBottom 22 +int styleable Toolbar_titleMarginEnd 23 +int styleable Toolbar_titleMarginStart 24 +int styleable Toolbar_titleMarginTop 25 +int styleable Toolbar_titleMargins 26 +int styleable Toolbar_titleTextAppearance 27 +int styleable Toolbar_titleTextColor 28 +int[] styleable View { 0x10100da, 0x1010000, 0x7f0400c9, 0x7f0400ca, 0x7f04011a } +int styleable View_android_focusable 0 +int styleable View_android_theme 1 +int styleable View_paddingEnd 2 +int styleable View_paddingStart 3 +int styleable View_theme 4 +int[] styleable ViewBackgroundHelper { 0x10100d4, 0x7f04003a, 0x7f04003b } +int styleable ViewBackgroundHelper_android_background 0 +int styleable ViewBackgroundHelper_backgroundTint 1 +int styleable ViewBackgroundHelper_backgroundTintMode 2 +int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 } +int styleable ViewStubCompat_android_id 0 +int styleable ViewStubCompat_android_inflatedId 1 +int styleable ViewStubCompat_android_layout 2 +int xml rn_dev_preferences 0x7f180001 diff --git a/lib/android/build/intermediates/transforms/mergeJniLibs/debug/__content__.json b/lib/android/build/intermediates/transforms/mergeJniLibs/debug/__content__.json new file mode 100644 index 0000000..49b1382 --- /dev/null +++ b/lib/android/build/intermediates/transforms/mergeJniLibs/debug/__content__.json @@ -0,0 +1 @@ +[{"name":"resources","index":0,"scopes":["PROJECT"],"types":["NATIVE_LIBS"],"format":"DIRECTORY","present":false}] \ No newline at end of file diff --git a/lib/android/build/intermediates/transforms/mergeJniLibs/release/__content__.json b/lib/android/build/intermediates/transforms/mergeJniLibs/release/__content__.json new file mode 100644 index 0000000..49b1382 --- /dev/null +++ b/lib/android/build/intermediates/transforms/mergeJniLibs/release/__content__.json @@ -0,0 +1 @@ +[{"name":"resources","index":0,"scopes":["PROJECT"],"types":["NATIVE_LIBS"],"format":"DIRECTORY","present":false}] \ No newline at end of file diff --git a/lib/android/build/outputs/logs/manifest-merger-debug-report.txt b/lib/android/build/outputs/logs/manifest-merger-debug-report.txt new file mode 100644 index 0000000..15d057f --- /dev/null +++ b/lib/android/build/outputs/logs/manifest-merger-debug-report.txt @@ -0,0 +1,33 @@ +-- Merging decision tree log --- +manifest +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 + package + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:3:5-44 + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + xmlns:android + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:11-69 +uses-permission#android.permission.INTERNET +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:4:5-67 + android:name + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:4:22-64 +uses-permission#android.permission.ACCESS_COARSE_LOCATION +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:5:5-81 + android:name + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:5:22-78 +uses-sdk +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml reason: use-sdk injection requested +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + android:targetSdkVersion + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + android:minSdkVersion + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml diff --git a/lib/android/build/outputs/logs/manifest-merger-release-report.txt b/lib/android/build/outputs/logs/manifest-merger-release-report.txt new file mode 100644 index 0000000..15d057f --- /dev/null +++ b/lib/android/build/outputs/logs/manifest-merger-release-report.txt @@ -0,0 +1,33 @@ +-- Merging decision tree log --- +manifest +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:1-6:12 + package + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:3:5-44 + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + xmlns:android + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:2:11-69 +uses-permission#android.permission.INTERNET +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:4:5-67 + android:name + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:4:22-64 +uses-permission#android.permission.ACCESS_COARSE_LOCATION +ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:5:5-81 + android:name + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml:5:22-78 +uses-sdk +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml reason: use-sdk injection requested +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml +INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + android:targetSdkVersion + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + android:minSdkVersion + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + ADDED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml + INJECTED from /Users/atar/PrortigerWorkspace/buyer/housing-app/node_modules/react-native-maps/lib/android/src/main/AndroidManifest.xml diff --git a/lib/android/gradle-maven-push.gradle b/lib/android/gradle-maven-push.gradle new file mode 100644 index 0000000..84bf616 --- /dev/null +++ b/lib/android/gradle-maven-push.gradle @@ -0,0 +1,114 @@ +/* + * Copyright 2013 Chris Banes + * + * 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. + */ + +apply plugin: 'maven' +apply plugin: 'signing' + +def isReleaseBuild() { + return VERSION_NAME.contains("SNAPSHOT") == false +} + +def getReleaseRepositoryUrl() { + return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" +} + +def getSnapshotRepositoryUrl() { + return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL + : "https://oss.sonatype.org/content/repositories/snapshots/" +} + +def getRepositoryUsername() { + return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : "" +} + +def getRepositoryPassword() { + return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : "" +} + +afterEvaluate { project -> + uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + pom.groupId = GROUP + pom.artifactId = POM_ARTIFACT_ID + pom.version = VERSION_NAME + + repository(url: getReleaseRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + snapshotRepository(url: getSnapshotRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name POM_NAME + packaging POM_PACKAGING + description POM_DESCRIPTION + url POM_URL + + scm { + url POM_SCM_URL + connection POM_SCM_CONNECTION + developerConnection POM_SCM_DEV_CONNECTION + } + + licenses { + license { + name POM_LICENSE_NAME + url POM_LICENSE_URL + distribution POM_LICENSE_DIST + } + } + + developers { + developer { + id POM_DEVELOPER_ID + name POM_DEVELOPER_NAME + } + } + } + } + } + } + + signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives + } + + task androidJavadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + } + + task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { + classifier = 'javadoc' + from androidJavadocs.destinationDir + } + + task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.sourceFiles + } + + artifacts { + archives androidSourcesJar + archives androidJavadocsJar + } +} \ No newline at end of file diff --git a/lib/android/src/main/AndroidManifest.xml b/lib/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e07e0af --- /dev/null +++ b/lib/android/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/lib/android/src/main/assets/ula.kml b/lib/android/src/main/assets/ula.kml new file mode 100644 index 0000000..2504574 --- /dev/null +++ b/lib/android/src/main/assets/ula.kml @@ -0,0 +1,1214 @@ + + + + + + + + + + + + + + +20171123121441_ULA_PARCIAL + + -18.9193508,-48.2830592 + + -1 + 0 + -1 + + -48.2830592,-18.9193508 + + + CEO-ULA-00001 + + -1 + 0 + -1 + + -48.28328,-18.915815 + + + CEO-ULA-00186 + + -1 + 0 + -1 + + -48.278833,-18.919549 + + + CEO-ULA-00188 + + -1 + 0 + -1 + + -48.289805,-18.913945 + + + CEO-ULA-00229 + + -1 + 0 + -1 + + -48.288815,-18.922615 + + + CEO-ULA-00243 + + -1 + 0 + -1 + + -48.281013,-18.916794 + + + CEO-ULA-00274 + + -1 + 0 + -1 + + -48.276156,-18.91852 + + + CEO-ULA-00275 + + -1 + 0 + -1 + + -48.278656,-18.922156 + + + ST-ULA-0001 + + -1 + 0 + -1 + + -48.283467,-18.91587 + + + ST-ULA-0360 + + -1 + 0 + -1 + + -48.2917338,-18.9200969 + + + ST-ULA-0361 + + -1 + 0 + -1 + + -48.2905979,-18.921816 + + + ST-ULA-0362 + + -1 + 0 + -1 + + -48.2920103,-18.9192301 + + + ST-ULA-0399 + + -1 + 0 + -1 + + -48.29048,-18.9193956 + + + ST-ULA-0400 + + -1 + 0 + -1 + + -48.2906689,-18.918796 + + + ST-ULA-0408 + + -1 + 0 + -1 + + -48.2912278,-18.9170382 + + + CEO-ULA-00391 + + -1 + 0 + -1 + + -48.289628,-18.914507 + + + CEO-ULA-00053 + + -1 + 0 + -1 + + -48.291706,-18.920121 + + + CEO-ULA-00067 + + -1 + 0 + -1 + + -48.29045,-18.91948 + + + CEO-ULA-00288 + + -1 + 0 + -1 + + -48.274365,-18.921111 + + + CEO-ULA-00332 + + -1 + 0 + -1 + + -48.279256,-18.916275 + + + CEO-ULA-00337 + + -1 + 0 + -1 + + -48.280717,-18.916827 + + + CEO-ULA-00350 + + -1 + 0 + -1 + + -48.281085,-18.924567 + + + CEO-ULA-00369 + + -1 + 0 + -1 + + -48.288157,-18.915412 + + + CEO-ULA-00372 + + -1 + 0 + -1 + + -48.282004,-18.923989 + + + CEO-ULA-00379 + + -1 + 0 + -1 + + -48.290547,-18.919788 + + + CEO-ULA-00382 + + -1 + 0 + -1 + + -48.289297,-18.91561 + + + CEO-ULA-00386 + + -1 + 0 + -1 + + -48.280915,-18.910799 + + + CEO-ULA-00388 + + -1 + 0 + -1 + + -48.283811,-18.914334 + + + CEO-ULA-00390 + + -1 + 0 + -1 + + -48.288354,-18.918549 + + + CEO-ULA-00400 + + -1 + 0 + -1 + + -48.283629,-18.921665 + + + CEO-ULA-00394 + + -1 + 0 + -1 + + -48.284537,-18.912023 + + + CEO-ULA-00396 + + -1 + 0 + -1 + + -48.284908,-18.925537 + + + CEO-ULA-00399 + + -1 + 0 + -1 + + -48.283935,-18.925506 + + + CEO-ULA-00417 + + -1 + 0 + -1 + + -48.284404,-18.912391 + + + CEO-ULA-00495 + + -1 + 0 + -1 + + -48.275935,-18.914429 + + + CEO-ULA-00448 + + -1 + 0 + -1 + + -48.280576,-18.921918 + + + CEO-ULA-00449 + + -1 + 0 + -1 + + -48.277405,-18.917667 + + + CEO-ULA-00488 + + -1 + 0 + -1 + + -48.282118,-18.920169 + + + CEO-ULA-00489 + + -1 + 0 + -1 + + -48.280924,-18.916682 + + + CEO-ULA-00491 + + -1 + 0 + -1 + + -48.282753,-18.913711 + + + ST-ULA-2399 + + -1 + 0 + -1 + + -48.2894488,-18.9230852 + + + ST-ULA-2400 + + -1 + 0 + -1 + + -48.2782936,-18.9196916 + + + ST-ULA-2397 + + -1 + 0 + -1 + + -48.2809308,-18.9166838 + + + ST-ULA-2398 + + -1 + 0 + -1 + + -48.2887073,-18.9228568 + + + ST-ULA-2401 + + -1 + 0 + -1 + + -48.2788126,-18.919553 + + + CEO-ULA-00509 + + -1 + 0 + -1 + + -48.280852,-18.919976 + + + CEO-ULA-00531 + + -1 + 0 + -1 + + -48.289429,-18.92309 + + + ST-ULA-1579 + + -1 + 0 + -1 + + -48.2831316,-18.9231769 + + + ST-ULA-1577 + + -1 + 0 + -1 + + -48.2803822,-18.9193287 + + + ST-ULA-1578 + + -1 + 0 + -1 + + -48.281754,-18.9211827 + + + ST-ULA-1545 + + -1 + 0 + -1 + + -48.2798797,-18.9171188 + + + ST-ULA-1551 + + -1 + 0 + -1 + + -48.2822027,-18.9181888 + + + ST-ULA-1576 + + -1 + 0 + -1 + + -48.2791963,-18.917984 + + + ST-ULA-1580 + + -1 + 0 + -1 + + -48.2820288,-18.9267845 + + + ST-ULA-1736 + + -1 + 0 + -1 + + -48.290548,-18.9198029 + + + ST-ULA-1662 + + -1 + 0 + -1 + + -48.2820532,-18.9267959 + + + ST-ULA-1663 + + -1 + 0 + -1 + + -48.2837533,-18.92488 + + + ST-ULA-1735 + + -1 + 0 + -1 + + -48.2904324,-18.919494 + + + ST-ULA-1745 + + -1 + 0 + -1 + + -48.2893041,-18.9156106 + + + ST-ULA-1773 + + -1 + 0 + -1 + + -48.2896346,-18.9144805 + + + ST-ULA-1759 + + -1 + 0 + -1 + + -48.2838156,-18.9143177 + + + ST-ULA-1760 + + -1 + 0 + -1 + + -48.2840708,-18.9135214 + + + ST-ULA-1761 + + -1 + 0 + -1 + + -48.2809102,-18.9108123 + + + ST-ULA-1776 + + -1 + 0 + -1 + + -48.2845163,-18.9120761 + + + ST-ULA-1777 + + -1 + 0 + -1 + + -48.286238,-18.9147202 + + + ST-ULA-1778 + + -1 + 0 + -1 + + -48.2897804,-18.9139702 + + + ST-ULA-1785 + + -1 + 0 + -1 + + -48.2802345,-18.9267323 + + + ST-ULA-1782 + + -1 + 0 + -1 + + -48.2845618,-18.9259192 + + + ST-ULA-1783 + + -1 + 0 + -1 + + -48.2848909,-18.9255362 + + + ST-ULA-1784 + + -1 + 0 + -1 + + -48.2826035,-18.9257531 + + + ST-ULA-1788 + + -1 + 0 + -1 + + -48.283994,-18.9255066 + + + ST-ULA-1789 + + -1 + 0 + -1 + + -48.2880791,-18.92552 + + + ST-ULA-1791 + + -1 + 0 + -1 + + -48.2848777,-18.9255045 + + + ST-ULA-1792 + + -1 + 0 + -1 + + -48.2845053,-18.9269676 + + + ST-ULA-1793 + + -1 + 0 + -1 + + -48.2823102,-18.9267975 + + + ST-ULA-1794 + + -1 + 0 + -1 + + -48.2849364,-18.9255375 + + + ST-ULA-1800 + + -1 + 0 + -1 + + -48.2841773,-18.9227149 + + + ST-ULA-1801 + + -1 + 0 + -1 + + -48.2836987,-18.9216584 + + + ST-ULA-1802 + + -1 + 0 + -1 + + -48.2848919,-18.9255115 + + + ST-ULA-1838 + + -1 + 0 + -1 + + -48.284408,-18.9123794 + + + ST-ULA-1839 + + -1 + 0 + -1 + + -48.2843991,-18.9123761 + + + ST-ULA-1768 + + -1 + 0 + -1 + + -48.2896203,-18.9145271 + + + ST-ULA-1769 + + -1 + 0 + -1 + + -48.2883589,-18.9185316 + + + ST-ULA-1770 + + -1 + 0 + -1 + + -48.2896109,-18.9145329 + + + ST-ULA-1771 + + -1 + 0 + -1 + + -48.2845797,-18.9120706 + + + ST-ULA-1772 + + -1 + 0 + -1 + + -48.2872279,-18.9128471 + + + ST-ULA-1689 + + -1 + 0 + -1 + + -48.2914404,-18.9163817 + + + ST-ULA-1690 + + -1 + 0 + -1 + + -48.2881643,-18.9154096 + + + ST-ULA-1691 + + -1 + 0 + -1 + + -48.2881523,-18.9154079 + + + ST-ULA-1692 + + -1 + 0 + -1 + + -48.2859653,-18.9147849 + + + ST-ULA-1693 + + -1 + 0 + -1 + + -48.2806094,-18.9183195 + + + ST-ULA-1694 + + -1 + 0 + -1 + + -48.2818765,-18.9164378 + + + ST-ULA-1723 + + -1 + 0 + -1 + + -48.2818717,-18.9112605 + + + ST-ULA-1724 + + -1 + 0 + -1 + + -48.2832877,-18.9120452 + + + ST-ULA-1044 + + -1 + 0 + -1 + + -48.2788265,-18.9195413 + + + ST-ULA-1048 + + -1 + 0 + -1 + + -48.2898389,-18.9139479 + + + ST-ULA-1049 + + -1 + 0 + -1 + + -48.2898306,-18.9138754 + + + ST-ULA-1836 + + -1 + 0 + -1 + + -48.2897986,-18.9139428 + + + ST-ULA-1837 + + -1 + 0 + -1 + + -48.2873611,-18.9128968 + + + ST-ULA-1710 + + -1 + 0 + -1 + + -48.2820099,-18.9239905 + + + ST-ULA-1711 + + -1 + 0 + -1 + + -48.2837723,-18.9242837 + + + ST-ULA-1363 + + -1 + 0 + -1 + + -48.2776727,-18.9229224 + + + ST-ULA-1366 + + -1 + 0 + -1 + + -48.276015,-18.9200525 + + + ST-ULA-1406 + + -1 + 0 + -1 + + -48.2743386,-18.921128 + + + ST-ULA-1129 + + -1 + 0 + -1 + + -48.2881549,-18.9223935 + + + ST-ULA-1130 + + -1 + 0 + -1 + + -48.2888228,-18.9226054 + + + ST-ULA-1246 + + -1 + 0 + -1 + + -48.2809791,-18.9170914 + + + ST-ULA-2007 + + -1 + 0 + -1 + + -48.2781596,-18.9186736 + + + ST-ULA-1963 + + -1 + 0 + -1 + + -48.2788194,-18.919549 + + + ST-ULA-1956 + + -1 + 0 + -1 + + -48.2780189,-18.9123572 + + + ST-ULA-1987 + + -1 + 0 + -1 + + -48.2761483,-18.9185129 + + + ST-ULA-2006 + + -1 + 0 + -1 + + -48.2805711,-18.9219041 + + + ST-ULA-2215 + + -1 + 0 + -1 + + -48.2850344,-18.9143632 + + + ST-ULA-2226 + + -1 + 0 + -1 + + -48.2849368,-18.9255278 + + + ST-ULA-2227 + + -1 + 0 + -1 + + -48.2862061,-18.9255751 + + + ST-ULA-2008 + + -1 + 0 + -1 + + -48.2824599,-18.9242629 + + + ST-ULA-2203 + + -1 + 0 + -1 + + -48.280991,-18.9201737 + + + ST-ULA-2206 + + -1 + 0 + -1 + + -48.2803008,-18.9176824 + + + ST-ULA-2207 + + -1 + 0 + -1 + + -48.2809238,-18.9166913 + + + ST-ULA-2209 + + -1 + 0 + -1 + + -48.2807351,-18.9112935 + + + ST-ULA-2214 + + -1 + 0 + -1 + + -48.2827837,-18.9137244 + + + ST-ULA-1669 + + -1 + 0 + -1 + + -48.2764255,-18.9140386 + + + ST-ULA-1477 + + -1 + 0 + -1 + + -48.2894117,-18.9231269 + + + ST-ULA-1478 + + -1 + 0 + -1 + + -48.2899636,-18.9253263 + + + ST-ULA-1480 + + -1 + 0 + -1 + + -48.2897642,-18.9256209 + + + ST-ULA-2268 + + -1 + 0 + -1 + + -48.2743334,-18.921121 + + + ST-ULA-2281 + + -1 + 0 + -1 + + -48.2808588,-18.9199855 + + + ST-ULA-2282 + + -1 + 0 + -1 + + -48.2830492,-18.9193608 + + + ST-ULA-0330 + + -1 + 0 + -1 + + -48.2905731,-18.9197947 + + + CTO-ULA-00159 + + -1 + 0 + -1 + + -48.290652,-18.918802 + + + CTO-ULA-00160 + + -1 + 0 + -1 + + -48.291211,-18.917047 + + + CTO-ULA-00161 + + -1 + 0 + -1 + + -48.290562,-18.921833 + + + CTO-ULA-00162 + + -1 + 0 + -1 + + -48.291992,-18.919241 + + + diff --git a/lib/android/src/main/java/com/airbnb/android/react/.DS_Store b/lib/android/src/main/java/com/airbnb/android/react/.DS_Store new file mode 100644 index 0000000..56d8c0e Binary files /dev/null and b/lib/android/src/main/java/com/airbnb/android/react/.DS_Store differ diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCallout.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCallout.java new file mode 100644 index 0000000..6f96e15 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCallout.java @@ -0,0 +1,23 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.facebook.react.views.view.ReactViewGroup; + +public class AirMapCallout extends ReactViewGroup { + private boolean tooltip = false; + public int width; + public int height; + + public AirMapCallout(Context context) { + super(context); + } + + public void setTooltip(boolean tooltip) { + this.tooltip = tooltip; + } + + public boolean getTooltip() { + return this.tooltip; + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCalloutManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCalloutManager.java new file mode 100644 index 0000000..b63ea29 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCalloutManager.java @@ -0,0 +1,56 @@ +package com.airbnb.android.react.maps; + +import com.facebook.react.common.MapBuilder; +import com.facebook.react.uimanager.LayoutShadowNode; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +import java.util.Map; + +import javax.annotation.Nullable; + +public class AirMapCalloutManager extends ViewGroupManager { + + @Override + public String getName() { + return "AIRMapCallout"; + } + + @Override + public AirMapCallout createViewInstance(ThemedReactContext context) { + return new AirMapCallout(context); + } + + @ReactProp(name = "tooltip", defaultBoolean = false) + public void setTooltip(AirMapCallout view, boolean tooltip) { + view.setTooltip(tooltip); + } + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + return MapBuilder.of("onPress", MapBuilder.of("registrationName", "onPress")); + } + + @Override + public LayoutShadowNode createShadowNodeInstance() { + // we use a custom shadow node that emits the width/height of the view + // after layout with the updateExtraData method. Without this, we can't generate + // a bitmap of the appropriate width/height of the rendered view. + return new SizeReportingShadowNode(); + } + + @Override + public void updateExtraData(AirMapCallout view, Object extraData) { + // This method is called from the shadow node with the width/height of the rendered + // marker view. + //noinspection unchecked + Map data = (Map) extraData; + float width = data.get("width"); + float height = data.get("height"); + view.width = (int) width; + view.height = (int) height; + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircle.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircle.java new file mode 100644 index 0000000..a70d914 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircle.java @@ -0,0 +1,100 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; + +public class AirMapCircle extends AirMapFeature { + + private CircleOptions circleOptions; + private Circle circle; + + private LatLng center; + private double radius; + private int strokeColor; + private int fillColor; + private float strokeWidth; + private float zIndex; + + public AirMapCircle(Context context) { + super(context); + } + + public void setCenter(LatLng center) { + this.center = center; + if (circle != null) { + circle.setCenter(this.center); + } + } + + public void setRadius(double radius) { + this.radius = radius; + if (circle != null) { + circle.setRadius(this.radius); + } + } + + public void setFillColor(int color) { + this.fillColor = color; + if (circle != null) { + circle.setFillColor(color); + } + } + + public void setStrokeColor(int color) { + this.strokeColor = color; + if (circle != null) { + circle.setStrokeColor(color); + } + } + + public void setStrokeWidth(float width) { + this.strokeWidth = width; + if (circle != null) { + circle.setStrokeWidth(width); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (circle != null) { + circle.setZIndex(zIndex); + } + } + + public CircleOptions getCircleOptions() { + if (circleOptions == null) { + circleOptions = createCircleOptions(); + } + return circleOptions; + } + + private CircleOptions createCircleOptions() { + CircleOptions options = new CircleOptions(); + options.center(center); + options.radius(radius); + options.fillColor(fillColor); + options.strokeColor(strokeColor); + options.strokeWidth(strokeWidth); + options.zIndex(zIndex); + return options; + } + + @Override + public Object getFeature() { + return circle; + } + + @Override + public void addToMap(GoogleMap map) { + circle = map.addCircle(getCircleOptions()); + } + + @Override + public void removeFromMap(GoogleMap map) { + circle.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircleManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircleManager.java new file mode 100644 index 0000000..c8eabf2 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapCircleManager.java @@ -0,0 +1,72 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; +import com.google.android.gms.maps.model.LatLng; + +public class AirMapCircleManager extends ViewGroupManager { + private final DisplayMetrics metrics; + + public AirMapCircleManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapCircle"; + } + + @Override + public AirMapCircle createViewInstance(ThemedReactContext context) { + return new AirMapCircle(context); + } + + @ReactProp(name = "center") + public void setCenter(AirMapCircle view, ReadableMap center) { + view.setCenter(new LatLng(center.getDouble("latitude"), center.getDouble("longitude"))); + } + + @ReactProp(name = "radius", defaultDouble = 0) + public void setRadius(AirMapCircle view, double radius) { + view.setRadius(radius); + } + + @ReactProp(name = "strokeWidth", defaultFloat = 1f) + public void setStrokeWidth(AirMapCircle view, float widthInPoints) { + float widthInScreenPx = metrics.density * widthInPoints; // done for parity with iOS + view.setStrokeWidth(widthInScreenPx); + } + + @ReactProp(name = "fillColor", defaultInt = Color.RED, customType = "Color") + public void setFillColor(AirMapCircle view, int color) { + view.setFillColor(color); + } + + @ReactProp(name = "strokeColor", defaultInt = Color.RED, customType = "Color") + public void setStrokeColor(AirMapCircle view, int color) { + view.setStrokeColor(color); + } + + @ReactProp(name = "zIndex", defaultFloat = 1.0f) + public void setZIndex(AirMapCircle view, float zIndex) { + view.setZIndex(zIndex); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapFeature.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapFeature.java new file mode 100644 index 0000000..70484c1 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapFeature.java @@ -0,0 +1,18 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.facebook.react.views.view.ReactViewGroup; +import com.google.android.gms.maps.GoogleMap; + +public abstract class AirMapFeature extends ReactViewGroup { + public AirMapFeature(Context context) { + super(context); + } + + public abstract void addToMap(GoogleMap map); + + public abstract void removeFromMap(GoogleMap map); + + public abstract Object getFeature(); +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLiteManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLiteManager.java new file mode 100644 index 0000000..619e364 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLiteManager.java @@ -0,0 +1,20 @@ +package com.airbnb.android.react.maps; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.google.android.gms.maps.GoogleMapOptions; + +public class AirMapLiteManager extends AirMapManager { + + private static final String REACT_CLASS = "AIRMapLite"; + + @Override + public String getName() { + return REACT_CLASS; + } + + public AirMapLiteManager(ReactApplicationContext context) { + super(context); + this.googleMapOptions = new GoogleMapOptions().liteMode(true); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTile.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTile.java new file mode 100644 index 0000000..159a1cc --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTile.java @@ -0,0 +1,148 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.Tile; +import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.gms.maps.model.TileOverlayOptions; +import com.google.android.gms.maps.model.TileProvider; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class AirMapLocalTile extends AirMapFeature { + + class AIRMapLocalTileProvider implements TileProvider { + private static final int BUFFER_SIZE = 16 * 1024; + private int tileSize; + private String pathTemplate; + + + public AIRMapLocalTileProvider(int tileSizet, String pathTemplate) { + this.tileSize = tileSizet; + this.pathTemplate = pathTemplate; + } + + @Override + public Tile getTile(int x, int y, int zoom) { + byte[] image = readTileImage(x, y, zoom); + return image == null ? TileProvider.NO_TILE : new Tile(this.tileSize, this.tileSize, image); + } + + public void setPathTemplate(String pathTemplate) { + this.pathTemplate = pathTemplate; + } + + public void setTileSize(int tileSize) { + this.tileSize = tileSize; + } + + private byte[] readTileImage(int x, int y, int zoom) { + InputStream in = null; + ByteArrayOutputStream buffer = null; + File file = new File(getTileFilename(x, y, zoom)); + + try { + in = new FileInputStream(file); + buffer = new ByteArrayOutputStream(); + + int nRead; + byte[] data = new byte[BUFFER_SIZE]; + + while ((nRead = in.read(data, 0, BUFFER_SIZE)) != -1) { + buffer.write(data, 0, nRead); + } + buffer.flush(); + + return buffer.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } catch (OutOfMemoryError e) { + e.printStackTrace(); + return null; + } finally { + if (in != null) try { in.close(); } catch (Exception ignored) {} + if (buffer != null) try { buffer.close(); } catch (Exception ignored) {} + } + } + + private String getTileFilename(int x, int y, int zoom) { + String s = this.pathTemplate + .replace("{x}", Integer.toString(x)) + .replace("{y}", Integer.toString(y)) + .replace("{z}", Integer.toString(zoom)); + return s; + } + } + + private TileOverlayOptions tileOverlayOptions; + private TileOverlay tileOverlay; + private AirMapLocalTile.AIRMapLocalTileProvider tileProvider; + + private String pathTemplate; + private float tileSize; + private float zIndex; + + public AirMapLocalTile(Context context) { + super(context); + } + + public void setPathTemplate(String pathTemplate) { + this.pathTemplate = pathTemplate; + if (tileProvider != null) { + tileProvider.setPathTemplate(pathTemplate); + } + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (tileOverlay != null) { + tileOverlay.setZIndex(zIndex); + } + } + + public void setTileSize(float tileSize) { + this.tileSize = tileSize; + if (tileProvider != null) { + tileProvider.setTileSize((int)tileSize); + } + } + + public TileOverlayOptions getTileOverlayOptions() { + if (tileOverlayOptions == null) { + tileOverlayOptions = createTileOverlayOptions(); + } + return tileOverlayOptions; + } + + private TileOverlayOptions createTileOverlayOptions() { + TileOverlayOptions options = new TileOverlayOptions(); + options.zIndex(zIndex); + this.tileProvider = new AirMapLocalTile.AIRMapLocalTileProvider((int)this.tileSize, this.pathTemplate); + options.tileProvider(this.tileProvider); + return options; + } + + @Override + public Object getFeature() { + return tileOverlay; + } + + @Override + public void addToMap(GoogleMap map) { + this.tileOverlay = map.addTileOverlay(getTileOverlayOptions()); + } + + @Override + public void removeFromMap(GoogleMap map) { + tileOverlay.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTileManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTileManager.java new file mode 100644 index 0000000..c964788 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTileManager.java @@ -0,0 +1,56 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +/** + * Created by zavadpe on 30/11/2017. + */ +public class AirMapLocalTileManager extends ViewGroupManager { + private DisplayMetrics metrics; + + public AirMapLocalTileManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapLocalTile"; + } + + @Override + public AirMapLocalTile createViewInstance(ThemedReactContext context) { + return new AirMapLocalTile(context); + } + + @ReactProp(name = "pathTemplate") + public void setPathTemplate(AirMapLocalTile view, String pathTemplate) { + view.setPathTemplate(pathTemplate); + } + + @ReactProp(name = "tileSize", defaultFloat = 256f) + public void setTileSize(AirMapLocalTile view, float tileSize) { + view.setTileSize(tileSize); + } + + @ReactProp(name = "zIndex", defaultFloat = -1.0f) + public void setZIndex(AirMapLocalTile view, float zIndex) { + view.setZIndex(zIndex); + } + +} \ No newline at end of file diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java new file mode 100644 index 0000000..2be486a --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java @@ -0,0 +1,469 @@ +package com.airbnb.android.react.maps; + +import android.view.View; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.common.MapBuilder; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.uimanager.LayoutShadowNode; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; +import com.facebook.react.uimanager.events.RCTEventEmitter; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MapStyleOptions; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nullable; + +public class AirMapManager extends ViewGroupManager { + + private static final String REACT_CLASS = "AIRMap"; + private static final int ANIMATE_TO_REGION = 1; + private static final int ANIMATE_TO_COORDINATE = 2; + private static final int ANIMATE_TO_VIEWING_ANGLE = 3; + private static final int ANIMATE_TO_BEARING = 4; + private static final int FIT_TO_ELEMENTS = 5; + private static final int FIT_TO_SUPPLIED_MARKERS = 6; + private static final int FIT_TO_COORDINATES = 7; + private static final int SET_MAP_BOUNDARIES = 8; + private static final int ANIMATE_TO_NAVIGATION = 9; + private static final int SET_INDOOR_ACTIVE_LEVEL_INDEX = 10; + private static final int SET_CAMERA = 11; + private static final int ANIMATE_CAMERA = 12; + + + private final Map MAP_TYPES = MapBuilder.of( + "standard", GoogleMap.MAP_TYPE_NORMAL, + "satellite", GoogleMap.MAP_TYPE_SATELLITE, + "hybrid", GoogleMap.MAP_TYPE_HYBRID, + "terrain", GoogleMap.MAP_TYPE_TERRAIN, + "none", GoogleMap.MAP_TYPE_NONE + ); + + private final ReactApplicationContext appContext; + private AirMapMarkerManager markerManager; + + protected GoogleMapOptions googleMapOptions; + + public AirMapManager(ReactApplicationContext context) { + this.appContext = context; + this.googleMapOptions = new GoogleMapOptions(); + } + + public AirMapMarkerManager getMarkerManager() { + return this.markerManager; + } + public void setMarkerManager(AirMapMarkerManager markerManager) { + this.markerManager = markerManager; + } + + @Override + public String getName() { + return REACT_CLASS; + } + + @Override + protected AirMapView createViewInstance(ThemedReactContext context) { + return new AirMapView(context, this.appContext, this, googleMapOptions); + } + + private void emitMapError(ThemedReactContext context, String message, String type) { + WritableMap error = Arguments.createMap(); + error.putString("message", message); + error.putString("type", type); + + context + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("onError", error); + } + + @ReactProp(name = "region") + public void setRegion(AirMapView view, ReadableMap region) { + view.setRegion(region); + } + + @ReactProp(name = "initialRegion") + public void setInitialRegion(AirMapView view, ReadableMap initialRegion) { + view.setInitialRegion(initialRegion); + } + + @ReactProp(name = "camera") + public void setCamera(AirMapView view, ReadableMap camera) { + view.setCamera(camera); + } + + @ReactProp(name = "initialCamera") + public void setInitialCamera(AirMapView view, ReadableMap initialCamera) { + view.setInitialCamera(initialCamera); + } + + @ReactProp(name = "mapType") + public void setMapType(AirMapView view, @Nullable String mapType) { + int typeId = MAP_TYPES.get(mapType); + view.map.setMapType(typeId); + } + + @ReactProp(name = "customMapStyleString") + public void setMapStyle(AirMapView view, @Nullable String customMapStyleString) { + view.map.setMapStyle(new MapStyleOptions(customMapStyleString)); + } + + @ReactProp(name = "mapPadding") + public void setMapPadding(AirMapView view, @Nullable ReadableMap padding) { + int left = 0; + int top = 0; + int right = 0; + int bottom = 0; + double density = (double) view.getResources().getDisplayMetrics().density; + + if (padding != null) { + if (padding.hasKey("left")) { + left = (int) (padding.getDouble("left") * density); + } + + if (padding.hasKey("top")) { + top = (int) (padding.getDouble("top") * density); + } + + if (padding.hasKey("right")) { + right = (int) (padding.getDouble("right") * density); + } + + if (padding.hasKey("bottom")) { + bottom = (int) (padding.getDouble("bottom") * density); + } + } + + view.map.setPadding(left, top, right, bottom); + } + + @ReactProp(name = "showsUserLocation", defaultBoolean = false) + public void setShowsUserLocation(AirMapView view, boolean showUserLocation) { + view.setShowsUserLocation(showUserLocation); + } + + @ReactProp(name = "showsMyLocationButton", defaultBoolean = true) + public void setShowsMyLocationButton(AirMapView view, boolean showMyLocationButton) { + view.setShowsMyLocationButton(showMyLocationButton); + } + + @ReactProp(name = "toolbarEnabled", defaultBoolean = true) + public void setToolbarEnabled(AirMapView view, boolean toolbarEnabled) { + view.setToolbarEnabled(toolbarEnabled); + } + + // This is a private prop to improve performance of panDrag by disabling it when the callback + // is not set + @ReactProp(name = "handlePanDrag", defaultBoolean = false) + public void setHandlePanDrag(AirMapView view, boolean handlePanDrag) { + view.setHandlePanDrag(handlePanDrag); + } + + @ReactProp(name = "showsTraffic", defaultBoolean = false) + public void setShowTraffic(AirMapView view, boolean showTraffic) { + view.map.setTrafficEnabled(showTraffic); + } + + @ReactProp(name = "showsBuildings", defaultBoolean = false) + public void setShowBuildings(AirMapView view, boolean showBuildings) { + view.map.setBuildingsEnabled(showBuildings); + } + + @ReactProp(name = "showsIndoors", defaultBoolean = false) + public void setShowIndoors(AirMapView view, boolean showIndoors) { + view.map.setIndoorEnabled(showIndoors); + } + + @ReactProp(name = "showsIndoorLevelPicker", defaultBoolean = false) + public void setShowsIndoorLevelPicker(AirMapView view, boolean showsIndoorLevelPicker) { + view.map.getUiSettings().setIndoorLevelPickerEnabled(showsIndoorLevelPicker); + } + + @ReactProp(name = "showsCompass", defaultBoolean = false) + public void setShowsCompass(AirMapView view, boolean showsCompass) { + view.map.getUiSettings().setCompassEnabled(showsCompass); + } + + @ReactProp(name = "scrollEnabled", defaultBoolean = false) + public void setScrollEnabled(AirMapView view, boolean scrollEnabled) { + view.map.getUiSettings().setScrollGesturesEnabled(scrollEnabled); + } + + @ReactProp(name = "zoomEnabled", defaultBoolean = false) + public void setZoomEnabled(AirMapView view, boolean zoomEnabled) { + view.map.getUiSettings().setZoomGesturesEnabled(zoomEnabled); + } + + @ReactProp(name = "zoomControlEnabled", defaultBoolean = true) + public void setZoomControlEnabled(AirMapView view, boolean zoomControlEnabled) { + view.map.getUiSettings().setZoomControlsEnabled(zoomControlEnabled); + } + + @ReactProp(name = "rotateEnabled", defaultBoolean = false) + public void setRotateEnabled(AirMapView view, boolean rotateEnabled) { + view.map.getUiSettings().setRotateGesturesEnabled(rotateEnabled); + } + + @ReactProp(name = "cacheEnabled", defaultBoolean = false) + public void setCacheEnabled(AirMapView view, boolean cacheEnabled) { + view.setCacheEnabled(cacheEnabled); + } + + @ReactProp(name = "loadingEnabled", defaultBoolean = false) + public void setLoadingEnabled(AirMapView view, boolean loadingEnabled) { + view.enableMapLoading(loadingEnabled); + } + + @ReactProp(name = "moveOnMarkerPress", defaultBoolean = true) + public void setMoveOnMarkerPress(AirMapView view, boolean moveOnPress) { + view.setMoveOnMarkerPress(moveOnPress); + } + + @ReactProp(name = "loadingBackgroundColor", customType = "Color") + public void setLoadingBackgroundColor(AirMapView view, @Nullable Integer loadingBackgroundColor) { + view.setLoadingBackgroundColor(loadingBackgroundColor); + } + + @ReactProp(name = "loadingIndicatorColor", customType = "Color") + public void setLoadingIndicatorColor(AirMapView view, @Nullable Integer loadingIndicatorColor) { + view.setLoadingIndicatorColor(loadingIndicatorColor); + } + + @ReactProp(name = "pitchEnabled", defaultBoolean = false) + public void setPitchEnabled(AirMapView view, boolean pitchEnabled) { + view.map.getUiSettings().setTiltGesturesEnabled(pitchEnabled); + } + + @ReactProp(name = "minZoomLevel") + public void setMinZoomLevel(AirMapView view, float minZoomLevel) { + view.map.setMinZoomPreference(minZoomLevel); + } + + @ReactProp(name = "maxZoomLevel") + public void setMaxZoomLevel(AirMapView view, float maxZoomLevel) { + view.map.setMaxZoomPreference(maxZoomLevel); + } + + @ReactProp(name = "kmlSrc") + public void setKmlSrc(AirMapView view, String kmlUrl) { + if (kmlUrl != null) { + view.setKmlSrc(kmlUrl); + } + } + + @Override + public void receiveCommand(AirMapView view, int commandId, @Nullable ReadableArray args) { + Integer duration; + Double lat; + Double lng; + Double lngDelta; + Double latDelta; + float bearing; + float angle; + ReadableMap region; + ReadableMap camera; + + switch (commandId) { + case SET_CAMERA: + camera = args.getMap(0); + view.animateToCamera(camera, 0); + break; + + case ANIMATE_CAMERA: + camera = args.getMap(0); + duration = args.getInt(1); + view.animateToCamera(camera, duration); + break; + + case ANIMATE_TO_NAVIGATION: + region = args.getMap(0); + lng = region.getDouble("longitude"); + lat = region.getDouble("latitude"); + LatLng location = new LatLng(lat, lng); + bearing = (float)args.getDouble(1); + angle = (float)args.getDouble(2); + duration = args.getInt(3); + view.animateToNavigation(location, bearing, angle, duration); + break; + + case ANIMATE_TO_REGION: + region = args.getMap(0); + duration = args.getInt(1); + lng = region.getDouble("longitude"); + lat = region.getDouble("latitude"); + lngDelta = region.getDouble("longitudeDelta"); + latDelta = region.getDouble("latitudeDelta"); + LatLngBounds bounds = new LatLngBounds( + new LatLng(lat - latDelta / 2, lng - lngDelta / 2), // southwest + new LatLng(lat + latDelta / 2, lng + lngDelta / 2) // northeast + ); + view.animateToRegion(bounds, duration); + break; + + case ANIMATE_TO_COORDINATE: + region = args.getMap(0); + duration = args.getInt(1); + lng = region.getDouble("longitude"); + lat = region.getDouble("latitude"); + view.animateToCoordinate(new LatLng(lat, lng), duration); + break; + + case ANIMATE_TO_VIEWING_ANGLE: + angle = (float)args.getDouble(0); + duration = args.getInt(1); + view.animateToViewingAngle(angle, duration); + break; + + case ANIMATE_TO_BEARING: + bearing = (float)args.getDouble(0); + duration = args.getInt(1); + view.animateToBearing(bearing, duration); + break; + + case FIT_TO_ELEMENTS: + view.fitToElements(args.getBoolean(0)); + break; + + case FIT_TO_SUPPLIED_MARKERS: + view.fitToSuppliedMarkers(args.getArray(0), args.getMap(1), args.getBoolean(2)); + break; + + case FIT_TO_COORDINATES: + view.fitToCoordinates(args.getArray(0), args.getMap(1), args.getBoolean(2)); + break; + + case SET_MAP_BOUNDARIES: + view.setMapBoundaries(args.getMap(0), args.getMap(1)); + break; + + case SET_INDOOR_ACTIVE_LEVEL_INDEX: + view.setIndoorActiveLevelIndex(args.getInt(0)); + break; + } + } + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + Map> map = MapBuilder.of( + "onMapReady", MapBuilder.of("registrationName", "onMapReady"), + "onPress", MapBuilder.of("registrationName", "onPress"), + "onLongPress", MapBuilder.of("registrationName", "onLongPress"), + "onMarkerPress", MapBuilder.of("registrationName", "onMarkerPress"), + "onMarkerSelect", MapBuilder.of("registrationName", "onMarkerSelect"), + "onMarkerDeselect", MapBuilder.of("registrationName", "onMarkerDeselect"), + "onCalloutPress", MapBuilder.of("registrationName", "onCalloutPress") + ); + + map.putAll(MapBuilder.of( + "onUserLocationChange", MapBuilder.of("registrationName", "onUserLocationChange"), + "onMarkerDragStart", MapBuilder.of("registrationName", "onMarkerDragStart"), + "onMarkerDrag", MapBuilder.of("registrationName", "onMarkerDrag"), + "onMarkerDragEnd", MapBuilder.of("registrationName", "onMarkerDragEnd"), + "onPanDrag", MapBuilder.of("registrationName", "onPanDrag"), + "onKmlReady", MapBuilder.of("registrationName", "onKmlReady"), + "onPoiClick", MapBuilder.of("registrationName", "onPoiClick") + )); + + map.putAll(MapBuilder.of( + "onIndoorLevelActivated", MapBuilder.of("registrationName", "onIndoorLevelActivated"), + "onIndoorBuildingFocused", MapBuilder.of("registrationName", "onIndoorBuildingFocused") + )); + + return map; + } + + @Nullable + @Override + public Map getCommandsMap() { + Map map = this.CreateMap( + "setCamera", SET_CAMERA, + "animateCamera", ANIMATE_CAMERA, + "animateToRegion", ANIMATE_TO_REGION, + "animateToCoordinate", ANIMATE_TO_COORDINATE, + "animateToViewingAngle", ANIMATE_TO_VIEWING_ANGLE, + "animateToBearing", ANIMATE_TO_BEARING, + "fitToElements", FIT_TO_ELEMENTS, + "fitToSuppliedMarkers", FIT_TO_SUPPLIED_MARKERS, + "fitToCoordinates", FIT_TO_COORDINATES, + "animateToNavigation", ANIMATE_TO_NAVIGATION + ); + + map.putAll(MapBuilder.of( + "setMapBoundaries", SET_MAP_BOUNDARIES, + "setIndoorActiveLevelIndex", SET_INDOOR_ACTIVE_LEVEL_INDEX + )); + + return map; + } + + public static Map CreateMap( + K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { + Map map = new HashMap(); + map.put(k1, v1); + map.put(k2, v2); + map.put(k3, v3); + map.put(k4, v4); + map.put(k5, v5); + map.put(k6, v6); + map.put(k7, v7); + map.put(k8, v8); + map.put(k9, v9); + map.put(k10, v10); + return map; + } + + @Override + public LayoutShadowNode createShadowNodeInstance() { + // A custom shadow node is needed in order to pass back the width/height of the map to the + // view manager so that it can start applying camera moves with bounds. + return new SizeReportingShadowNode(); + } + + @Override + public void addView(AirMapView parent, View child, int index) { + parent.addFeature(child, index); + } + + @Override + public int getChildCount(AirMapView view) { + return view.getFeatureCount(); + } + + @Override + public View getChildAt(AirMapView view, int index) { + return view.getFeatureAt(index); + } + + @Override + public void removeViewAt(AirMapView parent, int index) { + parent.removeFeatureAt(index); + } + + @Override + public void updateExtraData(AirMapView view, Object extraData) { + view.updateExtraData(extraData); + } + + void pushEvent(ThemedReactContext context, View view, String name, WritableMap data) { + context.getJSModule(RCTEventEmitter.class) + .receiveEvent(view.getId(), name, data); + } + + @Override + public void onDropViewInstance(AirMapView view) { + view.doDestroy(); + super.onDropViewInstance(view); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarker.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarker.java new file mode 100644 index 0000000..77beefd --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarker.java @@ -0,0 +1,627 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.view.View; +import android.widget.LinearLayout; +import android.animation.ObjectAnimator; +import android.util.Property; +import android.animation.TypeEvaluator; + +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.controller.BaseControllerListener; +import com.facebook.drawee.controller.ControllerListener; +import com.facebook.drawee.drawable.ScalingUtils; +import com.facebook.drawee.generic.GenericDraweeHierarchy; +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.DraweeHolder; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.image.CloseableImage; +import com.facebook.imagepipeline.image.CloseableStaticBitmap; +import com.facebook.imagepipeline.image.ImageInfo; +import com.facebook.imagepipeline.request.ImageRequest; +import com.facebook.imagepipeline.request.ImageRequestBuilder; +import com.facebook.react.bridge.ReadableMap; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; + +import javax.annotation.Nullable; + +public class AirMapMarker extends AirMapFeature { + + private MarkerOptions markerOptions; + private Marker marker; + private int width; + private int height; + private String identifier; + + private LatLng position; + private String title; + private String snippet; + + private boolean anchorIsSet; + private float anchorX; + private float anchorY; + + private AirMapCallout calloutView; + private View wrappedCalloutView; + private final Context context; + + private float markerHue = 0.0f; // should be between 0 and 360 + private BitmapDescriptor iconBitmapDescriptor; + private Bitmap iconBitmap; + + private float rotation = 0.0f; + private boolean flat = false; + private boolean draggable = false; + private int zIndex = 0; + private float opacity = 1.0f; + + private float calloutAnchorX; + private float calloutAnchorY; + private boolean calloutAnchorIsSet; + + private boolean tracksViewChanges = true; + private boolean tracksViewChangesActive = false; + private boolean hasViewChanges = true; + + private boolean hasCustomMarkerView = false; + private final AirMapMarkerManager markerManager; + private String imageUri; + + private final DraweeHolder logoHolder; + private DataSource> dataSource; + private final ControllerListener mLogoControllerListener = + new BaseControllerListener() { + @Override + public void onFinalImageSet( + String id, + @Nullable final ImageInfo imageInfo, + @Nullable Animatable animatable) { + CloseableReference imageReference = null; + try { + imageReference = dataSource.getResult(); + if (imageReference != null) { + CloseableImage image = imageReference.get(); + if (image != null && image instanceof CloseableStaticBitmap) { + CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) image; + Bitmap bitmap = closeableStaticBitmap.getUnderlyingBitmap(); + if (bitmap != null) { + bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); + iconBitmap = bitmap; + iconBitmapDescriptor = BitmapDescriptorFactory.fromBitmap(bitmap); + } + } + } + } finally { + dataSource.close(); + if (imageReference != null) { + CloseableReference.closeSafely(imageReference); + } + } + if (AirMapMarker.this.markerManager != null && AirMapMarker.this.imageUri != null) { + AirMapMarker.this.markerManager.getSharedIcon(AirMapMarker.this.imageUri) + .updateIcon(iconBitmapDescriptor, iconBitmap); + } + update(true); + } + }; + + public AirMapMarker(Context context, AirMapMarkerManager markerManager) { + super(context); + this.context = context; + this.markerManager = markerManager; + logoHolder = DraweeHolder.create(createDraweeHierarchy(), context); + logoHolder.onAttach(); + } + + public AirMapMarker(Context context, MarkerOptions options, AirMapMarkerManager markerManager) { + super(context); + this.context = context; + this.markerManager = markerManager; + logoHolder = DraweeHolder.create(createDraweeHierarchy(), context); + logoHolder.onAttach(); + + position = options.getPosition(); + setAnchor(options.getAnchorU(), options.getAnchorV()); + setCalloutAnchor(options.getInfoWindowAnchorU(), options.getInfoWindowAnchorV()); + setTitle(options.getTitle()); + setSnippet(options.getSnippet()); + setRotation(options.getRotation()); + setFlat(options.isFlat()); + setDraggable(options.isDraggable()); + setZIndex(Math.round(options.getZIndex())); + setAlpha(options.getAlpha()); + iconBitmapDescriptor = options.getIcon(); + } + + private GenericDraweeHierarchy createDraweeHierarchy() { + return new GenericDraweeHierarchyBuilder(getResources()) + .setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER) + .setFadeDuration(0) + .build(); + } + + public void setCoordinate(ReadableMap coordinate) { + position = new LatLng(coordinate.getDouble("latitude"), coordinate.getDouble("longitude")); + if (marker != null) { + marker.setPosition(position); + } + update(false); + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + update(false); + } + + public String getIdentifier() { + return this.identifier; + } + + public void setTitle(String title) { + this.title = title; + if (marker != null) { + marker.setTitle(title); + } + update(false); + } + + public void setSnippet(String snippet) { + this.snippet = snippet; + if (marker != null) { + marker.setSnippet(snippet); + } + update(false); + } + + public void setRotation(float rotation) { + this.rotation = rotation; + if (marker != null) { + marker.setRotation(rotation); + } + update(false); + } + + public void setFlat(boolean flat) { + this.flat = flat; + if (marker != null) { + marker.setFlat(flat); + } + update(false); + } + + public void setDraggable(boolean draggable) { + this.draggable = draggable; + if (marker != null) { + marker.setDraggable(draggable); + } + update(false); + } + + public void setZIndex(int zIndex) { + this.zIndex = zIndex; + if (marker != null) { + marker.setZIndex(zIndex); + } + update(false); + } + + public void setOpacity(float opacity) { + this.opacity = opacity; + if (marker != null) { + marker.setAlpha(opacity); + } + update(false); + } + + public void setMarkerHue(float markerHue) { + this.markerHue = markerHue; + update(false); + } + + public void setAnchor(double x, double y) { + anchorIsSet = true; + anchorX = (float) x; + anchorY = (float) y; + if (marker != null) { + marker.setAnchor(anchorX, anchorY); + } + update(false); + } + + public void setCalloutAnchor(double x, double y) { + calloutAnchorIsSet = true; + calloutAnchorX = (float) x; + calloutAnchorY = (float) y; + if (marker != null) { + marker.setInfoWindowAnchor(calloutAnchorX, calloutAnchorY); + } + update(false); + } + + public void setTracksViewChanges(boolean tracksViewChanges) { + this.tracksViewChanges = tracksViewChanges; + updateTracksViewChanges(); + } + + private void updateTracksViewChanges() { + boolean shouldTrack = tracksViewChanges && hasCustomMarkerView && marker != null; + if (shouldTrack == tracksViewChangesActive) return; + tracksViewChangesActive = shouldTrack; + + if (shouldTrack) { + ViewChangesTracker.getInstance().addMarker(this); + } else { + ViewChangesTracker.getInstance().removeMarker(this); + + // Let it render one more time to avoid race conditions. + // i.e. Image onLoad -> + // ViewChangesTracker may not get a chance to render -> + // setState({ tracksViewChanges: false }) -> + // image loaded but not rendered. + updateMarkerIcon(); + } + } + + public boolean updateCustomForTracking() { + if (!tracksViewChangesActive) + return false; + + updateMarkerIcon(); + + return true; + } + + public void updateMarkerIcon() { + if (marker == null) return; + + if (!hasCustomMarkerView) { + // No more updates for this, as it's a simple icon + hasViewChanges = false; + } + if (marker != null) { + marker.setIcon(getIcon()); + } + } + + public LatLng interpolate(float fraction, LatLng a, LatLng b) { + double lat = (b.latitude - a.latitude) * fraction + a.latitude; + double lng = (b.longitude - a.longitude) * fraction + a.longitude; + return new LatLng(lat, lng); + } + + public void animateToCoodinate(LatLng finalPosition, Integer duration) { + TypeEvaluator typeEvaluator = new TypeEvaluator() { + @Override + public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) { + return interpolate(fraction, startValue, endValue); + } + }; + Property property = Property.of(Marker.class, LatLng.class, "position"); + ObjectAnimator animator = ObjectAnimator.ofObject( + marker, + property, + typeEvaluator, + finalPosition); + animator.setDuration(duration); + animator.start(); + } + + public void setImage(String uri) { + hasViewChanges = true; + + boolean shouldLoadImage = true; + + if (this.markerManager != null) { + // remove marker from previous shared icon if needed, to avoid future updates from it. + // remove the shared icon completely if no markers on it as well. + // this is to avoid memory leak due to orphan bitmaps. + // + // However in case where client want to update all markers from icon A to icon B + // and after some time to update back from icon B to icon A + // it may be better to keep it though. We assume that is rare. + if (this.imageUri != null) { + this.markerManager.getSharedIcon(this.imageUri).removeMarker(this); + this.markerManager.removeSharedIconIfEmpty(this.imageUri); + } + if (uri != null) { + // listening for marker bitmap descriptor update, as well as check whether to load the image. + AirMapMarkerManager.AirMapMarkerSharedIcon sharedIcon = this.markerManager.getSharedIcon(uri); + sharedIcon.addMarker(this); + shouldLoadImage = sharedIcon.shouldLoadImage(); + } + } + + this.imageUri = uri; + if (!shouldLoadImage) {return;} + + if (uri == null) { + iconBitmapDescriptor = null; + update(true); + } else if (uri.startsWith("http://") || uri.startsWith("https://") || + uri.startsWith("file://") || uri.startsWith("asset://") || uri.startsWith("data:")) { + ImageRequest imageRequest = ImageRequestBuilder + .newBuilderWithSource(Uri.parse(uri)) + .build(); + + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + dataSource = imagePipeline.fetchDecodedImage(imageRequest, this); + DraweeController controller = Fresco.newDraweeControllerBuilder() + .setImageRequest(imageRequest) + .setControllerListener(mLogoControllerListener) + .setOldController(logoHolder.getController()) + .build(); + logoHolder.setController(controller); + } else { + iconBitmapDescriptor = getBitmapDescriptorByName(uri); + if (iconBitmapDescriptor != null) { + int drawableId = getDrawableResourceByName(uri); + iconBitmap = BitmapFactory.decodeResource(getResources(), drawableId); + if (iconBitmap == null) { // VectorDrawable or similar + Drawable drawable = getResources().getDrawable(drawableId); + iconBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + Canvas canvas = new Canvas(iconBitmap); + drawable.draw(canvas); + } + } + if (this.markerManager != null && uri != null) { + this.markerManager.getSharedIcon(uri).updateIcon(iconBitmapDescriptor, iconBitmap); + } + update(true); + } + } + + public void setIconBitmapDescriptor(BitmapDescriptor bitmapDescriptor, Bitmap bitmap) { + this.iconBitmapDescriptor = bitmapDescriptor; + this.iconBitmap = bitmap; + this.hasViewChanges = true; + this.update(true); + } + + public void setIconBitmap(Bitmap bitmap) { + this.iconBitmap = bitmap; + } + + public MarkerOptions getMarkerOptions() { + if (markerOptions == null) { + markerOptions = new MarkerOptions(); + } + + fillMarkerOptions(markerOptions); + return markerOptions; + } + + @Override + public void addView(View child, int index) { + super.addView(child, index); + // if children are added, it means we are rendering a custom marker + if (!(child instanceof AirMapCallout)) { + hasCustomMarkerView = true; + updateTracksViewChanges(); + } + update(true); + } + + @Override + public void requestLayout() { + super.requestLayout(); + + if (getChildCount() == 0) { + if (hasCustomMarkerView) { + hasCustomMarkerView = false; + clearDrawableCache(); + updateTracksViewChanges(); + update(true); + } + + } + } + + @Override + public Object getFeature() { + return marker; + } + + @Override + public void addToMap(GoogleMap map) { + marker = map.addMarker(getMarkerOptions()); + updateTracksViewChanges(); + } + + @Override + public void removeFromMap(GoogleMap map) { + marker.remove(); + marker = null; + updateTracksViewChanges(); + } + + private BitmapDescriptor getIcon() { + if (hasCustomMarkerView) { + // creating a bitmap from an arbitrary view + if (iconBitmapDescriptor != null) { + Bitmap viewBitmap = createDrawable(); + int width = Math.max(iconBitmap.getWidth(), viewBitmap.getWidth()); + int height = Math.max(iconBitmap.getHeight(), viewBitmap.getHeight()); + Bitmap combinedBitmap = Bitmap.createBitmap(width, height, iconBitmap.getConfig()); + Canvas canvas = new Canvas(combinedBitmap); + canvas.drawBitmap(iconBitmap, 0, 0, null); + canvas.drawBitmap(viewBitmap, 0, 0, null); + return BitmapDescriptorFactory.fromBitmap(combinedBitmap); + } else { + return BitmapDescriptorFactory.fromBitmap(createDrawable()); + } + } else if (iconBitmapDescriptor != null) { + // use local image as a marker + return iconBitmapDescriptor; + } else { + // render the default marker pin + return BitmapDescriptorFactory.defaultMarker(this.markerHue); + } + } + + private MarkerOptions fillMarkerOptions(MarkerOptions options) { + options.position(position); + if (anchorIsSet) options.anchor(anchorX, anchorY); + if (calloutAnchorIsSet) options.infoWindowAnchor(calloutAnchorX, calloutAnchorY); + options.title(title); + options.snippet(snippet); + options.rotation(rotation); + options.flat(flat); + options.draggable(draggable); + options.zIndex(zIndex); + options.alpha(opacity); + options.icon(getIcon()); + return options; + } + + public void update(boolean updateIcon) { + if (marker == null) { + return; + } + + if (updateIcon) + updateMarkerIcon(); + + if (anchorIsSet) { + marker.setAnchor(anchorX, anchorY); + } else { + marker.setAnchor(0.5f, 1.0f); + } + + if (calloutAnchorIsSet) { + marker.setInfoWindowAnchor(calloutAnchorX, calloutAnchorY); + } else { + marker.setInfoWindowAnchor(0.5f, 0); + } + } + + public void update(int width, int height) { + this.width = width; + this.height = height; + + update(true); + } + + private Bitmap mLastBitmapCreated = null; + + private void clearDrawableCache() { + mLastBitmapCreated = null; + } + + private Bitmap createDrawable() { + int width = this.width <= 0 ? 100 : this.width; + int height = this.height <= 0 ? 100 : this.height; + this.buildDrawingCache(); + + // Do not create the doublebuffer-bitmap each time. reuse it to save memory. + Bitmap bitmap = mLastBitmapCreated; + + if (bitmap == null || + bitmap.isRecycled() || + bitmap.getWidth() != width || + bitmap.getHeight() != height) { + bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mLastBitmapCreated = bitmap; + } else { + bitmap.eraseColor(Color.TRANSPARENT); + } + + Canvas canvas = new Canvas(bitmap); + this.draw(canvas); + + return bitmap; + } + + public void setCalloutView(AirMapCallout view) { + this.calloutView = view; + } + + public AirMapCallout getCalloutView() { + return this.calloutView; + } + + public View getCallout() { + if (this.calloutView == null) return null; + + if (this.wrappedCalloutView == null) { + this.wrapCalloutView(); + } + + if (this.calloutView.getTooltip()) { + return this.wrappedCalloutView; + } else { + return null; + } + } + + public View getInfoContents() { + if (this.calloutView == null) return null; + + if (this.wrappedCalloutView == null) { + this.wrapCalloutView(); + } + + if (this.calloutView.getTooltip()) { + return null; + } else { + return this.wrappedCalloutView; + } + } + + private void wrapCalloutView() { + // some hackery is needed to get the arbitrary infowindow view to render centered, and + // with only the width/height that it needs. + if (this.calloutView == null || this.calloutView.getChildCount() == 0) { + return; + } + + LinearLayout LL = new LinearLayout(context); + LL.setOrientation(LinearLayout.VERTICAL); + LL.setLayoutParams(new LinearLayout.LayoutParams( + this.calloutView.width, + this.calloutView.height, + 0f + )); + + + LinearLayout LL2 = new LinearLayout(context); + LL2.setOrientation(LinearLayout.HORIZONTAL); + LL2.setLayoutParams(new LinearLayout.LayoutParams( + this.calloutView.width, + this.calloutView.height, + 0f + )); + + LL.addView(LL2); + LL2.addView(this.calloutView); + + this.wrappedCalloutView = LL; + } + + private int getDrawableResourceByName(String name) { + return getResources().getIdentifier( + name, + "drawable", + getContext().getPackageName()); + } + + private BitmapDescriptor getBitmapDescriptorByName(String name) { + return BitmapDescriptorFactory.fromResource(getDrawableResourceByName(name)); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarkerManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarkerManager.java new file mode 100644 index 0000000..e89548c --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarkerManager.java @@ -0,0 +1,370 @@ +package com.airbnb.android.react.maps; + +import android.graphics.Bitmap; +import android.graphics.Color; +import android.view.View; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.MapBuilder; +import com.facebook.react.uimanager.LayoutShadowNode; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.LatLng; + +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + +public class AirMapMarkerManager extends ViewGroupManager { + + private static final int SHOW_INFO_WINDOW = 1; + private static final int HIDE_INFO_WINDOW = 2; + private static final int ANIMATE_MARKER_TO_COORDINATE = 3; + private static final int REDRAW = 4; + + public static class AirMapMarkerSharedIcon { + private BitmapDescriptor iconBitmapDescriptor; + private Bitmap bitmap; + private Map markers; + private boolean loadImageStarted; + + public AirMapMarkerSharedIcon(){ + this.markers = new WeakHashMap<>(); + this.loadImageStarted = false; + } + + /** + * check whether the load image process started. + * caller AirMapMarker will only need to load it when this returns true. + * + * @return true if it is not started, false otherwise. + */ + public synchronized boolean shouldLoadImage(){ + if (!this.loadImageStarted) { + this.loadImageStarted = true; + return true; + } + return false; + } + + /** + * subscribe icon update for given marker. + * + * The marker is wrapped in weakReference, so no need to remove it explicitly. + * + * @param marker + */ + public synchronized void addMarker(AirMapMarker marker) { + this.markers.put(marker, true); + if (this.iconBitmapDescriptor != null) { + marker.setIconBitmapDescriptor(this.iconBitmapDescriptor, this.bitmap); + } + } + + /** + * Remove marker from this shared icon. + * + * Marker will only need to call it when the marker receives a different marker image uri. + * + * @param marker + */ + public synchronized void removeMarker(AirMapMarker marker) { + this.markers.remove(marker); + } + + /** + * check if there is markers still listening on this icon. + * when there are not markers listen on it, we can remove it. + * + * @return true if there is, false otherwise + */ + public synchronized boolean hasMarker(){ + return this.markers.isEmpty(); + } + + /** + * Update the bitmap descriptor and bitmap for the image uri. + * And notify all subscribers about the update. + * + * @param bitmapDescriptor + * @param bitmap + */ + public synchronized void updateIcon(BitmapDescriptor bitmapDescriptor, Bitmap bitmap) { + + this.iconBitmapDescriptor = bitmapDescriptor; + this.bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); + + if (this.markers.isEmpty()) { + return; + } + + for (Map.Entry markerEntry: markers.entrySet()) { + if (markerEntry.getKey() != null) { + markerEntry.getKey().setIconBitmapDescriptor(bitmapDescriptor, bitmap); + } + } + } + } + + private Map sharedIcons = new ConcurrentHashMap<>(); + + /** + * get the shared icon object, if not existed, create a new one and store it. + * + * @param uri + * @return the icon object for the given uri. + */ + public AirMapMarkerSharedIcon getSharedIcon(String uri) { + AirMapMarkerSharedIcon icon = this.sharedIcons.get(uri); + if (icon == null) { + synchronized (this) { + if((icon = this.sharedIcons.get(uri)) == null) { + icon = new AirMapMarkerSharedIcon(); + this.sharedIcons.put(uri, icon); + } + } + } + return icon; + } + + /** + * Remove the share icon object from our sharedIcons map when no markers are listening for it. + * + * @param uri + */ + public void removeSharedIconIfEmpty(String uri) { + AirMapMarkerSharedIcon icon = this.sharedIcons.get(uri); + if (icon == null) {return;} + if (!icon.hasMarker()) { + synchronized (this) { + if((icon = this.sharedIcons.get(uri)) != null && !icon.hasMarker()) { + this.sharedIcons.remove(uri); + } + } + } + } + + public AirMapMarkerManager() { + } + + @Override + public String getName() { + return "AIRMapMarker"; + } + + @Override + public AirMapMarker createViewInstance(ThemedReactContext context) { + return new AirMapMarker(context, this); + } + + @ReactProp(name = "coordinate") + public void setCoordinate(AirMapMarker view, ReadableMap map) { + view.setCoordinate(map); + } + + @ReactProp(name = "title") + public void setTitle(AirMapMarker view, String title) { + view.setTitle(title); + } + + @ReactProp(name = "identifier") + public void setIdentifier(AirMapMarker view, String identifier) { + view.setIdentifier(identifier); + } + + @ReactProp(name = "description") + public void setDescription(AirMapMarker view, String description) { + view.setSnippet(description); + } + + // NOTE(lmr): + // android uses normalized coordinate systems for this, and is provided through the + // `anchor` property and `calloutAnchor` instead. Perhaps some work could be done + // to normalize iOS and android to use just one of the systems. +// @ReactProp(name = "centerOffset") +// public void setCenterOffset(AirMapMarker view, ReadableMap map) { +// +// } +// +// @ReactProp(name = "calloutOffset") +// public void setCalloutOffset(AirMapMarker view, ReadableMap map) { +// +// } + + @ReactProp(name = "anchor") + public void setAnchor(AirMapMarker view, ReadableMap map) { + // should default to (0.5, 1) (bottom middle) + double x = map != null && map.hasKey("x") ? map.getDouble("x") : 0.5; + double y = map != null && map.hasKey("y") ? map.getDouble("y") : 1.0; + view.setAnchor(x, y); + } + + @ReactProp(name = "calloutAnchor") + public void setCalloutAnchor(AirMapMarker view, ReadableMap map) { + // should default to (0.5, 0) (top middle) + double x = map != null && map.hasKey("x") ? map.getDouble("x") : 0.5; + double y = map != null && map.hasKey("y") ? map.getDouble("y") : 0.0; + view.setCalloutAnchor(x, y); + } + + @ReactProp(name = "image") + public void setImage(AirMapMarker view, @Nullable String source) { + view.setImage(source); + } +// public void setImage(AirMapMarker view, ReadableMap image) { +// view.setImage(image); +// } + + @ReactProp(name = "icon") + public void setIcon(AirMapMarker view, @Nullable String source) { + view.setImage(source); + } + + @ReactProp(name = "pinColor", defaultInt = Color.RED, customType = "Color") + public void setPinColor(AirMapMarker view, int pinColor) { + float[] hsv = new float[3]; + Color.colorToHSV(pinColor, hsv); + // NOTE: android only supports a hue + view.setMarkerHue(hsv[0]); + } + + @ReactProp(name = "rotation", defaultFloat = 0.0f) + public void setMarkerRotation(AirMapMarker view, float rotation) { + view.setRotation(rotation); + } + + @ReactProp(name = "flat", defaultBoolean = false) + public void setFlat(AirMapMarker view, boolean flat) { + view.setFlat(flat); + } + + @ReactProp(name = "draggable", defaultBoolean = false) + public void setDraggable(AirMapMarker view, boolean draggable) { + view.setDraggable(draggable); + } + + @Override + @ReactProp(name = "zIndex", defaultFloat = 0.0f) + public void setZIndex(AirMapMarker view, float zIndex) { + super.setZIndex(view, zIndex); + int integerZIndex = Math.round(zIndex); + view.setZIndex(integerZIndex); + } + + @Override + @ReactProp(name = "opacity", defaultFloat = 1.0f) + public void setOpacity(AirMapMarker view, float opacity) { + super.setOpacity(view, opacity); + view.setOpacity(opacity); + } + + @ReactProp(name = "tracksViewChanges", defaultBoolean = true) + public void setTracksViewChanges(AirMapMarker view, boolean tracksViewChanges) { + view.setTracksViewChanges(tracksViewChanges); + } + + @Override + public void addView(AirMapMarker parent, View child, int index) { + // if an component is a child, then it is a callout view, NOT part of the + // marker. + if (child instanceof AirMapCallout) { + parent.setCalloutView((AirMapCallout) child); + } else { + super.addView(parent, child, index); + parent.update(true); + } + } + + @Override + public void removeViewAt(AirMapMarker parent, int index) { + super.removeViewAt(parent, index); + parent.update(true); + } + + @Override + @Nullable + public Map getCommandsMap() { + return MapBuilder.of( + "showCallout", SHOW_INFO_WINDOW, + "hideCallout", HIDE_INFO_WINDOW, + "animateMarkerToCoordinate", ANIMATE_MARKER_TO_COORDINATE, + "redraw", REDRAW + ); + } + + @Override + public void receiveCommand(AirMapMarker view, int commandId, @Nullable ReadableArray args) { + Integer duration; + Double lat; + Double lng; + ReadableMap region; + + switch (commandId) { + case SHOW_INFO_WINDOW: + ((Marker) view.getFeature()).showInfoWindow(); + break; + + case HIDE_INFO_WINDOW: + ((Marker) view.getFeature()).hideInfoWindow(); + break; + + case ANIMATE_MARKER_TO_COORDINATE: + region = args.getMap(0); + duration = args.getInt(1); + + lng = region.getDouble("longitude"); + lat = region.getDouble("latitude"); + view.animateToCoodinate(new LatLng(lat, lng), duration); + break; + + case REDRAW: + view.updateMarkerIcon(); + break; + } + } + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + Map> map = MapBuilder.of( + "onPress", MapBuilder.of("registrationName", "onPress"), + "onCalloutPress", MapBuilder.of("registrationName", "onCalloutPress"), + "onDragStart", MapBuilder.of("registrationName", "onDragStart"), + "onDrag", MapBuilder.of("registrationName", "onDrag"), + "onDragEnd", MapBuilder.of("registrationName", "onDragEnd") + ); + + map.putAll(MapBuilder.of( + "onDragStart", MapBuilder.of("registrationName", "onDragStart"), + "onDrag", MapBuilder.of("registrationName", "onDrag"), + "onDragEnd", MapBuilder.of("registrationName", "onDragEnd") + )); + + return map; + } + + @Override + public LayoutShadowNode createShadowNodeInstance() { + // we use a custom shadow node that emits the width/height of the view + // after layout with the updateExtraData method. Without this, we can't generate + // a bitmap of the appropriate width/height of the rendered view. + return new SizeReportingShadowNode(); + } + + @Override + public void updateExtraData(AirMapMarker view, Object extraData) { + // This method is called from the shadow node with the width/height of the rendered + // marker view. + HashMap data = (HashMap) extraData; + float width = data.get("width"); + float height = data.get("height"); + view.update((int) width, (int) height); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapModule.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapModule.java new file mode 100644 index 0000000..c9ee803 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapModule.java @@ -0,0 +1,295 @@ +package com.airbnb.android.react.maps; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.net.Uri; +import android.util.Base64; +import android.util.DisplayMetrics; + +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableNativeMap; +import com.facebook.react.uimanager.NativeViewHierarchyManager; +import com.facebook.react.uimanager.UIBlock; +import com.facebook.react.uimanager.UIManagerModule; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.common.GoogleApiAvailability; +import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.LatLng; + +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import java.util.Map; +import java.util.HashMap; + +import javax.annotation.Nullable; + +public class AirMapModule extends ReactContextBaseJavaModule { + + private static final String SNAPSHOT_RESULT_FILE = "file"; + private static final String SNAPSHOT_RESULT_BASE64 = "base64"; + private static final String SNAPSHOT_FORMAT_PNG = "png"; + private static final String SNAPSHOT_FORMAT_JPG = "jpg"; + + public AirMapModule(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public String getName() { + return "AirMapModule"; + } + + @Override + public Map getConstants() { + final Map constants = new HashMap<>(); + constants.put("legalNotice", "This license information is displayed in Settings > Google > Open Source on any device running Google Play services."); + return constants; + } + + public Activity getActivity() { + return getCurrentActivity(); + } + + public static void closeQuietly(Closeable closeable) { + if (closeable == null) return; + try { + closeable.close(); + } catch (IOException ignored) { + } + } + + @ReactMethod + public void takeSnapshot(final int tag, final ReadableMap options, final Promise promise) { + + // Parse and verity options + final ReactApplicationContext context = getReactApplicationContext(); + final String format = options.hasKey("format") ? options.getString("format") : "png"; + final Bitmap.CompressFormat compressFormat = + format.equals(SNAPSHOT_FORMAT_PNG) ? Bitmap.CompressFormat.PNG : + format.equals(SNAPSHOT_FORMAT_JPG) ? Bitmap.CompressFormat.JPEG : null; + final double quality = options.hasKey("quality") ? options.getDouble("quality") : 1.0; + final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + final Integer width = + options.hasKey("width") ? (int) (displayMetrics.density * options.getDouble("width")) : 0; + final Integer height = + options.hasKey("height") ? (int) (displayMetrics.density * options.getDouble("height")) : 0; + final String result = options.hasKey("result") ? options.getString("result") : "file"; + + // Add UI-block so we can get a valid reference to the map-view + UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() { + public void execute(NativeViewHierarchyManager nvhm) { + AirMapView view = (AirMapView) nvhm.resolveView(tag); + if (view == null) { + promise.reject("AirMapView not found"); + return; + } + if (view.map == null) { + promise.reject("AirMapView.map is not valid"); + return; + } + view.map.snapshot(new GoogleMap.SnapshotReadyCallback() { + public void onSnapshotReady(@Nullable Bitmap snapshot) { + + // Convert image to requested width/height if necessary + if (snapshot == null) { + promise.reject("Failed to generate bitmap, snapshot = null"); + return; + } + if ((width != 0) && (height != 0) && + (width != snapshot.getWidth() || height != snapshot.getHeight())) { + snapshot = Bitmap.createScaledBitmap(snapshot, width, height, true); + } + + // Save the snapshot to disk + if (result.equals(SNAPSHOT_RESULT_FILE)) { + File tempFile; + FileOutputStream outputStream; + try { + tempFile = + File.createTempFile("AirMapSnapshot", "." + format, context.getCacheDir()); + outputStream = new FileOutputStream(tempFile); + } catch (Exception e) { + promise.reject(e); + return; + } + snapshot.compress(compressFormat, (int) (100.0 * quality), outputStream); + closeQuietly(outputStream); + String uri = Uri.fromFile(tempFile).toString(); + promise.resolve(uri); + } else if (result.equals(SNAPSHOT_RESULT_BASE64)) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + snapshot.compress(compressFormat, (int) (100.0 * quality), outputStream); + closeQuietly(outputStream); + byte[] bytes = outputStream.toByteArray(); + String data = Base64.encodeToString(bytes, Base64.NO_WRAP); + promise.resolve(data); + } + } + }); + } + }); + } + + @ReactMethod + public void getCamera(final int tag, final Promise promise) { + final ReactApplicationContext context = getReactApplicationContext(); + + UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() + { + @Override + public void execute(NativeViewHierarchyManager nvhm) + { + AirMapView view = (AirMapView) nvhm.resolveView(tag); + if (view == null) { + promise.reject("AirMapView not found"); + return; + } + if (view.map == null) { + promise.reject("AirMapView.map is not valid"); + return; + } + + CameraPosition position = view.map.getCameraPosition(); + + WritableMap centerJson = new WritableNativeMap(); + centerJson.putDouble("latitude", position.target.latitude); + centerJson.putDouble("longitude", position.target.longitude); + + WritableMap cameraJson = new WritableNativeMap(); + cameraJson.putMap("center", centerJson); + cameraJson.putDouble("heading", (double)position.bearing); + cameraJson.putDouble("zoom", (double)position.zoom); + cameraJson.putDouble("pitch", (double)position.tilt); + + promise.resolve(cameraJson); + } + }); + } + + @ReactMethod + public void pointForCoordinate(final int tag, ReadableMap coordinate, final Promise promise) { + final ReactApplicationContext context = getReactApplicationContext(); + final double density = (double) context.getResources().getDisplayMetrics().density; + + final LatLng coord = new LatLng( + coordinate.hasKey("latitude") ? coordinate.getDouble("latitude") : 0.0, + coordinate.hasKey("longitude") ? coordinate.getDouble("longitude") : 0.0 + ); + + UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() + { + @Override + public void execute(NativeViewHierarchyManager nvhm) + { + AirMapView view = (AirMapView) nvhm.resolveView(tag); + if (view == null) { + promise.reject("AirMapView not found"); + return; + } + if (view.map == null) { + promise.reject("AirMapView.map is not valid"); + return; + } + + Point pt = view.map.getProjection().toScreenLocation(coord); + + WritableMap ptJson = new WritableNativeMap(); + ptJson.putDouble("x", (double)pt.x / density); + ptJson.putDouble("y", (double)pt.y / density); + + promise.resolve(ptJson); + } + }); + } + + @ReactMethod + public void coordinateForPoint(final int tag, ReadableMap point, final Promise promise) { + final ReactApplicationContext context = getReactApplicationContext(); + final double density = (double) context.getResources().getDisplayMetrics().density; + + final Point pt = new Point( + point.hasKey("x") ? (int)(point.getDouble("x") * density) : 0, + point.hasKey("y") ? (int)(point.getDouble("y") * density) : 0 + ); + + UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() + { + @Override + public void execute(NativeViewHierarchyManager nvhm) + { + AirMapView view = (AirMapView) nvhm.resolveView(tag); + if (view == null) + { + promise.reject("AirMapView not found"); + return; + } + if (view.map == null) + { + promise.reject("AirMapView.map is not valid"); + return; + } + + LatLng coord = view.map.getProjection().fromScreenLocation(pt); + + WritableMap coordJson = new WritableNativeMap(); + coordJson.putDouble("latitude", coord.latitude); + coordJson.putDouble("longitude", coord.longitude); + + promise.resolve(coordJson); + } + }); + } + + @ReactMethod + public void getMapBoundaries(final int tag, final Promise promise) { + final ReactApplicationContext context = getReactApplicationContext(); + + UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() + { + @Override + public void execute(NativeViewHierarchyManager nvhm) + { + AirMapView view = (AirMapView) nvhm.resolveView(tag); + if (view == null) { + promise.reject("AirMapView not found"); + return; + } + if (view.map == null) { + promise.reject("AirMapView.map is not valid"); + return; + } + + double[][] boundaries = view.getMapBoundaries(); + + WritableMap coordinates = new WritableNativeMap(); + WritableMap northEastHash = new WritableNativeMap(); + WritableMap southWestHash = new WritableNativeMap(); + + northEastHash.putDouble("longitude", boundaries[0][0]); + northEastHash.putDouble("latitude", boundaries[0][1]); + southWestHash.putDouble("longitude", boundaries[1][0]); + southWestHash.putDouble("latitude", boundaries[1][1]); + + coordinates.putMap("northEast", northEastHash); + coordinates.putMap("southWest", southWestHash); + + promise.resolve(coordinates); + } + }); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlay.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlay.java new file mode 100644 index 0000000..7d2134a --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlay.java @@ -0,0 +1,144 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Bitmap; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.GroundOverlayOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +import java.util.ArrayList; + +public class AirMapOverlay extends AirMapFeature implements ImageReadable { + + private GroundOverlayOptions groundOverlayOptions; + private GroundOverlay groundOverlay; + private LatLngBounds bounds; + private BitmapDescriptor iconBitmapDescriptor; + private Bitmap iconBitmap; + private float zIndex; + private float transparency; + + private final ImageReader mImageReader; + private GoogleMap map; + + public AirMapOverlay(Context context) { + super(context); + this.mImageReader = new ImageReader(context, getResources(), this); + } + + public void setBounds(ReadableArray bounds) { + LatLng sw = new LatLng(bounds.getArray(1).getDouble(0), bounds.getArray(0).getDouble(1)); + LatLng ne = new LatLng(bounds.getArray(0).getDouble(0), bounds.getArray(1).getDouble(1)); + this.bounds = new LatLngBounds(sw, ne); + if (this.groundOverlay != null) { + this.groundOverlay.setPositionFromBounds(this.bounds); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (this.groundOverlay != null) { + this.groundOverlay.setZIndex(zIndex); + } + } + + // public void setTransparency(float transparency) { + // this.transparency = transparency; + // if (groundOverlay != null) { + // groundOverlay.setTransparency(transparency); + // } + // } + + public void setImage(String uri) { + this.mImageReader.setImage(uri); + } + + + public GroundOverlayOptions getGroundOverlayOptions() { + if (this.groundOverlayOptions == null) { + this.groundOverlayOptions = createGroundOverlayOptions(); + } + return this.groundOverlayOptions; + } + + private GroundOverlayOptions createGroundOverlayOptions() { + if (this.groundOverlayOptions != null) { + return this.groundOverlayOptions; + } + if (this.iconBitmapDescriptor != null) { + GroundOverlayOptions options = new GroundOverlayOptions(); + options.image(iconBitmapDescriptor); + options.positionFromBounds(bounds); + options.zIndex(zIndex); + return options; + } + return null; + } + + @Override + public Object getFeature() { + return groundOverlay; + } + + @Override + public void addToMap(GoogleMap map) { + GroundOverlayOptions groundOverlayOptions = getGroundOverlayOptions(); + if (groundOverlayOptions != null) { + this.groundOverlay = map.addGroundOverlay(groundOverlayOptions); + this.groundOverlay.setClickable(true); + } else { + this.map = map; + } + } + + @Override + public void removeFromMap(GoogleMap map) { + this.map = null; + if (this.groundOverlay != null) { + this.groundOverlay.remove(); + this.groundOverlay = null; + this.groundOverlayOptions = null; + } + } + + @Override + public void setIconBitmap(Bitmap bitmap) { + this.iconBitmap = bitmap; + } + + @Override + public void setIconBitmapDescriptor( + BitmapDescriptor iconBitmapDescriptor) { + this.iconBitmapDescriptor = iconBitmapDescriptor; + } + + @Override + public void update() { + this.groundOverlay = getGroundOverlay(); + if (this.groundOverlay != null) { + this.groundOverlay.setImage(this.iconBitmapDescriptor); + this.groundOverlay.setClickable(true); + } + } + + private GroundOverlay getGroundOverlay() { + if (this.groundOverlay != null) { + return this.groundOverlay; + } + if (this.map == null) { + return null; + } + GroundOverlayOptions groundOverlayOptions = getGroundOverlayOptions(); + if (groundOverlayOptions != null) { + return this.map.addGroundOverlay(groundOverlayOptions); + } + return null; + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlayManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlayManager.java new file mode 100644 index 0000000..ccc5a7e --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlayManager.java @@ -0,0 +1,72 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.common.MapBuilder; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +import java.util.Map; + +import javax.annotation.Nullable; + +public class AirMapOverlayManager extends ViewGroupManager { + private final DisplayMetrics metrics; + + public AirMapOverlayManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapOverlay"; + } + + @Override + public AirMapOverlay createViewInstance(ThemedReactContext context) { + return new AirMapOverlay(context); + } + + @ReactProp(name = "bounds") + public void setBounds(AirMapOverlay view, ReadableArray bounds) { + view.setBounds(bounds); + } + + @ReactProp(name = "zIndex", defaultFloat = 1.0f) + public void setZIndex(AirMapOverlay view, float zIndex) { + view.setZIndex(zIndex); + } + + // @ReactProp(name = "transparency", defaultFloat = 1.0f) + // public void setTransparency(AirMapOverlay view, float transparency) { + // view.setTransparency(transparency); + // } + + @ReactProp(name = "image") + public void setImage(AirMapOverlay view, @Nullable String source) { + view.setImage(source); + } + + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + return MapBuilder.of( + "onPress", MapBuilder.of("registrationName", "onPress") + ); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygon.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygon.java new file mode 100644 index 0000000..6ed5df3 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygon.java @@ -0,0 +1,160 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.PolygonOptions; + +import java.util.ArrayList; +import java.util.List; + +public class AirMapPolygon extends AirMapFeature { + + private PolygonOptions polygonOptions; + private Polygon polygon; + + private List coordinates; + private List> holes; + private int strokeColor; + private int fillColor; + private float strokeWidth; + private boolean geodesic; + private boolean tappable; + private float zIndex; + + public AirMapPolygon(Context context) { + super(context); + } + + public void setCoordinates(ReadableArray coordinates) { + // it's kind of a bummer that we can't run map() or anything on the ReadableArray + this.coordinates = new ArrayList<>(coordinates.size()); + for (int i = 0; i < coordinates.size(); i++) { + ReadableMap coordinate = coordinates.getMap(i); + this.coordinates.add(i, + new LatLng(coordinate.getDouble("latitude"), coordinate.getDouble("longitude"))); + } + if (polygon != null) { + polygon.setPoints(this.coordinates); + } + } + + public void setHoles(ReadableArray holes) { + if (holes == null) { return; } + + this.holes = new ArrayList<>(holes.size()); + + for (int i = 0; i < holes.size(); i++) { + ReadableArray hole = holes.getArray(i); + + if (hole.size() < 3) { continue; } + + List coordinates = new ArrayList<>(); + for (int j = 0; j < hole.size(); j++) { + ReadableMap coordinate = hole.getMap(j); + coordinates.add(new LatLng( + coordinate.getDouble("latitude"), + coordinate.getDouble("longitude"))); + } + + // If hole is triangle + if (coordinates.size() == 3) { + coordinates.add(coordinates.get(0)); + } + + this.holes.add(coordinates); + } + + if (polygon != null) { + polygon.setHoles(this.holes); + } + } + + + public void setFillColor(int color) { + this.fillColor = color; + if (polygon != null) { + polygon.setFillColor(color); + } + } + + public void setStrokeColor(int color) { + this.strokeColor = color; + if (polygon != null) { + polygon.setStrokeColor(color); + } + } + + public void setStrokeWidth(float width) { + this.strokeWidth = width; + if (polygon != null) { + polygon.setStrokeWidth(width); + } + } + + public void setTappable(boolean tapabble) { + this.tappable = tapabble; + if (polygon != null) { + polygon.setClickable(tappable); + } + } + + public void setGeodesic(boolean geodesic) { + this.geodesic = geodesic; + if (polygon != null) { + polygon.setGeodesic(geodesic); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (polygon != null) { + polygon.setZIndex(zIndex); + } + } + + public PolygonOptions getPolygonOptions() { + if (polygonOptions == null) { + polygonOptions = createPolygonOptions(); + } + return polygonOptions; + } + + private PolygonOptions createPolygonOptions() { + PolygonOptions options = new PolygonOptions(); + options.addAll(coordinates); + options.fillColor(fillColor); + options.strokeColor(strokeColor); + options.strokeWidth(strokeWidth); + options.geodesic(geodesic); + options.zIndex(zIndex); + + if (this.holes != null) { + for (int i = 0; i < holes.size(); i++) { + options.addHole(holes.get(i)); + } + } + + return options; + } + + @Override + public Object getFeature() { + return polygon; + } + + @Override + public void addToMap(GoogleMap map) { + polygon = map.addPolygon(getPolygonOptions()); + polygon.setClickable(this.tappable); + } + + @Override + public void removeFromMap(GoogleMap map) { + polygon.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygonManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygonManager.java new file mode 100644 index 0000000..3013214 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolygonManager.java @@ -0,0 +1,93 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.common.MapBuilder; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +import java.util.Map; + +import javax.annotation.Nullable; + +public class AirMapPolygonManager extends ViewGroupManager { + private final DisplayMetrics metrics; + + public AirMapPolygonManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapPolygon"; + } + + @Override + public AirMapPolygon createViewInstance(ThemedReactContext context) { + return new AirMapPolygon(context); + } + + @ReactProp(name = "coordinates") + public void setCoordinate(AirMapPolygon view, ReadableArray coordinates) { + view.setCoordinates(coordinates); + } + + @ReactProp(name = "holes") + public void setHoles(AirMapPolygon view, ReadableArray holes) { + view.setHoles(holes); + } + + @ReactProp(name = "strokeWidth", defaultFloat = 1f) + public void setStrokeWidth(AirMapPolygon view, float widthInPoints) { + float widthInScreenPx = metrics.density * widthInPoints; // done for parity with iOS + view.setStrokeWidth(widthInScreenPx); + } + + @ReactProp(name = "fillColor", defaultInt = Color.RED, customType = "Color") + public void setFillColor(AirMapPolygon view, int color) { + view.setFillColor(color); + } + + @ReactProp(name = "strokeColor", defaultInt = Color.RED, customType = "Color") + public void setStrokeColor(AirMapPolygon view, int color) { + view.setStrokeColor(color); + } + + @ReactProp(name = "tappable", defaultBoolean = false) + public void setTappable(AirMapPolygon view, boolean tapabble) { + view.setTappable(tapabble); + } + + @ReactProp(name = "geodesic", defaultBoolean = false) + public void setGeodesic(AirMapPolygon view, boolean geodesic) { + view.setGeodesic(geodesic); + } + + @ReactProp(name = "zIndex", defaultFloat = 1.0f) + public void setZIndex(AirMapPolygon view, float zIndex) { + view.setZIndex(zIndex); + } + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + return MapBuilder.of( + "onPress", MapBuilder.of("registrationName", "onPress") + ); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolyline.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolyline.java new file mode 100644 index 0000000..87d73b3 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolyline.java @@ -0,0 +1,210 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.Cap; +import com.google.android.gms.maps.model.Dash; +import com.google.android.gms.maps.model.Dot; +import com.google.android.gms.maps.model.Gap; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.PatternItem; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.RoundCap; +import com.google.maps.android.SphericalUtil; + +import java.util.ArrayList; +import java.util.List; + +public class AirMapPolyline extends AirMapFeature { + + private PolylineOptions polylineOptions; + private Polyline polyline; + + private List coordinates; + private int color; + private float width; + private boolean tappable; + private boolean showBezierCurve; + private boolean geodesic; + private float zIndex; + private Cap lineCap = new RoundCap(); + private ReadableArray patternValues; + private List pattern; + + public AirMapPolyline(Context context) { + super(context); + } + + public void setCoordinates(ReadableArray coordinates) { + this.coordinates = new ArrayList<>(coordinates.size()); + for (int i = 0; i < coordinates.size(); i++) { + ReadableMap coordinate = coordinates.getMap(i); + this.coordinates.add(i, + new LatLng(coordinate.getDouble("latitude"), coordinate.getDouble("longitude"))); + } + if (polyline != null) { + polyline.setPoints(this.coordinates); + } + } + + public void setColor(int color) { + this.color = color; + if (polyline != null) { + polyline.setColor(color); + } + } + + public void setWidth(float width) { + this.width = width; + if (polyline != null) { + polyline.setWidth(width); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (polyline != null) { + polyline.setZIndex(zIndex); + } + } + + public void setTappable(boolean tapabble) { + this.tappable = tapabble; + if (polyline != null) { + polyline.setClickable(tappable); + } + } + public void setShowBezierCurve(boolean showBezierCurve) { + this.showBezierCurve = showBezierCurve; + } + + public void setGeodesic(boolean geodesic) { + this.geodesic = geodesic; + if (polyline != null) { + polyline.setGeodesic(geodesic); + } + } + + public void setLineCap(Cap cap) { + this.lineCap = cap; + if (polyline != null) { + polyline.setStartCap(cap); + polyline.setEndCap(cap); + } + this.applyPattern(); + } + + public void setLineDashPattern(ReadableArray patternValues) { + this.patternValues = patternValues; + this.applyPattern(); + } + + private void applyPattern() { + if(patternValues == null) { + return; + } + this.pattern = new ArrayList<>(patternValues.size()); + for (int i = 0; i < patternValues.size(); i++) { + float patternValue = (float) patternValues.getDouble(i); + boolean isGap = i % 2 != 0; + if(isGap) { + this.pattern.add(new Gap(patternValue)); + }else { + PatternItem patternItem = null; + boolean isLineCapRound = this.lineCap instanceof RoundCap; + if(isLineCapRound) { + patternItem = new Dot(); + }else { + patternItem = new Dash(patternValue); + } + this.pattern.add(patternItem); + } + } + if(polyline != null) { + polyline.setPattern(this.pattern); + } + } + + public PolylineOptions getPolylineOptions() { + if (polylineOptions == null) { + polylineOptions = createPolylineOptions(); + } + return polylineOptions; + } + + private PolylineOptions createPolylineOptions() { + PolylineOptions options = new PolylineOptions(); + + options.color(color); + options.width(width); + options.geodesic(geodesic); + options.zIndex(zIndex); + options.startCap(lineCap); + options.endCap(lineCap); + options.pattern(this.pattern); + + if(this.showBezierCurve){ + LatLng init = this.coordinates.get(0); + LatLng end = this.coordinates.get(this.coordinates.size()-1); + + double distanceBetween = SphericalUtil.computeDistanceBetween(init, end); + double lineHeadingInit = SphericalUtil.computeHeading(init, end); + + double lineHeading1, lineHeading2; + if (lineHeadingInit < 0) { + lineHeading1 = lineHeadingInit + 45; + lineHeading2 = lineHeadingInit + 135; + } else { + lineHeading1 = lineHeadingInit + -45; + lineHeading2 = lineHeadingInit + -135; + } + + LatLng pA = SphericalUtil.computeOffset(init, distanceBetween / 2.5, lineHeading1); + LatLng pB = SphericalUtil.computeOffset(end, distanceBetween / 2.5, lineHeading2); + + + LatLng curveLatLng = null; + for (double t = 0.0; t < 1.01; t += 0.01) { + // P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4; for 4 points + double arcX = (1 - t) * (1 - t) * (1 - t) * init.latitude + + 3 * (1 - t) * (1 - t) * t * pA.latitude + + 3 * (1 - t) * t * t * pB.latitude + + t * t * t * end.latitude; + double arcY = (1 - t) * (1 - t) * (1 - t) * init.longitude + + 3 * (1 - t) * (1 - t) * t * pA.longitude + + 3 * (1 - t) * t * t * pB.longitude + + t * t * t * end.longitude; + + curveLatLng = new LatLng(arcX, arcY); + options.add(curveLatLng); + } + + }else{ + options.addAll(coordinates); + } + + + return options; + } + + @Override + public Object getFeature() { + return polyline; + } + + @Override + public void addToMap(GoogleMap map) { + polyline = map.addPolyline(getPolylineOptions()); + polyline.setClickable(this.tappable); + } + + @Override + public void removeFromMap(GoogleMap map) { + polyline.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolylineManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolylineManager.java new file mode 100644 index 0000000..2f4ee6c --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapPolylineManager.java @@ -0,0 +1,118 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.common.MapBuilder; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; +import com.google.android.gms.maps.model.ButtCap; +import com.google.android.gms.maps.model.Cap; +import com.google.android.gms.maps.model.RoundCap; +import com.google.android.gms.maps.model.SquareCap; + +import java.util.Map; + +import javax.annotation.Nullable; + +public class AirMapPolylineManager extends ViewGroupManager { + private final DisplayMetrics metrics; + + public AirMapPolylineManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapPolyline"; + } + + @Override + public AirMapPolyline createViewInstance(ThemedReactContext context) { + return new AirMapPolyline(context); + } + + @ReactProp(name = "coordinates") + public void setCoordinate(AirMapPolyline view, ReadableArray coordinates) { + view.setCoordinates(coordinates); + } + + @ReactProp(name = "strokeWidth", defaultFloat = 1f) + public void setStrokeWidth(AirMapPolyline view, float widthInPoints) { + float widthInScreenPx = metrics.density * widthInPoints; // done for parity with iOS + view.setWidth(widthInScreenPx); + } + + @ReactProp(name = "strokeColor", defaultInt = Color.RED, customType = "Color") + public void setStrokeColor(AirMapPolyline view, int color) { + view.setColor(color); + } + + @ReactProp(name = "showBezierCurve", defaultBoolean = false) + public void showBezierCurve(AirMapPolyline view, boolean showBezierCurve) { + view.setShowBezierCurve(showBezierCurve); + } + + @ReactProp(name = "tappable", defaultBoolean = false) + public void setTappable(AirMapPolyline view, boolean tapabble) { + view.setTappable(tapabble); + } + + @ReactProp(name = "geodesic", defaultBoolean = false) + public void setGeodesic(AirMapPolyline view, boolean geodesic) { + view.setGeodesic(geodesic); + } + + @ReactProp(name = "zIndex", defaultFloat = 1.0f) + public void setZIndex(AirMapPolyline view, float zIndex) { + view.setZIndex(zIndex); + } + + @ReactProp(name = "lineCap") + public void setlineCap(AirMapPolyline view, String lineCap) { + Cap cap = null; + switch (lineCap) { + case "butt": + cap = new ButtCap(); + break; + case "round": + cap = new RoundCap(); + break; + case "square": + cap = new SquareCap(); + break; + default: + cap = new RoundCap(); + break; + } + view.setLineCap(cap); + } + + @ReactProp(name = "lineDashPattern") + public void setLineDashPattern(AirMapPolyline view, ReadableArray patternValues) { + view.setLineDashPattern(patternValues); + } + + @Override + @Nullable + public Map getExportedCustomDirectEventTypeConstants() { + return MapBuilder.of( + "onPress", MapBuilder.of("registrationName", "onPress") + ); + } +} + diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTile.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTile.java new file mode 100644 index 0000000..6ff5ba2 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTile.java @@ -0,0 +1,138 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.gms.maps.model.TileOverlayOptions; +import com.google.android.gms.maps.model.UrlTileProvider; + +import java.net.MalformedURLException; +import java.net.URL; + +public class AirMapUrlTile extends AirMapFeature { + + class AIRMapUrlTileProvider extends UrlTileProvider { + private String urlTemplate; + + public AIRMapUrlTileProvider(int width, int height, String urlTemplate) { + super(width, height); + this.urlTemplate = urlTemplate; + } + + @Override + public synchronized URL getTileUrl(int x, int y, int zoom) { + + if (AirMapUrlTile.this.flipY == true) { + y = (1 << zoom) - y - 1; + } + + String s = this.urlTemplate + .replace("{x}", Integer.toString(x)) + .replace("{y}", Integer.toString(y)) + .replace("{z}", Integer.toString(zoom)); + URL url = null; + + if(AirMapUrlTile.this.maximumZ > 0 && zoom > maximumZ) { + return url; + } + + if(AirMapUrlTile.this.minimumZ > 0 && zoom < minimumZ) { + return url; + } + + try { + url = new URL(s); + } catch (MalformedURLException e) { + throw new AssertionError(e); + } + return url; + } + + public void setUrlTemplate(String urlTemplate) { + this.urlTemplate = urlTemplate; + } + } + + private TileOverlayOptions tileOverlayOptions; + private TileOverlay tileOverlay; + private AIRMapUrlTileProvider tileProvider; + + private String urlTemplate; + private float zIndex; + private float maximumZ; + private float minimumZ; + private boolean flipY; + + public AirMapUrlTile(Context context) { + super(context); + } + + public void setUrlTemplate(String urlTemplate) { + this.urlTemplate = urlTemplate; + if (tileProvider != null) { + tileProvider.setUrlTemplate(urlTemplate); + } + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (tileOverlay != null) { + tileOverlay.setZIndex(zIndex); + } + } + + public void setMaximumZ(float maximumZ) { + this.maximumZ = maximumZ; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setMinimumZ(float minimumZ) { + this.minimumZ = minimumZ; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setFlipY(boolean flipY) { + this.flipY = flipY; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public TileOverlayOptions getTileOverlayOptions() { + if (tileOverlayOptions == null) { + tileOverlayOptions = createTileOverlayOptions(); + } + return tileOverlayOptions; + } + + private TileOverlayOptions createTileOverlayOptions() { + TileOverlayOptions options = new TileOverlayOptions(); + options.zIndex(zIndex); + this.tileProvider = new AIRMapUrlTileProvider(256, 256, this.urlTemplate); + options.tileProvider(this.tileProvider); + return options; + } + + @Override + public Object getFeature() { + return tileOverlay; + } + + @Override + public void addToMap(GoogleMap map) { + this.tileOverlay = map.addTileOverlay(getTileOverlayOptions()); + } + + @Override + public void removeFromMap(GoogleMap map) { + tileOverlay.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTileManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTileManager.java new file mode 100644 index 0000000..d89e8ec --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTileManager.java @@ -0,0 +1,63 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +public class AirMapUrlTileManager extends ViewGroupManager { + private DisplayMetrics metrics; + + public AirMapUrlTileManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapUrlTile"; + } + + @Override + public AirMapUrlTile createViewInstance(ThemedReactContext context) { + return new AirMapUrlTile(context); + } + + @ReactProp(name = "urlTemplate") + public void setUrlTemplate(AirMapUrlTile view, String urlTemplate) { + view.setUrlTemplate(urlTemplate); + } + + @ReactProp(name = "zIndex", defaultFloat = -1.0f) + public void setZIndex(AirMapUrlTile view, float zIndex) { + view.setZIndex(zIndex); + } + + @ReactProp(name = "minimumZ", defaultFloat = 0.0f) + public void setMinimumZ(AirMapUrlTile view, float minimumZ) { + view.setMinimumZ(minimumZ); + } + + @ReactProp(name = "maximumZ", defaultFloat = 100.0f) + public void setMaximumZ(AirMapUrlTile view, float maximumZ) { + view.setMaximumZ(maximumZ); + } + + @ReactProp(name = "flipY", defaultBoolean = false) + public void setFlipY(AirMapUrlTile view, boolean flipY) { + view.setFlipY(flipY); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java new file mode 100644 index 0000000..397d4a6 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java @@ -0,0 +1,1246 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.ColorStateList; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Point; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.os.Build; +import android.support.v4.view.GestureDetectorCompat; +import android.support.v4.view.MotionEventCompat; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.location.Location; + +import com.facebook.react.bridge.LifecycleEventListener; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableNativeArray; +import com.facebook.react.bridge.WritableNativeMap; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.uimanager.events.EventDispatcher; +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.gms.maps.MapView; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.PointOfInterest; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.VisibleRegion; +import com.google.android.gms.maps.model.IndoorBuilding; +import com.google.android.gms.maps.model.IndoorLevel; +import com.google.maps.android.data.kml.KmlContainer; +import com.google.maps.android.data.kml.KmlLayer; +import com.google.maps.android.data.kml.KmlPlacemark; +import com.google.maps.android.data.kml.KmlStyle; + +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import static android.support.v4.content.PermissionChecker.checkSelfPermission; + +public class AirMapView extends MapView implements GoogleMap.InfoWindowAdapter, + GoogleMap.OnMarkerDragListener, OnMapReadyCallback, GoogleMap.OnPoiClickListener, GoogleMap.OnIndoorStateChangeListener { + public GoogleMap map; + private KmlLayer kmlLayer; + private ProgressBar mapLoadingProgressBar; + private RelativeLayout mapLoadingLayout; + private ImageView cacheImageView; + private Boolean isMapLoaded = false; + private Integer loadingBackgroundColor = null; + private Integer loadingIndicatorColor = null; + private final int baseMapPadding = 50; + + private LatLngBounds boundsToMove; + private CameraUpdate cameraToSet; + private boolean showUserLocation = false; + private boolean handlePanDrag = false; + private boolean moveOnMarkerPress = true; + private boolean cacheEnabled = false; + private boolean initialRegionSet = false; + private boolean initialCameraSet = false; + private LatLngBounds cameraLastIdleBounds; + private int cameraMoveReason = 0; + + private static final String[] PERMISSIONS = new String[]{ + "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"}; + + private final List features = new ArrayList<>(); + private final Map markerMap = new HashMap<>(); + private final Map polylineMap = new HashMap<>(); + private final Map polygonMap = new HashMap<>(); + private final GestureDetectorCompat gestureDetector; + private final AirMapManager manager; + private LifecycleEventListener lifecycleListener; + private boolean paused = false; + private boolean destroyed = false; + private final ThemedReactContext context; + private final EventDispatcher eventDispatcher; + + private ViewAttacherGroup attacherGroup; + + private static boolean contextHasBug(Context context) { + return context == null || + context.getResources() == null || + context.getResources().getConfiguration() == null; + } + + // We do this to fix this bug: + // https://github.com/react-native-community/react-native-maps/issues/271 + // + // which conflicts with another bug regarding the passed in context: + // https://github.com/react-native-community/react-native-maps/issues/1147 + // + // Doing this allows us to avoid both bugs. + private static Context getNonBuggyContext(ThemedReactContext reactContext, + ReactApplicationContext appContext) { + Context superContext = reactContext; + if (!contextHasBug(appContext.getCurrentActivity())) { + superContext = appContext.getCurrentActivity(); + } else if (contextHasBug(superContext)) { + // we have the bug! let's try to find a better context to use + if (!contextHasBug(reactContext.getCurrentActivity())) { + superContext = reactContext.getCurrentActivity(); + } else if (!contextHasBug(reactContext.getApplicationContext())) { + superContext = reactContext.getApplicationContext(); + } else { + // ¯\_(ツ)_/¯ + } + } + return superContext; + } + + public AirMapView(ThemedReactContext reactContext, ReactApplicationContext appContext, + AirMapManager manager, + GoogleMapOptions googleMapOptions) { + super(getNonBuggyContext(reactContext, appContext), googleMapOptions); + + this.manager = manager; + this.context = reactContext; + + super.onCreate(null); + // TODO(lmr): what about onStart???? + super.onResume(); + super.getMapAsync(this); + + final AirMapView view = this; + + gestureDetector = + new GestureDetectorCompat(reactContext, new GestureDetector.SimpleOnGestureListener() { + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, + float distanceY) { + if (handlePanDrag) { + onPanDrag(e2); + } + return false; + } + }); + + this.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (!paused) { + AirMapView.this.cacheView(); + } + } + }); + + eventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); + + // Set up a parent view for triggering visibility in subviews that depend on it. + // Mainly ReactImageView depends on Fresco which depends on onVisibilityChanged() event + attacherGroup = new ViewAttacherGroup(context); + LayoutParams attacherLayoutParams = new LayoutParams(0, 0); + attacherLayoutParams.width = 0; + attacherLayoutParams.height = 0; + attacherLayoutParams.leftMargin = 99999999; + attacherLayoutParams.topMargin = 99999999; + attacherGroup.setLayoutParams(attacherLayoutParams); + addView(attacherGroup); + } + + @Override + public void onMapReady(final GoogleMap map) { + if (destroyed) { + return; + } + this.map = map; + this.map.setInfoWindowAdapter(this); + this.map.setOnMarkerDragListener(this); + this.map.setOnPoiClickListener(this); + this.map.setOnIndoorStateChangeListener(this); + + manager.pushEvent(context, this, "onMapReady", new WritableNativeMap()); + + final AirMapView view = this; + + map.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { + @Override + public void onMyLocationChange(Location location){ + WritableMap event = new WritableNativeMap(); + + WritableMap coordinate = new WritableNativeMap(); + coordinate.putDouble("latitude", location.getLatitude()); + coordinate.putDouble("longitude", location.getLongitude()); + coordinate.putDouble("altitude", location.getAltitude()); + coordinate.putDouble("timestamp", location.getTime()); + coordinate.putDouble("accuracy", location.getAccuracy()); + coordinate.putDouble("speed", location.getSpeed()); + if(android.os.Build.VERSION.SDK_INT >= 18){ + coordinate.putBoolean("isFromMockProvider", location.isFromMockProvider()); + } + + event.putMap("coordinate", coordinate); + + manager.pushEvent(context, view, "onUserLocationChange", event); + } + }); + + map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(Marker marker) { + WritableMap event; + AirMapMarker airMapMarker = getMarkerMap(marker); + + event = makeClickEventData(marker.getPosition()); + event.putString("action", "marker-press"); + event.putString("id", airMapMarker.getIdentifier()); + manager.pushEvent(context, view, "onMarkerPress", event); + + event = makeClickEventData(marker.getPosition()); + event.putString("action", "marker-press"); + event.putString("id", airMapMarker.getIdentifier()); + manager.pushEvent(context, airMapMarker, "onPress", event); + + // Return false to open the callout info window and center on the marker + // https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap + // .OnMarkerClickListener + if (view.moveOnMarkerPress) { + return false; + } else { + marker.showInfoWindow(); + return true; + } + } + }); + + map.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() { + @Override + public void onPolygonClick(Polygon polygon) { + WritableMap event = makeClickEventData(polygon.getPoints().get(0)); + event.putString("action", "polygon-press"); + manager.pushEvent(context, polygonMap.get(polygon), "onPress", event); + } + }); + + map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() { + @Override + public void onPolylineClick(Polyline polyline) { + WritableMap event = makeClickEventData(polyline.getPoints().get(0)); + event.putString("action", "polyline-press"); + manager.pushEvent(context, polylineMap.get(polyline), "onPress", event); + } + }); + + map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { + @Override + public void onInfoWindowClick(Marker marker) { + WritableMap event; + + event = makeClickEventData(marker.getPosition()); + event.putString("action", "callout-press"); + manager.pushEvent(context, view, "onCalloutPress", event); + + event = makeClickEventData(marker.getPosition()); + event.putString("action", "callout-press"); + AirMapMarker markerView = getMarkerMap(marker); + manager.pushEvent(context, markerView, "onCalloutPress", event); + + event = makeClickEventData(marker.getPosition()); + event.putString("action", "callout-press"); + AirMapCallout infoWindow = markerView.getCalloutView(); + if (infoWindow != null) manager.pushEvent(context, infoWindow, "onPress", event); + } + }); + + map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { + @Override + public void onMapClick(LatLng point) { + WritableMap event = makeClickEventData(point); + event.putString("action", "press"); + manager.pushEvent(context, view, "onPress", event); + } + }); + + map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() { + @Override + public void onMapLongClick(LatLng point) { + WritableMap event = makeClickEventData(point); + event.putString("action", "long-press"); + manager.pushEvent(context, view, "onLongPress", makeClickEventData(point)); + } + }); + + map.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { + @Override + public void onCameraMoveStarted(int reason) { + cameraMoveReason = reason; + } + }); + + map.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() { + @Override + public void onCameraMove() { + LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; + cameraLastIdleBounds = null; + eventDispatcher.dispatchEvent(new RegionChangeEvent(getId(), bounds, true)); + } + }); + + map.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { + @Override + public void onCameraIdle() { + LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; + if ((cameraMoveReason != 0) && + ((cameraLastIdleBounds == null) || + LatLngBoundsUtils.BoundsAreDifferent(bounds, cameraLastIdleBounds))) { + cameraLastIdleBounds = bounds; + eventDispatcher.dispatchEvent(new RegionChangeEvent(getId(), bounds, false)); + } + } + }); + + map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { + @Override public void onMapLoaded() { + isMapLoaded = true; + AirMapView.this.cacheView(); + } + }); + + // We need to be sure to disable location-tracking when app enters background, in-case some + // other module + // has acquired a wake-lock and is controlling location-updates, otherwise, location-manager + // will be left + // updating location constantly, killing the battery, even though some other location-mgmt + // module may + // desire to shut-down location-services. + lifecycleListener = new LifecycleEventListener() { + @Override + public void onHostResume() { + if (hasPermissions()) { + //noinspection MissingPermission + map.setMyLocationEnabled(showUserLocation); + } + synchronized (AirMapView.this) { + if (!destroyed) { + AirMapView.this.onResume(); + } + paused = false; + } + } + + @Override + public void onHostPause() { + if (hasPermissions()) { + //noinspection MissingPermission + map.setMyLocationEnabled(false); + } + synchronized (AirMapView.this) { + if (!destroyed) { + AirMapView.this.onPause(); + } + paused = true; + } + } + + @Override + public void onHostDestroy() { + AirMapView.this.doDestroy(); + } + }; + + context.addLifecycleEventListener(lifecycleListener); + } + + private boolean hasPermissions() { + return checkSelfPermission(getContext(), PERMISSIONS[0]) == PackageManager.PERMISSION_GRANTED || + checkSelfPermission(getContext(), PERMISSIONS[1]) == PackageManager.PERMISSION_GRANTED; + } + + + /* + onDestroy is final method so I can't override it. + */ + public synchronized void doDestroy() { + if (destroyed) { + return; + } + destroyed = true; + + if (lifecycleListener != null && context != null) { + context.removeLifecycleEventListener(lifecycleListener); + lifecycleListener = null; + } + if (!paused) { + onPause(); + paused = true; + } + onDestroy(); + } + + public void setInitialRegion(ReadableMap initialRegion) { + if (!initialRegionSet && initialRegion != null) { + setRegion(initialRegion); + initialRegionSet = true; + } + } + + public void setInitialCamera(ReadableMap initialCamera) { + if (!initialCameraSet && initialCamera != null) { + setCamera(initialCamera); + initialCameraSet = true; + } + } + + public void setRegion(ReadableMap region) { + if (region == null) return; + + Double lng = region.getDouble("longitude"); + Double lat = region.getDouble("latitude"); + Double lngDelta = region.getDouble("longitudeDelta"); + Double latDelta = region.getDouble("latitudeDelta"); + LatLngBounds bounds = new LatLngBounds( + new LatLng(lat - latDelta / 2, lng - lngDelta / 2), // southwest + new LatLng(lat + latDelta / 2, lng + lngDelta / 2) // northeast + ); + if (super.getHeight() <= 0 || super.getWidth() <= 0) { + // in this case, our map has not been laid out yet, so we save the bounds in a local + // variable, and make a guess of zoomLevel 10. Not to worry, though: as soon as layout + // occurs, we will move the camera to the saved bounds. Note that if we tried to move + // to the bounds now, it would trigger an exception. + map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10)); + boundsToMove = bounds; + } else { + map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); + boundsToMove = null; + } + } + + public void setCamera(ReadableMap camera) { + if (camera == null) return; + + CameraPosition.Builder builder = new CameraPosition.Builder(); + + ReadableMap center = camera.getMap("center"); + if (center != null) { + Double lng = center.getDouble("longitude"); + Double lat = center.getDouble("latitude"); + builder.target(new LatLng(lat, lng)); + } + + builder.tilt((float)camera.getDouble("pitch")); + builder.bearing((float)camera.getDouble("heading")); + builder.zoom(camera.getInt("zoom")); + + CameraUpdate update = CameraUpdateFactory.newCameraPosition(builder.build()); + + if (super.getHeight() <= 0 || super.getWidth() <= 0) { + // in this case, our map has not been laid out yet, so we save the camera update in a + // local variable. As soon as layout occurs, we will move the camera to the saved update. + // Note that if we tried to move to the camera now, it would trigger an exception. + cameraToSet = update; + } else { + map.moveCamera(update); + cameraToSet = null; + } + } + + public void setShowsUserLocation(boolean showUserLocation) { + this.showUserLocation = showUserLocation; // hold onto this for lifecycle handling + if (hasPermissions()) { + //noinspection MissingPermission + map.setMyLocationEnabled(showUserLocation); + } + } + + public void setShowsMyLocationButton(boolean showMyLocationButton) { + if (hasPermissions() || !showMyLocationButton) { + map.getUiSettings().setMyLocationButtonEnabled(showMyLocationButton); + } + } + + public void setToolbarEnabled(boolean toolbarEnabled) { + if (hasPermissions() || !toolbarEnabled) { + map.getUiSettings().setMapToolbarEnabled(toolbarEnabled); + } + } + + public void setCacheEnabled(boolean cacheEnabled) { + this.cacheEnabled = cacheEnabled; + this.cacheView(); + } + + public void enableMapLoading(boolean loadingEnabled) { + if (loadingEnabled && !this.isMapLoaded) { + this.getMapLoadingLayoutView().setVisibility(View.VISIBLE); + } + } + + public void setMoveOnMarkerPress(boolean moveOnPress) { + this.moveOnMarkerPress = moveOnPress; + } + + public void setLoadingBackgroundColor(Integer loadingBackgroundColor) { + this.loadingBackgroundColor = loadingBackgroundColor; + + if (this.mapLoadingLayout != null) { + if (loadingBackgroundColor == null) { + this.mapLoadingLayout.setBackgroundColor(Color.WHITE); + } else { + this.mapLoadingLayout.setBackgroundColor(this.loadingBackgroundColor); + } + } + } + + public void setLoadingIndicatorColor(Integer loadingIndicatorColor) { + this.loadingIndicatorColor = loadingIndicatorColor; + if (this.mapLoadingProgressBar != null) { + Integer color = loadingIndicatorColor; + if (color == null) { + color = Color.parseColor("#606060"); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ColorStateList progressTintList = ColorStateList.valueOf(loadingIndicatorColor); + ColorStateList secondaryProgressTintList = ColorStateList.valueOf(loadingIndicatorColor); + ColorStateList indeterminateTintList = ColorStateList.valueOf(loadingIndicatorColor); + + this.mapLoadingProgressBar.setProgressTintList(progressTintList); + this.mapLoadingProgressBar.setSecondaryProgressTintList(secondaryProgressTintList); + this.mapLoadingProgressBar.setIndeterminateTintList(indeterminateTintList); + } else { + PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN; + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { + mode = PorterDuff.Mode.MULTIPLY; + } + if (this.mapLoadingProgressBar.getIndeterminateDrawable() != null) + this.mapLoadingProgressBar.getIndeterminateDrawable().setColorFilter(color, mode); + if (this.mapLoadingProgressBar.getProgressDrawable() != null) + this.mapLoadingProgressBar.getProgressDrawable().setColorFilter(color, mode); + } + } + } + + public void setHandlePanDrag(boolean handlePanDrag) { + this.handlePanDrag = handlePanDrag; + } + + public void addFeature(View child, int index) { + // Our desired API is to pass up annotations/overlays as children to the mapview component. + // This is where we intercept them and do the appropriate underlying mapview action. + if (child instanceof AirMapMarker) { + AirMapMarker annotation = (AirMapMarker) child; + annotation.addToMap(map); + features.add(index, annotation); + + // Allow visibility event to be triggered later + int visibility = annotation.getVisibility(); + annotation.setVisibility(INVISIBLE); + + // Remove from a view group if already present, prevent "specified child + // already had a parent" error. + ViewGroup annotationParent = (ViewGroup)annotation.getParent(); + if (annotationParent != null) { + annotationParent.removeView(annotation); + } + + // Add to the parent group + attacherGroup.addView(annotation); + + // Trigger visibility event if necessary. + // With some testing, seems like it is not always + // triggered just by being added to a parent view. + annotation.setVisibility(visibility); + + Marker marker = (Marker) annotation.getFeature(); + markerMap.put(marker, annotation); + } else if (child instanceof AirMapPolyline) { + AirMapPolyline polylineView = (AirMapPolyline) child; + polylineView.addToMap(map); + features.add(index, polylineView); + Polyline polyline = (Polyline) polylineView.getFeature(); + polylineMap.put(polyline, polylineView); + } else if (child instanceof AirMapPolygon) { + AirMapPolygon polygonView = (AirMapPolygon) child; + polygonView.addToMap(map); + features.add(index, polygonView); + Polygon polygon = (Polygon) polygonView.getFeature(); + polygonMap.put(polygon, polygonView); + } else if (child instanceof AirMapCircle) { + AirMapCircle circleView = (AirMapCircle) child; + circleView.addToMap(map); + features.add(index, circleView); + } else if (child instanceof AirMapUrlTile) { + AirMapUrlTile urlTileView = (AirMapUrlTile) child; + urlTileView.addToMap(map); + features.add(index, urlTileView); + } else if (child instanceof AirMapWMSTile) { + AirMapWMSTile urlTileView = (AirMapWMSTile) child; + urlTileView.addToMap(map); + features.add(index, urlTileView); + } else if (child instanceof AirMapLocalTile) { + AirMapLocalTile localTileView = (AirMapLocalTile) child; + localTileView.addToMap(map); + features.add(index, localTileView); + } else if (child instanceof AirMapOverlay) { + AirMapOverlay overlayView = (AirMapOverlay) child; + overlayView.addToMap(map); + features.add(index, overlayView); + } else if (child instanceof ViewGroup) { + ViewGroup children = (ViewGroup) child; + for (int i = 0; i < children.getChildCount(); i++) { + addFeature(children.getChildAt(i), index); + } + } else { + addView(child, index); + } + } + + public int getFeatureCount() { + return features.size(); + } + + public View getFeatureAt(int index) { + return features.get(index); + } + + public void removeFeatureAt(int index) { + AirMapFeature feature = features.remove(index); + if (feature instanceof AirMapMarker) { + markerMap.remove(feature.getFeature()); + } + feature.removeFromMap(map); + } + + public WritableMap makeClickEventData(LatLng point) { + WritableMap event = new WritableNativeMap(); + + WritableMap coordinate = new WritableNativeMap(); + coordinate.putDouble("latitude", point.latitude); + coordinate.putDouble("longitude", point.longitude); + event.putMap("coordinate", coordinate); + + Projection projection = map.getProjection(); + Point screenPoint = projection.toScreenLocation(point); + + WritableMap position = new WritableNativeMap(); + position.putDouble("x", screenPoint.x); + position.putDouble("y", screenPoint.y); + event.putMap("position", position); + + return event; + } + + public void updateExtraData(Object extraData) { + // if boundsToMove is not null, we now have the MapView's width/height, so we can apply + // a proper camera move + if (boundsToMove != null) { + HashMap data = (HashMap) extraData; + int width = data.get("width") == null ? 0 : data.get("width").intValue(); + int height = data.get("height") == null ? 0 : data.get("height").intValue(); + + //fix for https://github.com/react-native-community/react-native-maps/issues/245, + //it's not guaranteed the passed-in height and width would be greater than 0. + if (width <= 0 || height <= 0) { + map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundsToMove, 0)); + } else { + map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundsToMove, width, height, 0)); + } + + boundsToMove = null; + cameraToSet = null; + } + else if (cameraToSet != null) { + map.moveCamera(cameraToSet); + cameraToSet = null; + } + } + + public void animateToCamera(ReadableMap camera, int duration) { + if (map == null) return; + CameraPosition.Builder builder = new CameraPosition.Builder(map.getCameraPosition()); + if (camera.hasKey("zoom")) { + builder.zoom((float)camera.getDouble("zoom")); + } + if (camera.hasKey("heading")) { + builder.bearing((float)camera.getDouble("heading")); + } + if (camera.hasKey("pitch")) { + builder.tilt((float)camera.getDouble("pitch")); + } + if (camera.hasKey("center")) { + ReadableMap center = camera.getMap("center"); + builder.target(new LatLng(center.getDouble("latitude"), center.getDouble("longitude"))); + } + + CameraUpdate update = CameraUpdateFactory.newCameraPosition(builder.build()); + + if (duration <= 0) { + map.moveCamera(update); + } + else { + map.animateCamera(update, duration, null); + } + } + + public void animateToNavigation(LatLng location, float bearing, float angle, int duration) { + if (map == null) return; + CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition()) + .bearing(bearing) + .tilt(angle) + .target(location) + .build(); + map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null); + } + + public void animateToRegion(LatLngBounds bounds, int duration) { + if (map == null) return; + map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0), duration, null); + } + + public void animateToViewingAngle(float angle, int duration) { + if (map == null) return; + + CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition()) + .tilt(angle) + .build(); + map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null); + } + + public void animateToBearing(float bearing, int duration) { + if (map == null) return; + CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition()) + .bearing(bearing) + .build(); + map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null); + } + + public void animateToCoordinate(LatLng coordinate, int duration) { + if (map == null) return; + map.animateCamera(CameraUpdateFactory.newLatLng(coordinate), duration, null); + } + + public void fitToElements(boolean animated) { + if (map == null) return; + + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + boolean addedPosition = false; + + for (AirMapFeature feature : features) { + if (feature instanceof AirMapMarker) { + Marker marker = (Marker) feature.getFeature(); + builder.include(marker.getPosition()); + addedPosition = true; + } + // TODO(lmr): may want to include shapes / etc. + } + if (addedPosition) { + LatLngBounds bounds = builder.build(); + CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding); + if (animated) { + map.animateCamera(cu); + } else { + map.moveCamera(cu); + } + } + } + + public void fitToSuppliedMarkers(ReadableArray markerIDsArray, ReadableMap edgePadding, boolean animated) { + if (map == null) return; + + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + String[] markerIDs = new String[markerIDsArray.size()]; + for (int i = 0; i < markerIDsArray.size(); i++) { + markerIDs[i] = markerIDsArray.getString(i); + } + + boolean addedPosition = false; + + List markerIDList = Arrays.asList(markerIDs); + + for (AirMapFeature feature : features) { + if (feature instanceof AirMapMarker) { + String identifier = ((AirMapMarker) feature).getIdentifier(); + Marker marker = (Marker) feature.getFeature(); + if (markerIDList.contains(identifier)) { + builder.include(marker.getPosition()); + addedPosition = true; + } + } + } + + if (addedPosition) { + LatLngBounds bounds = builder.build(); + CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding); + + if (edgePadding != null) { + map.setPadding(edgePadding.getInt("left"), edgePadding.getInt("top"), + edgePadding.getInt("right"), edgePadding.getInt("bottom")); + } + + if (animated) { + map.animateCamera(cu); + } else { + map.moveCamera(cu); + } + } + } + + public void fitToCoordinates(ReadableArray coordinatesArray, ReadableMap edgePadding, + boolean animated) { + if (map == null) return; + + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + for (int i = 0; i < coordinatesArray.size(); i++) { + ReadableMap latLng = coordinatesArray.getMap(i); + Double lat = latLng.getDouble("latitude"); + Double lng = latLng.getDouble("longitude"); + builder.include(new LatLng(lat, lng)); + } + + LatLngBounds bounds = builder.build(); + CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding); + + if (edgePadding != null) { + map.setPadding(edgePadding.getInt("left"), edgePadding.getInt("top"), + edgePadding.getInt("right"), edgePadding.getInt("bottom")); + } + + if (animated) { + map.animateCamera(cu); + } else { + map.moveCamera(cu); + } + map.setPadding(0, 0, 0, + 0); // Without this, the Google logo is moved up by the value of edgePadding.bottom + } + + public double[][] getMapBoundaries() { + LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; + LatLng northEast = bounds.northeast; + LatLng southWest = bounds.southwest; + + return new double[][] { + {northEast.longitude, northEast.latitude}, + {southWest.longitude, southWest.latitude} + }; + } + + public void setMapBoundaries(ReadableMap northEast, ReadableMap southWest) { + if (map == null) return; + + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + Double latNE = northEast.getDouble("latitude"); + Double lngNE = northEast.getDouble("longitude"); + builder.include(new LatLng(latNE, lngNE)); + + Double latSW = southWest.getDouble("latitude"); + Double lngSW = southWest.getDouble("longitude"); + builder.include(new LatLng(latSW, lngSW)); + + LatLngBounds bounds = builder.build(); + + map.setLatLngBoundsForCameraTarget(bounds); + } + + // InfoWindowAdapter interface + + @Override + public View getInfoWindow(Marker marker) { + AirMapMarker markerView = getMarkerMap(marker); + return markerView.getCallout(); + } + + @Override + public View getInfoContents(Marker marker) { + AirMapMarker markerView = getMarkerMap(marker); + return markerView.getInfoContents(); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + gestureDetector.onTouchEvent(ev); + + int action = MotionEventCompat.getActionMasked(ev); + + switch (action) { + case (MotionEvent.ACTION_DOWN): + this.getParent().requestDisallowInterceptTouchEvent( + map != null && map.getUiSettings().isScrollGesturesEnabled()); + break; + case (MotionEvent.ACTION_UP): + // Clear this regardless, since isScrollGesturesEnabled() may have been updated + this.getParent().requestDisallowInterceptTouchEvent(false); + break; + } + super.dispatchTouchEvent(ev); + return true; + } + + @Override + public void onMarkerDragStart(Marker marker) { + WritableMap event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, this, "onMarkerDragStart", event); + + AirMapMarker markerView = getMarkerMap(marker); + event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, markerView, "onDragStart", event); + } + + @Override + public void onMarkerDrag(Marker marker) { + WritableMap event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, this, "onMarkerDrag", event); + + AirMapMarker markerView = getMarkerMap(marker); + event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, markerView, "onDrag", event); + } + + @Override + public void onMarkerDragEnd(Marker marker) { + WritableMap event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, this, "onMarkerDragEnd", event); + + AirMapMarker markerView = getMarkerMap(marker); + event = makeClickEventData(marker.getPosition()); + manager.pushEvent(context, markerView, "onDragEnd", event); + } + + @Override + public void onPoiClick(PointOfInterest poi) { + WritableMap event = makeClickEventData(poi.latLng); + + event.putString("placeId", poi.placeId); + event.putString("name", poi.name); + + manager.pushEvent(context, this, "onPoiClick", event); + } + + private ProgressBar getMapLoadingProgressBar() { + if (this.mapLoadingProgressBar == null) { + this.mapLoadingProgressBar = new ProgressBar(getContext()); + this.mapLoadingProgressBar.setIndeterminate(true); + } + if (this.loadingIndicatorColor != null) { + this.setLoadingIndicatorColor(this.loadingIndicatorColor); + } + return this.mapLoadingProgressBar; + } + + private RelativeLayout getMapLoadingLayoutView() { + if (this.mapLoadingLayout == null) { + this.mapLoadingLayout = new RelativeLayout(getContext()); + this.mapLoadingLayout.setBackgroundColor(Color.LTGRAY); + this.addView(this.mapLoadingLayout, + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + params.addRule(RelativeLayout.CENTER_IN_PARENT); + this.mapLoadingLayout.addView(this.getMapLoadingProgressBar(), params); + + this.mapLoadingLayout.setVisibility(View.INVISIBLE); + } + this.setLoadingBackgroundColor(this.loadingBackgroundColor); + return this.mapLoadingLayout; + } + + private ImageView getCacheImageView() { + if (this.cacheImageView == null) { + this.cacheImageView = new ImageView(getContext()); + this.addView(this.cacheImageView, + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + this.cacheImageView.setVisibility(View.INVISIBLE); + } + return this.cacheImageView; + } + + private void removeCacheImageView() { + if (this.cacheImageView != null) { + ((ViewGroup) this.cacheImageView.getParent()).removeView(this.cacheImageView); + this.cacheImageView = null; + } + } + + private void removeMapLoadingProgressBar() { + if (this.mapLoadingProgressBar != null) { + ((ViewGroup) this.mapLoadingProgressBar.getParent()).removeView(this.mapLoadingProgressBar); + this.mapLoadingProgressBar = null; + } + } + + private void removeMapLoadingLayoutView() { + this.removeMapLoadingProgressBar(); + if (this.mapLoadingLayout != null) { + ((ViewGroup) this.mapLoadingLayout.getParent()).removeView(this.mapLoadingLayout); + this.mapLoadingLayout = null; + } + } + + private void cacheView() { + if (this.cacheEnabled) { + final ImageView cacheImageView = this.getCacheImageView(); + final RelativeLayout mapLoadingLayout = this.getMapLoadingLayoutView(); + cacheImageView.setVisibility(View.INVISIBLE); + mapLoadingLayout.setVisibility(View.VISIBLE); + if (this.isMapLoaded) { + this.map.snapshot(new GoogleMap.SnapshotReadyCallback() { + @Override public void onSnapshotReady(Bitmap bitmap) { + cacheImageView.setImageBitmap(bitmap); + cacheImageView.setVisibility(View.VISIBLE); + mapLoadingLayout.setVisibility(View.INVISIBLE); + } + }); + } + } else { + this.removeCacheImageView(); + if (this.isMapLoaded) { + this.removeMapLoadingLayoutView(); + } + } + } + + public void onPanDrag(MotionEvent ev) { + Point point = new Point((int) ev.getX(), (int) ev.getY()); + LatLng coords = this.map.getProjection().fromScreenLocation(point); + WritableMap event = makeClickEventData(coords); + manager.pushEvent(context, this, "onPanDrag", event); + } + + public void setKmlSrc(String kmlSrc) { + try { + InputStream kmlStream = new FileUtil(context).execute(kmlSrc).get(); + + if (kmlStream == null) { + return; + } + + kmlLayer = new KmlLayer(map, kmlStream, context); + kmlLayer.addLayerToMap(); + + WritableMap pointers = new WritableNativeMap(); + WritableArray markers = new WritableNativeArray(); + + if (kmlLayer.getContainers() == null) { + manager.pushEvent(context, this, "onKmlReady", pointers); + return; + } + + //Retrieve a nested container within the first container + KmlContainer container = kmlLayer.getContainers().iterator().next(); + if (container == null || container.getContainers() == null) { + manager.pushEvent(context, this, "onKmlReady", pointers); + return; + } + + + if (container.getContainers().iterator().hasNext()) { + container = container.getContainers().iterator().next(); + } + + Integer index = 0; + for (KmlPlacemark placemark : container.getPlacemarks()) { + MarkerOptions options = new MarkerOptions(); + + if (placemark.getInlineStyle() != null) { + options = placemark.getMarkerOptions(); + } else { + options.icon(BitmapDescriptorFactory.defaultMarker()); + } + + LatLng latLng = ((LatLng) placemark.getGeometry().getGeometryObject()); + String title = ""; + String snippet = ""; + + if (placemark.hasProperty("name")) { + title = placemark.getProperty("name"); + } + + if (placemark.hasProperty("description")) { + snippet = placemark.getProperty("description"); + } + + options.position(latLng); + options.title(title); + options.snippet(snippet); + + AirMapMarker marker = new AirMapMarker(context, options, this.manager.getMarkerManager()); + + if (placemark.getInlineStyle() != null + && placemark.getInlineStyle().getIconUrl() != null) { + marker.setImage(placemark.getInlineStyle().getIconUrl()); + } else if (container.getStyle(placemark.getStyleId()) != null) { + KmlStyle style = container.getStyle(placemark.getStyleId()); + marker.setImage(style.getIconUrl()); + } + + String identifier = title + " - " + index; + + marker.setIdentifier(identifier); + + addFeature(marker, index++); + + WritableMap loadedMarker = makeClickEventData(latLng); + loadedMarker.putString("id", identifier); + loadedMarker.putString("title", title); + loadedMarker.putString("description", snippet); + + markers.pushMap(loadedMarker); + } + + pointers.putArray("markers", markers); + + manager.pushEvent(context, this, "onKmlReady", pointers); + + } catch (XmlPullParserException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + + @Override + public void onIndoorBuildingFocused() { + IndoorBuilding building = this.map.getFocusedBuilding(); + if (building != null) { + List levels = building.getLevels(); + int index = 0; + WritableArray levelsArray = Arguments.createArray(); + for (IndoorLevel level : levels) { + WritableMap levelMap = Arguments.createMap(); + levelMap.putInt("index", index); + levelMap.putString("name", level.getName()); + levelMap.putString("shortName", level.getShortName()); + levelsArray.pushMap(levelMap); + index++; + } + WritableMap event = Arguments.createMap(); + WritableMap indoorBuilding = Arguments.createMap(); + indoorBuilding.putArray("levels", levelsArray); + indoorBuilding.putInt("activeLevelIndex", building.getActiveLevelIndex()); + indoorBuilding.putBoolean("underground", building.isUnderground()); + + event.putMap("IndoorBuilding", indoorBuilding); + + manager.pushEvent(context, this, "onIndoorBuildingFocused", event); + } else { + WritableMap event = Arguments.createMap(); + WritableArray levelsArray = Arguments.createArray(); + WritableMap indoorBuilding = Arguments.createMap(); + indoorBuilding.putArray("levels", levelsArray); + indoorBuilding.putInt("activeLevelIndex", 0); + indoorBuilding.putBoolean("underground", false); + + event.putMap("IndoorBuilding", indoorBuilding); + + manager.pushEvent(context, this, "onIndoorBuildingFocused", event); + } + } + + @Override + public void onIndoorLevelActivated(IndoorBuilding building) { + if (building == null) { + return; + } + int activeLevelIndex = building.getActiveLevelIndex(); + if (activeLevelIndex < 0 || activeLevelIndex >= building.getLevels().size()) { + return; + } + IndoorLevel level = building.getLevels().get(activeLevelIndex); + + WritableMap event = Arguments.createMap(); + WritableMap indoorlevel = Arguments.createMap(); + + indoorlevel.putInt("activeLevelIndex", activeLevelIndex); + indoorlevel.putString("name", level.getName()); + indoorlevel.putString("shortName", level.getShortName()); + + event.putMap("IndoorLevel", indoorlevel); + + manager.pushEvent(context, this, "onIndoorLevelActivated", event); + } + + public void setIndoorActiveLevelIndex(int activeLevelIndex) { + IndoorBuilding building = this.map.getFocusedBuilding(); + if (building != null) { + if (activeLevelIndex >= 0 && activeLevelIndex < building.getLevels().size()) { + IndoorLevel level = building.getLevels().get(activeLevelIndex); + if (level != null) { + level.activate(); + } + } + } + } + + private AirMapMarker getMarkerMap(Marker marker) { + AirMapMarker airMarker = markerMap.get(marker); + + if (airMarker != null) { + return airMarker; + } + + for (Map.Entry entryMarker : markerMap.entrySet()) { + if (entryMarker.getKey().getPosition().equals(marker.getPosition()) + && entryMarker.getKey().getTitle().equals(marker.getTitle())) { + airMarker = entryMarker.getValue(); + break; + } + } + + return airMarker; + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTile.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTile.java new file mode 100644 index 0000000..e789d2b --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTile.java @@ -0,0 +1,156 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.gms.maps.model.TileOverlayOptions; +import com.google.android.gms.maps.model.UrlTileProvider; + +import java.net.MalformedURLException; +import java.net.URL; + +public class AirMapWMSTile extends AirMapFeature { + private static final double[] mapBound = {-20037508.34789244, 20037508.34789244}; + private static final double FULL = 20037508.34789244 * 2; + + class AIRMapGSUrlTileProvider extends UrlTileProvider { + private String urlTemplate; + private int width; + private int height; + public AIRMapGSUrlTileProvider(int width, int height, String urlTemplate) { + super(width, height); + this.urlTemplate = urlTemplate; + this.width = width; + this.height = height; + } + + @Override + public synchronized URL getTileUrl(int x, int y, int zoom) { + if(AirMapWMSTile.this.maximumZ > 0 && zoom > maximumZ) { + return null; + } + if(AirMapWMSTile.this.minimumZ > 0 && zoom < minimumZ) { + return null; + } + double[] bb = getBoundingBox(x, y, zoom); + String s = this.urlTemplate + .replace("{minX}", Double.toString(bb[0])) + .replace("{minY}", Double.toString(bb[1])) + .replace("{maxX}", Double.toString(bb[2])) + .replace("{maxY}", Double.toString(bb[3])) + .replace("{width}", Integer.toString(width)) + .replace("{height}", Integer.toString(height)); + URL url = null; + try { + url = new URL(s); + } catch (MalformedURLException e) { + throw new AssertionError(e); + } + return url; + } + + private double[] getBoundingBox(int x, int y, int zoom) { + double tile = FULL / Math.pow(2, zoom); + return new double[]{ + mapBound[0] + x * tile, + mapBound[1] - (y + 1) * tile, + mapBound[0] + (x + 1) * tile, + mapBound[1] - y * tile + }; + } + + public void setUrlTemplate(String urlTemplate) { + this.urlTemplate = urlTemplate; + } + } + + private TileOverlayOptions tileOverlayOptions; + private TileOverlay tileOverlay; + private AIRMapGSUrlTileProvider tileProvider; + + private String urlTemplate; + private float zIndex; + private float maximumZ; + private float minimumZ; + private int tileSize; + private float opacity; + + public AirMapWMSTile(Context context) { + super(context); + } + + public void setUrlTemplate(String urlTemplate) { + this.urlTemplate = urlTemplate; + if (tileProvider != null) { + tileProvider.setUrlTemplate(urlTemplate); + } + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setZIndex(float zIndex) { + this.zIndex = zIndex; + if (tileOverlay != null) { + tileOverlay.setZIndex(zIndex); + } + } + + public void setMaximumZ(float maximumZ) { + this.maximumZ = maximumZ; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + + public void setMinimumZ(float minimumZ) { + this.minimumZ = minimumZ; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + public void setTileSize(int tileSize) { + this.tileSize = tileSize; + if (tileOverlay != null) { + tileOverlay.clearTileCache(); + } + } + public void setOpacity(float opacity) { + this.opacity = opacity; + if (tileOverlay != null) { + tileOverlay.setTransparency(1-opacity); + } + } + + public TileOverlayOptions getTileOverlayOptions() { + if (tileOverlayOptions == null) { + tileOverlayOptions = createTileOverlayOptions(); + } + return tileOverlayOptions; + } + + private TileOverlayOptions createTileOverlayOptions() { + TileOverlayOptions options = new TileOverlayOptions(); + options.zIndex(zIndex); + options.transparency(1-opacity); + this.tileProvider = new AIRMapGSUrlTileProvider(this.tileSize, this.tileSize, this.urlTemplate); + options.tileProvider(this.tileProvider); + return options; + } + + @Override + public Object getFeature() { + return tileOverlay; + } + + @Override + public void addToMap(GoogleMap map) { + this.tileOverlay = map.addTileOverlay(getTileOverlayOptions()); + } + + @Override + public void removeFromMap(GoogleMap map) { + tileOverlay.remove(); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTileManager.java b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTileManager.java new file mode 100644 index 0000000..1e7fba5 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTileManager.java @@ -0,0 +1,67 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; + +public class AirMapWMSTileManager extends ViewGroupManager { + private DisplayMetrics metrics; + + public AirMapWMSTileManager(ReactApplicationContext reactContext) { + super(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + metrics = new DisplayMetrics(); + ((WindowManager) reactContext.getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay() + .getRealMetrics(metrics); + } else { + metrics = reactContext.getResources().getDisplayMetrics(); + } + } + + @Override + public String getName() { + return "AIRMapWMSTile"; + } + + @Override + public AirMapWMSTile createViewInstance(ThemedReactContext context) { + return new AirMapWMSTile(context); + } + + @ReactProp(name = "urlTemplate") + public void setUrlTemplate(AirMapWMSTile view, String urlTemplate) { + view.setUrlTemplate(urlTemplate); + } + + @ReactProp(name = "zIndex", defaultFloat = -1.0f) + public void setZIndex(AirMapWMSTile view, float zIndex) { + view.setZIndex(zIndex); + } + + @ReactProp(name = "minimumZ", defaultFloat = 0.0f) + public void setMinimumZ(AirMapWMSTile view, float minimumZ) { + view.setMinimumZ(minimumZ); + } + + @ReactProp(name = "maximumZ", defaultFloat = 100.0f) + public void setMaximumZ(AirMapWMSTile view, float maximumZ) { + view.setMaximumZ(maximumZ); + } + + @ReactProp(name = "tileSize", defaultInt = 512) + public void setTileSize(AirMapWMSTile view, int tileSize) { + view.setTileSize(tileSize); + } + + @ReactProp(name = "opacity", defaultFloat = 1.0f) + public void setOpacity(AirMapWMSTile view, float opacity) { + view.setOpacity(opacity); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/FileUtil.java b/lib/android/src/main/java/com/airbnb/android/react/maps/FileUtil.java new file mode 100644 index 0000000..5fb1aa0 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/FileUtil.java @@ -0,0 +1,77 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.net.Uri; +import android.os.AsyncTask; + +import com.facebook.common.logging.FLog; +import com.facebook.react.common.ReactConstants; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; + +public class FileUtil extends AsyncTask { + + private final String NAME = "FileUtil"; + private final String TEMP_FILE_SUFFIX = "temp"; + + private Exception exception; + private Context context; + + public FileUtil(Context context) { + super(); + + this.context = context; + } + + protected InputStream doInBackground(String... urls) { + try { + Uri fileContentUri = Uri.parse(urls[0]); + + if (fileContentUri.getScheme().startsWith("http")) { + return getDownloadFileInputStream(context, fileContentUri); + } + return context.getContentResolver().openInputStream(fileContentUri); + } catch (Exception e) { + this.exception = e; + FLog.e( + ReactConstants.TAG, + "Could not retrieve file for contentUri " + urls[0], + e); + return null; + } + } + + private InputStream getDownloadFileInputStream(Context context, Uri uri) + throws IOException { + final File outputDir = context.getApplicationContext().getCacheDir(); + final File file = File.createTempFile(NAME, TEMP_FILE_SUFFIX, outputDir); + file.deleteOnExit(); + + final URL url = new URL(uri.toString()); + final InputStream is = url.openStream(); + try { + final ReadableByteChannel channel = Channels.newChannel(is); + try { + final FileOutputStream stream = new FileOutputStream(file); + try { + stream.getChannel().transferFrom(channel, 0, Long.MAX_VALUE); + return new FileInputStream(file); + } finally { + stream.close(); + } + } finally { + channel.close(); + } + } finally { + is.close(); + } + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReadable.java b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReadable.java new file mode 100644 index 0000000..6400532 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReadable.java @@ -0,0 +1,15 @@ +package com.airbnb.android.react.maps; + + +import android.graphics.Bitmap; + +import com.google.android.gms.maps.model.BitmapDescriptor; + +public interface ImageReadable { + + public void setIconBitmap(Bitmap bitmap); + + public void setIconBitmapDescriptor(BitmapDescriptor bitmapDescriptor); + + public void update(); +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReader.java b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReader.java new file mode 100644 index 0000000..c01866d --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageReader.java @@ -0,0 +1,129 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Animatable; +import android.net.Uri; + +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.controller.BaseControllerListener; +import com.facebook.drawee.controller.ControllerListener; +import com.facebook.drawee.drawable.ScalingUtils; +import com.facebook.drawee.generic.GenericDraweeHierarchy; +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.DraweeHolder; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.image.CloseableImage; +import com.facebook.imagepipeline.image.CloseableStaticBitmap; +import com.facebook.imagepipeline.image.ImageInfo; +import com.facebook.imagepipeline.request.ImageRequest; +import com.facebook.imagepipeline.request.ImageRequestBuilder; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; + +import javax.annotation.Nullable; + +public class ImageReader { + + private final ImageReadable imp; + private final Context context; + private final Resources resources; + + private final DraweeHolder logoHolder; + private DataSource> dataSource; + + private final ControllerListener mLogoControllerListener = + new BaseControllerListener() { + @Override + public void onFinalImageSet( + String id, + @Nullable final ImageInfo imageInfo, + @Nullable Animatable animatable) { + CloseableReference imageReference = null; + try { + imageReference = dataSource.getResult(); + if (imageReference != null) { + CloseableImage image = imageReference.get(); + if (image != null && image instanceof CloseableStaticBitmap) { + CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) image; + Bitmap bitmap = closeableStaticBitmap.getUnderlyingBitmap(); + if (bitmap != null) { + bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); + imp.setIconBitmap(bitmap); + imp.setIconBitmapDescriptor(BitmapDescriptorFactory.fromBitmap(bitmap)); + } + } + } + } finally { + dataSource.close(); + if (imageReference != null) { + CloseableReference.closeSafely(imageReference); + } + } + imp.update(); + } + }; + + public ImageReader(Context context, Resources resources, ImageReadable imp) { + this.context = context; + this.resources = resources; + this.imp = imp; + logoHolder = DraweeHolder.create(createDraweeHeirarchy(resources), context); + logoHolder.onAttach(); + } + + private GenericDraweeHierarchy createDraweeHeirarchy(Resources resources){ + return new GenericDraweeHierarchyBuilder(resources) + .setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER) + .setFadeDuration(0) + .build(); + } + + public void setImage(String uri) { + if (uri == null) { + imp.setIconBitmapDescriptor(null); + imp.update(); + } else if (uri.startsWith("http://") || uri.startsWith("https://") || + uri.startsWith("file://") || uri.startsWith("asset://")) { + ImageRequest imageRequest = ImageRequestBuilder + .newBuilderWithSource(Uri.parse(uri)) + .build(); + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + dataSource = imagePipeline.fetchDecodedImage(imageRequest, this); + + DraweeController controller = Fresco.newDraweeControllerBuilder() + .setImageRequest(imageRequest) + .setControllerListener(mLogoControllerListener) + .setOldController(logoHolder.getController()) + .build(); + logoHolder.setController(controller); + } else { + BitmapDescriptor iconBitmapDescriptor = getBitmapDescriptorByName(uri); + if (iconBitmapDescriptor != null) { + imp.setIconBitmapDescriptor(iconBitmapDescriptor); + imp.setIconBitmap(BitmapFactory.decodeResource(this.resources, getDrawableResourceByName + (uri))); + } + imp.update(); + } + + + } + + private int getDrawableResourceByName(String name) { + return this.resources.getIdentifier( + name, + "drawable", + this.context.getPackageName()); + } + + private BitmapDescriptor getBitmapDescriptorByName(String name) { + return BitmapDescriptorFactory.fromResource(getDrawableResourceByName(name)); + } + +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/ImageUtil.java b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageUtil.java new file mode 100644 index 0000000..35078a9 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/ImageUtil.java @@ -0,0 +1,27 @@ +package com.airbnb.android.react.maps; + + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Base64; + +import java.io.ByteArrayOutputStream; + +public class ImageUtil { + public static Bitmap convert(String base64Str) throws IllegalArgumentException { + byte[] decodedBytes = Base64.decode( + base64Str.substring(base64Str.indexOf(",") + 1), + Base64.DEFAULT + ); + + return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); + } + + public static String convert(Bitmap bitmap) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); + + return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); + } + +} \ No newline at end of file diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/LatLngBoundsUtils.java b/lib/android/src/main/java/com/airbnb/android/react/maps/LatLngBoundsUtils.java new file mode 100644 index 0000000..d32e0dc --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/LatLngBoundsUtils.java @@ -0,0 +1,47 @@ +package com.airbnb.android.react.maps; + +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +public class LatLngBoundsUtils { + public static boolean BoundsAreDifferent(LatLngBounds a, LatLngBounds b) { + LatLng centerA = a.getCenter(); + double latA = centerA.latitude; + double lngA = centerA.longitude; + double latDeltaA = a.northeast.latitude - a.southwest.latitude; + double lngDeltaA = a.northeast.longitude - a.southwest.longitude; + + LatLng centerB = b.getCenter(); + double latB = centerB.latitude; + double lngB = centerB.longitude; + double latDeltaB = b.northeast.latitude - b.southwest.latitude; + double lngDeltaB = b.northeast.longitude - b.southwest.longitude; + + double latEps = LatitudeEpsilon(a, b); + double lngEps = LongitudeEpsilon(a, b); + + return + different(latA, latB, latEps) || + different(lngA, lngB, lngEps) || + different(latDeltaA, latDeltaB, latEps) || + different(lngDeltaA, lngDeltaB, lngEps); + } + + private static boolean different(double a, double b, double epsilon) { + return Math.abs(a - b) > epsilon; + } + + private static double LatitudeEpsilon(LatLngBounds a, LatLngBounds b) { + double sizeA = a.northeast.latitude - a.southwest.latitude; // something mod 180? + double sizeB = b.northeast.latitude - b.southwest.latitude; // something mod 180? + double size = Math.min(Math.abs(sizeA), Math.abs(sizeB)); + return size / 2560; + } + + private static double LongitudeEpsilon(LatLngBounds a, LatLngBounds b) { + double sizeA = a.northeast.longitude - a.southwest.longitude; + double sizeB = b.northeast.longitude - b.southwest.longitude; + double size = Math.min(Math.abs(sizeA), Math.abs(sizeB)); + return size / 2560; + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/MapsPackage.java b/lib/android/src/main/java/com/airbnb/android/react/maps/MapsPackage.java new file mode 100644 index 0000000..826ee0f --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/MapsPackage.java @@ -0,0 +1,61 @@ +package com.airbnb.android.react.maps; + +import android.app.Activity; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JavaScriptModule; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class MapsPackage implements ReactPackage { + public MapsPackage(Activity activity) { + } // backwards compatibility + + public MapsPackage() { + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + return Arrays.asList(new AirMapModule(reactContext)); + } + + // Deprecated RN 0.47 + public List> createJSModules() { + return Collections.emptyList(); + } + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + AirMapCalloutManager calloutManager = new AirMapCalloutManager(); + AirMapMarkerManager annotationManager = new AirMapMarkerManager(); + AirMapPolylineManager polylineManager = new AirMapPolylineManager(reactContext); + AirMapPolygonManager polygonManager = new AirMapPolygonManager(reactContext); + AirMapCircleManager circleManager = new AirMapCircleManager(reactContext); + AirMapManager mapManager = new AirMapManager(reactContext); + AirMapLiteManager mapLiteManager = new AirMapLiteManager(reactContext); + AirMapUrlTileManager urlTileManager = new AirMapUrlTileManager(reactContext); + AirMapWMSTileManager gsUrlTileManager = new AirMapWMSTileManager(reactContext); + AirMapLocalTileManager localTileManager = new AirMapLocalTileManager(reactContext); + AirMapOverlayManager overlayManager = new AirMapOverlayManager(reactContext); + mapManager.setMarkerManager(annotationManager); + + return Arrays.asList( + calloutManager, + annotationManager, + polylineManager, + polygonManager, + circleManager, + mapManager, + mapLiteManager, + urlTileManager, + gsUrlTileManager, + localTileManager, + overlayManager + ); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/RegionChangeEvent.java b/lib/android/src/main/java/com/airbnb/android/react/maps/RegionChangeEvent.java new file mode 100644 index 0000000..675eb41 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/RegionChangeEvent.java @@ -0,0 +1,46 @@ +package com.airbnb.android.react.maps; + +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableNativeMap; +import com.facebook.react.uimanager.events.Event; +import com.facebook.react.uimanager.events.RCTEventEmitter; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +public class RegionChangeEvent extends Event { + private final LatLngBounds bounds; + private final boolean continuous; + + public RegionChangeEvent(int id, LatLngBounds bounds, boolean continuous) { + super(id); + this.bounds = bounds; + this.continuous = continuous; + } + + @Override + public String getEventName() { + return "topChange"; + } + + @Override + public boolean canCoalesce() { + return false; + } + + @Override + public void dispatch(RCTEventEmitter rctEventEmitter) { + + WritableMap event = new WritableNativeMap(); + event.putBoolean("continuous", continuous); + + WritableMap region = new WritableNativeMap(); + LatLng center = bounds.getCenter(); + region.putDouble("latitude", center.latitude); + region.putDouble("longitude", center.longitude); + region.putDouble("latitudeDelta", bounds.northeast.latitude - bounds.southwest.latitude); + region.putDouble("longitudeDelta", bounds.northeast.longitude - bounds.southwest.longitude); + event.putMap("region", region); + + rctEventEmitter.receiveEvent(getViewTag(), getEventName(), event); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/SizeReportingShadowNode.java b/lib/android/src/main/java/com/airbnb/android/react/maps/SizeReportingShadowNode.java new file mode 100644 index 0000000..bf6c29d --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/SizeReportingShadowNode.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +package com.airbnb.android.react.maps; + +import com.facebook.react.uimanager.LayoutShadowNode; +import com.facebook.react.uimanager.UIViewOperationQueue; + +import java.util.HashMap; +import java.util.Map; + +// Custom LayoutShadowNode implementation used in conjunction with the AirMapManager +// which sends the width/height of the view after layout occurs. +public class SizeReportingShadowNode extends LayoutShadowNode { + + @Override + public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue) { + super.onCollectExtraUpdates(uiViewOperationQueue); + + Map data = new HashMap<>(); + data.put("width", getLayoutWidth()); + data.put("height", getLayoutHeight()); + + uiViewOperationQueue.enqueueUpdateExtraData(getReactTag(), data); + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/ViewAttacherGroup.java b/lib/android/src/main/java/com/airbnb/android/react/maps/ViewAttacherGroup.java new file mode 100644 index 0000000..30477c0 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/ViewAttacherGroup.java @@ -0,0 +1,31 @@ +package com.airbnb.android.react.maps; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.os.Build; + +import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.views.view.ReactViewGroup; + +public class ViewAttacherGroup extends ReactViewGroup { + + public ViewAttacherGroup(Context context) { + super(context); + + this.setWillNotDraw(true); + this.setVisibility(VISIBLE); + this.setAlpha(0.0f); + this.setRemoveClippedSubviews(false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + this.setClipBounds(new Rect(0, 0, 0, 0)); + } + this.setOverflow("hidden"); // Change to ViewProps.HIDDEN until RN 0.57 is base + } + + // This should make it more performant, avoid trying to hard to overlap layers with opacity. + @Override + public boolean hasOverlappingRendering() { + return false; + } +} diff --git a/lib/android/src/main/java/com/airbnb/android/react/maps/ViewChangesTracker.java b/lib/android/src/main/java/com/airbnb/android/react/maps/ViewChangesTracker.java new file mode 100644 index 0000000..8094b13 --- /dev/null +++ b/lib/android/src/main/java/com/airbnb/android/react/maps/ViewChangesTracker.java @@ -0,0 +1,75 @@ +package com.airbnb.android.react.maps; + +import android.os.Handler; +import android.os.Looper; + +import java.util.LinkedList; + +public class ViewChangesTracker { + + private static ViewChangesTracker instance; + private Handler handler; + private LinkedList markers = new LinkedList<>(); + private boolean hasScheduledFrame = false; + private Runnable updateRunnable; + private final long fps = 40; + + private ViewChangesTracker() { + handler = new Handler(Looper.myLooper()); + updateRunnable = new Runnable() { + @Override + public void run() { + hasScheduledFrame = false; + update(); + + if (markers.size() > 0) { + handler.postDelayed(updateRunnable, fps); + } + } + }; + } + + static ViewChangesTracker getInstance() { + if (instance == null) { + synchronized (ViewChangesTracker.class) { + instance = new ViewChangesTracker(); + } + } + + return instance; + } + + public void addMarker(AirMapMarker marker) { + markers.add(marker); + + if (!hasScheduledFrame) { + hasScheduledFrame = true; + handler.postDelayed(updateRunnable, fps); + } + } + + public void removeMarker(AirMapMarker marker) { + markers.remove(marker); + } + + public boolean containsMarker(AirMapMarker marker) { + return markers.contains(marker); + } + + private LinkedList markersToRemove = new LinkedList<>(); + + public void update() { + for (AirMapMarker marker : markers) { + if (!marker.updateCustomForTracking()) { + markersToRemove.add(marker); + } + } + + // Remove markers that are not active anymore + if (markersToRemove.size() > 0) { + markers.removeAll(markersToRemove); + markersToRemove.clear(); + } + } + +} diff --git a/lib/components/AnimatedRegion.js b/lib/components/AnimatedRegion.js new file mode 100644 index 0000000..3747a70 --- /dev/null +++ b/lib/components/AnimatedRegion.js @@ -0,0 +1,192 @@ +import { Animated } from 'react-native'; + +const AnimatedWithChildren = Object.getPrototypeOf(Animated.ValueXY); +if (__DEV__) { + if (AnimatedWithChildren.name !== 'AnimatedWithChildren') { + console.error( + 'AnimatedRegion could not obtain AnimatedWithChildren base class' + ); + } +} +// const __Animated = Object.getPrototypeOf(AnimatedWithChildren); +// if (__Animated.name !== 'Animated') console.error('AnimatedRegion could not obtain Animated base class'); + +var _uniqueId = 1; + +export default class AnimatedMapRegion extends AnimatedWithChildren { + constructor(valueIn) { + super(); + var value = valueIn || { + // probably want to come up with better defaults + latitude: 0, + longitude: 0, + latitudeDelta: 0, + longitudeDelta: 0, + }; + this.latitude = + value.latitude instanceof Animated.Value + ? value.latitude + : new Animated.Value(value.latitude); + this.longitude = + value.longitude instanceof Animated.Value + ? value.longitude + : new Animated.Value(value.longitude); + this.latitudeDelta = + value.latitudeDelta instanceof Animated.Value + ? value.latitudeDelta + : new Animated.Value(value.latitudeDelta); + this.longitudeDelta = + value.longitudeDelta instanceof Animated.Value + ? value.longitudeDelta + : new Animated.Value(value.longitudeDelta); + this._listeners = {}; + } + + setValue(value) { + this.latitude._value = value.latitude; + this.longitude._value = value.longitude; + this.latitudeDelta._value = value.latitudeDelta; + this.longitudeDelta._value = value.longitudeDelta; + } + + setOffset(offset) { + this.latitude.setOffset(offset.latitude); + this.longitude.setOffset(offset.longitude); + this.latitudeDelta.setOffset(offset.latitudeDelta); + this.longitudeDelta.setOffset(offset.longitudeDelta); + } + + flattenOffset() { + this.latitude.flattenOffset(); + this.longitude.flattenOffset(); + this.latitudeDelta.flattenOffset(); + this.longitudeDelta.flattenOffset(); + } + + __getValue() { + return { + latitude: this.latitude.__getValue(), + longitude: this.longitude.__getValue(), + latitudeDelta: this.latitudeDelta.__getValue(), + longitudeDelta: this.longitudeDelta.__getValue(), + }; + } + + __attach() { + this.latitude.__addChild(this); + this.longitude.__addChild(this); + this.latitudeDelta.__addChild(this); + this.longitudeDelta.__addChild(this); + } + + __detach() { + this.latitude.__removeChild(this); + this.longitude.__removeChild(this); + this.latitudeDelta.__removeChild(this); + this.longitudeDelta.__removeChild(this); + } + + stopAnimation(callback) { + this.latitude.stopAnimation(); + this.longitude.stopAnimation(); + this.latitudeDelta.stopAnimation(); + this.longitudeDelta.stopAnimation(); + callback && callback(this.__getValue()); + } + + addListener(callback) { + var id = String(_uniqueId++); + var jointCallback = (/*{value}*/) => { + callback(this.__getValue()); + }; + this._listeners[id] = { + latitude: this.latitude.addListener(jointCallback), + longitude: this.longitude.addListener(jointCallback), + latitudeDelta: this.latitudeDelta.addListener(jointCallback), + longitudeDelta: this.longitudeDelta.addListener(jointCallback), + }; + return id; + } + + removeListener(id) { + this.latitude.removeListener(this._listeners[id].latitude); + this.longitude.removeListener(this._listeners[id].longitude); + this.latitudeDelta.removeListener(this._listeners[id].latitudeDelta); + this.longitudeDelta.removeListener(this._listeners[id].longitudeDelta); + delete this._listeners[id]; + } + + spring(config) { + var animations = []; + config.hasOwnProperty('latitude') && + animations.push( + Animated.spring(this.latitude, { + ...config, + toValue: config.latitude, + }) + ); + + config.hasOwnProperty('longitude') && + animations.push( + Animated.spring(this.longitude, { + ...config, + toValue: config.longitude, + }) + ); + + config.hasOwnProperty('latitudeDelta') && + animations.push( + Animated.spring(this.latitudeDelta, { + ...config, + toValue: config.latitudeDelta, + }) + ); + + config.hasOwnProperty('longitudeDelta') && + animations.push( + Animated.spring(this.longitudeDelta, { + ...config, + toValue: config.longitudeDelta, + }) + ); + + return Animated.parallel(animations); + } + + timing(config) { + var animations = []; + config.hasOwnProperty('latitude') && + animations.push( + Animated.timing(this.latitude, { + ...config, + toValue: config.latitude, + }) + ); + + config.hasOwnProperty('longitude') && + animations.push( + Animated.timing(this.longitude, { + ...config, + toValue: config.longitude, + }) + ); + + config.hasOwnProperty('latitudeDelta') && + animations.push( + Animated.timing(this.latitudeDelta, { + ...config, + toValue: config.latitudeDelta, + }) + ); + + config.hasOwnProperty('longitudeDelta') && + animations.push( + Animated.timing(this.longitudeDelta, { + ...config, + toValue: config.longitudeDelta, + }) + ); + + return Animated.parallel(animations); + } +} diff --git a/lib/components/MapCallout.js b/lib/components/MapCallout.js new file mode 100644 index 0000000..48e5dee --- /dev/null +++ b/lib/components/MapCallout.js @@ -0,0 +1,53 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { StyleSheet, ViewPropTypes, View } from 'react-native'; +import decorateMapComponent, { + SUPPORTED, + USES_DEFAULT_IMPLEMENTATION, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + tooltip: PropTypes.bool, + onPress: PropTypes.func, + alphaHitTest: PropTypes.bool, +}; + +const defaultProps = { + tooltip: false, + alphaHitTest: false, +}; + +class MapCallout extends React.Component { + render() { + const AIRMapCallout = this.getAirComponent(); + return ( + + ); + } +} + +MapCallout.propTypes = propTypes; +MapCallout.defaultProps = defaultProps; + +const styles = StyleSheet.create({ + callout: { + position: 'absolute', + }, +}); + +export default decorateMapComponent(MapCallout, { + componentType: 'Callout', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapCalloutSubview.js b/lib/components/MapCalloutSubview.js new file mode 100644 index 0000000..6aa6369 --- /dev/null +++ b/lib/components/MapCalloutSubview.js @@ -0,0 +1,46 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { StyleSheet, ViewPropTypes, View } from 'react-native'; +import decorateMapComponent, { + SUPPORTED, + NOT_SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + onPress: PropTypes.func, +}; + +const defaultProps = {}; + +class MapCalloutSubview extends React.Component { + render() { + const AIRMapCalloutSubview = this.getAirComponent(); + return ( + + ); + } +} + +MapCalloutSubview.propTypes = propTypes; +MapCalloutSubview.defaultProps = defaultProps; + +const styles = StyleSheet.create({ + calloutSubview: {}, +}); + +export default decorateMapComponent(MapCalloutSubview, { + componentType: 'CalloutSubview', + providers: { + google: { + ios: SUPPORTED, + android: NOT_SUPPORTED, + }, + }, +}); diff --git a/lib/components/MapCircle.js b/lib/components/MapCircle.js new file mode 100644 index 0000000..3001751 --- /dev/null +++ b/lib/components/MapCircle.js @@ -0,0 +1,150 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { ColorPropType, ViewPropTypes, View } from 'react-native'; +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * The coordinate of the center of the circle + */ + center: PropTypes.shape({ + /** + * Coordinates for the center of the circle. + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }).isRequired, + + /** + * The radius of the circle to be drawn (in meters) + */ + radius: PropTypes.number.isRequired, + + /** + * Callback that is called when the user presses on the circle + */ + onPress: PropTypes.func, + + /** + * The stroke width to use for the path. + */ + strokeWidth: PropTypes.number, + + /** + * The stroke color to use for the path. + */ + strokeColor: ColorPropType, + + /** + * The fill color to use for the path. + */ + fillColor: ColorPropType, + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is 0. + * + * @platform android + */ + zIndex: PropTypes.number, + + /** + * The line cap style to apply to the open ends of the path. + * The default style is `round`. + * + * @platform ios + */ + lineCap: PropTypes.oneOf(['butt', 'round', 'square']), + + /** + * The line join style to apply to corners of the path. + * The default style is `round`. + * + * @platform ios + */ + lineJoin: PropTypes.oneOf(['miter', 'round', 'bevel']), + + /** + * The limiting value that helps avoid spikes at junctions between connected line segments. + * The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If + * the ratio of the miter length—that is, the diagonal length of the miter join—to the line + * thickness exceeds the miter limit, the joint is converted to a bevel join. The default + * miter limit is 10, which results in the conversion of miters whose angle at the joint + * is less than 11 degrees. + * + * @platform ios + */ + miterLimit: PropTypes.number, + + /** + * The offset (in points) at which to start drawing the dash pattern. + * + * Use this property to start drawing a dashed line partway through a segment or gap. For + * example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the + * middle of the first gap. + * + * The default value of this property is 0. + * + * @platform ios + */ + lineDashPhase: PropTypes.number, + + /** + * An array of numbers specifying the dash pattern to use for the path. + * + * The array contains one or more numbers that indicate the lengths (measured in points) of the + * line segments and gaps in the pattern. The values in the array alternate, starting with the + * first line segment length, followed by the first gap length, followed by the second line + * segment length, and so on. + * + * This property is set to `null` by default, which indicates no line dash pattern. + * + * @platform ios + */ + lineDashPattern: PropTypes.arrayOf(PropTypes.number), +}; + +const defaultProps = { + strokeColor: '#000', + strokeWidth: 1, +}; + +class MapCircle extends React.Component { + setNativeProps(props) { + this.circle.setNativeProps(props); + } + + render() { + const AIRMapCircle = this.getAirComponent(); + return ( + { + this.circle = ref; + }} + /> + ); + } +} + +MapCircle.propTypes = propTypes; +MapCircle.defaultProps = defaultProps; + +export default decorateMapComponent(MapCircle, { + componentType: 'Circle', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapLocalTile.js b/lib/components/MapLocalTile.js new file mode 100644 index 0000000..dc09b86 --- /dev/null +++ b/lib/components/MapLocalTile.js @@ -0,0 +1,56 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +import { ViewPropTypes, View } from 'react-native'; + +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * The path template of the local tile source. + * The patterns {x} {y} {z} will be replaced at runtime, + * for example, /storage/emulated/0/tiles/{z}/{x}/{y}.png. + */ + pathTemplate: PropTypes.string.isRequired, + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is -1. + * + * @platform android + */ + zIndex: PropTypes.number, + + /** + * Size of tile images. + */ + tileSize: PropTypes.number, +}; + +class MapLocalTile extends React.Component { + render() { + const AIRMapLocalTile = this.getAirComponent(); + return ; + } +} + +MapLocalTile.propTypes = propTypes; + +export default decorateMapComponent(MapLocalTile, { + componentType: 'LocalTile', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapMarker.js b/lib/components/MapMarker.js new file mode 100644 index 0000000..ec06a1d --- /dev/null +++ b/lib/components/MapMarker.js @@ -0,0 +1,371 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { + ColorPropType, + StyleSheet, + Platform, + NativeModules, + Animated, + Image, + findNodeHandle, + ViewPropTypes, + View, +} from 'react-native'; + +import decorateMapComponent, { + SUPPORTED, + USES_DEFAULT_IMPLEMENTATION, +} from './decorateMapComponent'; + +const viewConfig = { + uiViewClassName: 'AIRMapMarker', + validAttributes: { + coordinate: true, + }, +}; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + // TODO(lmr): get rid of these? + identifier: PropTypes.string, + reuseIdentifier: PropTypes.string, + + /** + * The title of the marker. This is only used if the component has no children that + * are a ``, in which case the default callout behavior will be used, which + * will show both the `title` and the `description`, if provided. + */ + title: PropTypes.string, + + /** + * The description of the marker. This is only used if the component has no children + * that are a ``, in which case the default callout behavior will be used, + * which will show both the `title` and the `description`, if provided. + */ + description: PropTypes.string, + + /** + * Test ID for end to end test automation + */ + testID: PropTypes.string, + + /** + * A custom image to be used as the marker's icon. Only local image resources are allowed to be + * used. + */ + image: PropTypes.any, + + /** + * Marker icon to render (equivalent to `icon` property of GMSMarker Class). + * Using this property has an advantage over `image` in term of performance, battery usage... + * because it doesn't trigger tracksViewChanges. + * (tracksViewChanges is set to YES by default if iconView is not nil). + */ + icon: PropTypes.any, + + /** + * Opacity level of view/image based markers + */ + opacity: PropTypes.number, + + /** + * If no custom marker view or custom image is provided, the platform default pin will be used, + * which can be customized by this color. Ignored if a custom marker is being used. + */ + pinColor: ColorPropType, + + /** + * The coordinate for the marker. + */ + coordinate: PropTypes.shape({ + /** + * Coordinates for the anchor point of the marker. + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }).isRequired, + + /** + * The offset (in points) at which to display the view. + * + * By default, the center point of an annotation view is placed at the coordinate point of the + * associated annotation. You can use this property to reposition the annotation view as + * needed. This x and y offset values are measured in points. Positive offset values move the + * annotation view down and to the right, while negative values move it up and to the left. + * + * For android, see the `anchor` prop. + * + * @platform ios + */ + centerOffset: PropTypes.shape({ + /** + * Offset from the anchor point + */ + x: PropTypes.number.isRequired, + y: PropTypes.number.isRequired, + }), + + /** + * The offset (in points) at which to place the callout bubble. + * + * This property determines the additional distance by which to move the callout bubble. When + * this property is set to (0, 0), the anchor point of the callout bubble is placed on the + * top-center point of the marker view’s frame. Specifying positive offset values moves the + * callout bubble down and to the right, while specifying negative values moves it up and to + * the left. + * + * For android, see the `calloutAnchor` prop. + * + * @platform ios + */ + calloutOffset: PropTypes.shape({ + /** + * Offset to the callout + */ + x: PropTypes.number.isRequired, + y: PropTypes.number.isRequired, + }), + + /** + * Sets the anchor point for the marker. + * + * The anchor specifies the point in the icon image that is anchored to the marker's position + * on the Earth's surface. + * + * The anchor point is specified in the continuous space [0.0, 1.0] x [0.0, 1.0], where (0, 0) + * is the top-left corner of the image, and (1, 1) is the bottom-right corner. The anchoring + * point in a W x H image is the nearest discrete grid point in a (W + 1) x (H + 1) grid, + * obtained by scaling the then rounding. For example, in a 4 x 2 image, the anchor point + * (0.7, 0.6) resolves to the grid point at (3, 1). + * + * For ios, see the `centerOffset` prop. + * + * @platform android + */ + anchor: PropTypes.shape({ + /** + * Offset to the callout + */ + x: PropTypes.number.isRequired, + y: PropTypes.number.isRequired, + }), + + /** + * Specifies the point in the marker image at which to anchor the callout when it is displayed. + * This is specified in the same coordinate system as the anchor. See the `andor` prop for more + * details. + * + * The default is the top middle of the image. + * + * For ios, see the `calloutOffset` prop. + * + * @platform android + */ + calloutAnchor: PropTypes.shape({ + /** + * Offset to the callout + */ + x: PropTypes.number.isRequired, + y: PropTypes.number.isRequired, + }), + + /** + * Sets whether this marker should be flat against the map true or a billboard facing the + * camera false. + * + * @platform android + */ + flat: PropTypes.bool, + + draggable: PropTypes.bool, + + /** + * Sets whether this marker should track view changes true. + */ + + tracksViewChanges: PropTypes.bool, + + /** + * Sets whether this marker should track view changes in info window true. + * + * @platform ios + */ + + tracksInfoWindowChanges: PropTypes.bool, + + /** + * Stops Marker onPress events from propagating to and triggering MapView onPress events. + * + * @platform ios + */ + + stopPropagation: PropTypes.bool, + + /** + * Callback that is called when the user presses on the marker + */ + onPress: PropTypes.func, + + /** + * Callback that is called when the user selects the marker, before the callout is shown. + * + * @platform ios + */ + onSelect: PropTypes.func, + + /** + * Callback that is called when the marker is deselected, before the callout is hidden. + * + * @platform ios + */ + onDeselect: PropTypes.func, + + /** + * Callback that is called when the user taps the callout view. + */ + onCalloutPress: PropTypes.func, + + /** + * Callback that is called when the user initiates a drag on this marker (if it is draggable) + */ + onDragStart: PropTypes.func, + + /** + * Callback called continuously as the marker is dragged + */ + onDrag: PropTypes.func, + + /** + * Callback that is called when a drag on this marker finishes. This is usually the point you + * will want to setState on the marker's coordinate again + */ + onDragEnd: PropTypes.func, +}; + +const defaultProps = { + stopPropagation: false, +}; + +class MapMarker extends React.Component { + constructor(props) { + super(props); + + this.showCallout = this.showCallout.bind(this); + this.hideCallout = this.hideCallout.bind(this); + this.redrawCallout = this.redrawCallout.bind(this); + this.animateMarkerToCoordinate = this.animateMarkerToCoordinate.bind(this); + } + + setNativeProps(props) { + this.marker.setNativeProps(props); + } + + showCallout() { + this._runCommand('showCallout', []); + } + + hideCallout() { + this._runCommand('hideCallout', []); + } + + redrawCallout() { + this._runCommand('redrawCallout', []); + } + + animateMarkerToCoordinate(coordinate, duration) { + this._runCommand('animateMarkerToCoordinate', [ + coordinate, + duration || 500, + ]); + } + + redraw() { + this._runCommand('redraw', []); + } + + _getHandle() { + return findNodeHandle(this.marker); + } + + _runCommand(name, args) { + switch (Platform.OS) { + case 'android': + NativeModules.UIManager.dispatchViewManagerCommand( + this._getHandle(), + this.getUIManagerCommand(name), + args + ); + break; + + case 'ios': + this.getMapManagerCommand(name)(this._getHandle(), ...args); + break; + + default: + break; + } + } + + render() { + let image; + if (this.props.image) { + image = Image.resolveAssetSource(this.props.image) || {}; + image = image.uri || this.props.image; + } + + let icon; + if (this.props.icon) { + icon = Image.resolveAssetSource(this.props.icon) || {}; + icon = icon.uri; + } + + const AIRMapMarker = this.getAirComponent(); + + return ( + { + this.marker = ref; + }} + {...this.props} + image={image} + icon={icon} + style={[styles.marker, this.props.style]} + onPress={event => { + if (this.props.stopPropagation) { + event.stopPropagation(); + } + if (this.props.onPress) { + this.props.onPress(event); + } + }} + /> + ); + } +} + +MapMarker.propTypes = propTypes; +MapMarker.defaultProps = defaultProps; +MapMarker.viewConfig = viewConfig; + +const styles = StyleSheet.create({ + marker: { + position: 'absolute', + backgroundColor: 'transparent', + }, +}); + +MapMarker.Animated = Animated.createAnimatedComponent(MapMarker); + +export default decorateMapComponent(MapMarker, { + componentType: 'Marker', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapOverlay.js b/lib/components/MapOverlay.js new file mode 100644 index 0000000..38d20df --- /dev/null +++ b/lib/components/MapOverlay.js @@ -0,0 +1,72 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, Image, Animated } from 'react-native'; + +import decorateMapComponent, { + SUPPORTED, + USES_DEFAULT_IMPLEMENTATION, +} from './decorateMapComponent'; + +const viewConfig = { + uiViewClassName: 'AIRMapOverlay', + validAttributes: { + image: true, + }, +}; + +const propTypes = { + ...View.propTypes, + // A custom image to be used as overlay. + image: PropTypes.any.isRequired, + // Top left and bottom right coordinates for the overlay + bounds: PropTypes.arrayOf(PropTypes.array.isRequired).isRequired, +}; + +class MapOverlay extends Component { + render() { + let image; + if (this.props.image) { + if ( + typeof this.props.image.startsWith === 'function' && + this.props.image.startsWith('http') + ) { + image = this.props.image; + } else { + image = Image.resolveAssetSource(this.props.image) || {}; + image = image.uri; + } + } + + const AIRMapOverlay = this.getAirComponent(); + + return ( + + ); + } +} + +MapOverlay.propTypes = propTypes; +MapOverlay.viewConfig = viewConfig; + +const styles = StyleSheet.create({ + overlay: { + position: 'absolute', + backgroundColor: 'transparent', + }, +}); + +MapOverlay.Animated = Animated.createAnimatedComponent(MapOverlay); + +export default decorateMapComponent(MapOverlay, { + componentType: 'Overlay', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapPolygon.js b/lib/components/MapPolygon.js new file mode 100644 index 0000000..3a5e841 --- /dev/null +++ b/lib/components/MapPolygon.js @@ -0,0 +1,177 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { ColorPropType, ViewPropTypes, View } from 'react-native'; +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * An array of coordinates to describe the polygon + */ + coordinates: PropTypes.arrayOf( + PropTypes.shape({ + /** + * Latitude/Longitude coordinates + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }) + ), + + /** + * An array of array of coordinates to describe the polygon holes + */ + holes: PropTypes.arrayOf( + PropTypes.arrayOf( + PropTypes.shape({ + /** + * Latitude/Longitude coordinates + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }) + ) + ), + + /** + * Callback that is called when the user presses on the polygon + */ + onPress: PropTypes.func, + + /** + * Boolean to allow a polygon to be tappable and use the + * onPress function + */ + tappable: PropTypes.bool, + + /** + * The stroke width to use for the path. + */ + strokeWidth: PropTypes.number, + + /** + * The stroke color to use for the path. + */ + strokeColor: ColorPropType, + + /** + * The fill color to use for the path. + */ + fillColor: ColorPropType, + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is 0. + * + * @platform android + */ + zIndex: PropTypes.number, + + /** + * The line cap style to apply to the open ends of the path. + * The default style is `round`. + * + * @platform ios + */ + lineCap: PropTypes.oneOf(['butt', 'round', 'square']), + + /** + * The line join style to apply to corners of the path. + * The default style is `round`. + * + * @platform ios + */ + lineJoin: PropTypes.oneOf(['miter', 'round', 'bevel']), + + /** + * The limiting value that helps avoid spikes at junctions between connected line segments. + * The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If + * the ratio of the miter length—that is, the diagonal length of the miter join—to the line + * thickness exceeds the miter limit, the joint is converted to a bevel join. The default + * miter limit is 10, which results in the conversion of miters whose angle at the joint + * is less than 11 degrees. + * + * @platform ios + */ + miterLimit: PropTypes.number, + + /** + * Boolean to indicate whether to draw each segment of the line as a geodesic as opposed to + * straight lines on the Mercator projection. A geodesic is the shortest path between two + * points on the Earth's surface. The geodesic curve is constructed assuming the Earth is + * a sphere. + * + */ + geodesic: PropTypes.bool, + + /** + * The offset (in points) at which to start drawing the dash pattern. + * + * Use this property to start drawing a dashed line partway through a segment or gap. For + * example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the + * middle of the first gap. + * + * The default value of this property is 0. + * + * @platform ios + */ + lineDashPhase: PropTypes.number, + + /** + * An array of numbers specifying the dash pattern to use for the path. + * + * The array contains one or more numbers that indicate the lengths (measured in points) of the + * line segments and gaps in the pattern. The values in the array alternate, starting with the + * first line segment length, followed by the first gap length, followed by the second line + * segment length, and so on. + * + * This property is set to `null` by default, which indicates no line dash pattern. + * + * @platform ios + */ + lineDashPattern: PropTypes.arrayOf(PropTypes.number), +}; + +const defaultProps = { + strokeColor: '#000', + strokeWidth: 1, +}; + +class MapPolygon extends React.Component { + setNativeProps(props) { + this.polygon.setNativeProps(props); + } + + render() { + const AIRMapPolygon = this.getAirComponent(); + return ( + { + this.polygon = ref; + }} + /> + ); + } +} + +MapPolygon.propTypes = propTypes; +MapPolygon.defaultProps = defaultProps; + +export default decorateMapComponent(MapPolygon, { + componentType: 'Polygon', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapPolyline.js b/lib/components/MapPolyline.js new file mode 100644 index 0000000..d162654 --- /dev/null +++ b/lib/components/MapPolyline.js @@ -0,0 +1,169 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { ColorPropType, ViewPropTypes, View } from 'react-native'; +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * An array of coordinates to describe the polygon + */ + coordinates: PropTypes.arrayOf( + PropTypes.shape({ + /** + * Latitude/Longitude coordinates + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }) + ), + + /** + * Callback that is called when the user presses on the polyline + */ + onPress: PropTypes.func, + + /* Boolean to allow a polyline to be tappable and use the + * onPress function + */ + tappable: PropTypes.bool, + + /** + * The fill color to use for the path. + */ + fillColor: ColorPropType, + + /** + * The stroke width to use for the path. + */ + strokeWidth: PropTypes.number, + + /** + * The stroke color to use for the path. + */ + strokeColor: ColorPropType, + + /** + * The stroke colors to use for the path. + */ + strokeColors: PropTypes.arrayOf(ColorPropType), + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is 0. + * + * @platform android + */ + zIndex: PropTypes.number, + + /** + * The line cap style to apply to the open ends of the path. + * The default style is `round`. + * + * @platform ios + */ + lineCap: PropTypes.oneOf(['butt', 'round', 'square']), + + /** + * The line join style to apply to corners of the path. + * The default style is `round`. + * + * @platform ios + */ + lineJoin: PropTypes.oneOf(['miter', 'round', 'bevel']), + + /** + * The limiting value that helps avoid spikes at junctions between connected line segments. + * The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If + * the ratio of the miter length—that is, the diagonal length of the miter join—to the line + * thickness exceeds the miter limit, the joint is converted to a bevel join. The default + * miter limit is 10, which results in the conversion of miters whose angle at the joint + * is less than 11 degrees. + * + * @platform ios + */ + miterLimit: PropTypes.number, + + /** + * Boolean to indicate whether to draw each segment of the line as a geodesic as opposed to + * straight lines on the Mercator projection. A geodesic is the shortest path between two + * points on the Earth's surface. The geodesic curve is constructed assuming the Earth is + * a sphere. + * + * @platform android + */ + geodesic: PropTypes.bool, + + /** + * The offset (in points) at which to start drawing the dash pattern. + * + * Use this property to start drawing a dashed line partway through a segment or gap. For + * example, a phase value of 6 for the patter 5-2-3-2 would cause drawing to begin in the + * middle of the first gap. + * + * The default value of this property is 0. + * + * @platform ios + */ + lineDashPhase: PropTypes.number, + + /** + * An array of numbers specifying the dash pattern to use for the path. + * + * The array contains one or more numbers that indicate the lengths (measured in points) of the + * line segments and gaps in the pattern. The values in the array alternate, starting with the + * first line segment length, followed by the first gap length, followed by the second line + * segment length, and so on. + * + * This property is set to `null` by default, which indicates no line dash pattern. + * + * @platform ios + */ + lineDashPattern: PropTypes.arrayOf(PropTypes.number), +}; + +const defaultProps = { + strokeColor: '#000', + strokeWidth: 1, + lineJoin: 'round', + lineCap: 'round', +}; + +class MapPolyline extends React.Component { + setNativeProps(props) { + this.polyline.setNativeProps(props); + } + + render() { + const AIRMapPolyline = this.getAirComponent(); + return ( + { + this.polyline = ref; + }} + /> + ); + } +} + +MapPolyline.propTypes = propTypes; +MapPolyline.defaultProps = defaultProps; + +export default decorateMapComponent(MapPolyline, { + componentType: 'Polyline', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapUrlTile.js b/lib/components/MapUrlTile.js new file mode 100644 index 0000000..494dcf6 --- /dev/null +++ b/lib/components/MapUrlTile.js @@ -0,0 +1,83 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +import { ViewPropTypes, View } from 'react-native'; + +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * The url template of the tile server. The patterns {x} {y} {z} will be replaced at runtime + * For example, http://c.tile.openstreetmap.org/{z}/{x}/{y}.png + */ + urlTemplate: PropTypes.string.isRequired, + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is -1. + * + * @platform android + */ + zIndex: PropTypes.number, + /** + * The maximum zoom level for this tile overlay. + * + */ + maximumZ: PropTypes.number, + + /** + * The minimum zoom level for this tile overlay. + * + */ + minimumZ: PropTypes.number, + + /** + * Corresponds to MKTileOverlay canReplaceMapContent. + * + * @platform ios + */ + shouldReplaceMapContent: PropTypes.bool, + + /** + * (Optional) Tile size for iOS only, default size is 256 * 256. + * + * @platform ios + */ + tileSize: PropTypes.number, + + /** + * + * Allow tiles using the TMS coordinate system (origin bottom left) + * to be used, and displayed at their correct coordinates + * + */ + flipY: PropTypes.bool, +}; + +class MapUrlTile extends React.Component { + render() { + const AIRMapUrlTile = this.getAirComponent(); + return ; + } +} + +MapUrlTile.propTypes = propTypes; + +export default decorateMapComponent(MapUrlTile, { + componentType: 'UrlTile', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/MapView.js b/lib/components/MapView.js new file mode 100644 index 0000000..390fa25 --- /dev/null +++ b/lib/components/MapView.js @@ -0,0 +1,1075 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { + EdgeInsetsPropType, + PointPropType, + Platform, + Animated as RNAnimated, + requireNativeComponent, + NativeModules, + ColorPropType, + findNodeHandle, + ViewPropTypes, + View, +} from 'react-native'; +import MapMarker from './MapMarker'; +import MapPolyline from './MapPolyline'; +import MapPolygon from './MapPolygon'; +import MapCircle from './MapCircle'; +import MapCallout from './MapCallout'; +import MapCalloutSubview from './MapCalloutSubview'; +import MapOverlay from './MapOverlay'; +import MapUrlTile from './MapUrlTile'; +import MapWMSTile from './MapWMSTile'; +import MapLocalTile from './MapLocalTile'; +import AnimatedRegion from './AnimatedRegion'; +import { + contextTypes as childContextTypes, + getAirMapName, + googleMapIsInstalled, + createNotSupportedComponent, +} from './decorateMapComponent'; +import * as ProviderConstants from './ProviderConstants'; + +export const MAP_TYPES = { + STANDARD: 'standard', + SATELLITE: 'satellite', + HYBRID: 'hybrid', + TERRAIN: 'terrain', + NONE: 'none', + MUTEDSTANDARD: 'mutedStandard', +}; + +const GOOGLE_MAPS_ONLY_TYPES = [MAP_TYPES.TERRAIN, MAP_TYPES.NONE]; + +const viewConfig = { + uiViewClassName: 'AIRMap', + validAttributes: { + region: true, + }, +}; + +/** + * Defines the map camera. + */ +const CameraShape = PropTypes.shape({ + center: PropTypes.shape({ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + }), + pitch: PropTypes.number.isRequired, + heading: PropTypes.number.isRequired, + altitude: PropTypes.number.isRequired, + zoom: PropTypes.number.isRequired, +}); + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + /** + * When provider is "google", we will use GoogleMaps. + * Any value other than "google" will default to using + * MapKit in iOS or GoogleMaps in android as the map provider. + */ + provider: PropTypes.oneOf(['google']), + + /** + * Used to style and layout the `MapView`. See `StyleSheet.js` and + * `ViewStylePropTypes.js` for more info. + */ + style: viewPropTypes.style, + + /** + * A json object that describes the style of the map. This is transformed to a string + * and saved in mayStyleString to be sent to android and ios + * https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource + * https://developers.google.com/maps/documentation/android-api/styling + */ + customMapStyle: PropTypes.array, + + /** + * A json string that describes the style of the map + * https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource + * https://developers.google.com/maps/documentation/android-api/styling + */ + customMapStyleString: PropTypes.string, + + /** + * If `true` the app will ask for the user's location. + * Default value is `false`. + * + * **NOTE**: You need to add NSLocationWhenInUseUsageDescription key in + * Info.plist to enable geolocation, otherwise it is going + * to *fail silently*! You will also need to add an explanation for why + * you need the users location against `NSLocationWhenInUseUsageDescription` in Info.plist. + * Otherwise Apple may reject your app submission. + */ + showsUserLocation: PropTypes.bool, + + /** + * The title of the annotation for current user location. This only works if + * `showsUserLocation` is true. + * There is a default value `My Location` set by MapView. + * + * @platform ios + */ + userLocationAnnotationTitle: PropTypes.string, + + /** + * If `false` hide the button to move map to the current user's location. + * Default value is `true`. + * + * @platform android + */ + showsMyLocationButton: PropTypes.bool, + + /** + * If `true` the map will focus on the user's location. This only works if + * `showsUserLocation` is true and the user has shared their location. + * Default value is `false`. + * + * @platform ios + */ + followsUserLocation: PropTypes.bool, + + /** + * If `false` points of interest won't be displayed on the map. + * Default value is `true`. + * + */ + showsPointsOfInterest: PropTypes.bool, + + /** + * If `false` compass won't be displayed on the map. + * Default value is `true`. + * + * @platform ios + */ + showsCompass: PropTypes.bool, + + /** + * If `false` the user won't be able to pinch/zoom the map. + * Default value is `true`. + * + */ + zoomEnabled: PropTypes.bool, + + /** + * If `false` the user won't be able to double tap to zoom the map. + * However it will greatly decrease delay of tap gesture recognition. + * Default value is `true`. + * + */ + zoomTapEnabled: PropTypes.bool, + + /** + *If `false` the user won't be able to zoom the map + * Default value is `true`. + * + *@platform android + */ + zoomControlEnabled: PropTypes.bool, + + /** + * If `false` the user won't be able to pinch/rotate the map. + * Default value is `true`. + * + */ + rotateEnabled: PropTypes.bool, + + /** + * If `true` the map will be cached to an Image for performance + * Default value is `false`. + * + */ + cacheEnabled: PropTypes.bool, + + /** + * If `true` the map will be showing a loading indicator + * Default value is `false`. + * + */ + loadingEnabled: PropTypes.bool, + + /** + * Loading background color while generating map cache image or loading the map + * Default color is light gray. + * + */ + loadingBackgroundColor: ColorPropType, + + /** + * Loading indicator color while generating map cache image or loading the map + * Default color is gray color for iOS, theme color for Android. + * + */ + loadingIndicatorColor: ColorPropType, + + /** + * If `false` the user won't be able to change the map region being displayed. + * Default value is `true`. + * + */ + scrollEnabled: PropTypes.bool, + + /** + * If `false` the user won't be able to adjust the camera’s pitch angle. + * Default value is `true`. + * + */ + pitchEnabled: PropTypes.bool, + + /** + * If `false` will hide 'Navigate' and 'Open in Maps' buttons on marker press + * Default value is `true`. + * + * @platform android + */ + toolbarEnabled: PropTypes.bool, + + /** + * A Boolean indicating whether on marker press the map will move to the pressed marker + * Default value is `true` + * + * @platform android + */ + moveOnMarkerPress: PropTypes.bool, + + /** + * A Boolean indicating whether the map shows scale information. + * Default value is `false` + * + * @platform ios + */ + showsScale: PropTypes.bool, + + /** + * A Boolean indicating whether the map displays extruded building information. + * Default value is `true`. + */ + showsBuildings: PropTypes.bool, + + /** + * A Boolean value indicating whether the map displays traffic information. + * Default value is `false`. + */ + showsTraffic: PropTypes.bool, + + /** + * A Boolean indicating whether indoor maps should be enabled. + * Default value is `false` + * + * @platform android + */ + showsIndoors: PropTypes.bool, + + /** + * A Boolean indicating whether indoor level picker should be enabled. + * Default value is `false` + * + * @platform android + */ + showsIndoorLevelPicker: PropTypes.bool, + + /** + * The map type to be displayed. + * + * - standard: standard road map (default) + * - satellite: satellite view + * - hybrid: satellite view with roads and points of interest overlayed + * - terrain: topographic view + * - none: no base map + */ + mapType: PropTypes.oneOf(Object.values(MAP_TYPES)), + + /** + * The region to be displayed by the map. + * + * The region is defined by the center coordinates and the span of + * coordinates to display. + */ + region: PropTypes.shape({ + /** + * Coordinates for the center of the map. + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + + /** + * Difference between the minimun and the maximum latitude/longitude + * to be displayed. + */ + latitudeDelta: PropTypes.number.isRequired, + longitudeDelta: PropTypes.number.isRequired, + }), + + /** + * The initial region to be displayed by the map. Use this prop instead of `region` + * only if you don't want to control the viewport of the map besides the initial region. + * + * Changing this prop after the component has mounted will not result in a region change. + * + * This is similar to the `initialValue` prop of a text input. + */ + initialRegion: PropTypes.shape({ + /** + * Coordinates for the center of the map. + */ + latitude: PropTypes.number.isRequired, + longitude: PropTypes.number.isRequired, + + /** + * Difference between the minimun and the maximum latitude/longitude + * to be displayed. + */ + latitudeDelta: PropTypes.number.isRequired, + longitudeDelta: PropTypes.number.isRequired, + }), + + /** + * The camera view the map should use. + * + * Use the camera system, instead of the region system, if you need control over + * the pitch or heading. + */ + camera: CameraShape, + + /** + * The initial camera view the map should use. Use this prop instead of `camera` + * only if you don't want to control the camera of the map besides the initial view. + * + * Use the camera system, instead of the region system, if you need control over + * the pitch or heading. + * + * Changing this prop after the component has mounted will not result in a camera change. + * + * This is similar to the `initialValue` prop of a text input. + */ + initialCamera: CameraShape, + + /** + * A Boolean indicating whether to use liteMode for android + * Default value is `false` + * + * @platform android + */ + liteMode: PropTypes.bool, + + /** + * (Google Maps only) + * + * Padding that is used by the Google Map View to position + * the camera, legal labels and buttons + * + */ + mapPadding: EdgeInsetsPropType, + + /** + * (Google Maps only, iOS) + * + * Whether the safe area padding is added to the Google Map View padding. + * This affects where markers, compass, Google logo etc. are placed on the view. + * + */ + paddingAdjustmentBehavior: PropTypes.oneOf(['always', 'automatic', 'never']), + + /** + * Maximum size of area that can be displayed. + * + * @platform ios + */ + maxDelta: PropTypes.number, + + /** + * Minimum size of area that can be displayed. + * + * @platform ios + */ + minDelta: PropTypes.number, + + /** + * Insets for the map's legal label, originally at bottom left of the map. + * See `EdgeInsetsPropType.js` for more information. + */ + legalLabelInsets: EdgeInsetsPropType, + + /** + * Callback that is called once the map is fully loaded. + */ + onMapReady: PropTypes.func, + + /** + * Callback that is called once the kml is fully loaded. + */ + onKmlReady: PropTypes.func, + + /** + * Callback that is called continuously when the user is dragging the map. + */ + onRegionChange: PropTypes.func, + + /** + * Callback that is called once, when the user is done moving the map. + */ + onRegionChangeComplete: PropTypes.func, + + /** + * Callback that is called when user taps on the map. + */ + onPress: PropTypes.func, + + /** + * Callback that is called when user makes a "long press" somewhere on the map. + */ + onLongPress: PropTypes.func, + + /** + * Callback that is called when the underlying map figures our users current location. + */ + onUserLocationChange: PropTypes.func, + + /** + * Callback that is called when user makes a "drag" somewhere on the map + */ + onPanDrag: PropTypes.func, + + /** + * Callback that is called when user click on a POI + */ + onPoiClick: PropTypes.func, + + /** + * Callback that is called when a marker on the map is tapped by the user. + */ + onMarkerPress: PropTypes.func, + + /** + * Callback that is called when a marker on the map becomes selected. This will be called when + * the callout for that marker is about to be shown. + * + * @platform ios + */ + onMarkerSelect: PropTypes.func, + + /** + * Callback that is called when a marker on the map becomes deselected. This will be called when + * the callout for that marker is about to be hidden. + * + * @platform ios + */ + onMarkerDeselect: PropTypes.func, + + /** + * Callback that is called when a callout is tapped by the user. + */ + onCalloutPress: PropTypes.func, + + /** + * Callback that is called when the user initiates a drag on a marker (if it is draggable) + */ + onMarkerDragStart: PropTypes.func, + + /** + * Callback called continuously as a marker is dragged + */ + onMarkerDrag: PropTypes.func, + + /** + * Callback that is called when a drag on a marker finishes. This is usually the point you + * will want to setState on the marker's coordinate again + */ + onMarkerDragEnd: PropTypes.func, + + /** + * Minimum zoom value for the map, must be between 0 and 20 + */ + minZoomLevel: PropTypes.number, + + /** + * Maximum zoom value for the map, must be between 0 and 20 + */ + maxZoomLevel: PropTypes.number, + + /** + * Url KML Source + */ + kmlSrc: PropTypes.string, + + /** + * Offset Point x y for compass location. + * + * @platform ios + */ + compassOffset: PointPropType, + + /** + * Callback that is called when a level is activated on a indoor building. + */ + onIndoorLevelActivated: PropTypes.func, + + /** + * Callback that is called when a Building is focused. + */ + onIndoorBuildingFocused: PropTypes.func, +}; + +class MapView extends React.Component { + constructor(props) { + super(props); + + this.state = { + isReady: Platform.OS === 'ios', + }; + + this._onMapReady = this._onMapReady.bind(this); + this._onMarkerPress = this._onMarkerPress.bind(this); + this._onChange = this._onChange.bind(this); + this._onLayout = this._onLayout.bind(this); + } + + getChildContext() { + return { provider: this.props.provider }; + } + + getSnapshotBeforeUpdate(prevProps) { + if ( + this.state.isReady && + this.props.customMapStyle !== prevProps.customMapStyle + ) { + this._updateStyle(this.props); + } + return this.props.region || null; + } + + componentDidUpdate(prevProps, prevState, region) { + const a = this.__lastRegion; + const b = region; + if (!a || !b) { + return; + } + if ( + a.latitude !== b.latitude || + a.longitude !== b.longitude || + a.latitudeDelta !== b.latitudeDelta || + a.longitudeDelta !== b.longitudeDelta + ) { + this.map.setNativeProps({ region: b }); + } + } + + componentDidMount() { + const { isReady } = this.state; + if (isReady) { + this._updateStyle(this.props); + } + } + + _updateStyle(props) { + const { customMapStyle } = props; + this.map.setNativeProps({ + customMapStyleString: JSON.stringify(customMapStyle), + }); + } + + _onMapReady() { + const { region, initialRegion, onMapReady } = this.props; + if (region) { + this.map.setNativeProps({ region }); + } else if (initialRegion) { + this.map.setNativeProps({ initialRegion }); + } + this._updateStyle(this.props); + this.setState({ isReady: true }, () => { + if (onMapReady) { + onMapReady(); + } + }); + } + + _onLayout(e) { + const { layout } = e.nativeEvent; + if (!layout.width || !layout.height) { + return; + } + if (this.state.isReady && !this.__layoutCalled) { + const { region, initialRegion } = this.props; + if (region) { + this.__layoutCalled = true; + this.map.setNativeProps({ region }); + } else if (initialRegion) { + this.__layoutCalled = true; + this.map.setNativeProps({ initialRegion }); + } + } + if (this.props.onLayout) { + this.props.onLayout(e); + } + } + + _onMarkerPress(event) { + if (this.props.onMarkerPress) { + this.props.onMarkerPress(event.nativeEvent); + } + } + + _onChange(event) { + this.__lastRegion = event.nativeEvent.region; + if (event.nativeEvent.continuous) { + if (this.props.onRegionChange) { + this.props.onRegionChange(event.nativeEvent.region); + } + } else if (this.props.onRegionChangeComplete) { + this.props.onRegionChangeComplete(event.nativeEvent.region); + } + } + + getCamera() { + if (Platform.OS === 'android') { + return NativeModules.AirMapModule.getCamera(this._getHandle()); + } else if (Platform.OS === 'ios') { + return this._runCommand('getCamera', []); + } + return Promise.reject('getCamera not supported on this platform'); + } + + setCamera(camera) { + this._runCommand('setCamera', [camera]); + } + + animateCamera(camera, opts) { + this._runCommand('animateCamera', [camera, (opts && opts.duration) || 500]); + } + + animateToNavigation(location, bearing, angle, duration) { + console.warn( + 'animateToNavigation() is deprecated, use animateCamera() instead' + ); + this._runCommand('animateToNavigation', [ + location, + bearing, + angle, + duration || 500, + ]); + } + + animateToRegion(region, duration) { + this._runCommand('animateToRegion', [region, duration || 500]); + } + + animateToCoordinate(latLng, duration) { + console.warn( + 'animateToCoordinate() is deprecated, use animateCamera() instead' + ); + this._runCommand('animateToCoordinate', [latLng, duration || 500]); + } + + animateToBearing(bearing, duration) { + console.warn( + 'animateToBearing() is deprecated, use animateCamera() instead' + ); + this._runCommand('animateToBearing', [bearing, duration || 500]); + } + + animateToViewingAngle(angle, duration) { + console.warn( + 'animateToViewingAngle() is deprecated, use animateCamera() instead' + ); + this._runCommand('animateToViewingAngle', [angle, duration || 500]); + } + + fitToElements(animated) { + this._runCommand('fitToElements', [animated]); + } + + fitToSuppliedMarkers(markers, options = {}) { + const { + edgePadding = { top: 0, right: 0, bottom: 0, left: 0 }, + animated = true, + } = options; + + this._runCommand('fitToSuppliedMarkers', [markers, edgePadding, animated]); + } + + fitToCoordinates(coordinates = [], options = {}) { + const { + edgePadding = { top: 0, right: 0, bottom: 0, left: 0 }, + animated = true, + } = options; + + this._runCommand('fitToCoordinates', [coordinates, edgePadding, animated]); + } + + /** + * Get visible boudaries + * + * @return Promise Promise with the bounding box ({ northEast: , southWest: }) + */ + async getMapBoundaries() { + if (Platform.OS === 'android') { + return await NativeModules.AirMapModule.getMapBoundaries( + this._getHandle() + ); + } else if (Platform.OS === 'ios') { + return await this._runCommand('getMapBoundaries', []); + } + return Promise.reject('getMapBoundaries not supported on this platform'); + } + + setMapBoundaries(northEast, southWest) { + this._runCommand('setMapBoundaries', [northEast, southWest]); + } + + setIndoorActiveLevelIndex(activeLevelIndex) { + this._runCommand('setIndoorActiveLevelIndex', [activeLevelIndex]); + } + + /** + * Takes a snapshot of the map and saves it to a picture + * file or returns the image as a base64 encoded string. + * + * @param config Configuration options + * @param [config.width] Width of the rendered map-view (when omitted actual view width is used). + * @param [config.height] Height of the rendered map-view (when omitted actual height is used). + * @param [config.region] Region to render (Only supported on iOS). + * @param [config.format] Encoding format ('png', 'jpg') (default: 'png'). + * @param [config.quality] Compression quality (only used for jpg) (default: 1.0). + * @param [config.result] Result format ('file', 'base64') (default: 'file'). + * + * @return Promise Promise with either the file-uri or base64 encoded string + */ + takeSnapshot(args) { + // For the time being we support the legacy API on iOS. + // This will be removed in a future release and only the + // new Promise style API shall be supported. + if (Platform.OS === 'ios' && arguments.length === 4) { + console.warn( + 'Old takeSnapshot API has been deprecated; will be removed in the near future' + ); + const width = arguments[0]; + const height = arguments[1]; + const region = arguments[2]; + const callback = arguments[3]; + this._runCommand('takeSnapshot', [ + width || 0, + height || 0, + region || {}, + 'png', + 1, + 'legacy', + callback, + ]); + return undefined; + } + + // Sanitize inputs + const config = { + width: args.width || 0, + height: args.height || 0, + region: args.region || {}, + format: args.format || 'png', + quality: args.quality || 1.0, + result: args.result || 'file', + }; + if (config.format !== 'png' && config.format !== 'jpg') { + throw new Error('Invalid format specified'); + } + if (config.result !== 'file' && config.result !== 'base64') { + throw new Error('Invalid result specified'); + } + + // Call native function + if (Platform.OS === 'android') { + return NativeModules.AirMapModule.takeSnapshot(this._getHandle(), config); + } else if (Platform.OS === 'ios') { + return new Promise((resolve, reject) => { + this._runCommand('takeSnapshot', [ + config.width, + config.height, + config.region, + config.format, + config.quality, + config.result, + (err, snapshot) => { + if (err) { + reject(err); + } else { + resolve(snapshot); + } + }, + ]); + }); + } + return Promise.reject('takeSnapshot not supported on this platform'); + } + + /** + * Convert a map coordinate to user-space point + * + * @param coordinate Coordinate + * @param [coordinate.latitude] Latitude + * @param [coordinate.longitude] Longitude + * + * @return Promise Promise with the point ({ x: Number, y: Number }) + */ + pointForCoordinate(coordinate) { + if (Platform.OS === 'android') { + return NativeModules.AirMapModule.pointForCoordinate( + this._getHandle(), + coordinate + ); + } else if (Platform.OS === 'ios') { + return this._runCommand('pointForCoordinate', [coordinate]); + } + return Promise.reject('pointForCoordinate not supported on this platform'); + } + + /** + * Convert a user-space point to a map coordinate + * + * @param point Point + * @param [point.x] X + * @param [point.x] Y + * + * @return Promise Promise with the coordinate ({ latitude: Number, longitude: Number }) + */ + coordinateForPoint(point) { + if (Platform.OS === 'android') { + return NativeModules.AirMapModule.coordinateForPoint( + this._getHandle(), + point + ); + } else if (Platform.OS === 'ios') { + return this._runCommand('coordinateForPoint', [point]); + } + return Promise.reject('coordinateForPoint not supported on this platform'); + } + + /** + * Get markers' centers and frames in user-space coordinates + * + * @param onlyVisible boolean true to include only visible markers, false to include all + * + * @return Promise Promise with { : { point: Point, frame: Frame } } + */ + getMarkersFrames(onlyVisible = false) { + if (Platform.OS === 'ios') { + return this._runCommand('getMarkersFrames', [onlyVisible]); + } + return Promise.reject('getMarkersFrames not supported on this platform'); + } + + /** + * Get bounding box from region + * + * @param region Region + * + * @return Object Object bounding box ({ northEast: , southWest: }) + */ + boundingBoxForRegion(region) { + return { + northEast: { + latitude: region.latitude + region.latitudeDelta / 2, + longitude: region.longitude + region.longitudeDelta / 2, + }, + southWest: { + latitude: region.latitude - region.latitudeDelta / 2, + longitude: region.longitude - region.longitudeDelta / 2, + }, + }; + } + + _uiManagerCommand(name) { + const UIManager = NativeModules.UIManager; + const componentName = getAirMapName(this.props.provider); + + if (!UIManager.getViewManagerConfig) { + // RN < 0.58 + return UIManager[componentName].Commands[name]; + } + + // RN >= 0.58 + return UIManager.getViewManagerConfig(componentName).Commands[name]; + } + + _mapManagerCommand(name) { + const managerName = getAirMapName(this.props.provider); + + if (managerName === 'UI') { + const UIManager = NativeModules.UIManager; + if (!UIManager.getViewManagerConfig) { + // RN < 0.58 + return UIManager[name]; + } + + // RN >= 0.58 + return UIManager.getViewManagerConfig(name); + } + + return NativeModules[`${getAirMapName(this.props.provider)}Manager`][name]; + } + + _getHandle() { + return findNodeHandle(this.map); + } + + _runCommand(name, args) { + switch (Platform.OS) { + case 'android': + return NativeModules.UIManager.dispatchViewManagerCommand( + this._getHandle(), + this._uiManagerCommand(name), + args + ); + + case 'ios': + return this._mapManagerCommand(name)(this._getHandle(), ...args); + + default: + return Promise.reject(`Invalid platform was passed: ${Platform.OS}`); + } + } + + render() { + let props; + + if (this.state.isReady) { + props = { + region: null, + initialRegion: null, + onMarkerPress: this._onMarkerPress, + onChange: this._onChange, + onMapReady: this._onMapReady, + onLayout: this._onLayout, + ...this.props, + }; + if ( + Platform.OS === 'ios' && + props.provider === ProviderConstants.PROVIDER_DEFAULT && + GOOGLE_MAPS_ONLY_TYPES.includes(props.mapType) + ) { + props.mapType = MAP_TYPES.standard; + } + props.handlePanDrag = !!props.onPanDrag; + } else { + props = { + style: this.props.style, + region: null, + initialRegion: null, + onMarkerPress: this._onMarkerPress, + onChange: this._onChange, + onMapReady: this._onMapReady, + onLayout: this._onLayout, + }; + } + + if (Platform.OS === 'android' && this.props.liteMode) { + return ( + { + this.map = ref; + }} + {...props} + /> + ); + } + + const AIRMap = getAirMapComponent(this.props.provider); + + return ( + { + this.map = ref; + }} + {...props} + /> + ); + } +} + +MapView.propTypes = propTypes; +MapView.viewConfig = viewConfig; +MapView.childContextTypes = childContextTypes; + +MapView.MAP_TYPES = MAP_TYPES; + +const nativeComponent = Component => + requireNativeComponent(Component, MapView, { + nativeOnly: { + onChange: true, + onMapReady: true, + onKmlReady: true, + handlePanDrag: true, + }, + }); +const airMaps = { + default: nativeComponent('AIRMap'), +}; +if (Platform.OS === 'android') { + airMaps.google = airMaps.default; +} else { + airMaps.google = googleMapIsInstalled + ? nativeComponent('AIRGoogleMap') + : createNotSupportedComponent( + 'react-native-maps: AirGoogleMaps dir must be added to your xCode project to support GoogleMaps on iOS.' + ); +} +const getAirMapComponent = provider => airMaps[provider || 'default']; + +let AIRMapLite; +if (!NativeModules.UIManager.getViewManagerConfig) { + // RN < 0.58 + AIRMapLite = + NativeModules.UIManager.AIRMapLite && + requireNativeComponent('AIRMapLite', MapView, { + nativeOnly: { + onChange: true, + onMapReady: true, + handlePanDrag: true, + }, + }); +} else { + // RN >= 0.58 + AIRMapLite = + NativeModules.UIManager.getViewManagerConfig('AIRMapLite') && + requireNativeComponent('AIRMapLite', MapView, { + nativeOnly: { + onChange: true, + onMapReady: true, + handlePanDrag: true, + }, + }); +} + +export const Animated = RNAnimated.createAnimatedComponent(MapView); + +export const ProviderPropType = PropTypes.oneOf( + Object.values(ProviderConstants) +); + +/** + * TODO: + * All of these properties on MapView are unecessary since they can be imported + * individually with the es6 exports in index.js. Removing them is a breaking change, + * but potentially allows for better dead code elimination since references are not + * kept to components which are never used. + */ + +MapView.Marker = MapMarker; +MapView.Polyline = MapPolyline; +MapView.Polygon = MapPolygon; +MapView.Circle = MapCircle; +MapView.UrlTile = MapUrlTile; +MapView.MapWMSTile = MapWMSTile; +MapView.LocalTile = MapLocalTile; +MapView.Overlay = MapOverlay; +MapView.Callout = MapCallout; +MapView.CalloutSubview = MapCalloutSubview; +Object.assign(MapView, ProviderConstants); +MapView.ProviderPropType = ProviderPropType; + +MapView.Animated = Animated; +MapView.AnimatedRegion = AnimatedRegion; + +export default MapView; diff --git a/lib/components/MapWMSTile.js b/lib/components/MapWMSTile.js new file mode 100644 index 0000000..5623564 --- /dev/null +++ b/lib/components/MapWMSTile.js @@ -0,0 +1,79 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +import { ViewPropTypes, View } from 'react-native'; + +import decorateMapComponent, { + USES_DEFAULT_IMPLEMENTATION, + SUPPORTED, +} from './decorateMapComponent'; + +// if ViewPropTypes is not defined fall back to View.propType (to support RN < 0.44) +const viewPropTypes = ViewPropTypes || View.propTypes; + +const propTypes = { + ...viewPropTypes, + + /** + * The url template of the tile server. The patterns {minX} {maxX} {minY} {maxY} {width} {height} + * will be replaced at runtime according to EPSG:900913 specification bounding box. + * For example, https://demo.geo-solutions.it/geoserver/tiger/wms?service=WMS&version=1.1.0&request=GetMap&layers=tiger:poi&styles=&bbox={minX},{minY},{maxX},{maxY}&width={width}&height={height}&srs=EPSG:900913&format=image/png&transparent=true&format_options=dpi:213 + */ + urlTemplate: PropTypes.string.isRequired, + + /** + * The order in which this tile overlay is drawn with respect to other overlays. An overlay + * with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays + * with the same z-index is arbitrary. The default zIndex is -1. + * + * @platform android + */ + zIndex: PropTypes.number, + /** + * The maximum zoom level for this tile overlay. + * + */ + maximumZ: PropTypes.number, + + /** + * The minimum zoom level for this tile overlay. + * + */ + minimumZ: PropTypes.number, + + /** + * Corresponds to MKTileOverlay canReplaceMapContent. + * + * @platform ios + */ + shouldReplaceMapContent: PropTypes.bool, + /** + * tileSize. + * + */ + tileSize: PropTypes.number, + + /** + * opacity. between 0 - 1 + * + */ + opacity: PropTypes.number, +}; + +class MapWMSTile extends React.Component { + render() { + const AIRMapWMSTile = this.getAirComponent(); + return ; + } +} + +MapWMSTile.propTypes = propTypes; +export default decorateMapComponent(MapWMSTile, { + componentType: 'WMSTile', + providers: { + google: { + ios: SUPPORTED, + android: USES_DEFAULT_IMPLEMENTATION, + }, + }, +}); diff --git a/lib/components/ProviderConstants.js b/lib/components/ProviderConstants.js new file mode 100644 index 0000000..99e7767 --- /dev/null +++ b/lib/components/ProviderConstants.js @@ -0,0 +1,2 @@ +export const PROVIDER_DEFAULT = null; +export const PROVIDER_GOOGLE = 'google'; diff --git a/lib/components/decorateMapComponent.js b/lib/components/decorateMapComponent.js new file mode 100644 index 0000000..03b4784 --- /dev/null +++ b/lib/components/decorateMapComponent.js @@ -0,0 +1,112 @@ +import PropTypes from 'prop-types'; +import { requireNativeComponent, NativeModules, Platform } from 'react-native'; +import { PROVIDER_DEFAULT, PROVIDER_GOOGLE } from './ProviderConstants'; + +export const SUPPORTED = 'SUPPORTED'; +export const USES_DEFAULT_IMPLEMENTATION = 'USES_DEFAULT_IMPLEMENTATION'; +export const NOT_SUPPORTED = 'NOT_SUPPORTED'; + +export function getAirMapName(provider) { + if (Platform.OS === 'android') { + return 'AIRMap'; + } + if (provider === PROVIDER_GOOGLE) { + return 'AIRGoogleMap'; + } + return 'AIRMap'; +} + +function getAirComponentName(provider, component) { + return `${getAirMapName(provider)}${component}`; +} + +export const contextTypes = { + provider: PropTypes.string, +}; + +export const createNotSupportedComponent = message => () => { + console.error(message); + return null; +}; + +function getViewManagerConfig(viewManagerName) { + const UIManager = NativeModules.UIManager; + if (!UIManager.getViewManagerConfig) { + // RN < 0.58 + return UIManager[viewManagerName]; + } + // RN >= 0.58 + return UIManager.getViewManagerConfig(viewManagerName); +} + +export const googleMapIsInstalled = !!getViewManagerConfig( + getAirMapName(PROVIDER_GOOGLE) +); + +export default function decorateMapComponent( + Component, + { componentType, providers } +) { + const components = {}; + + const getDefaultComponent = () => + requireNativeComponent(getAirComponentName(null, componentType), Component); + + Component.contextTypes = contextTypes; + + Component.prototype.getAirComponent = function getAirComponent() { + const provider = this.context.provider || PROVIDER_DEFAULT; + if (components[provider]) { + return components[provider]; + } + + if (provider === PROVIDER_DEFAULT) { + components[PROVIDER_DEFAULT] = getDefaultComponent(); + return components[PROVIDER_DEFAULT]; + } + + const providerInfo = providers[provider]; + const platformSupport = providerInfo[Platform.OS]; + const componentName = getAirComponentName(provider, componentType); + if (platformSupport === NOT_SUPPORTED) { + components[provider] = createNotSupportedComponent( + `react-native-maps: ${componentName} is not supported on ${Platform.OS}` + ); + } else if (platformSupport === SUPPORTED) { + if ( + provider !== PROVIDER_GOOGLE || + (Platform.OS === 'ios' && googleMapIsInstalled) + ) { + components[provider] = requireNativeComponent(componentName, Component); + } + } else { + // (platformSupport === USES_DEFAULT_IMPLEMENTATION) + if (!components[PROVIDER_DEFAULT]) { + components[PROVIDER_DEFAULT] = getDefaultComponent(); + } + components[provider] = components[PROVIDER_DEFAULT]; + } + + return components[provider]; + }; + + Component.prototype.getUIManagerCommand = function getUIManagerCommand(name) { + const componentName = getAirComponentName( + this.context.provider, + componentType + ); + return getViewManagerConfig(componentName).Commands[name]; + }; + + Component.prototype.getMapManagerCommand = function getMapManagerCommand( + name + ) { + const airComponentName = `${getAirComponentName( + this.context.provider, + componentType + )}Manager`; + return NativeModules[airComponentName][name]; + }; + + return Component; +} diff --git a/lib/ios/AirGoogleMaps/AIRDummyView.h b/lib/ios/AirGoogleMaps/AIRDummyView.h new file mode 100644 index 0000000..39428cd --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRDummyView.h @@ -0,0 +1,18 @@ +// +// AIRDummyView.h +// AirMapsExplorer +// +// Created by Gil Birman on 10/4/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + + +@interface AIRDummyView : UIView +@property (nonatomic, weak) UIView *view; +- (instancetype)initWithView:(UIView*)view; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRDummyView.m b/lib/ios/AirGoogleMaps/AIRDummyView.m new file mode 100644 index 0000000..70921d1 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRDummyView.m @@ -0,0 +1,23 @@ +// +// AIRDummyView.m +// AirMapsExplorer +// +// Created by Gil Birman on 10/4/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import "AIRDummyView.h" + +@implementation AIRDummyView +- (instancetype)initWithView:(UIView*)view +{ + if ((self = [super init])) { + self.view = view; + } + return self; +} +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSMarker.h b/lib/ios/AirGoogleMaps/AIRGMSMarker.h new file mode 100644 index 0000000..79a05ad --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSMarker.h @@ -0,0 +1,27 @@ +// +// AIRGMSMarker.h +// AirMaps +// +// Created by Gil Birman on 9/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@class AIRGoogleMapMarker; + +@interface AIRGMSMarker : GMSMarker +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, weak) AIRGoogleMapMarker *fakeMarker; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@end + + +@protocol AIRGMSMarkerDelegate +@required +-(void)didTapMarker; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSMarker.m b/lib/ios/AirGoogleMaps/AIRGMSMarker.m new file mode 100644 index 0000000..5f27005 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSMarker.m @@ -0,0 +1,16 @@ +// +// AIRGMSMarker.m +// AirMaps +// +// Created by Gil Birman on 9/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGMSMarker.h" + +@implementation AIRGMSMarker + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSPolygon.h b/lib/ios/AirGoogleMaps/AIRGMSPolygon.h new file mode 100644 index 0000000..3c9947c --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSPolygon.h @@ -0,0 +1,20 @@ +// +// AIRGMSPolygon.h +// AirMaps +// +// Created by Gerardo Pacheco 02/05/2017. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@class AIRGoogleMapPolygon; + +@interface AIRGMSPolygon : GMSPolygon +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSPolygon.m b/lib/ios/AirGoogleMaps/AIRGMSPolygon.m new file mode 100644 index 0000000..cf66a84 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSPolygon.m @@ -0,0 +1,16 @@ +// +// AIRGMSPolygon.m +// AirMaps +// +// Created by Gerardo Pacheco 02/05/2017. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGMSPolygon.h" + +@implementation AIRGMSPolygon + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSPolyline.h b/lib/ios/AirGoogleMaps/AIRGMSPolyline.h new file mode 100644 index 0000000..417a1b6 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSPolyline.h @@ -0,0 +1,20 @@ +// +// AIRGMSPolyline.h +// AirMaps +// +// Created by Guilherme Pontes 04/05/2017. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@class AIRGoogleMapPolyline; + +@interface AIRGMSPolyline : GMSPolyline +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGMSPolyline.m b/lib/ios/AirGoogleMaps/AIRGMSPolyline.m new file mode 100644 index 0000000..fb36a9a --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGMSPolyline.m @@ -0,0 +1,15 @@ +// +// AIRGMSPolyline.m +// AirMaps +// +// Created by Guilherme Pontes 04/05/2017. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGMSPolyline.h" + +@implementation AIRGMSPolyline +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMap.h b/lib/ios/AirGoogleMaps/AIRGoogleMap.h new file mode 100644 index 0000000..3d6238f --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMap.h @@ -0,0 +1,81 @@ +// +// AIRGoogleMap.h +// AirMaps +// +// Created by Gil Birman on 9/1/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import +#import +#import +#import +#import "AIRGMSMarker.h" +#import "RCTConvert+AirMap.h" + +@interface AIRGoogleMap : GMSMapView + +// TODO: don't use MK region? +@property (nonatomic, weak) RCTBridge *bridge; +@property (nonatomic, assign) MKCoordinateRegion initialRegion; +@property (nonatomic, assign) MKCoordinateRegion region; +@property (nonatomic, assign) GMSCameraPosition *cameraProp; // Because the base class already has a "camera" prop. +@property (nonatomic, assign) GMSCameraPosition *initialCamera; +@property (nonatomic, assign) NSString *customMapStyleString; +@property (nonatomic, assign) UIEdgeInsets mapPadding; +@property (nonatomic, assign) NSString *paddingAdjustmentBehaviorString; +@property (nonatomic, copy) RCTBubblingEventBlock onMapReady; +@property (nonatomic, copy) RCTBubblingEventBlock onKmlReady; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, copy) RCTBubblingEventBlock onLongPress; +@property (nonatomic, copy) RCTBubblingEventBlock onPanDrag; +@property (nonatomic, copy) RCTBubblingEventBlock onUserLocationChange; +@property (nonatomic, copy) RCTBubblingEventBlock onMarkerPress; +@property (nonatomic, copy) RCTBubblingEventBlock onChange; +@property (nonatomic, copy) RCTBubblingEventBlock onPoiClick; +@property (nonatomic, copy) RCTDirectEventBlock onRegionChange; +@property (nonatomic, copy) RCTDirectEventBlock onRegionChangeComplete; +@property (nonatomic, copy) RCTDirectEventBlock onIndoorLevelActivated; +@property (nonatomic, copy) RCTDirectEventBlock onIndoorBuildingFocused; +@property (nonatomic, strong) NSMutableArray *markers; +@property (nonatomic, strong) NSMutableArray *polygons; +@property (nonatomic, strong) NSMutableArray *polylines; +@property (nonatomic, strong) NSMutableArray *circles; +@property (nonatomic, strong) NSMutableArray *tiles; +@property (nonatomic, strong) NSMutableArray *overlays; + +@property (nonatomic, assign) BOOL showsBuildings; +@property (nonatomic, assign) BOOL showsTraffic; +@property (nonatomic, assign) BOOL showsCompass; +@property (nonatomic, assign) BOOL scrollEnabled; +@property (nonatomic, assign) BOOL zoomEnabled; +@property (nonatomic, assign) BOOL rotateEnabled; +@property (nonatomic, assign) BOOL pitchEnabled; +@property (nonatomic, assign) BOOL zoomTapEnabled; +@property (nonatomic, assign) BOOL showsUserLocation; +@property (nonatomic, assign) BOOL showsMyLocationButton; +@property (nonatomic, assign) BOOL showsIndoors; +@property (nonatomic, assign) BOOL showsIndoorLevelPicker; +@property (nonatomic, assign) NSString *kmlSrc; + +- (void)didPrepareMap; +- (BOOL)didTapMarker:(GMSMarker *)marker; +- (void)didTapPolyline:(GMSPolyline *)polyline; +- (void)didTapPolygon:(GMSPolygon *)polygon; +- (void)didTapAtCoordinate:(CLLocationCoordinate2D)coordinate; +- (void)didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate; +- (void)didChangeCameraPosition:(GMSCameraPosition *)position; +- (void)idleAtCameraPosition:(GMSCameraPosition *)position; +- (void)didTapPOIWithPlaceID:(NSString *)placeID name:(NSString *) name location:(CLLocationCoordinate2D) location; +- (NSArray *)getMapBoundaries; + ++ (MKCoordinateRegion)makeGMSCameraPositionFromMap:(GMSMapView *)map andGMSCameraPosition:(GMSCameraPosition *)position; ++ (GMSCameraPosition*)makeGMSCameraPositionFromMap:(GMSMapView *)map andMKCoordinateRegion:(MKCoordinateRegion)region; + +- (NSDictionary*) getMarkersFramesWithOnlyVisible:(BOOL)onlyVisible; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMap.m b/lib/ios/AirGoogleMaps/AIRGoogleMap.m new file mode 100644 index 0000000..4292c23 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMap.m @@ -0,0 +1,868 @@ +// +// AIRGoogleMap.m +// AirMaps +// +// Created by Gil Birman on 9/1/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMap.h" +#import "AIRGoogleMapMarker.h" +#import "AIRGoogleMapMarkerManager.h" +#import "AIRGoogleMapPolygon.h" +#import "AIRGoogleMapPolyline.h" +#import "AIRGoogleMapCircle.h" +#import "AIRGoogleMapUrlTile.h" +#import "AIRGoogleMapWMSTile.h" +#import "AIRGoogleMapOverlay.h" +#import +#import +#import +#import +#import "RCTConvert+AirMap.h" +#import + +#ifdef HAVE_GOOGLE_MAPS_UTILS +#import +#import +#import +#import +#define REQUIRES_GOOGLE_MAPS_UTILS(feature) do {} while (0) +#else +#define GMUKMLParser void +#define GMUPlacemark void +#define REQUIRES_GOOGLE_MAPS_UTILS(feature) do { \ + [NSException raise:@"ReactNativeMapsDependencyMissing" \ + format:@"Use of " feature "requires Google-Maps-iOS-Utils, you must install via CocoaPods to use this feature"]; \ +} while (0) +#endif + + +id regionAsJSON(MKCoordinateRegion region) { + return @{ + @"latitude": [NSNumber numberWithDouble:region.center.latitude], + @"longitude": [NSNumber numberWithDouble:region.center.longitude], + @"latitudeDelta": [NSNumber numberWithDouble:region.span.latitudeDelta], + @"longitudeDelta": [NSNumber numberWithDouble:region.span.longitudeDelta], + }; +} + +@interface AIRGoogleMap () + +- (id)eventFromCoordinate:(CLLocationCoordinate2D)coordinate; + +@property (nonatomic, strong) NSMutableDictionary *origGestureRecognizersMeta; + +@end + +@implementation AIRGoogleMap +{ + NSMutableArray *_reactSubviews; + MKCoordinateRegion _initialRegion; + MKCoordinateRegion _region; + BOOL _initialCameraSetOnLoad; + BOOL _didCallOnMapReady; + BOOL _didMoveToWindow; + BOOL _zoomTapEnabled; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _reactSubviews = [NSMutableArray new]; + _markers = [NSMutableArray array]; + _polygons = [NSMutableArray array]; + _polylines = [NSMutableArray array]; + _circles = [NSMutableArray array]; + _tiles = [NSMutableArray array]; + _overlays = [NSMutableArray array]; + _initialCamera = nil; + _cameraProp = nil; + _initialRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(0.0, 0.0), MKCoordinateSpanMake(0.0, 0.0)); + _region = MKCoordinateRegionMake(CLLocationCoordinate2DMake(0.0, 0.0), MKCoordinateSpanMake(0.0, 0.0)); + _initialCameraSetOnLoad = false; + _didCallOnMapReady = false; + _didMoveToWindow = false; + _zoomTapEnabled = YES; + + // Listen to the myLocation property of GMSMapView. + [self addObserver:self + forKeyPath:@"myLocation" + options:NSKeyValueObservingOptionNew + context:NULL]; + + self.origGestureRecognizersMeta = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)dealloc { + [self removeObserver:self + forKeyPath:@"myLocation" + context:NULL]; +} + +- (id)eventFromCoordinate:(CLLocationCoordinate2D)coordinate { + + CGPoint touchPoint = [self.projection pointForCoordinate:coordinate]; + + return @{ + @"coordinate": @{ + @"latitude": @(coordinate.latitude), + @"longitude": @(coordinate.longitude), + }, + @"position": @{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }, + }; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex { + // Our desired API is to pass up markers/overlays as children to the mapview component. + // This is where we intercept them and do the appropriate underlying mapview action. + if ([subview isKindOfClass:[AIRGoogleMapMarker class]]) { + AIRGoogleMapMarker *marker = (AIRGoogleMapMarker*)subview; + marker.realMarker.map = self; + [self.markers addObject:marker]; + } else if ([subview isKindOfClass:[AIRGoogleMapPolygon class]]) { + AIRGoogleMapPolygon *polygon = (AIRGoogleMapPolygon*)subview; + polygon.polygon.map = self; + [self.polygons addObject:polygon]; + } else if ([subview isKindOfClass:[AIRGoogleMapPolyline class]]) { + AIRGoogleMapPolyline *polyline = (AIRGoogleMapPolyline*)subview; + polyline.polyline.map = self; + [self.polylines addObject:polyline]; + } else if ([subview isKindOfClass:[AIRGoogleMapCircle class]]) { + AIRGoogleMapCircle *circle = (AIRGoogleMapCircle*)subview; + circle.circle.map = self; + [self.circles addObject:circle]; + } else if ([subview isKindOfClass:[AIRGoogleMapUrlTile class]]) { + AIRGoogleMapUrlTile *tile = (AIRGoogleMapUrlTile*)subview; + tile.tileLayer.map = self; + [self.tiles addObject:tile]; + } else if ([subview isKindOfClass:[AIRGoogleMapWMSTile class]]) { + AIRGoogleMapWMSTile *tile = (AIRGoogleMapWMSTile*)subview; + tile.tileLayer.map = self; + [self.tiles addObject:tile]; + } else if ([subview isKindOfClass:[AIRGoogleMapOverlay class]]) { + AIRGoogleMapOverlay *overlay = (AIRGoogleMapOverlay*)subview; + overlay.overlay.map = self; + [self.overlays addObject:overlay]; + } else { + NSArray> *childSubviews = [subview reactSubviews]; + for (int i = 0; i < childSubviews.count; i++) { + [self insertReactSubview:(UIView *)childSubviews[i] atIndex:atIndex]; + } + } + [_reactSubviews insertObject:(UIView *)subview atIndex:(NSUInteger) atIndex]; +} +#pragma clang diagnostic pop + + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (void)removeReactSubview:(id)subview { + // similarly, when the children are being removed we have to do the appropriate + // underlying mapview action here. + if ([subview isKindOfClass:[AIRGoogleMapMarker class]]) { + AIRGoogleMapMarker *marker = (AIRGoogleMapMarker*)subview; + marker.realMarker.map = nil; + [self.markers removeObject:marker]; + } else if ([subview isKindOfClass:[AIRGoogleMapPolygon class]]) { + AIRGoogleMapPolygon *polygon = (AIRGoogleMapPolygon*)subview; + polygon.polygon.map = nil; + [self.polygons removeObject:polygon]; + } else if ([subview isKindOfClass:[AIRGoogleMapPolyline class]]) { + AIRGoogleMapPolyline *polyline = (AIRGoogleMapPolyline*)subview; + polyline.polyline.map = nil; + [self.polylines removeObject:polyline]; + } else if ([subview isKindOfClass:[AIRGoogleMapCircle class]]) { + AIRGoogleMapCircle *circle = (AIRGoogleMapCircle*)subview; + circle.circle.map = nil; + [self.circles removeObject:circle]; + } else if ([subview isKindOfClass:[AIRGoogleMapUrlTile class]]) { + AIRGoogleMapUrlTile *tile = (AIRGoogleMapUrlTile*)subview; + tile.tileLayer.map = nil; + [self.tiles removeObject:tile]; + } else if ([subview isKindOfClass:[AIRGoogleMapWMSTile class]]) { + AIRGoogleMapWMSTile *tile = (AIRGoogleMapWMSTile*)subview; + tile.tileLayer.map = nil; + [self.tiles removeObject:tile]; + } else if ([subview isKindOfClass:[AIRGoogleMapOverlay class]]) { + AIRGoogleMapOverlay *overlay = (AIRGoogleMapOverlay*)subview; + overlay.overlay.map = nil; + [self.overlays removeObject:overlay]; + } else { + NSArray> *childSubviews = [subview reactSubviews]; + for (int i = 0; i < childSubviews.count; i++) { + [self removeReactSubview:(UIView *)childSubviews[i]]; + } + } + [_reactSubviews removeObject:(UIView *)subview]; +} +#pragma clang diagnostic pop + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (NSArray> *)reactSubviews { + return _reactSubviews; +} +#pragma clang diagnostic pop + +- (NSArray *)getMapBoundaries +{ + GMSVisibleRegion visibleRegion = self.projection.visibleRegion; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithRegion:visibleRegion]; + + CLLocationCoordinate2D northEast = bounds.northEast; + CLLocationCoordinate2D southWest = bounds.southWest; + + return @[ + @[ + [NSNumber numberWithDouble:northEast.longitude], + [NSNumber numberWithDouble:northEast.latitude] + ], + @[ + [NSNumber numberWithDouble:southWest.longitude], + [NSNumber numberWithDouble:southWest.latitude] + ] + ]; +} + +- (void)didMoveToWindow { + if (_didMoveToWindow) return; + _didMoveToWindow = true; + + if (_initialCamera != nil) { + self.camera = _initialCamera; + } + else if (_initialRegion.span.latitudeDelta != 0.0 && + _initialRegion.span.longitudeDelta != 0.0) { + self.camera = [AIRGoogleMap makeGMSCameraPositionFromMap:self andMKCoordinateRegion:_initialRegion]; + } else if (_region.span.latitudeDelta != 0.0 && + _region.span.longitudeDelta != 0.0) { + self.camera = [AIRGoogleMap makeGMSCameraPositionFromMap:self andMKCoordinateRegion:_region]; + } + + [super didMoveToWindow]; +} + +- (void)setInitialRegion:(MKCoordinateRegion)initialRegion { + if (_initialCameraSetOnLoad) return; + _initialRegion = initialRegion; + _initialCameraSetOnLoad = _didMoveToWindow; + self.camera = [AIRGoogleMap makeGMSCameraPositionFromMap:self andMKCoordinateRegion:initialRegion]; +} + +- (void)setInitialCamera:(GMSCameraPosition*)initialCamera { + if (_initialCameraSetOnLoad) return; + _initialCamera = initialCamera; + _initialCameraSetOnLoad = _didMoveToWindow; + self.camera = initialCamera; +} + +- (void)setRegion:(MKCoordinateRegion)region { + // TODO: The JS component is repeatedly setting region unnecessarily. We might want to deal with that in here. + _region = region; + self.camera = [AIRGoogleMap makeGMSCameraPositionFromMap:self andMKCoordinateRegion:region]; +} + +- (void)setCameraProp:(GMSCameraPosition*)camera { + _initialCamera = camera; + self.camera = camera; +} + + +- (void)didPrepareMap { + UIView* mapView = [self valueForKey:@"mapView"]; //GMSVectorMapView + [self overrideGestureRecognizersForView:mapView]; + + if (_didCallOnMapReady) return; + _didCallOnMapReady = true; + if (self.onMapReady) self.onMapReady(@{}); +} + +- (BOOL)didTapMarker:(GMSMarker *)marker { + AIRGMSMarker *airMarker = (AIRGMSMarker *)marker; + + id event = @{@"action": @"marker-press", + @"id": airMarker.identifier ?: @"unknown", + @"coordinate": @{ + @"latitude": @(airMarker.position.latitude), + @"longitude": @(airMarker.position.longitude) + } + }; + + if (airMarker.onPress) airMarker.onPress(event); + if (self.onMarkerPress) self.onMarkerPress(event); + + // TODO: not sure why this is necessary + [self setSelectedMarker:marker]; + return NO; +} + +- (void)didTapPolyline:(GMSOverlay *)polyline { + AIRGMSPolyline *airPolyline = (AIRGMSPolyline *)polyline; + + id event = @{@"action": @"polyline-press", + @"id": airPolyline.identifier ?: @"unknown", + }; + + if (airPolyline.onPress) airPolyline.onPress(event); +} + +- (void)didTapPolygon:(GMSOverlay *)polygon { + AIRGMSPolygon *airPolygon = (AIRGMSPolygon *)polygon; + + id event = @{@"action": @"polygon-press", + @"id": airPolygon.identifier ?: @"unknown", + }; + + if (airPolygon.onPress) airPolygon.onPress(event); +} + +- (void)didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { + if (!self.onPress) return; + self.onPress([self eventFromCoordinate:coordinate]); +} + +- (void)didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + if (!self.onLongPress) return; + self.onLongPress([self eventFromCoordinate:coordinate]); +} + +- (void)didChangeCameraPosition:(GMSCameraPosition *)position { + id event = @{@"continuous": @YES, + @"region": regionAsJSON([AIRGoogleMap makeGMSCameraPositionFromMap:self andGMSCameraPosition:position]), + }; + + if (self.onChange) self.onChange(event); +} + +- (void)didTapPOIWithPlaceID:(NSString *)placeID + name:(NSString *)name + location:(CLLocationCoordinate2D)location { + id event = @{@"placeId": placeID, + @"name": name, + @"coordinate": @{ + @"latitude": @(location.latitude), + @"longitude": @(location.longitude) + } + }; + + if (self.onPoiClick) self.onPoiClick(event); +} + +- (void)idleAtCameraPosition:(GMSCameraPosition *)position { + id event = @{@"continuous": @NO, + @"region": regionAsJSON([AIRGoogleMap makeGMSCameraPositionFromMap:self andGMSCameraPosition:position]), + }; + if (self.onChange) self.onChange(event); // complete +} + +- (void)setMapPadding:(UIEdgeInsets)mapPadding { + self.padding = mapPadding; +} + +- (UIEdgeInsets)mapPadding { + return self.padding; +} + +- (void)setPaddingAdjustmentBehaviorString:(NSString *)str +{ + if ([str isEqualToString:@"never"]) + { + self.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorNever; + } + else if ([str isEqualToString:@"automatic"]) + { + self.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorAutomatic; + } + else //if ([str isEqualToString:@"always"]) <-- default + { + self.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorAlways; + } +} + +- (NSString *)paddingAdjustmentBehaviorString +{ + switch (self.paddingAdjustmentBehavior) + { + case kGMSMapViewPaddingAdjustmentBehaviorNever: + return @"never"; + case kGMSMapViewPaddingAdjustmentBehaviorAutomatic: + return @"automatic"; + case kGMSMapViewPaddingAdjustmentBehaviorAlways: + return @"always"; + + default: + return @"unknown"; + } +} + +- (void)setScrollEnabled:(BOOL)scrollEnabled { + self.settings.scrollGestures = scrollEnabled; +} + +- (BOOL)scrollEnabled { + return self.settings.scrollGestures; +} + +- (void)setZoomEnabled:(BOOL)zoomEnabled { + self.settings.zoomGestures = zoomEnabled; +} + +- (BOOL)zoomEnabled { + return self.settings.zoomGestures; +} + +- (void)setZoomTapEnabled:(BOOL)zoomTapEnabled { + _zoomTapEnabled = zoomTapEnabled; +} + +- (BOOL)zoomTapEnabled { + return _zoomTapEnabled; +} + +- (void)setRotateEnabled:(BOOL)rotateEnabled { + self.settings.rotateGestures = rotateEnabled; +} + +- (BOOL)rotateEnabled { + return self.settings.rotateGestures; +} + +- (void)setPitchEnabled:(BOOL)pitchEnabled { + self.settings.tiltGestures = pitchEnabled; +} + +- (BOOL)pitchEnabled { + return self.settings.tiltGestures; +} + +- (void)setShowsTraffic:(BOOL)showsTraffic { + self.trafficEnabled = showsTraffic; +} + +- (BOOL)showsTraffic { + return self.trafficEnabled; +} + +- (void)setShowsBuildings:(BOOL)showsBuildings { + self.buildingsEnabled = showsBuildings; +} + +- (BOOL)showsBuildings { + return self.buildingsEnabled; +} + +- (void)setShowsCompass:(BOOL)showsCompass { + self.settings.compassButton = showsCompass; +} + +- (void)setCustomMapStyleString:(NSString *)customMapStyleString { + NSError *error; + + GMSMapStyle *style = [GMSMapStyle styleWithJSONString:customMapStyleString error:&error]; + + if (!style) { + NSLog(@"The style definition could not be loaded: %@", error); + } + + self.mapStyle = style; +} + +- (BOOL)showsCompass { + return self.settings.compassButton; +} + +- (void)setShowsUserLocation:(BOOL)showsUserLocation { + self.myLocationEnabled = showsUserLocation; +} + +- (BOOL)showsUserLocation { + return self.myLocationEnabled; +} + +- (void)setShowsMyLocationButton:(BOOL)showsMyLocationButton { + self.settings.myLocationButton = showsMyLocationButton; +} + +- (BOOL)showsMyLocationButton { + return self.settings.myLocationButton; +} + +- (void)setMinZoomLevel:(CGFloat)minZoomLevel { + [self setMinZoom:minZoomLevel maxZoom:self.maxZoom ]; +} + +- (void)setMaxZoomLevel:(CGFloat)maxZoomLevel { + [self setMinZoom:self.minZoom maxZoom:maxZoomLevel ]; +} + +- (void)setShowsIndoors:(BOOL)showsIndoors { + self.indoorEnabled = showsIndoors; +} + +- (BOOL)showsIndoors { + return self.indoorEnabled; +} + +- (void)setShowsIndoorLevelPicker:(BOOL)showsIndoorLevelPicker { + self.settings.indoorPicker = showsIndoorLevelPicker; +} + +- (BOOL)showsIndoorLevelPicker { + return self.settings.indoorPicker; +} + ++ (MKCoordinateRegion) makeGMSCameraPositionFromMap:(GMSMapView *)map andGMSCameraPosition:(GMSCameraPosition *)position { + // solution from here: http://stackoverflow.com/a/16587735/1102215 + GMSVisibleRegion visibleRegion = map.projection.visibleRegion; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithRegion: visibleRegion]; + CLLocationCoordinate2D center; + CLLocationDegrees longitudeDelta; + CLLocationDegrees latitudeDelta = bounds.northEast.latitude - bounds.southWest.latitude; + + if(bounds.northEast.longitude >= bounds.southWest.longitude) { + //Standard case + center = CLLocationCoordinate2DMake((bounds.southWest.latitude + bounds.northEast.latitude) / 2, + (bounds.southWest.longitude + bounds.northEast.longitude) / 2); + longitudeDelta = bounds.northEast.longitude - bounds.southWest.longitude; + } else { + //Region spans the international dateline + center = CLLocationCoordinate2DMake((bounds.southWest.latitude + bounds.northEast.latitude) / 2, + (bounds.southWest.longitude + bounds.northEast.longitude + 360) / 2); + longitudeDelta = bounds.northEast.longitude + 360 - bounds.southWest.longitude; + } + MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta); + return MKCoordinateRegionMake(center, span); +} + ++ (GMSCameraPosition*) makeGMSCameraPositionFromMap:(GMSMapView *)map andMKCoordinateRegion:(MKCoordinateRegion)region { + float latitudeDelta = region.span.latitudeDelta * 0.5; + float longitudeDelta = region.span.longitudeDelta * 0.5; + + CLLocationCoordinate2D a = CLLocationCoordinate2DMake(region.center.latitude + latitudeDelta, + region.center.longitude + longitudeDelta); + CLLocationCoordinate2D b = CLLocationCoordinate2DMake(region.center.latitude - latitudeDelta, + region.center.longitude - longitudeDelta); + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:a coordinate:b]; + return [map cameraForBounds:bounds insets:UIEdgeInsetsZero]; +} + +#pragma mark - Utils + +- (CGRect) frameForMarker:(AIRGoogleMapMarker*) mrkView { + CGPoint mrkAnchor = mrkView.realMarker.groundAnchor; + CGPoint mrkPoint = [self.projection pointForCoordinate:mrkView.coordinate]; + CGSize mrkSize = mrkView.realMarker.iconView ? mrkView.realMarker.iconView.bounds.size : CGSizeMake(20, 30); + CGRect mrkFrame = CGRectMake(mrkPoint.x, mrkPoint.y, mrkSize.width, mrkSize.height); + mrkFrame.origin.y -= mrkAnchor.y * mrkSize.height; + mrkFrame.origin.x -= mrkAnchor.x * mrkSize.width; + return mrkFrame; +} + +- (NSDictionary*) getMarkersFramesWithOnlyVisible:(BOOL)onlyVisible { + NSMutableDictionary* markersFrames = [NSMutableDictionary new]; + for (AIRGoogleMapMarker* mrkView in self.markers) { + CGRect frame = [self frameForMarker:mrkView]; + CGPoint point = [self.projection pointForCoordinate:mrkView.coordinate]; + NSDictionary* frameDict = @{ + @"x": @(frame.origin.x), + @"y": @(frame.origin.y), + @"width": @(frame.size.width), + @"height": @(frame.size.height) + }; + NSDictionary* pointDict = @{ + @"x": @(point.x), + @"y": @(point.y) + }; + NSString* k = mrkView.identifier; + BOOL isVisible = CGRectIntersectsRect(self.bounds, frame); + if (k != nil && (!onlyVisible || isVisible)) { + [markersFrames setObject:@{ @"frame": frameDict, @"point": pointDict } forKey:k]; + } + } + return markersFrames; +} + +- (AIRGoogleMapMarker*) markerAtPoint:(CGPoint)point { + AIRGoogleMapMarker* mrk = nil; + for (AIRGoogleMapMarker* mrkView in self.markers) { + CGRect frame = [self frameForMarker:mrkView]; + if (CGRectContainsPoint(frame, point)) { + mrk = mrkView; + break; + } + } + return mrk; +} + +-(SEL)getActionForTarget:(NSObject*)target { + SEL action = nil; + uint32_t ivarCount; + Ivar *ivars = class_copyIvarList([target class], &ivarCount); + if (ivars) { + for (uint32_t i = 0 ; i < ivarCount ; i++) { + Ivar ivar = ivars[i]; + const char* type = ivar_getTypeEncoding(ivar); + const char* ivarName = ivar_getName(ivar); + NSString* name = [NSString stringWithCString: ivarName encoding: NSASCIIStringEncoding]; + if (type[0] == ':' && [name isEqualToString:@"_action"]) { + SEL sel = ((SEL (*)(id, Ivar))object_getIvar)(target, ivar); + action = sel; + break; + } + } + } + free(ivars); + return action; +} + +#pragma mark - Overrides for Callout behavior + +-(void)overrideGestureRecognizersForView:(UIView*)view { + NSArray* grs = view.gestureRecognizers; + for (UIGestureRecognizer* gestureRecognizer in grs) { + NSNumber* grHash = [NSNumber numberWithUnsignedInteger:gestureRecognizer.hash]; + if([self.origGestureRecognizersMeta objectForKey:grHash] != nil) + continue; //already patched + + //get original handlers + NSArray* origTargets = [gestureRecognizer valueForKey:@"targets"]; + NSMutableArray* origTargetsActions = [[NSMutableArray alloc] init]; + BOOL isZoomTapGesture = NO; + for (NSObject* trg in origTargets) { + NSObject* target = [trg valueForKey:@"target"]; + SEL action = [self getActionForTarget:trg]; + isZoomTapGesture = [NSStringFromSelector(action) isEqualToString:@"handleZoomTapGesture:"]; + [origTargetsActions addObject:@{ + @"target": [NSValue valueWithNonretainedObject:target], + @"action": NSStringFromSelector(action) + }]; + } + if (isZoomTapGesture && self.zoomTapEnabled == NO) { + [view removeGestureRecognizer:gestureRecognizer]; + continue; + } + + //replace with extendedMapGestureHandler + for (NSDictionary* origTargetAction in origTargetsActions) { + NSValue* targetValue = [origTargetAction objectForKey:@"target"]; + NSObject* target = [targetValue nonretainedObjectValue]; + NSString* actionString = [origTargetAction objectForKey:@"action"]; + SEL action = NSSelectorFromString(actionString); + [gestureRecognizer removeTarget:target action:action]; + } + [gestureRecognizer addTarget:self action:@selector(extendedMapGestureHandler:)]; + + [self.origGestureRecognizersMeta setObject:@{@"targets": origTargetsActions} + forKey:grHash]; + } +} + +- (id)extendedMapGestureHandler:(UIGestureRecognizer*)gestureRecognizer { + NSNumber* grHash = [NSNumber numberWithUnsignedInteger:gestureRecognizer.hash]; + UIWindow* win = [[[UIApplication sharedApplication] windows] firstObject]; + NSObject* bubbleProvider = [self valueForKey:@"bubbleProvider"]; //GMSbubbleEntityProvider + CGRect bubbleAbsoluteFrame = [bubbleProvider accessibilityFrame]; + CGRect bubbleFrame = [win convertRect:bubbleAbsoluteFrame toView:self]; + UIView* bubbleView = [bubbleProvider valueForKey:@"view"]; + + BOOL performOriginalActions = YES; + BOOL isTap = [gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] || [gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]]; + if (isTap) { + BOOL isTapInsideBubble = NO; + CGPoint tapPoint = CGPointZero; + CGPoint tapPointInBubble = CGPointZero; + + NSArray* touches = [gestureRecognizer valueForKey:@"touches"]; + UITouch* oneTouch = [touches firstObject]; + NSArray* delayedTouches = [gestureRecognizer valueForKey:@"delayedTouches"]; + NSObject* delayedTouch = [delayedTouches firstObject]; //UIGestureDeleayedTouch + UITouch* tapTouch = [delayedTouch valueForKey:@"stateWhenDelayed"]; + if (!tapTouch) + tapTouch = oneTouch; + tapPoint = [tapTouch locationInView:self]; + isTapInsideBubble = tapTouch != nil && CGRectContainsPoint(bubbleFrame, tapPoint); + if (isTapInsideBubble) { + tapPointInBubble = CGPointMake(tapPoint.x - bubbleFrame.origin.x, tapPoint.y - bubbleFrame.origin.y); + } + if (isTapInsideBubble) { + //find bubble's marker + AIRGoogleMapMarker* markerView = nil; + AIRGMSMarker* marker = nil; + for (AIRGoogleMapMarker* mrk in self.markers) { + if ([mrk.calloutView isEqual:bubbleView]) { + markerView = mrk; + marker = markerView.realMarker; + break; + } + } + + //find real tap target subview + UIView* realSubview = [(RCTView*)bubbleView hitTest:tapPointInBubble withEvent:nil]; + AIRGoogleMapCalloutSubview* realPressableSubview = nil; + if (realSubview) { + UIView* tmp = realSubview; + while (tmp && tmp != win && tmp != bubbleView) { + if ([tmp respondsToSelector:@selector(onPress)]) { + realPressableSubview = (AIRGoogleMapCalloutSubview*) tmp; + break; + } + tmp = tmp.superview; + } + } + + if (markerView) { + BOOL isInsideCallout = [markerView.calloutView isPointInside:tapPointInBubble]; + if (isInsideCallout) { + [markerView didTapInfoWindowOfMarker:marker subview:realPressableSubview point:tapPointInBubble frame:bubbleFrame]; + } else { + AIRGoogleMapMarker* markerAtTapPoint = [self markerAtPoint:tapPoint]; + if (markerAtTapPoint != nil) { + [self didTapMarker:markerAtTapPoint.realMarker]; + } else { + CLLocationCoordinate2D coord = [self.projection coordinateForPoint:tapPoint]; + [markerView hideCalloutView]; + [self didTapAtCoordinate:coord]; + } + } + + performOriginalActions = NO; + } + } + } + + if (performOriginalActions) { + NSDictionary* origMeta = [self.origGestureRecognizersMeta objectForKey:grHash]; + NSDictionary* origTargets = [origMeta objectForKey:@"targets"]; + for (NSDictionary* origTarget in origTargets) { + NSValue* targetValue = [origTarget objectForKey:@"target"]; + NSObject* target = [targetValue nonretainedObjectValue]; + NSString* actionString = [origTarget objectForKey:@"action"]; + SEL action = NSSelectorFromString(actionString); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [target performSelector:action withObject:gestureRecognizer]; +#pragma clang diagnostic pop + } + } + + return nil; +} + + +#pragma mark - KVO updates + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + if ([keyPath isEqualToString:@"myLocation"]){ + CLLocation *location = [object myLocation]; + + id event = @{@"coordinate": @{ + @"latitude": @(location.coordinate.latitude), + @"longitude": @(location.coordinate.longitude), + @"altitude": @(location.altitude), + @"timestamp": @(location.timestamp.timeIntervalSinceReferenceDate * 1000), + @"accuracy": @(location.horizontalAccuracy), + @"altitudeAccuracy": @(location.verticalAccuracy), + @"speed": @(location.speed), + } + }; + + if (self.onUserLocationChange) self.onUserLocationChange(event); + } else { + // This message is not for me; pass it on to super. + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + ++ (NSString *)GetIconUrl:(GMUPlacemark *) marker parser:(GMUKMLParser *) parser { +#ifdef HAVE_GOOGLE_MAPS_UTILS + if (marker.style.styleID != nil) { + for (GMUStyle *style in parser.styles) { + if (style.styleID == marker.style.styleID) { + return style.iconUrl; + } + } + } + + return marker.style.iconUrl; +#else + REQUIRES_GOOGLE_MAPS_UTILS("GetIconUrl:parser:"); return @""; +#endif +} + +- (NSString *)KmlSrc { + return _kmlSrc; +} + +- (void)setKmlSrc:(NSString *)kmlUrl { +#ifdef HAVE_GOOGLE_MAPS_UTILS + + _kmlSrc = kmlUrl; + + NSURL *url = [NSURL URLWithString:kmlUrl]; + NSData *urlData = nil; + + if ([url isFileURL]) { + urlData = [NSData dataWithContentsOfURL:url]; + } else { + urlData = [[NSFileManager defaultManager] contentsAtPath:kmlUrl]; + } + + GMUKMLParser *parser = [[GMUKMLParser alloc] initWithData:urlData]; + [parser parse]; + + NSUInteger index = 0; + NSMutableArray *markers = [[NSMutableArray alloc]init]; + + for (GMUPlacemark *place in parser.placemarks) { + + CLLocationCoordinate2D location =((GMUPoint *) place.geometry).coordinate; + + AIRGoogleMapMarker *marker = (AIRGoogleMapMarker *)[[AIRGoogleMapMarkerManager alloc] view]; + if (!marker.bridge) { + marker.bridge = _bridge; + } + marker.identifier = place.title; + marker.coordinate = location; + marker.title = place.title; + marker.subtitle = place.snippet; + marker.pinColor = place.style.fillColor; + marker.imageSrc = [AIRGoogleMap GetIconUrl:place parser:parser]; + marker.layer.backgroundColor = [UIColor clearColor].CGColor; + marker.layer.position = CGPointZero; + + [self insertReactSubview:(UIView *) marker atIndex:index]; + + [markers addObject:@{@"id": marker.identifier, + @"title": marker.title, + @"description": marker.subtitle, + @"coordinate": @{ + @"latitude": @(location.latitude), + @"longitude": @(location.longitude) + } + }]; + + index++; + } + + id event = @{@"markers": markers}; + if (self.onKmlReady) self.onKmlReady(event); +#else + REQUIRES_GOOGLE_MAPS_UTILS(); +#endif +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.h new file mode 100644 index 0000000..b3fef11 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.h @@ -0,0 +1,23 @@ +// +// AIRGoogleMapCallout.h +// AirMaps +// +// Created by Gil Birman on 9/6/16. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface AIRGoogleMapCallout : UIView +@property (nonatomic, assign) BOOL tooltip; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, assign) BOOL alphaHitTest; + +- (BOOL) isPointInside:(CGPoint)pointInCallout; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.m new file mode 100644 index 0000000..968293d --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCallout.m @@ -0,0 +1,39 @@ +// +// AIRGoogleMapCallout.m +// AirMaps +// +// Created by Gil Birman on 9/6/16. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapCallout.h" +#import +#import +#import + +@implementation AIRGoogleMapCallout + +- (BOOL) isPointInside:(CGPoint)pointInCallout { + if (!self.alphaHitTest) + return TRUE; + CGFloat alpha = [self alphaOfPoint:pointInCallout]; + return alpha >= 0.01; +} + +- (CGFloat) alphaOfPoint:(CGPoint)point { + unsigned char pixel[4] = {0}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); + CGContextTranslateCTM(context, -point.x, -point.y); + [self.layer renderInContext:context]; + CGContextRelease(context); + CGColorSpaceRelease(colorSpace); + return pixel[3]/255.0; +} + + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.h new file mode 100644 index 0000000..4d70ea3 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.h @@ -0,0 +1,17 @@ +// +// AIRGoogleMapCalloutManager.h +// AirMaps +// +// Created by Gil Birman on 9/6/16. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapCalloutManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.m new file mode 100644 index 0000000..b238316 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutManager.m @@ -0,0 +1,30 @@ +// +// AIRGoogleMapCalloutManager.m +// AirMaps +// +// Created by Gil Birman on 9/6/16. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapCalloutManager.h" +#import "AIRGoogleMapCallout.h" +#import + +@implementation AIRGoogleMapCalloutManager +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapCallout *callout = [AIRGoogleMapCallout new]; + return callout; +} + +RCT_EXPORT_VIEW_PROPERTY(tooltip, BOOL) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(alphaHitTest, BOOL) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.h new file mode 100644 index 0000000..fd7d36c --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.h @@ -0,0 +1,18 @@ +// +// AIRGoogleMapCalloutSubview.h +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface AIRGoogleMapCalloutSubview : UIView +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.m new file mode 100644 index 0000000..ef0281a --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubview.m @@ -0,0 +1,19 @@ +// +// AIRGoogleMapCalloutSubview.m +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapCalloutSubview.h" +#import +#import +#import + +@implementation AIRGoogleMapCalloutSubview +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.h new file mode 100644 index 0000000..c1280da --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.h @@ -0,0 +1,17 @@ +// +// AIRGoogleMapCalloutSubviewManager.h +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapCalloutSubviewManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.m new file mode 100644 index 0000000..5a97bef --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCalloutSubviewManager.m @@ -0,0 +1,28 @@ +// +// AIRGoogleMapCalloutSubviewManager.m +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapCalloutSubviewManager.h" +#import "AIRGoogleMapCalloutSubview.h" +#import + +@implementation AIRGoogleMapCalloutSubviewManager +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapCalloutSubview *calloutSubview = [AIRGoogleMapCalloutSubview new]; + return calloutSubview; +} + +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.h new file mode 100644 index 0000000..478933e --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.h @@ -0,0 +1,24 @@ +// +// AIRGoogleMapsCircle.h +// +// Created by Nick Italiano on 10/24/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import "AIRMapCoordinate.h" + +@interface AIRGoogleMapCircle : UIView + +@property (nonatomic, strong) GMSCircle *circle; +@property (nonatomic, assign) double radius; +@property (nonatomic, assign) CLLocationCoordinate2D centerCoordinate; +@property (nonatomic, assign) UIColor *strokeColor; +@property (nonatomic, assign) double strokeWidth; +@property (nonatomic, assign) UIColor *fillColor; +@property (nonatomic, assign) int zIndex; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.m new file mode 100644 index 0000000..f0c73b9 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCircle.m @@ -0,0 +1,61 @@ +// +// AIRGoogleMapsCircle.m +// +// Created by Nick Italiano on 10/24/16. +// + +#ifdef HAVE_GOOGLE_MAPS +#import +#import "AIRGoogleMapCircle.h" +#import +#import + +@implementation AIRGoogleMapCircle + +- (instancetype)init +{ + if (self = [super init]) { + _circle = [[GMSCircle alloc] init]; + } + return self; +} + +- (void)setRadius:(double)radius +{ + _radius = radius; + _circle.radius = radius; +} + +- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate +{ + _centerCoordinate = centerCoordinate; + _circle.position = centerCoordinate; +} + +-(void)setStrokeColor:(UIColor *)strokeColor +{ + _strokeColor = strokeColor; + _circle.strokeColor = strokeColor; +} + +-(void)setStrokeWidth:(double)strokeWidth +{ + _strokeWidth = strokeWidth; + _circle.strokeWidth = strokeWidth; +} + +-(void)setFillColor:(UIColor *)fillColor +{ + _fillColor = fillColor; + _circle.fillColor = fillColor; +} + +-(void)setZIndex:(int)zIndex +{ + _zIndex = zIndex; + _circle.zIndex = zIndex; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.h new file mode 100644 index 0000000..02ce07c --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.h @@ -0,0 +1,15 @@ +// +// AIRGoogleMapCircleManager.h +// +// Created by Nick Italiano on 10/24/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapCircleManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.m new file mode 100644 index 0000000..d113d04 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapCircleManager.m @@ -0,0 +1,37 @@ +// +// AIRGoogleMapCircleManager.m +// +// Created by Nick Italiano on 10/24/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapCircleManager.h" +#import "AIRGoogleMapCircle.h" +#import +#import + +@interface AIRGoogleMapCircleManager() + +@end + +@implementation AIRGoogleMapCircleManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapCircle *circle = [AIRGoogleMapCircle new]; + return circle; +} + +RCT_EXPORT_VIEW_PROPERTY(radius, double) +RCT_REMAP_VIEW_PROPERTY(center, centerCoordinate, CLLocationCoordinate2D) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, double) +RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(zIndex, int) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapManager.h new file mode 100644 index 0000000..eb69786 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapManager.h @@ -0,0 +1,18 @@ +// +// AIRGoogleMapManager.h +// AirMaps +// +// Created by Gil Birman on 9/1/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import "AIRGoogleMap.h" + +@interface AIRGoogleMapManager : RCTViewManager +@property (nonatomic, assign) AIRGoogleMap *map; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapManager.m new file mode 100644 index 0000000..9c4090f --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapManager.m @@ -0,0 +1,725 @@ +// +// AIRGoogleMapManager.m +// AirMaps +// +// Created by Gil Birman on 9/1/16. +// + +#ifdef HAVE_GOOGLE_MAPS + + +#import "AIRGoogleMapManager.h" +#import +#import +#import +#import +#import +#import +#import +#import +#import "RCTConvert+GMSMapViewType.h" +#import "AIRGoogleMap.h" +#import "AIRMapMarker.h" +#import "AIRMapPolyline.h" +#import "AIRMapPolygon.h" +#import "AIRMapCircle.h" +#import "SMCalloutView.h" +#import "AIRGoogleMapMarker.h" +#import "RCTConvert+AirMap.h" + +#import +#import + +static NSString *const RCTMapViewKey = @"MapView"; + + +@interface AIRGoogleMapManager() +{ + BOOL didCallOnMapReady; +} +@end + +@implementation AIRGoogleMapManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMap *map = [AIRGoogleMap new]; + map.bridge = self.bridge; + map.delegate = self; + map.isAccessibilityElement = YES; + map.accessibilityElementsHidden = NO; + map.settings.consumesGesturesInView = NO; + map.indoorDisplay.delegate = self; + self.map = map; + + UIPanGestureRecognizer *drag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapDrag:)]; + [drag setMinimumNumberOfTouches:1]; + [drag setMaximumNumberOfTouches:1]; + [map addGestureRecognizer:drag]; + + UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapDrag:)]; + [map addGestureRecognizer:pinch]; + + return map; +} + +RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString) +RCT_EXPORT_VIEW_PROPERTY(initialCamera, GMSCameraPosition) +RCT_REMAP_VIEW_PROPERTY(camera, cameraProp, GMSCameraPosition) +RCT_EXPORT_VIEW_PROPERTY(initialRegion, MKCoordinateRegion) +RCT_EXPORT_VIEW_PROPERTY(region, MKCoordinateRegion) +RCT_EXPORT_VIEW_PROPERTY(showsBuildings, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsCompass, BOOL) +//RCT_EXPORT_VIEW_PROPERTY(showsScale, BOOL) // Not supported by GoogleMaps +RCT_EXPORT_VIEW_PROPERTY(showsTraffic, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zoomEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(rotateEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(scrollEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(pitchEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zoomTapEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsUserLocation, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsMyLocationButton, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsIndoors, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsIndoorLevelPicker, BOOL) +RCT_EXPORT_VIEW_PROPERTY(customMapStyleString, NSString) +RCT_EXPORT_VIEW_PROPERTY(mapPadding, UIEdgeInsets) +RCT_REMAP_VIEW_PROPERTY(paddingAdjustmentBehavior, paddingAdjustmentBehaviorString, NSString) +RCT_EXPORT_VIEW_PROPERTY(onMapReady, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onKmlReady, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onLongPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPanDrag, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onUserLocationChange, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerPress, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onRegionChange, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onRegionChangeComplete, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPoiClick, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onIndoorLevelActivated, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onIndoorBuildingFocused, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(mapType, GMSMapViewType) +RCT_EXPORT_VIEW_PROPERTY(minZoomLevel, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(maxZoomLevel, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(kmlSrc, NSString) + +RCT_EXPORT_METHOD(getCamera:(nonnull NSNumber *)reactTag + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + reject(@"Invalid argument", [NSString stringWithFormat:@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view], NULL); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + resolve(@{ + @"center": @{ + @"latitude": @(mapView.camera.target.latitude), + @"longitude": @(mapView.camera.target.longitude), + }, + @"pitch": @(mapView.camera.viewingAngle), + @"heading": @(mapView.camera.bearing), + @"zoom": @(mapView.camera.zoom), + }); + } + }]; +} + +RCT_EXPORT_METHOD(setCamera:(nonnull NSNumber *)reactTag + camera:(id)json) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + GMSCameraPosition *camera = [RCTConvert GMSCameraPositionWithDefaults:json existingCamera:[mapView camera]]; + [mapView setCamera:camera]; + } + }]; +} + + +RCT_EXPORT_METHOD(animateCamera:(nonnull NSNumber *)reactTag + withCamera:(id)json + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + GMSCameraPosition *camera = [RCTConvert GMSCameraPositionWithDefaults:json existingCamera:[mapView camera]]; + [mapView animateToCameraPosition:camera]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToNavigation:(nonnull NSNumber *)reactTag + withRegion:(MKCoordinateRegion)region + withBearing:(CGFloat)bearing + withAngle:(double)angle + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + GMSCameraPosition *camera = [AIRGoogleMap makeGMSCameraPositionFromMap:mapView andMKCoordinateRegion:region]; + [mapView animateToCameraPosition:camera]; + [mapView animateToViewingAngle:angle]; + [mapView animateToBearing:bearing]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToRegion:(nonnull NSNumber *)reactTag + withRegion:(MKCoordinateRegion)region + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + // Core Animation must be used to control the animation's duration + // See http://stackoverflow.com/a/15663039/171744 + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + GMSCameraPosition *camera = [AIRGoogleMap makeGMSCameraPositionFromMap:mapView andMKCoordinateRegion:region]; + [mapView animateToCameraPosition:camera]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToCoordinate:(nonnull NSNumber *)reactTag + withRegion:(CLLocationCoordinate2D)latlng + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + [(AIRGoogleMap *)view animateToLocation:latlng]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToViewingAngle:(nonnull NSNumber *)reactTag + withAngle:(double)angle + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + [mapView animateToViewingAngle:angle]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToBearing:(nonnull NSNumber *)reactTag + withBearing:(CGFloat)bearing + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:duration/1000]; + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + [mapView animateToBearing:bearing]; + [CATransaction commit]; + } + }]; +} + +RCT_EXPORT_METHOD(fitToElements:(nonnull NSNumber *)reactTag + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + CLLocationCoordinate2D myLocation = ((AIRGoogleMapMarker *)(mapView.markers.firstObject)).realMarker.position; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:myLocation coordinate:myLocation]; + + for (AIRGoogleMapMarker *marker in mapView.markers) + bounds = [bounds includingCoordinate:marker.realMarker.position]; + + GMSCameraUpdate *cameraUpdate = [GMSCameraUpdate fitBounds:bounds withPadding:55.0f]; + + if (animated) { + [mapView animateWithCameraUpdate: cameraUpdate]; + } else { + [mapView moveCamera: cameraUpdate]; + } + } + }]; +} + +RCT_EXPORT_METHOD(fitToSuppliedMarkers:(nonnull NSNumber *)reactTag + markers:(nonnull NSArray *)markers + edgePadding:(nonnull NSDictionary *)edgePadding + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + NSPredicate *filterMarkers = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + AIRGoogleMapMarker *marker = (AIRGoogleMapMarker *)evaluatedObject; + return [marker isKindOfClass:[AIRGoogleMapMarker class]] && [markers containsObject:marker.identifier]; + }]; + + NSArray *filteredMarkers = [mapView.markers filteredArrayUsingPredicate:filterMarkers]; + + CLLocationCoordinate2D myLocation = ((AIRGoogleMapMarker *)(filteredMarkers.firstObject)).realMarker.position; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:myLocation coordinate:myLocation]; + + for (AIRGoogleMapMarker *marker in filteredMarkers) + bounds = [bounds includingCoordinate:marker.realMarker.position]; + + // Set Map viewport + CGFloat top = [RCTConvert CGFloat:edgePadding[@"top"]]; + CGFloat right = [RCTConvert CGFloat:edgePadding[@"right"]]; + CGFloat bottom = [RCTConvert CGFloat:edgePadding[@"bottom"]]; + CGFloat left = [RCTConvert CGFloat:edgePadding[@"left"]]; + + GMSCameraUpdate* cameraUpdate = [GMSCameraUpdate fitBounds:bounds withEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)]; + if (animated) { + [mapView animateWithCameraUpdate:cameraUpdate + ]; + } else { + [mapView moveCamera: cameraUpdate]; + } + } + }]; +} + +RCT_EXPORT_METHOD(fitToCoordinates:(nonnull NSNumber *)reactTag + coordinates:(nonnull NSArray *)coordinates + edgePadding:(nonnull NSDictionary *)edgePadding + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + CLLocationCoordinate2D myLocation = coordinates.firstObject.coordinate; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:myLocation coordinate:myLocation]; + + for (AIRMapCoordinate *coordinate in coordinates) + bounds = [bounds includingCoordinate:coordinate.coordinate]; + + // Set Map viewport + CGFloat top = [RCTConvert CGFloat:edgePadding[@"top"]]; + CGFloat right = [RCTConvert CGFloat:edgePadding[@"right"]]; + CGFloat bottom = [RCTConvert CGFloat:edgePadding[@"bottom"]]; + CGFloat left = [RCTConvert CGFloat:edgePadding[@"left"]]; + + GMSCameraUpdate *cameraUpdate = [GMSCameraUpdate fitBounds:bounds withEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)]; + + if (animated) { + [mapView animateWithCameraUpdate: cameraUpdate]; + } else { + [mapView moveCamera: cameraUpdate]; + } + } + }]; +} + +RCT_EXPORT_METHOD(takeSnapshot:(nonnull NSNumber *)reactTag + withWidth:(nonnull NSNumber *)width + withHeight:(nonnull NSNumber *)height + withRegion:(MKCoordinateRegion)region + format:(nonnull NSString *)format + quality:(nonnull NSNumber *)quality + result:(nonnull NSString *)result + withCallback:(RCTResponseSenderBlock)callback) +{ + NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; + NSString *pathComponent = [NSString stringWithFormat:@"Documents/snapshot-%.20lf.%@", timeStamp, format]; + NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent: pathComponent]; + + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + // TODO: currently we are ignoring width, height, region + + UIGraphicsBeginImageContextWithOptions(mapView.frame.size, YES, 0.0f); + [mapView.layer renderInContext:UIGraphicsGetCurrentContext()]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + + NSData *data; + if ([format isEqualToString:@"png"]) { + data = UIImagePNGRepresentation(image); + + } + else if([format isEqualToString:@"jpg"]) { + data = UIImageJPEGRepresentation(image, quality.floatValue); + } + + if ([result isEqualToString:@"file"]) { + [data writeToFile:filePath atomically:YES]; + callback(@[[NSNull null], filePath]); + } + else if ([result isEqualToString:@"base64"]) { + callback(@[[NSNull null], [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]]); + } + else if ([result isEqualToString:@"legacy"]) { + + // In the initial (iOS only) implementation of takeSnapshot, + // both the uri and the base64 encoded string were returned. + // Returning both is rarely useful and in fact causes a + // performance penalty when only the file URI is desired. + // In that case the base64 encoded string was always marshalled + // over the JS-bridge (which is quite slow). + // A new more flexible API was created to cover this. + // This code should be removed in a future release when the + // old API is fully deprecated. + [data writeToFile:filePath atomically:YES]; + NSDictionary *snapshotData = @{ + @"uri": filePath, + @"data": [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn] + }; + callback(@[[NSNull null], snapshotData]); + } + + } + UIGraphicsEndImageContext(); + }]; +} + +RCT_EXPORT_METHOD(pointForCoordinate:(nonnull NSNumber *)reactTag + coordinate:(NSDictionary *)coordinate + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + CLLocationCoordinate2D coord = + CLLocationCoordinate2DMake( + [coordinate[@"latitude"] doubleValue], + [coordinate[@"longitude"] doubleValue] + ); + + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + CGPoint touchPoint = [mapView.projection pointForCoordinate:coord]; + + resolve(@{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }); + } + }]; +} + +RCT_EXPORT_METHOD(coordinateForPoint:(nonnull NSNumber *)reactTag + point:(NSDictionary *)point + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + CGPoint pt = CGPointMake( + [point[@"x"] doubleValue], + [point[@"y"] doubleValue] + ); + + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + CLLocationCoordinate2D coordinate = [mapView.projection coordinateForPoint:pt]; + + resolve(@{ + @"latitude": @(coordinate.latitude), + @"longitude": @(coordinate.longitude), + }); + } + }]; +} + +RCT_EXPORT_METHOD(getMarkersFrames:(nonnull NSNumber *)reactTag + onlyVisible:(BOOL)onlyVisible + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + resolve([mapView getMarkersFramesWithOnlyVisible:onlyVisible]); + } + }]; +} + +RCT_EXPORT_METHOD(getMapBoundaries:(nonnull NSNumber *)reactTag + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + NSArray *boundingBox = [view getMapBoundaries]; + + resolve(@{ + @"northEast" : @{ + @"longitude" : boundingBox[0][0], + @"latitude" : boundingBox[0][1] + }, + @"southWest" : @{ + @"longitude" : boundingBox[1][0], + @"latitude" : boundingBox[1][1] + } + }); + } + }]; +} + +RCT_EXPORT_METHOD(setMapBoundaries:(nonnull NSNumber *)reactTag + northEast:(CLLocationCoordinate2D)northEast + southWest:(CLLocationCoordinate2D)southWest) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:northEast coordinate:southWest]; + + mapView.cameraTargetBounds = bounds; + } + }]; +} + +RCT_EXPORT_METHOD(setIndoorActiveLevelIndex:(nonnull NSNumber *)reactTag + levelIndex:(NSInteger) levelIndex) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRGoogleMap, got: %@", view); + } else { + AIRGoogleMap *mapView = (AIRGoogleMap *)view; + if (!self.map.indoorDisplay) { + return; + } + if ( levelIndex < [self.map.indoorDisplay.activeBuilding.levels count]) { + mapView.indoorDisplay.activeLevel = self.map.indoorDisplay.activeBuilding.levels[levelIndex]; + } + } + }]; + } + ++ (BOOL)requiresMainQueueSetup { + return YES; +} + +- (NSDictionary *)constantsToExport { + return @{ @"legalNotice": [GMSServices openSourceLicenseInfo] }; +} + +- (void)mapViewDidStartTileRendering:(GMSMapView *)mapView { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didPrepareMap]; +} + +- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + return [googleMapView didTapMarker:marker]; +} + +- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSPolygon *)polygon { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didTapPolygon:polygon]; +} + +- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didTapAtCoordinate:coordinate]; +} + +- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didLongPressAtCoordinate:coordinate]; +} + +- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didChangeCameraPosition:position]; +} + +- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView idleAtCameraPosition:position]; +} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + return [aMarker.fakeMarker markerInfoWindow];} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoContents:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + return [aMarker.fakeMarker markerInfoContents]; +} + +- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + [aMarker.fakeMarker didTapInfoWindowOfMarker:aMarker]; +} + +- (void)mapView:(GMSMapView *)mapView didBeginDraggingMarker:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + [aMarker.fakeMarker didBeginDraggingMarker:aMarker]; +} + +- (void)mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + [aMarker.fakeMarker didEndDraggingMarker:aMarker]; +} + +- (void)mapView:(GMSMapView *)mapView didDragMarker:(GMSMarker *)marker { + AIRGMSMarker *aMarker = (AIRGMSMarker *)marker; + [aMarker.fakeMarker didDragMarker:aMarker]; +} + +- (void) didChangeActiveBuilding: (nullable GMSIndoorBuilding *) building { + if (!building) { + if (!self.map.onIndoorBuildingFocused) { + return; + } + self.map.onIndoorBuildingFocused(@{ + @"IndoorBuilding": @{ + @"activeLevelIndex": @0, + @"underground": @false, + @"levels": [[NSMutableArray alloc]init] + } + }); + } + NSInteger i = 0; + NSMutableArray *arrayLevels = [[NSMutableArray alloc]init]; + for (GMSIndoorLevel *level in building.levels) { + [arrayLevels addObject: @{ + @"index": @(i), + @"name" : level.name, + @"shortName" : level.shortName, + } + ]; + i++; + } + if (!self.map.onIndoorBuildingFocused) { + return; + } + self.map.onIndoorBuildingFocused(@{ + @"IndoorBuilding": @{ + @"activeLevelIndex": @(building.defaultLevelIndex), + @"underground": @(building.underground), + @"levels": arrayLevels + } + } + ); +} + +- (void) didChangeActiveLevel: (nullable GMSIndoorLevel *) level { + if (!self.map.onIndoorLevelActivated || !self.map.indoorDisplay || !level) { + return; + } + NSInteger i = 0; + for (GMSIndoorLevel *buildingLevel in self.map.indoorDisplay.activeBuilding.levels) { + if (buildingLevel.name == level.name && buildingLevel.shortName == level.shortName) { + break; + } + i++; + } + self.map.onIndoorLevelActivated(@{ + @"IndoorLevel": @{ + @"activeLevelIndex": @(i), + @"name": level.name, + @"shortName": level.shortName + } + }); +} + +- (void)mapView:(GMSMapView *)mapView + didTapPOIWithPlaceID:(NSString *)placeID + name:(NSString *)name + location:(CLLocationCoordinate2D)location { + AIRGoogleMap *googleMapView = (AIRGoogleMap *)mapView; + [googleMapView didTapPOIWithPlaceID:placeID name:name location:location]; +} + +#pragma mark Gesture Recognizer Handlers + +- (void)handleMapDrag:(UIPanGestureRecognizer*)recognizer { + AIRGoogleMap *map = (AIRGoogleMap *)recognizer.view; + if (!map.onPanDrag) return; + + CGPoint touchPoint = [recognizer locationInView:map]; + CLLocationCoordinate2D coord = [map.projection coordinateForPoint:touchPoint]; + map.onPanDrag(@{ + @"coordinate": @{ + @"latitude": @(coord.latitude), + @"longitude": @(coord.longitude), + }, + @"position": @{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }, + }); + +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.h b/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.h new file mode 100644 index 0000000..f3d7347 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.h @@ -0,0 +1,55 @@ +// +// AIRGoogleMapMarker.h +// AirMaps +// +// Created by Gil Birman on 9/2/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import +#import "AIRGMSMarker.h" +#import "AIRGoogleMap.h" +#import "AIRGoogleMapCallout.h" +#import "AIRGoogleMapCalloutSubview.h" + +@interface AIRGoogleMapMarker : UIView + +@property (nonatomic, weak) RCTBridge *bridge; +@property (nonatomic, strong) AIRGoogleMapCallout *calloutView; +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; +@property (nonatomic, assign) CLLocationDegrees rotation; +@property (nonatomic, strong) AIRGMSMarker* realMarker; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, copy) RCTDirectEventBlock onDragStart; +@property (nonatomic, copy) RCTDirectEventBlock onDrag; +@property (nonatomic, copy) RCTDirectEventBlock onDragEnd; +@property (nonatomic, copy) NSString *imageSrc; +@property (nonatomic, copy) NSString *iconSrc; +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *subtitle; +@property (nonatomic, strong) UIColor *pinColor; +@property (nonatomic, assign) CGPoint anchor; +@property (nonatomic, assign) CGPoint calloutAnchor; +@property (nonatomic, assign) NSInteger zIndex; +@property (nonatomic, assign) double opacity; +@property (nonatomic, assign) BOOL draggable; +@property (nonatomic, assign) BOOL tracksViewChanges; +@property (nonatomic, assign) BOOL tracksInfoWindowChanges; + +- (void)showCalloutView; +- (void)hideCalloutView; +- (void)redraw; +- (UIView *)markerInfoContents; +- (UIView *)markerInfoWindow; +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker; +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker point:(CGPoint)point frame:(CGRect)frame; +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker subview:(AIRGoogleMapCalloutSubview*)subview point:(CGPoint)point frame:(CGRect)frame; +- (void)didBeginDraggingMarker:(AIRGMSMarker *)marker; +- (void)didEndDraggingMarker:(AIRGMSMarker *)marker; +- (void)didDragMarker:(AIRGMSMarker *)marker; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.m b/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.m new file mode 100644 index 0000000..2013236 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapMarker.m @@ -0,0 +1,412 @@ +// +// AIRGoogleMapMarker.m +// AirMaps +// +// Created by Gil Birman on 9/2/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapMarker.h" +#import +#import +#import +#import "AIRGMSMarker.h" +#import "AIRGoogleMapCallout.h" +#import "AIRDummyView.h" + +CGRect unionRect(CGRect a, CGRect b) { + return CGRectMake( + MIN(a.origin.x, b.origin.x), + MIN(a.origin.y, b.origin.y), + MAX(a.size.width, b.size.width), + MAX(a.size.height, b.size.height)); +} + +@interface AIRGoogleMapMarker () +- (id)eventFromMarker:(AIRGMSMarker*)marker; +@end + +@implementation AIRGoogleMapMarker { + RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; + __weak UIImageView *_iconImageView; + UIView *_iconView; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _realMarker = [[AIRGMSMarker alloc] init]; + _realMarker.fakeMarker = self; + _realMarker.tracksViewChanges = true; + _realMarker.tracksInfoWindowChanges = false; + } + return self; +} + +- (void)layoutSubviews { + float width = 0; + float height = 0; + + for (UIView *v in [_iconView subviews]) { + + float fw = v.frame.origin.x + v.frame.size.width; + float fh = v.frame.origin.y + v.frame.size.height; + + width = MAX(fw, width); + height = MAX(fh, height); + } + + [_iconView setFrame:CGRectMake(0, 0, width, height)]; +} + +- (id)eventFromMarker:(AIRGMSMarker*)marker { + + CLLocationCoordinate2D coordinate = marker.position; + CGPoint position = [self.realMarker.map.projection pointForCoordinate:coordinate]; + + return @{ + @"id": marker.identifier ?: @"unknown", + @"position": @{ + @"x": @(position.x), + @"y": @(position.y), + }, + @"coordinate": @{ + @"latitude": @(coordinate.latitude), + @"longitude": @(coordinate.longitude), + } + }; +} + +- (void)iconViewInsertSubview:(UIView*)subview atIndex:(NSInteger)atIndex { + if (!_realMarker.iconView) { + _iconView = [[UIView alloc] init]; + _realMarker.iconView = _iconView; + } + [_iconView insertSubview:subview atIndex:atIndex]; +} + +- (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex { + if ([subview isKindOfClass:[AIRGoogleMapCallout class]]) { + self.calloutView = (AIRGoogleMapCallout *)subview; + } else { // a child view of the marker + [self iconViewInsertSubview:(UIView*)subview atIndex:atIndex+1]; + } + AIRDummyView *dummySubview = [[AIRDummyView alloc] initWithView:(UIView *)subview]; + [super insertReactSubview:(UIView*)dummySubview atIndex:atIndex]; +} + +- (void)removeReactSubview:(id)dummySubview { + UIView* subview = ((AIRDummyView*)dummySubview).view; + + if ([subview isKindOfClass:[AIRGoogleMapCallout class]]) { + self.calloutView = nil; + } else { + [(UIView*)subview removeFromSuperview]; + } + [super removeReactSubview:(UIView*)dummySubview]; +} + +- (void)showCalloutView { + [_realMarker.map setSelectedMarker:_realMarker]; +} + +- (void)hideCalloutView { + [_realMarker.map setSelectedMarker:Nil]; +} + +- (void)redraw { + if (!_realMarker.iconView) return; + + BOOL oldValue = _realMarker.tracksViewChanges; + + if (oldValue == YES) + { + // Immediate refresh, like right now. Not waiting for next frame. + UIView *view = _realMarker.iconView; + _realMarker.iconView = nil; + _realMarker.iconView = view; + } + else + { + // Refresh according to docs + _realMarker.tracksViewChanges = YES; + _realMarker.tracksViewChanges = NO; + } +} + +- (UIView *)markerInfoContents { + if (self.calloutView && !self.calloutView.tooltip) { + return self.calloutView; + } + return nil; +} + +- (UIView *)markerInfoWindow { + if (self.calloutView && self.calloutView.tooltip) { + return self.calloutView; + } + return nil; +} + +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker point:(CGPoint)point frame:(CGRect)frame { + if (self.calloutView && self.calloutView.onPress) { + //todo: why not 'callout-press' ? + id event = @{ + @"action": @"marker-overlay-press", + @"id": self.identifier ?: @"unknown", + @"point": @{ + @"x": @(point.x), + @"y": @(point.y), + }, + @"frame": @{ + @"x": @(frame.origin.x), + @"y": @(frame.origin.y), + @"width": @(frame.size.width), + @"height": @(frame.size.height), + } + }; + self.calloutView.onPress(event); + } +} + +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker { + [self didTapInfoWindowOfMarker:marker point:CGPointMake(-1, -1) frame:CGRectZero]; +} + +- (void)didTapInfoWindowOfMarker:(AIRGMSMarker *)marker subview:(AIRGoogleMapCalloutSubview*)subview point:(CGPoint)point frame:(CGRect)frame { + if (subview && subview.onPress) { + //todo: why not 'callout-inside-press' ? + id event = @{ + @"action": @"marker-inside-overlay-press", + @"id": self.identifier ?: @"unknown", + @"point": @{ + @"x": @(point.x), + @"y": @(point.y), + }, + @"frame": @{ + @"x": @(frame.origin.x), + @"y": @(frame.origin.y), + @"width": @(frame.size.width), + @"height": @(frame.size.height), + } + }; + subview.onPress(event); + } else { + [self didTapInfoWindowOfMarker:marker point:point frame:frame]; + } +} + +- (void)didBeginDraggingMarker:(AIRGMSMarker *)marker { + if (!self.onDragStart) return; + self.onDragStart([self eventFromMarker:marker]); +} + +- (void)didEndDraggingMarker:(AIRGMSMarker *)marker { + if (!self.onDragEnd) return; + self.onDragEnd([self eventFromMarker:marker]); +} + +- (void)didDragMarker:(AIRGMSMarker *)marker { + if (!self.onDrag) return; + self.onDrag([self eventFromMarker:marker]); +} + +- (void)setCoordinate:(CLLocationCoordinate2D)coordinate { + _realMarker.position = coordinate; +} + +- (CLLocationCoordinate2D)coordinate { + return _realMarker.position; +} + +- (void)setRotation:(CLLocationDegrees)rotation { + _realMarker.rotation = rotation; +} + +- (CLLocationDegrees)rotation { + return _realMarker.rotation; +} + +- (void)setIdentifier:(NSString *)identifier { + _realMarker.identifier = identifier; +} + +- (NSString *)identifier { + return _realMarker.identifier; +} + +- (void)setOnPress:(RCTBubblingEventBlock)onPress { + _realMarker.onPress = onPress; +} + +- (RCTBubblingEventBlock)onPress { + return _realMarker.onPress; +} + +- (void)setOpacity:(double)opacity +{ + _realMarker.opacity = opacity; +} + +- (void)setImageSrc:(NSString *)imageSrc +{ + _imageSrc = imageSrc; + + if (_reloadImageCancellationBlock) { + _reloadImageCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + + if (!_imageSrc) { + if (_iconImageView) [_iconImageView removeFromSuperview]; + return; + } + + if (!_iconImageView) { + // prevent glitch with marker (cf. https://github.com/react-native-community/react-native-maps/issues/738) + UIImageView *empyImageView = [[UIImageView alloc] init]; + _iconImageView = empyImageView; + [self iconViewInsertSubview:_iconImageView atIndex:0]; + } + + _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:_imageSrc] + size:self.bounds.size + scale:RCTScreenScale() + clipped:YES + resizeMode:RCTResizeModeCenter + progressBlock:nil + partialLoadBlock:nil + completionBlock:^(NSError *error, UIImage *image) { + if (error) { + // TODO(lmr): do something with the error? + NSLog(@"%@", error); + } + dispatch_async(dispatch_get_main_queue(), ^{ + + // TODO(gil): This way allows different image sizes + if (self->_iconImageView) [self->_iconImageView removeFromSuperview]; + + // ... but this way is more efficient? +// if (_iconImageView) { +// [_iconImageView setImage:image]; +// return; +// } + + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + + // TODO: w,h or pixel density could be a prop. + float density = 1; + float w = image.size.width/density; + float h = image.size.height/density; + CGRect bounds = CGRectMake(0, 0, w, h); + + imageView.contentMode = UIViewContentModeScaleAspectFit; + [imageView setFrame:bounds]; + + // NOTE: sizeToFit doesn't work instead. Not sure why. + // TODO: Doing it this way is not ideal because it causes things to reshuffle + // when the image loads IF the image is larger than the UIView. + // Shouldn't required images have size info automatically via RN? + CGRect selfBounds = unionRect(bounds, self.bounds); + [self setFrame:selfBounds]; + + self->_iconImageView = imageView; + [self iconViewInsertSubview:imageView atIndex:0]; + }); + }]; +} + +- (void)setIconSrc:(NSString *)iconSrc +{ + _iconSrc = iconSrc; + + if (_reloadImageCancellationBlock) { + _reloadImageCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + + _reloadImageCancellationBlock = + [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:_iconSrc] + size:self.bounds.size + scale:RCTScreenScale() + clipped:YES + resizeMode:RCTResizeModeCenter + progressBlock:nil + partialLoadBlock:nil + completionBlock:^(NSError *error, UIImage *image) { + if (error) { + // TODO(lmr): do something with the error? + NSLog(@"%@", error); + } + dispatch_async(dispatch_get_main_queue(), ^{ + _realMarker.icon = image; + }); + }]; +} + +- (void)setTitle:(NSString *)title { + _realMarker.title = [title copy]; +} + +- (NSString *)title { + return _realMarker.title; +} + +- (void)setSubtitle:(NSString *)subtitle { + _realMarker.snippet = subtitle; +} + +- (NSString *)subtitle { + return _realMarker.snippet; +} + +- (void)setPinColor:(UIColor *)pinColor { + _pinColor = pinColor; + _realMarker.icon = [GMSMarker markerImageWithColor:pinColor]; +} + +- (void)setAnchor:(CGPoint)anchor { + _anchor = anchor; + _realMarker.groundAnchor = anchor; +} + +- (void)setCalloutAnchor:(CGPoint)calloutAnchor { + _calloutAnchor = calloutAnchor; + _realMarker.infoWindowAnchor = calloutAnchor; +} + + +- (void)setZIndex:(NSInteger)zIndex +{ + _zIndex = zIndex; + _realMarker.zIndex = (int)zIndex; +} + +- (void)setDraggable:(BOOL)draggable { + _realMarker.draggable = draggable; +} + +- (BOOL)draggable { + return _realMarker.draggable; +} + +- (void)setTracksViewChanges:(BOOL)tracksViewChanges { + _realMarker.tracksViewChanges = tracksViewChanges; +} + +- (BOOL)tracksViewChanges { + return _realMarker.tracksViewChanges; +} + +- (void)setTracksInfoWindowChanges:(BOOL)tracksInfoWindowChanges { + _realMarker.tracksInfoWindowChanges = tracksInfoWindowChanges; +} + +- (BOOL)tracksInfoWindowChanges { + return _realMarker.tracksInfoWindowChanges; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.h new file mode 100644 index 0000000..ea52ccd --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.h @@ -0,0 +1,16 @@ +// +// AIRGoogleMapMarkerManager.h +// AirMaps +// +// Created by Gil Birman on 9/2/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapMarkerManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.m new file mode 100644 index 0000000..f97a9b1 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.m @@ -0,0 +1,113 @@ +// +// AIRGoogleMapMarkerManager.m +// AirMaps +// +// Created by Gil Birman on 9/2/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapMarkerManager.h" +#import "AIRGoogleMapMarker.h" +#import +#import +#import "RCTConvert+AirMap.h" + +@implementation AIRGoogleMapMarkerManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapMarker *marker = [AIRGoogleMapMarker new]; +// UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTap:)]; +// // setting this to NO allows the parent MapView to continue receiving marker selection events +// tapGestureRecognizer.cancelsTouchesInView = NO; +// [marker addGestureRecognizer:tapGestureRecognizer]; + marker.bridge = self.bridge; + marker.isAccessibilityElement = YES; + marker.accessibilityElementsHidden = NO; + return marker; +} + +RCT_EXPORT_VIEW_PROPERTY(identifier, NSString) +RCT_EXPORT_VIEW_PROPERTY(coordinate, CLLocationCoordinate2D) +RCT_EXPORT_VIEW_PROPERTY(rotation, CLLocationDegrees) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString) +RCT_REMAP_VIEW_PROPERTY(icon, iconSrc, NSString) +RCT_EXPORT_VIEW_PROPERTY(title, NSString) +RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString) +RCT_REMAP_VIEW_PROPERTY(description, subtitle, NSString) +RCT_EXPORT_VIEW_PROPERTY(pinColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(anchor, CGPoint) +RCT_EXPORT_VIEW_PROPERTY(calloutAnchor, CGPoint) +RCT_EXPORT_VIEW_PROPERTY(zIndex, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(draggable, BOOL) +RCT_EXPORT_VIEW_PROPERTY(tracksViewChanges, BOOL) +RCT_EXPORT_VIEW_PROPERTY(tracksInfoWindowChanges, BOOL) +RCT_EXPORT_VIEW_PROPERTY(opacity, double) +RCT_EXPORT_VIEW_PROPERTY(onDragStart, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDrag, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTDirectEventBlock) + +RCT_EXPORT_METHOD(showCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [(AIRGoogleMapMarker *) view showCalloutView]; + } + }]; +} + +RCT_EXPORT_METHOD(hideCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [(AIRGoogleMapMarker *) view hideCalloutView]; + } + }]; +} + +RCT_EXPORT_METHOD(redrawCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRGoogleMapMarker* marker = (AIRGoogleMapMarker *) view; + + [NSTimer scheduledTimerWithTimeInterval:0.0 + target:[NSBlockOperation blockOperationWithBlock:^{ + [marker hideCalloutView]; + [marker showCalloutView]; + }] + selector:@selector(main) + userInfo:nil + repeats:NO + ]; + } + }]; +} + +RCT_EXPORT_METHOD(redraw:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRGoogleMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [(AIRGoogleMapMarker *) view redraw]; + } + }]; +} +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.h b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.h new file mode 100644 index 0000000..0fd00eb --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.h @@ -0,0 +1,27 @@ +// +// AIRGoogleMapOverlay.h +// +// Created by Taro Matsuzawa on 5/3/17. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRGoogleMap.h" + +@interface AIRGoogleMapOverlay : UIView + +@property (nonatomic, strong) GMSGroundOverlay *overlay; +@property (nonatomic, copy) NSString *imageSrc; +@property (nonatomic, strong, readonly) UIImage *overlayImage; +@property (nonatomic, copy) NSArray *boundsRect; +@property (nonatomic, readonly) GMSCoordinateBounds *overlayBounds; + +@property (nonatomic, weak) RCTBridge *bridge; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.m b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.m new file mode 100644 index 0000000..20dba83 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlay.m @@ -0,0 +1,80 @@ +// +// AIRGoogleMapOverlay.m +// Created by Nick Italiano on 3/5/17. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapOverlay.h" + +#import +#import +#import +#import + +@interface AIRGoogleMapOverlay() + @property (nonatomic, strong, readwrite) UIImage *overlayImage; + @property (nonatomic, readwrite) GMSCoordinateBounds *overlayBounds; +@end + +@implementation AIRGoogleMapOverlay { + RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; + CLLocationCoordinate2D _southWest; + CLLocationCoordinate2D _northEast; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _overlay = [[GMSGroundOverlay alloc] init]; + } + return self; +} + +- (void)setImageSrc:(NSString *)imageSrc +{ + NSLog(@">>> SET IMAGESRC: %@", imageSrc); + _imageSrc = imageSrc; + + if (_reloadImageCancellationBlock) { + _reloadImageCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + + __weak typeof(self) weakSelf = self; + _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:_imageSrc] + size:weakSelf.bounds.size + scale:RCTScreenScale() + clipped:YES + resizeMode:RCTResizeModeCenter + progressBlock:nil + partialLoadBlock:nil + completionBlock:^(NSError *error, UIImage *image) { + if (error) { + NSLog(@"%@", error); + } + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@">>> IMAGE: %@", image); + weakSelf.overlayImage = image; + weakSelf.overlay.icon = image; + }); + }]; + +} + +- (void)setBoundsRect:(NSArray *)boundsRect +{ + _boundsRect = boundsRect; + + _southWest = CLLocationCoordinate2DMake([boundsRect[1][0] doubleValue], [boundsRect[0][1] doubleValue]); + _northEast = CLLocationCoordinate2DMake([boundsRect[0][0] doubleValue], [boundsRect[1][1] doubleValue]); + + _overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:_southWest + coordinate:_northEast]; + + _overlay.bounds = _overlayBounds; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.h new file mode 100644 index 0000000..6d692c5 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.h @@ -0,0 +1,10 @@ +// +// AIRGoogleMapOverlayManager.h +// Created by Taro Matsuzawa on 3/5/17. +// + +#import +#import + +@interface AIRGoogleMapOverlayManager : RCTViewManager +@end diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.m new file mode 100644 index 0000000..12b29e7 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapOverlayManager.m @@ -0,0 +1,22 @@ +#import "AIRGoogleMapOverlayManager.h" +#import "AIRGoogleMapOverlay.h" + +@interface AIRGoogleMapOverlayManager() + +@end + +@implementation AIRGoogleMapOverlayManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapOverlay *overlay = [AIRGoogleMapOverlay new]; + overlay.bridge = self.bridge; + return overlay; +} + +RCT_REMAP_VIEW_PROPERTY(bounds, boundsRect, NSArray) +RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString) + +@end diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.h b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.h new file mode 100644 index 0000000..214e50f --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.h @@ -0,0 +1,32 @@ +// +// AIRGoogleMapPolygon.h +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import +#import "AIRGMSPolygon.h" +#import "AIRMapCoordinate.h" + +@interface AIRGoogleMapPolygon : UIView + +@property (nonatomic, weak) RCTBridge *bridge; +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, strong) AIRGMSPolygon *polygon; +@property (nonatomic, strong) NSArray *coordinates; +@property (nonatomic, strong) NSArray *> *holes; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; + +@property (nonatomic, assign) UIColor *fillColor; +@property (nonatomic, assign) double strokeWidth; +@property (nonatomic, assign) UIColor *strokeColor; +@property (nonatomic, assign) BOOL geodesic; +@property (nonatomic, assign) int zIndex; +@property (nonatomic, assign) BOOL tappable; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.m b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.m new file mode 100644 index 0000000..6d162a7 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygon.m @@ -0,0 +1,100 @@ +// +// AIRGoogleMapPolygon.m +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapPolygon.h" +#import "AIRGMSPolygon.h" +#import + +@implementation AIRGoogleMapPolygon + +- (instancetype)init +{ + if (self = [super init]) { + _polygon = [[AIRGMSPolygon alloc] init]; + } + + return self; +} + +- (void)setCoordinates:(NSArray *)coordinates +{ + _coordinates = coordinates; + + GMSMutablePath *path = [GMSMutablePath path]; + for(int i = 0; i < coordinates.count; i++) + { + [path addCoordinate:coordinates[i].coordinate]; + } + + _polygon.path = path; +} + +- (void)setHoles:(NSArray *> *)holes +{ + _holes = holes; + + if (holes.count) + { + NSMutableArray *interiorPolygons = [NSMutableArray array]; + for(int h = 0; h < holes.count; h++) + { + GMSMutablePath *path = [GMSMutablePath path]; + for(int i = 0; i < holes[h].count; i++) + { + [path addCoordinate:holes[h][i].coordinate]; + } + [interiorPolygons addObject:path]; + } + + _polygon.holes = interiorPolygons; + } +} + +-(void)setFillColor:(UIColor *)fillColor +{ + _fillColor = fillColor; + _polygon.fillColor = fillColor; +} + +-(void)setStrokeWidth:(double)strokeWidth +{ + _strokeWidth = strokeWidth; + _polygon.strokeWidth = strokeWidth; +} + +-(void)setStrokeColor:(UIColor *) strokeColor +{ + _strokeColor = strokeColor; + _polygon.strokeColor = strokeColor; +} + +-(void)setGeodesic:(BOOL)geodesic +{ + _geodesic = geodesic; + _polygon.geodesic = geodesic; +} + +-(void)setZIndex:(int)zIndex +{ + _zIndex = zIndex; + _polygon.zIndex = zIndex; +} + +-(void)setTappable:(BOOL)tappable +{ + _tappable = tappable; + _polygon.tappable = tappable; +} + +- (void)setOnPress:(RCTBubblingEventBlock)onPress { + _polygon.onPress = onPress; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.h new file mode 100644 index 0000000..89175e7 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.h @@ -0,0 +1,15 @@ +// +// AIRGoogleMapPolylgoneManager.h +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapPolygonManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.m new file mode 100644 index 0000000..7e4e152 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.m @@ -0,0 +1,46 @@ +// +// AIRGoogleMapPolylgoneManager.m +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS +#import "AIRGoogleMapPolygonManager.h" + +#import +#import +#import +#import +#import +#import +#import "RCTConvert+AirMap.h" +#import "AIRGoogleMapPolygon.h" + +@interface AIRGoogleMapPolygonManager() + +@end + +@implementation AIRGoogleMapPolygonManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapPolygon *polygon = [AIRGoogleMapPolygon new]; + polygon.bridge = self.bridge; + return polygon; +} + +RCT_EXPORT_VIEW_PROPERTY(coordinates, AIRMapCoordinateArray) +RCT_EXPORT_VIEW_PROPERTY(holes, AIRMapCoordinateArrayArray) +RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, double) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(geodesic, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zIndex, int) +RCT_EXPORT_VIEW_PROPERTY(tappable, BOOL) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.h b/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.h new file mode 100644 index 0000000..9524e08 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.h @@ -0,0 +1,34 @@ +// +// AIRGoogleMapPolyline.h +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS +#import +#import +#import +#import "AIRGMSPolyline.h" +#import "AIRMapCoordinate.h" +#import "AIRGoogleMapMarker.h" + +@interface AIRGoogleMapPolyline : UIView + +@property (nonatomic, weak) RCTBridge *bridge; +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, strong) AIRGMSPolyline *polyline; +@property (nonatomic, strong) NSArray *coordinates; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; + +@property (nonatomic, strong) UIColor *strokeColor; +@property (nonatomic, assign) double strokeWidth; +@property (nonatomic, assign) UIColor *fillColor; +@property (nonatomic, strong) NSArray *lineDashPattern; +@property (nonatomic, assign) BOOL geodesic; +@property (nonatomic, assign) NSString *title; +@property (nonatomic, assign) int zIndex; +@property (nonatomic, assign) BOOL tappable; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.m b/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.m new file mode 100644 index 0000000..eca6bf0 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolyline.m @@ -0,0 +1,115 @@ +// +// AIRGoogleMapPolyline.m +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS +#import +#import "AIRGoogleMapPolyline.h" +#import "AIRGMSPolyline.h" +#import "AIRMapCoordinate.h" +#import "AIRGoogleMapMarker.h" +#import "AIRGoogleMapMarkerManager.h" +#import +#import + +@implementation AIRGoogleMapPolyline + +- (instancetype)init +{ + if (self = [super init]) { + _polyline = [[AIRGMSPolyline alloc] init]; + } + return self; +} + +-(void)setCoordinates:(NSArray *)coordinates +{ + _coordinates = coordinates; + + GMSMutablePath *path = [GMSMutablePath path]; + for(int i = 0; i < coordinates.count; i++) + { + [path addCoordinate:coordinates[i].coordinate]; + } + + _polyline.path = path; + + [self configureStyleSpansIfNeeded]; +} + +-(void)setStrokeColor:(UIColor *)strokeColor +{ + _strokeColor = strokeColor; + _polyline.strokeColor = strokeColor; + [self configureStyleSpansIfNeeded]; +} + +-(void)setStrokeWidth:(double)strokeWidth +{ + _strokeWidth = strokeWidth; + _polyline.strokeWidth = strokeWidth; +} + +-(void)setFillColor:(UIColor *)fillColor +{ + _fillColor = fillColor; + _polyline.spans = @[[GMSStyleSpan spanWithColor:fillColor]]; +} + +- (void)setLineDashPattern:(NSArray *)lineDashPattern { + _lineDashPattern = lineDashPattern; + [self configureStyleSpansIfNeeded]; +} + +-(void)setGeodesic:(BOOL)geodesic +{ + _geodesic = geodesic; + _polyline.geodesic = geodesic; +} + +-(void)setTitle:(NSString *)title +{ + _title = title; + _polyline.title = _title; +} + +-(void) setZIndex:(int)zIndex +{ + _zIndex = zIndex; + _polyline.zIndex = zIndex; +} + +-(void)setTappable:(BOOL)tappable +{ + _tappable = tappable; + _polyline.tappable = tappable; +} + +- (void)setOnPress:(RCTBubblingEventBlock)onPress { + _polyline.onPress = onPress; +} + +- (void)configureStyleSpansIfNeeded { + if (!_strokeColor || !_lineDashPattern || !_polyline.path) { + return; + } + + BOOL isLine = YES; + NSMutableArray *styles = [[NSMutableArray alloc] init]; + for (NSInteger i = 0; i < _lineDashPattern.count; i++) { + if (isLine) { + [styles addObject:[GMSStrokeStyle solidColor:_strokeColor]]; + } else { + [styles addObject:[GMSStrokeStyle solidColor:[UIColor clearColor]]]; + } + isLine = !isLine; + } + + _polyline.spans = GMSStyleSpans(_polyline.path, styles, _lineDashPattern, kGMSLengthRhumb); +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.h new file mode 100644 index 0000000..7657967 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.h @@ -0,0 +1,15 @@ +// +// AIRGoogleMapPolylineManager.h +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import + +@interface AIRGoogleMapPolylineManager : RCTViewManager + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.m new file mode 100644 index 0000000..3ec4718 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.m @@ -0,0 +1,47 @@ +// +// AIRGoogleMapPolylineManager.m +// +// Created by Nick Italiano on 10/22/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapPolylineManager.h" + +#import +#import +#import +#import +#import +#import +#import "RCTConvert+AirMap.h" +#import "AIRGoogleMapPolyline.h" + +@interface AIRGoogleMapPolylineManager() + +@end + +@implementation AIRGoogleMapPolylineManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapPolyline *polyline = [AIRGoogleMapPolyline new]; + polyline.bridge = self.bridge; + return polyline; +} + +RCT_EXPORT_VIEW_PROPERTY(coordinates, AIRMapCoordinateArray) +RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, double) +RCT_EXPORT_VIEW_PROPERTY(lineDashPattern, NSArray) +RCT_EXPORT_VIEW_PROPERTY(geodesic, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zIndex, int) +RCT_EXPORT_VIEW_PROPERTY(tappable, BOOL) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapURLTileManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapURLTileManager.m new file mode 100644 index 0000000..ee501d8 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapURLTileManager.m @@ -0,0 +1,33 @@ +// +// AIRGoogleMapURLTileManager.m +// Created by Nick Italiano on 11/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapUrlTileManager.h" +#import "AIRGoogleMapUrlTile.h" + +@interface AIRGoogleMapUrlTileManager() + +@end + +@implementation AIRGoogleMapUrlTileManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapUrlTile *tileLayer = [AIRGoogleMapUrlTile new]; + return tileLayer; +} + +RCT_EXPORT_VIEW_PROPERTY(urlTemplate, NSString) +RCT_EXPORT_VIEW_PROPERTY(zIndex, int) +RCT_EXPORT_VIEW_PROPERTY(maximumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(minimumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(flipY, BOOL) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.h b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.h new file mode 100644 index 0000000..05b2afd --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.h @@ -0,0 +1,22 @@ +// +// AIRGoogleMapURLTile.h +// Created by Nick Italiano on 11/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface AIRGoogleMapUrlTile : UIView + +@property (nonatomic, strong) GMSURLTileLayer *tileLayer; +@property (nonatomic, assign) NSString *urlTemplate; +@property (nonatomic, assign) int zIndex; +@property NSInteger *maximumZ; +@property NSInteger *minimumZ; +@property BOOL flipY; + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.m b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.m new file mode 100644 index 0000000..c9beb39 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTile.m @@ -0,0 +1,56 @@ +// +// AIRGoogleMapURLTile.m +// Created by Nick Italiano on 11/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapUrlTile.h" + +@implementation AIRGoogleMapUrlTile + +- (void)setZIndex:(int)zIndex +{ + _zIndex = zIndex; + _tileLayer.zIndex = zIndex; +} + +- (void)setUrlTemplate:(NSString *)urlTemplate +{ + _urlTemplate = urlTemplate; + _tileLayer = [GMSURLTileLayer tileLayerWithURLConstructor:[self _getTileURLConstructor]]; + _tileLayer.tileSize = [[UIScreen mainScreen] scale] * 256; +} + +- (GMSTileURLConstructor)_getTileURLConstructor +{ + NSString *urlTemplate = self.urlTemplate; + NSInteger *maximumZ = self.maximumZ; + NSInteger *minimumZ = self.minimumZ; + GMSTileURLConstructor urls = ^NSURL* _Nullable (NSUInteger x, NSUInteger y, NSUInteger zoom) { + + if (self.flipY == YES) { + y = (1 << zoom) - y - 1; + } + + NSString *url = urlTemplate; + url = [url stringByReplacingOccurrencesOfString:@"{x}" withString:[NSString stringWithFormat: @"%ld", (long)x]]; + url = [url stringByReplacingOccurrencesOfString:@"{y}" withString:[NSString stringWithFormat: @"%ld", (long)y]]; + url = [url stringByReplacingOccurrencesOfString:@"{z}" withString:[NSString stringWithFormat: @"%ld", (long)zoom]]; + + if(maximumZ && (long)zoom > (long)maximumZ) { + return nil; + } + + if(minimumZ && (long)zoom < (long)minimumZ) { + return nil; + } + + return [NSURL URLWithString:url]; + }; + return urls; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTileManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTileManager.h new file mode 100644 index 0000000..cf4fd62 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapUrlTileManager.h @@ -0,0 +1,14 @@ +// +// AIRGoogleMapURLTileManager.h +// Created by Nick Italiano on 11/5/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface AIRGoogleMapUrlTileManager : RCTViewManager +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.h b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.h new file mode 100644 index 0000000..ad2acb5 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.h @@ -0,0 +1,33 @@ +// +// AIRGoogleMapWMSTile.h +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface WMSTileOverlay : GMSSyncTileLayer +@property (nonatomic) double MapX,MapY,FULL; +@property (nonatomic, strong) NSString *template; +@property (nonatomic, assign) NSInteger maximumZ; +@property (nonatomic, assign) NSInteger minimumZ; +@end + +@interface AIRGoogleMapWMSTile : UIView +@property (nonatomic, strong) WMSTileOverlay *tileLayer; +@property (nonatomic, assign) NSString *urlTemplate; +@property (nonatomic, assign) int zIndex; +@property (nonatomic, assign) NSInteger maximumZ; +@property (nonatomic, assign) NSInteger minimumZ; +@property (nonatomic, assign) NSInteger tileSize; +@property (nonatomic, assign) float opacity; +@end + +#endif + + diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.m b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.m new file mode 100644 index 0000000..ce1111e --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTile.m @@ -0,0 +1,125 @@ +// +// AIRGoogleMapWMSTile.m +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapWMSTile.h" + +@implementation AIRGoogleMapWMSTile + +-(id) init +{ + self = [super init]; + _opacity = 1; + return self ; +} + +- (void)setZIndex:(int)zIndex +{ + _zIndex = zIndex; + _tileLayer.zIndex = zIndex; +} +- (void)setTileSize:(NSInteger)tileSize +{ + _tileSize = tileSize; + if(self.tileLayer) { + self.tileLayer.tileSize = tileSize; + [self.tileLayer clearTileCache]; + } +} +- (void)setMinimumZ:(NSInteger)minimumZ +{ + _minimumZ = minimumZ; + if(self.tileLayer && _minimumZ) { + [self.tileLayer setMinimumZ: _minimumZ ]; + [self.tileLayer clearTileCache]; + } +} + +- (void)setMaximumZ:(NSInteger)maximumZ +{ + _maximumZ = maximumZ; + if(self.tileLayer && maximumZ) { + [self.tileLayer setMaximumZ: _maximumZ ]; + [self.tileLayer clearTileCache]; + } +} +- (void)setOpacity:(float)opacity +{ + _opacity = opacity; + if(self.tileLayer ) { + [self.tileLayer setOpacity:opacity]; + [self.tileLayer clearTileCache]; + } +} + +- (void)setUrlTemplate:(NSString *)urlTemplate +{ + _urlTemplate = urlTemplate; + WMSTileOverlay *tile = [[WMSTileOverlay alloc] init]; + [tile setTemplate:urlTemplate]; + [tile setMaximumZ: _maximumZ]; + [tile setMinimumZ: _minimumZ]; + [tile setOpacity: _opacity]; + [tile setTileSize: _tileSize]; + [tile setZIndex: _zIndex]; + _tileLayer = tile; +} +@end + +@implementation WMSTileOverlay +-(id) init +{ + self = [super init]; + _MapX = -20037508.34789244; + _MapY = 20037508.34789244; + _FULL = 20037508.34789244 * 2; + return self ; +} + +-(NSArray *)getBoundBox:(NSInteger)x yAxis:(NSInteger)y zoom:(NSInteger)zoom +{ + double tile = _FULL / pow(2.0, (double)zoom); + NSArray *result =[[NSArray alloc] initWithObjects: + [NSNumber numberWithDouble:_MapX + (double)x * tile ], + [NSNumber numberWithDouble:_MapY - (double)(y+1) * tile ], + [NSNumber numberWithDouble:_MapX + (double)(x+1) * tile ], + [NSNumber numberWithDouble:_MapY - (double)y * tile ], + nil]; + + return result; + +} + +- (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom +{ + NSInteger maximumZ = self.maximumZ; + NSInteger minimumZ = self.minimumZ; + if(maximumZ && (long)zoom > (long)maximumZ) { + return nil; + } + if(minimumZ && (long)zoom < (long)minimumZ) { + return nil; + } + NSArray *bb = [self getBoundBox:x yAxis:y zoom:zoom]; + NSMutableString *url = [self.template mutableCopy]; + [url replaceOccurrencesOfString: @"{minX}" withString:[NSString stringWithFormat:@"%@", bb[0]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{minY}" withString:[NSString stringWithFormat:@"%@", bb[1]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{maxX}" withString:[NSString stringWithFormat:@"%@", bb[2]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{maxY}" withString:[NSString stringWithFormat:@"%@", bb[3]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{width}" withString:[NSString stringWithFormat:@"%d", (int)self.tileSize] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{height}" withString:[NSString stringWithFormat:@"%d", (int)self.tileSize] options:0 range:NSMakeRange(0, url.length)]; + NSURL *uri = [NSURL URLWithString:url]; + NSData *data = [NSData dataWithContentsOfURL:uri]; + UIImage *img = [[UIImage alloc] initWithData:data]; + return img; +} + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.h b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.h new file mode 100644 index 0000000..7401533 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.h @@ -0,0 +1,17 @@ +// +// AIRGoogleMapWMSTileManager.h +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import + +@interface AIRGoogleMapWMSTileManager : RCTViewManager +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.m b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.m new file mode 100644 index 0000000..c2f6685 --- /dev/null +++ b/lib/ios/AirGoogleMaps/AIRGoogleMapWMSTileManager.m @@ -0,0 +1,37 @@ +// +// AIRGoogleMapWMSTileManager.m +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "AIRGoogleMapWMSTileManager.h" +#import "AIRGoogleMapWMSTile.h" + +@interface AIRGoogleMapWMSTileManager() + +@end + +@implementation AIRGoogleMapWMSTileManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRGoogleMapWMSTile *tileLayer = [AIRGoogleMapWMSTile new]; + return tileLayer; +} + +RCT_EXPORT_VIEW_PROPERTY(urlTemplate, NSString) +RCT_EXPORT_VIEW_PROPERTY(zIndex, int) +RCT_EXPORT_VIEW_PROPERTY(maximumZ, int) +RCT_EXPORT_VIEW_PROPERTY(minimumZ, int) +RCT_EXPORT_VIEW_PROPERTY(tileSize, int) +RCT_EXPORT_VIEW_PROPERTY(opacity, float) + +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.h b/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.h new file mode 100644 index 0000000..9926e9d --- /dev/null +++ b/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.h @@ -0,0 +1,17 @@ +// +// RCTConvert+GMSMapViewType.h +// +// Created by Nick Italiano on 10/23/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import +#import +#import + +@interface RCTConvert (GMSMapViewType) ++ (GMSCameraPosition*)GMSCameraPositionWithDefaults:(id)json existingCamera:(GMSCameraPosition*)existingCamera; +@end + +#endif diff --git a/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.m b/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.m new file mode 100644 index 0000000..e768807 --- /dev/null +++ b/lib/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.m @@ -0,0 +1,79 @@ +// +// RCTConvert+GMSMapViewType.m +// +// Created by Nick Italiano on 10/23/16. +// + +#ifdef HAVE_GOOGLE_MAPS + +#import "RCTConvert+GMSMapViewType.h" +#import +#import +#import + +@implementation RCTConvert (GMSMapViewType) + RCT_ENUM_CONVERTER(GMSMapViewType, + ( + @{ + @"standard": @(kGMSTypeNormal), + @"satellite": @(kGMSTypeSatellite), + @"hybrid": @(kGMSTypeHybrid), + @"terrain": @(kGMSTypeTerrain), + @"none": @(kGMSTypeNone) + } + ), kGMSTypeTerrain, intValue) + + ++ (GMSCameraPosition*)GMSCameraPosition:(id)json +{ + json = [self NSDictionary:json]; + return [RCTConvert GMSCameraPositionWithDefaults:json existingCamera:nil]; +} + ++ (GMSCameraPosition*)GMSCameraPositionWithDefaults:(id)json existingCamera:(GMSCameraPosition*)existingCamera +{ + CLLocationDegrees latitude = 0; + CLLocationDegrees longitude = 0; + double viewingAngle = 0; + double zoom = 0; + double bearing = 0; + + if (existingCamera != nil) { + viewingAngle = existingCamera.viewingAngle; + latitude = existingCamera.target.latitude; + longitude = existingCamera.target.longitude; + zoom = existingCamera.zoom; + bearing = existingCamera.bearing; + } + + if (json[@"center"]) { + CLLocationCoordinate2D target = [self CLLocationCoordinate2D:json[@"center"]]; + latitude = target.latitude; + longitude = target.longitude; + } + + if (json[@"pitch"]) { + viewingAngle = [self double:json[@"pitch"]]; + } + + // zoomAtCoordinate:forMeters:perPoints is offered by the SDK, which would allow + // us to support the "altitude" property of the camera as an alternative to "zoom". + // However, I am not clear on what the "perPoints" argument does... + if (json[@"zoom"]) { + zoom = [self double:json[@"zoom"]]; + } + + if (json[@"heading"]) { + bearing = [self double:json[@"heading"]]; + } + + return [GMSCameraPosition cameraWithLatitude:latitude + longitude:longitude + zoom:zoom + bearing:bearing + viewingAngle:viewingAngle]; +} + +@end + +#endif diff --git a/lib/ios/AirMaps.xcodeproj/project.pbxproj b/lib/ios/AirMaps.xcodeproj/project.pbxproj new file mode 100644 index 0000000..18e9003 --- /dev/null +++ b/lib/ios/AirMaps.xcodeproj/project.pbxproj @@ -0,0 +1,581 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1125B2DA1C4AD3DA007D0023 /* AIRMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2BE1C4AD3DA007D0023 /* AIRMap.m */; }; + 1125B2DB1C4AD3DA007D0023 /* AIRMapCallout.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2C01C4AD3DA007D0023 /* AIRMapCallout.m */; }; + 1125B2DC1C4AD3DA007D0023 /* AIRMapCalloutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2C21C4AD3DA007D0023 /* AIRMapCalloutManager.m */; }; + 1125B2DD1C4AD3DA007D0023 /* AIRMapCircle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2C41C4AD3DA007D0023 /* AIRMapCircle.m */; }; + 1125B2DE1C4AD3DA007D0023 /* AIRMapCircleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2C61C4AD3DA007D0023 /* AIRMapCircleManager.m */; }; + 1125B2DF1C4AD3DA007D0023 /* AIRMapCoordinate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2C81C4AD3DA007D0023 /* AIRMapCoordinate.m */; }; + 1125B2E01C4AD3DA007D0023 /* AIRMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2CA1C4AD3DA007D0023 /* AIRMapManager.m */; }; + 1125B2E11C4AD3DA007D0023 /* AIRMapMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2CC1C4AD3DA007D0023 /* AIRMapMarker.m */; }; + 1125B2E21C4AD3DA007D0023 /* AIRMapMarkerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2CE1C4AD3DA007D0023 /* AIRMapMarkerManager.m */; }; + 1125B2E31C4AD3DA007D0023 /* AIRMapPolygon.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2D01C4AD3DA007D0023 /* AIRMapPolygon.m */; }; + 1125B2E41C4AD3DA007D0023 /* AIRMapPolygonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2D21C4AD3DA007D0023 /* AIRMapPolygonManager.m */; }; + 1125B2E51C4AD3DA007D0023 /* AIRMapPolyline.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2D41C4AD3DA007D0023 /* AIRMapPolyline.m */; }; + 1125B2E61C4AD3DA007D0023 /* AIRMapPolylineManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2D61C4AD3DA007D0023 /* AIRMapPolylineManager.m */; }; + 1125B2F21C4AD445007D0023 /* SMCalloutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125B2F11C4AD445007D0023 /* SMCalloutView.m */; }; + 19DABC7F1E7C9D3C00F41150 /* RCTConvert+AirMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 19DABC7E1E7C9D3C00F41150 /* RCTConvert+AirMap.m */; }; + 2163AA501FEAEDD100BBEC95 /* AIRMapPolylineRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2163AA4F1FEAEDD100BBEC95 /* AIRMapPolylineRenderer.m */; }; + 4C99C9DE2226CF2800A8693E /* AIRWeakTimerReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C99C9DD2226CF2800A8693E /* AIRWeakTimerReference.m */; }; + 4C99C9E12226D8C400A8693E /* AIRWeakMapReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C99C9E02226D8C400A8693E /* AIRWeakMapReference.m */; }; + 53D31636202E723B00B55447 /* AIRMapOverlayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D31635202E723B00B55447 /* AIRMapOverlayManager.m */; }; + 53D3163A202E72FC00B55447 /* AIRMapOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D31639202E72FC00B55447 /* AIRMapOverlay.m */; }; + 53D3163D202E734F00B55447 /* AIRMapOverlayRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D3163C202E734F00B55447 /* AIRMapOverlayRenderer.m */; }; + 628F81201FD16DF80058313A /* AIRMapLocalTile.m in Sources */ = {isa = PBXBuildFile; fileRef = 628F811F1FD16DF80058313A /* AIRMapLocalTile.m */; }; + 628F81231FD16EFA0058313A /* AIRMapLocalTileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 628F81221FD16EFA0058313A /* AIRMapLocalTileManager.m */; }; + 62AEC4D41FD5A0AA003225E0 /* AIRMapLocalTileOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AEC4D31FD5A0AA003225E0 /* AIRMapLocalTileOverlay.m */; }; + 8B19A3C82257BBDF00BB8735 /* AIRMapCalloutSubview.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B19A3C42257BBDE00BB8735 /* AIRMapCalloutSubview.m */; }; + 8B19A3C92257BBDF00BB8735 /* AIRMapCalloutSubviewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B19A3C72257BBDF00BB8735 /* AIRMapCalloutSubviewManager.m */; }; + 8BC85FB02107CFEC0006CEA5 /* AIRGoogleMapOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BC85FAF2107CFEC0006CEA5 /* AIRGoogleMapOverlay.m */; }; + 9B9498CA2017EFB800158761 /* AIRGoogleMapUrlTile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498A62017EFB400158761 /* AIRGoogleMapUrlTile.m */; }; + 9B9498CB2017EFB800158761 /* AIRGoogleMapURLTileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498A72017EFB400158761 /* AIRGoogleMapURLTileManager.m */; }; + 9B9498CC2017EFB800158761 /* AIRGMSPolygon.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498A82017EFB400158761 /* AIRGMSPolygon.m */; }; + 9B9498CD2017EFB800158761 /* AIRGoogleMapCallout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498AC2017EFB400158761 /* AIRGoogleMapCallout.m */; }; + 9B9498CE2017EFB800158761 /* AIRGMSMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498AE2017EFB500158761 /* AIRGMSMarker.m */; }; + 9B9498CF2017EFB800158761 /* AIRGMSPolyline.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498AF2017EFB500158761 /* AIRGMSPolyline.m */; }; + 9B9498D02017EFB800158761 /* AIRGoogleMapPolylineManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498B12017EFB500158761 /* AIRGoogleMapPolylineManager.m */; }; + 9B9498D12017EFB800158761 /* AIRGoogleMapCircle.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498B32017EFB500158761 /* AIRGoogleMapCircle.m */; }; + 9B9498D22017EFB800158761 /* AIRGoogleMapMarkerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498B52017EFB500158761 /* AIRGoogleMapMarkerManager.m */; }; + 9B9498D32017EFB800158761 /* AIRGoogleMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498B72017EFB500158761 /* AIRGoogleMap.m */; }; + 9B9498D42017EFB800158761 /* RCTConvert+GMSMapViewType.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498B92017EFB600158761 /* RCTConvert+GMSMapViewType.m */; }; + 9B9498D52017EFB800158761 /* AIRGoogleMapPolyline.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498BB2017EFB600158761 /* AIRGoogleMapPolyline.m */; }; + 9B9498D62017EFB800158761 /* AIRGoogleMapCircleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498BC2017EFB600158761 /* AIRGoogleMapCircleManager.m */; }; + 9B9498D72017EFB800158761 /* AIRGoogleMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498BD2017EFB600158761 /* AIRGoogleMapManager.m */; }; + 9B9498D92017EFB800158761 /* AIRGoogleMapCalloutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498C42017EFB700158761 /* AIRGoogleMapCalloutManager.m */; }; + 9B9498DA2017EFB800158761 /* AIRGoogleMapPolygon.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498C62017EFB800158761 /* AIRGoogleMapPolygon.m */; }; + 9B9498DB2017EFB800158761 /* AIRGoogleMapMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498C72017EFB800158761 /* AIRGoogleMapMarker.m */; }; + 9B9498DC2017EFB800158761 /* AIRGoogleMapPolygonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9498C92017EFB800158761 /* AIRGoogleMapPolygonManager.m */; }; + A8494E28218891020092506D /* AIRMapWMSTileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A8494E24218891020092506D /* AIRMapWMSTileManager.m */; }; + A8494E29218891020092506D /* AIRMapWMSTile.m in Sources */ = {isa = PBXBuildFile; fileRef = A8494E27218891020092506D /* AIRMapWMSTile.m */; }; + A8494E2E218891180092506D /* AIRGoogleMapWMSTileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A8494E2A218891180092506D /* AIRGoogleMapWMSTileManager.m */; }; + A8494E2F218891180092506D /* AIRGoogleMapWMSTile.m in Sources */ = {isa = PBXBuildFile; fileRef = A8494E2D218891180092506D /* AIRGoogleMapWMSTile.m */; }; + B5EA3BA92098E22B000E7AFD /* AIRDummyView.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EA3BA72098E22B000E7AFD /* AIRDummyView.m */; }; + DA6C26381C9E2AFE0035349F /* AIRMapUrlTile.m in Sources */ = {isa = PBXBuildFile; fileRef = DA6C26371C9E2AFE0035349F /* AIRMapUrlTile.m */; }; + DA6C263E1C9E324A0035349F /* AIRMapUrlTileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DA6C263D1C9E324A0035349F /* AIRMapUrlTileManager.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 11FA5C4F1C4A1296003AC2EE /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1125B2BD1C4AD3DA007D0023 /* AIRMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMap.h; path = AirMaps/AIRMap.h; sourceTree = SOURCE_ROOT; }; + 1125B2BE1C4AD3DA007D0023 /* AIRMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMap.m; path = AirMaps/AIRMap.m; sourceTree = SOURCE_ROOT; }; + 1125B2BF1C4AD3DA007D0023 /* AIRMapCallout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapCallout.h; path = AirMaps/AIRMapCallout.h; sourceTree = SOURCE_ROOT; }; + 1125B2C01C4AD3DA007D0023 /* AIRMapCallout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapCallout.m; path = AirMaps/AIRMapCallout.m; sourceTree = SOURCE_ROOT; }; + 1125B2C11C4AD3DA007D0023 /* AIRMapCalloutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapCalloutManager.h; path = AirMaps/AIRMapCalloutManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2C21C4AD3DA007D0023 /* AIRMapCalloutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapCalloutManager.m; path = AirMaps/AIRMapCalloutManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2C31C4AD3DA007D0023 /* AIRMapCircle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapCircle.h; path = AirMaps/AIRMapCircle.h; sourceTree = SOURCE_ROOT; }; + 1125B2C41C4AD3DA007D0023 /* AIRMapCircle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapCircle.m; path = AirMaps/AIRMapCircle.m; sourceTree = SOURCE_ROOT; }; + 1125B2C51C4AD3DA007D0023 /* AIRMapCircleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapCircleManager.h; path = AirMaps/AIRMapCircleManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2C61C4AD3DA007D0023 /* AIRMapCircleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapCircleManager.m; path = AirMaps/AIRMapCircleManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2C71C4AD3DA007D0023 /* AIRMapCoordinate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapCoordinate.h; path = AirMaps/AIRMapCoordinate.h; sourceTree = SOURCE_ROOT; }; + 1125B2C81C4AD3DA007D0023 /* AIRMapCoordinate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapCoordinate.m; path = AirMaps/AIRMapCoordinate.m; sourceTree = SOURCE_ROOT; }; + 1125B2C91C4AD3DA007D0023 /* AIRMapManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapManager.h; path = AirMaps/AIRMapManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2CA1C4AD3DA007D0023 /* AIRMapManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapManager.m; path = AirMaps/AIRMapManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2CB1C4AD3DA007D0023 /* AIRMapMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapMarker.h; path = AirMaps/AIRMapMarker.h; sourceTree = SOURCE_ROOT; }; + 1125B2CC1C4AD3DA007D0023 /* AIRMapMarker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapMarker.m; path = AirMaps/AIRMapMarker.m; sourceTree = SOURCE_ROOT; }; + 1125B2CD1C4AD3DA007D0023 /* AIRMapMarkerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapMarkerManager.h; path = AirMaps/AIRMapMarkerManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2CE1C4AD3DA007D0023 /* AIRMapMarkerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapMarkerManager.m; path = AirMaps/AIRMapMarkerManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2CF1C4AD3DA007D0023 /* AIRMapPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapPolygon.h; path = AirMaps/AIRMapPolygon.h; sourceTree = SOURCE_ROOT; }; + 1125B2D01C4AD3DA007D0023 /* AIRMapPolygon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapPolygon.m; path = AirMaps/AIRMapPolygon.m; sourceTree = SOURCE_ROOT; }; + 1125B2D11C4AD3DA007D0023 /* AIRMapPolygonManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapPolygonManager.h; path = AirMaps/AIRMapPolygonManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2D21C4AD3DA007D0023 /* AIRMapPolygonManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapPolygonManager.m; path = AirMaps/AIRMapPolygonManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2D31C4AD3DA007D0023 /* AIRMapPolyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapPolyline.h; path = AirMaps/AIRMapPolyline.h; sourceTree = SOURCE_ROOT; }; + 1125B2D41C4AD3DA007D0023 /* AIRMapPolyline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapPolyline.m; path = AirMaps/AIRMapPolyline.m; sourceTree = SOURCE_ROOT; }; + 1125B2D51C4AD3DA007D0023 /* AIRMapPolylineManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRMapPolylineManager.h; path = AirMaps/AIRMapPolylineManager.h; sourceTree = SOURCE_ROOT; }; + 1125B2D61C4AD3DA007D0023 /* AIRMapPolylineManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRMapPolylineManager.m; path = AirMaps/AIRMapPolylineManager.m; sourceTree = SOURCE_ROOT; }; + 1125B2F01C4AD445007D0023 /* SMCalloutView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMCalloutView.h; path = AirMaps/Callout/SMCalloutView.h; sourceTree = SOURCE_ROOT; }; + 1125B2F11C4AD445007D0023 /* SMCalloutView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMCalloutView.m; path = AirMaps/Callout/SMCalloutView.m; sourceTree = SOURCE_ROOT; }; + 11FA5C511C4A1296003AC2EE /* libAirMaps.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAirMaps.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 19DABC7D1E7C9D3C00F41150 /* RCTConvert+AirMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+AirMap.h"; sourceTree = ""; }; + 19DABC7E1E7C9D3C00F41150 /* RCTConvert+AirMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+AirMap.m"; sourceTree = ""; }; + 2163AA4E1FEAEDD100BBEC95 /* AIRMapPolylineRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapPolylineRenderer.h; sourceTree = ""; }; + 2163AA4F1FEAEDD100BBEC95 /* AIRMapPolylineRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapPolylineRenderer.m; sourceTree = ""; }; + 4C99C9DC2226CF2800A8693E /* AIRWeakTimerReference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRWeakTimerReference.h; sourceTree = ""; }; + 4C99C9DD2226CF2800A8693E /* AIRWeakTimerReference.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRWeakTimerReference.m; sourceTree = ""; }; + 4C99C9DF2226D8C400A8693E /* AIRWeakMapReference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRWeakMapReference.h; sourceTree = ""; }; + 4C99C9E02226D8C400A8693E /* AIRWeakMapReference.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRWeakMapReference.m; sourceTree = ""; }; + 53D31635202E723B00B55447 /* AIRMapOverlayManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRMapOverlayManager.m; sourceTree = ""; }; + 53D31637202E725E00B55447 /* AIRMapOverlayManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRMapOverlayManager.h; sourceTree = ""; }; + 53D31638202E72D500B55447 /* AIRMapOverlay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRMapOverlay.h; sourceTree = ""; }; + 53D31639202E72FC00B55447 /* AIRMapOverlay.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRMapOverlay.m; sourceTree = ""; }; + 53D3163B202E732300B55447 /* AIRMapOverlayRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRMapOverlayRenderer.h; sourceTree = ""; }; + 53D3163C202E734F00B55447 /* AIRMapOverlayRenderer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRMapOverlayRenderer.m; sourceTree = ""; }; + 628F811E1FD16D780058313A /* AIRMapLocalTile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRMapLocalTile.h; sourceTree = ""; }; + 628F811F1FD16DF80058313A /* AIRMapLocalTile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRMapLocalTile.m; sourceTree = ""; }; + 628F81211FD16EAB0058313A /* AIRMapLocalTileManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AIRMapLocalTileManager.h; sourceTree = ""; }; + 628F81221FD16EFA0058313A /* AIRMapLocalTileManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AIRMapLocalTileManager.m; sourceTree = ""; }; + 62AEC4D31FD5A0AA003225E0 /* AIRMapLocalTileOverlay.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AIRMapLocalTileOverlay.m; path = AirMaps/AIRMapLocalTileOverlay.m; sourceTree = ""; }; + 8B19A3C42257BBDE00BB8735 /* AIRMapCalloutSubview.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapCalloutSubview.m; sourceTree = ""; }; + 8B19A3C52257BBDE00BB8735 /* AIRMapCalloutSubviewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapCalloutSubviewManager.h; sourceTree = ""; }; + 8B19A3C62257BBDF00BB8735 /* AIRMapCalloutSubview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapCalloutSubview.h; sourceTree = ""; }; + 8B19A3C72257BBDF00BB8735 /* AIRMapCalloutSubviewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapCalloutSubviewManager.m; sourceTree = ""; }; + 8BC85FAD2107C0BD0006CEA5 /* User.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = User.xcconfig; sourceTree = ""; }; + 8BC85FAE2107CFD80006CEA5 /* AIRGoogleMapOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapOverlay.h; path = AirGoogleMaps/AIRGoogleMapOverlay.h; sourceTree = ""; }; + 8BC85FAF2107CFEC0006CEA5 /* AIRGoogleMapOverlay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapOverlay.m; path = AirGoogleMaps/AIRGoogleMapOverlay.m; sourceTree = ""; }; + 9B9498A42017EFB400158761 /* AIRGoogleMapCallout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapCallout.h; path = AirGoogleMaps/AIRGoogleMapCallout.h; sourceTree = ""; }; + 9B9498A52017EFB400158761 /* AIRGoogleMapPolygonManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapPolygonManager.h; path = AirGoogleMaps/AIRGoogleMapPolygonManager.h; sourceTree = ""; }; + 9B9498A62017EFB400158761 /* AIRGoogleMapUrlTile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapUrlTile.m; path = AirGoogleMaps/AIRGoogleMapUrlTile.m; sourceTree = ""; }; + 9B9498A72017EFB400158761 /* AIRGoogleMapURLTileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapURLTileManager.m; path = AirGoogleMaps/AIRGoogleMapURLTileManager.m; sourceTree = ""; }; + 9B9498A82017EFB400158761 /* AIRGMSPolygon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGMSPolygon.m; path = AirGoogleMaps/AIRGMSPolygon.m; sourceTree = ""; }; + 9B9498A92017EFB400158761 /* RCTConvert+GMSMapViewType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "RCTConvert+GMSMapViewType.h"; path = "AirGoogleMaps/RCTConvert+GMSMapViewType.h"; sourceTree = ""; }; + 9B9498AA2017EFB400158761 /* AIRGoogleMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMap.h; path = AirGoogleMaps/AIRGoogleMap.h; sourceTree = ""; }; + 9B9498AB2017EFB400158761 /* AIRGoogleMapMarkerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapMarkerManager.h; path = AirGoogleMaps/AIRGoogleMapMarkerManager.h; sourceTree = ""; }; + 9B9498AC2017EFB400158761 /* AIRGoogleMapCallout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapCallout.m; path = AirGoogleMaps/AIRGoogleMapCallout.m; sourceTree = ""; }; + 9B9498AD2017EFB400158761 /* AIRGoogleMapUrlTileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapUrlTileManager.h; path = AirGoogleMaps/AIRGoogleMapUrlTileManager.h; sourceTree = ""; }; + 9B9498AE2017EFB500158761 /* AIRGMSMarker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGMSMarker.m; path = AirGoogleMaps/AIRGMSMarker.m; sourceTree = ""; }; + 9B9498AF2017EFB500158761 /* AIRGMSPolyline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGMSPolyline.m; path = AirGoogleMaps/AIRGMSPolyline.m; sourceTree = ""; }; + 9B9498B02017EFB500158761 /* AIRGoogleMapCircleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapCircleManager.h; path = AirGoogleMaps/AIRGoogleMapCircleManager.h; sourceTree = ""; }; + 9B9498B12017EFB500158761 /* AIRGoogleMapPolylineManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapPolylineManager.m; path = AirGoogleMaps/AIRGoogleMapPolylineManager.m; sourceTree = ""; }; + 9B9498B32017EFB500158761 /* AIRGoogleMapCircle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapCircle.m; path = AirGoogleMaps/AIRGoogleMapCircle.m; sourceTree = ""; }; + 9B9498B42017EFB500158761 /* AIRGMSPolyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGMSPolyline.h; path = AirGoogleMaps/AIRGMSPolyline.h; sourceTree = ""; }; + 9B9498B52017EFB500158761 /* AIRGoogleMapMarkerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapMarkerManager.m; path = AirGoogleMaps/AIRGoogleMapMarkerManager.m; sourceTree = ""; }; + 9B9498B62017EFB500158761 /* AIRGoogleMapPolylineManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapPolylineManager.h; path = AirGoogleMaps/AIRGoogleMapPolylineManager.h; sourceTree = ""; }; + 9B9498B72017EFB500158761 /* AIRGoogleMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMap.m; path = AirGoogleMaps/AIRGoogleMap.m; sourceTree = ""; }; + 9B9498B82017EFB600158761 /* AIRGoogleMapPolyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapPolyline.h; path = AirGoogleMaps/AIRGoogleMapPolyline.h; sourceTree = ""; }; + 9B9498B92017EFB600158761 /* RCTConvert+GMSMapViewType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "RCTConvert+GMSMapViewType.m"; path = "AirGoogleMaps/RCTConvert+GMSMapViewType.m"; sourceTree = ""; }; + 9B9498BA2017EFB600158761 /* AIRGMSPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGMSPolygon.h; path = AirGoogleMaps/AIRGMSPolygon.h; sourceTree = ""; }; + 9B9498BB2017EFB600158761 /* AIRGoogleMapPolyline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapPolyline.m; path = AirGoogleMaps/AIRGoogleMapPolyline.m; sourceTree = ""; }; + 9B9498BC2017EFB600158761 /* AIRGoogleMapCircleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapCircleManager.m; path = AirGoogleMaps/AIRGoogleMapCircleManager.m; sourceTree = ""; }; + 9B9498BD2017EFB600158761 /* AIRGoogleMapManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapManager.m; path = AirGoogleMaps/AIRGoogleMapManager.m; sourceTree = ""; }; + 9B9498BE2017EFB600158761 /* AIRGoogleMapManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapManager.h; path = AirGoogleMaps/AIRGoogleMapManager.h; sourceTree = ""; }; + 9B9498C02017EFB700158761 /* AIRGoogleMapMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapMarker.h; path = AirGoogleMaps/AIRGoogleMapMarker.h; sourceTree = ""; }; + 9B9498C12017EFB700158761 /* AIRGMSMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGMSMarker.h; path = AirGoogleMaps/AIRGMSMarker.h; sourceTree = ""; }; + 9B9498C22017EFB700158761 /* AIRGoogleMapCircle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapCircle.h; path = AirGoogleMaps/AIRGoogleMapCircle.h; sourceTree = ""; }; + 9B9498C32017EFB700158761 /* AIRGoogleMapPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapPolygon.h; path = AirGoogleMaps/AIRGoogleMapPolygon.h; sourceTree = ""; }; + 9B9498C42017EFB700158761 /* AIRGoogleMapCalloutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapCalloutManager.m; path = AirGoogleMaps/AIRGoogleMapCalloutManager.m; sourceTree = ""; }; + 9B9498C52017EFB800158761 /* AIRGoogleMapCalloutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapCalloutManager.h; path = AirGoogleMaps/AIRGoogleMapCalloutManager.h; sourceTree = ""; }; + 9B9498C62017EFB800158761 /* AIRGoogleMapPolygon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapPolygon.m; path = AirGoogleMaps/AIRGoogleMapPolygon.m; sourceTree = ""; }; + 9B9498C72017EFB800158761 /* AIRGoogleMapMarker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapMarker.m; path = AirGoogleMaps/AIRGoogleMapMarker.m; sourceTree = ""; }; + 9B9498C82017EFB800158761 /* AIRGoogleMapUrlTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapUrlTile.h; path = AirGoogleMaps/AIRGoogleMapUrlTile.h; sourceTree = ""; }; + 9B9498C92017EFB800158761 /* AIRGoogleMapPolygonManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapPolygonManager.m; path = AirGoogleMaps/AIRGoogleMapPolygonManager.m; sourceTree = ""; }; + A8494E24218891020092506D /* AIRMapWMSTileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapWMSTileManager.m; sourceTree = ""; }; + A8494E25218891020092506D /* AIRMapWMSTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapWMSTile.h; sourceTree = ""; }; + A8494E26218891020092506D /* AIRMapWMSTileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapWMSTileManager.h; sourceTree = ""; }; + A8494E27218891020092506D /* AIRMapWMSTile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapWMSTile.m; sourceTree = ""; }; + A8494E2A218891180092506D /* AIRGoogleMapWMSTileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapWMSTileManager.m; path = AirGoogleMaps/AIRGoogleMapWMSTileManager.m; sourceTree = ""; }; + A8494E2B218891180092506D /* AIRGoogleMapWMSTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapWMSTile.h; path = AirGoogleMaps/AIRGoogleMapWMSTile.h; sourceTree = ""; }; + A8494E2C218891180092506D /* AIRGoogleMapWMSTileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRGoogleMapWMSTileManager.h; path = AirGoogleMaps/AIRGoogleMapWMSTileManager.h; sourceTree = ""; }; + A8494E2D218891180092506D /* AIRGoogleMapWMSTile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRGoogleMapWMSTile.m; path = AirGoogleMaps/AIRGoogleMapWMSTile.m; sourceTree = ""; }; + B5EA3BA72098E22B000E7AFD /* AIRDummyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRDummyView.m; path = AirGoogleMaps/AIRDummyView.m; sourceTree = ""; }; + B5EA3BA82098E22B000E7AFD /* AIRDummyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRDummyView.h; path = AirGoogleMaps/AIRDummyView.h; sourceTree = ""; }; + DA6C26361C9E2AFE0035349F /* AIRMapUrlTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapUrlTile.h; sourceTree = ""; }; + DA6C26371C9E2AFE0035349F /* AIRMapUrlTile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapUrlTile.m; sourceTree = ""; }; + DA6C263C1C9E324A0035349F /* AIRMapUrlTileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRMapUrlTileManager.h; sourceTree = ""; }; + DA6C263D1C9E324A0035349F /* AIRMapUrlTileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRMapUrlTileManager.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 11FA5C4E1C4A1296003AC2EE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 11FA5C481C4A1296003AC2EE = { + isa = PBXGroup; + children = ( + 9B9498A32017EF9D00158761 /* AirGoogleMaps */, + 62AEC4D31FD5A0AA003225E0 /* AIRMapLocalTileOverlay.m */, + 11FA5C531C4A1296003AC2EE /* AirMaps */, + 11FA5C521C4A1296003AC2EE /* Products */, + 8BC85FAD2107C0BD0006CEA5 /* User.xcconfig */, + ); + sourceTree = ""; + }; + 11FA5C521C4A1296003AC2EE /* Products */ = { + isa = PBXGroup; + children = ( + 11FA5C511C4A1296003AC2EE /* libAirMaps.a */, + ); + name = Products; + sourceTree = ""; + }; + 11FA5C531C4A1296003AC2EE /* AirMaps */ = { + isa = PBXGroup; + children = ( + 1125B2BD1C4AD3DA007D0023 /* AIRMap.h */, + 1125B2BE1C4AD3DA007D0023 /* AIRMap.m */, + 1125B2BF1C4AD3DA007D0023 /* AIRMapCallout.h */, + 1125B2C01C4AD3DA007D0023 /* AIRMapCallout.m */, + 1125B2C11C4AD3DA007D0023 /* AIRMapCalloutManager.h */, + 1125B2C21C4AD3DA007D0023 /* AIRMapCalloutManager.m */, + 8B19A3C62257BBDF00BB8735 /* AIRMapCalloutSubview.h */, + 8B19A3C42257BBDE00BB8735 /* AIRMapCalloutSubview.m */, + 8B19A3C52257BBDE00BB8735 /* AIRMapCalloutSubviewManager.h */, + 8B19A3C72257BBDF00BB8735 /* AIRMapCalloutSubviewManager.m */, + 1125B2C31C4AD3DA007D0023 /* AIRMapCircle.h */, + 1125B2C41C4AD3DA007D0023 /* AIRMapCircle.m */, + 1125B2C51C4AD3DA007D0023 /* AIRMapCircleManager.h */, + 1125B2C61C4AD3DA007D0023 /* AIRMapCircleManager.m */, + 1125B2D41C4AD3DA007D0023 /* AIRMapPolyline.m */, + 1125B2C71C4AD3DA007D0023 /* AIRMapCoordinate.h */, + 1125B2C81C4AD3DA007D0023 /* AIRMapCoordinate.m */, + 1125B2C91C4AD3DA007D0023 /* AIRMapManager.h */, + 1125B2CA1C4AD3DA007D0023 /* AIRMapManager.m */, + 1125B2CB1C4AD3DA007D0023 /* AIRMapMarker.h */, + 1125B2CC1C4AD3DA007D0023 /* AIRMapMarker.m */, + 1125B2CD1C4AD3DA007D0023 /* AIRMapMarkerManager.h */, + 1125B2CE1C4AD3DA007D0023 /* AIRMapMarkerManager.m */, + 1125B2CF1C4AD3DA007D0023 /* AIRMapPolygon.h */, + 1125B2D01C4AD3DA007D0023 /* AIRMapPolygon.m */, + 1125B2D11C4AD3DA007D0023 /* AIRMapPolygonManager.h */, + 1125B2D21C4AD3DA007D0023 /* AIRMapPolygonManager.m */, + 1125B2D31C4AD3DA007D0023 /* AIRMapPolyline.h */, + 1125B2D51C4AD3DA007D0023 /* AIRMapPolylineManager.h */, + 1125B2D61C4AD3DA007D0023 /* AIRMapPolylineManager.m */, + 2163AA4E1FEAEDD100BBEC95 /* AIRMapPolylineRenderer.h */, + 2163AA4F1FEAEDD100BBEC95 /* AIRMapPolylineRenderer.m */, + 1125B2F01C4AD445007D0023 /* SMCalloutView.h */, + 1125B2F11C4AD445007D0023 /* SMCalloutView.m */, + 19DABC7D1E7C9D3C00F41150 /* RCTConvert+AirMap.h */, + 19DABC7E1E7C9D3C00F41150 /* RCTConvert+AirMap.m */, + DA6C26361C9E2AFE0035349F /* AIRMapUrlTile.h */, + DA6C26371C9E2AFE0035349F /* AIRMapUrlTile.m */, + DA6C263C1C9E324A0035349F /* AIRMapUrlTileManager.h */, + DA6C263D1C9E324A0035349F /* AIRMapUrlTileManager.m */, + A8494E25218891020092506D /* AIRMapWMSTile.h */, + A8494E27218891020092506D /* AIRMapWMSTile.m */, + A8494E26218891020092506D /* AIRMapWMSTileManager.h */, + A8494E24218891020092506D /* AIRMapWMSTileManager.m */, + 1125B2CC1C4AD3DA007D0023 /* AIRMapMarker.m */, + 628F811E1FD16D780058313A /* AIRMapLocalTile.h */, + 628F811F1FD16DF80058313A /* AIRMapLocalTile.m */, + 628F81211FD16EAB0058313A /* AIRMapLocalTileManager.h */, + 628F81221FD16EFA0058313A /* AIRMapLocalTileManager.m */, + 53D31638202E72D500B55447 /* AIRMapOverlay.h */, + 53D31639202E72FC00B55447 /* AIRMapOverlay.m */, + 53D31637202E725E00B55447 /* AIRMapOverlayManager.h */, + 53D31635202E723B00B55447 /* AIRMapOverlayManager.m */, + 53D3163B202E732300B55447 /* AIRMapOverlayRenderer.h */, + 53D3163C202E734F00B55447 /* AIRMapOverlayRenderer.m */, + 4C99C9DC2226CF2800A8693E /* AIRWeakTimerReference.h */, + 4C99C9DD2226CF2800A8693E /* AIRWeakTimerReference.m */, + 4C99C9DF2226D8C400A8693E /* AIRWeakMapReference.h */, + 4C99C9E02226D8C400A8693E /* AIRWeakMapReference.m */, + ); + path = AirMaps; + sourceTree = ""; + }; + 9B9498A32017EF9D00158761 /* AirGoogleMaps */ = { + isa = PBXGroup; + children = ( + B5EA3BA82098E22B000E7AFD /* AIRDummyView.h */, + B5EA3BA72098E22B000E7AFD /* AIRDummyView.m */, + 9B9498C12017EFB700158761 /* AIRGMSMarker.h */, + 9B9498AE2017EFB500158761 /* AIRGMSMarker.m */, + 9B9498BA2017EFB600158761 /* AIRGMSPolygon.h */, + 9B9498A82017EFB400158761 /* AIRGMSPolygon.m */, + 9B9498B42017EFB500158761 /* AIRGMSPolyline.h */, + 9B9498AF2017EFB500158761 /* AIRGMSPolyline.m */, + 9B9498AA2017EFB400158761 /* AIRGoogleMap.h */, + 9B9498B72017EFB500158761 /* AIRGoogleMap.m */, + 9B9498A42017EFB400158761 /* AIRGoogleMapCallout.h */, + 9B9498AC2017EFB400158761 /* AIRGoogleMapCallout.m */, + 9B9498C52017EFB800158761 /* AIRGoogleMapCalloutManager.h */, + 9B9498C42017EFB700158761 /* AIRGoogleMapCalloutManager.m */, + 9B9498C22017EFB700158761 /* AIRGoogleMapCircle.h */, + 9B9498B32017EFB500158761 /* AIRGoogleMapCircle.m */, + 9B9498B02017EFB500158761 /* AIRGoogleMapCircleManager.h */, + 9B9498BC2017EFB600158761 /* AIRGoogleMapCircleManager.m */, + 9B9498BE2017EFB600158761 /* AIRGoogleMapManager.h */, + 9B9498BD2017EFB600158761 /* AIRGoogleMapManager.m */, + 9B9498C02017EFB700158761 /* AIRGoogleMapMarker.h */, + 9B9498C72017EFB800158761 /* AIRGoogleMapMarker.m */, + 9B9498AB2017EFB400158761 /* AIRGoogleMapMarkerManager.h */, + 9B9498B52017EFB500158761 /* AIRGoogleMapMarkerManager.m */, + 9B9498C32017EFB700158761 /* AIRGoogleMapPolygon.h */, + 9B9498C62017EFB800158761 /* AIRGoogleMapPolygon.m */, + 9B9498A52017EFB400158761 /* AIRGoogleMapPolygonManager.h */, + 9B9498C92017EFB800158761 /* AIRGoogleMapPolygonManager.m */, + 9B9498B82017EFB600158761 /* AIRGoogleMapPolyline.h */, + 9B9498BB2017EFB600158761 /* AIRGoogleMapPolyline.m */, + 8BC85FAE2107CFD80006CEA5 /* AIRGoogleMapOverlay.h */, + 8BC85FAF2107CFEC0006CEA5 /* AIRGoogleMapOverlay.m */, + 9B9498B62017EFB500158761 /* AIRGoogleMapPolylineManager.h */, + 9B9498B12017EFB500158761 /* AIRGoogleMapPolylineManager.m */, + 9B9498C82017EFB800158761 /* AIRGoogleMapUrlTile.h */, + 9B9498A62017EFB400158761 /* AIRGoogleMapUrlTile.m */, + 9B9498AD2017EFB400158761 /* AIRGoogleMapUrlTileManager.h */, + 9B9498A72017EFB400158761 /* AIRGoogleMapURLTileManager.m */, + A8494E2B218891180092506D /* AIRGoogleMapWMSTile.h */, + A8494E2D218891180092506D /* AIRGoogleMapWMSTile.m */, + A8494E2C218891180092506D /* AIRGoogleMapWMSTileManager.h */, + A8494E2A218891180092506D /* AIRGoogleMapWMSTileManager.m */, + 9B9498A92017EFB400158761 /* RCTConvert+GMSMapViewType.h */, + 9B9498B92017EFB600158761 /* RCTConvert+GMSMapViewType.m */, + ); + name = AirGoogleMaps; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 11FA5C501C4A1296003AC2EE /* AirMaps */ = { + isa = PBXNativeTarget; + buildConfigurationList = 11FA5C5A1C4A1296003AC2EE /* Build configuration list for PBXNativeTarget "AirMaps" */; + buildPhases = ( + 11FA5C4D1C4A1296003AC2EE /* Sources */, + 11FA5C4E1C4A1296003AC2EE /* Frameworks */, + 11FA5C4F1C4A1296003AC2EE /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AirMaps; + productName = AirMaps; + productReference = 11FA5C511C4A1296003AC2EE /* libAirMaps.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 11FA5C491C4A1296003AC2EE /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = Christopher; + TargetAttributes = { + 11FA5C501C4A1296003AC2EE = { + CreatedOnToolsVersion = 7.2; + }; + }; + }; + buildConfigurationList = 11FA5C4C1C4A1296003AC2EE /* Build configuration list for PBXProject "AirMaps" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 11FA5C481C4A1296003AC2EE; + productRefGroup = 11FA5C521C4A1296003AC2EE /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 11FA5C501C4A1296003AC2EE /* AirMaps */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 11FA5C4D1C4A1296003AC2EE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 62AEC4D41FD5A0AA003225E0 /* AIRMapLocalTileOverlay.m in Sources */, + 9B9498DC2017EFB800158761 /* AIRGoogleMapPolygonManager.m in Sources */, + 1125B2E31C4AD3DA007D0023 /* AIRMapPolygon.m in Sources */, + 4C99C9DE2226CF2800A8693E /* AIRWeakTimerReference.m in Sources */, + 1125B2E41C4AD3DA007D0023 /* AIRMapPolygonManager.m in Sources */, + A8494E2F218891180092506D /* AIRGoogleMapWMSTile.m in Sources */, + 9B9498CB2017EFB800158761 /* AIRGoogleMapURLTileManager.m in Sources */, + A8494E28218891020092506D /* AIRMapWMSTileManager.m in Sources */, + 1125B2DB1C4AD3DA007D0023 /* AIRMapCallout.m in Sources */, + 53D31636202E723B00B55447 /* AIRMapOverlayManager.m in Sources */, + 1125B2E01C4AD3DA007D0023 /* AIRMapManager.m in Sources */, + 1125B2E61C4AD3DA007D0023 /* AIRMapPolylineManager.m in Sources */, + 9B9498DA2017EFB800158761 /* AIRGoogleMapPolygon.m in Sources */, + 9B9498D12017EFB800158761 /* AIRGoogleMapCircle.m in Sources */, + 1125B2DD1C4AD3DA007D0023 /* AIRMapCircle.m in Sources */, + 9B9498CE2017EFB800158761 /* AIRGMSMarker.m in Sources */, + 9B9498D72017EFB800158761 /* AIRGoogleMapManager.m in Sources */, + 19DABC7F1E7C9D3C00F41150 /* RCTConvert+AirMap.m in Sources */, + A8494E2E218891180092506D /* AIRGoogleMapWMSTileManager.m in Sources */, + 8B19A3C82257BBDF00BB8735 /* AIRMapCalloutSubview.m in Sources */, + 1125B2E51C4AD3DA007D0023 /* AIRMapPolyline.m in Sources */, + 4C99C9E12226D8C400A8693E /* AIRWeakMapReference.m in Sources */, + 9B9498D52017EFB800158761 /* AIRGoogleMapPolyline.m in Sources */, + 9B9498CF2017EFB800158761 /* AIRGMSPolyline.m in Sources */, + 9B9498D42017EFB800158761 /* RCTConvert+GMSMapViewType.m in Sources */, + 9B9498D32017EFB800158761 /* AIRGoogleMap.m in Sources */, + DA6C263E1C9E324A0035349F /* AIRMapUrlTileManager.m in Sources */, + 9B9498DB2017EFB800158761 /* AIRGoogleMapMarker.m in Sources */, + 628F81201FD16DF80058313A /* AIRMapLocalTile.m in Sources */, + 9B9498D92017EFB800158761 /* AIRGoogleMapCalloutManager.m in Sources */, + 53D3163A202E72FC00B55447 /* AIRMapOverlay.m in Sources */, + 53D3163D202E734F00B55447 /* AIRMapOverlayRenderer.m in Sources */, + 1125B2DA1C4AD3DA007D0023 /* AIRMap.m in Sources */, + 1125B2DF1C4AD3DA007D0023 /* AIRMapCoordinate.m in Sources */, + 9B9498D62017EFB800158761 /* AIRGoogleMapCircleManager.m in Sources */, + 8BC85FB02107CFEC0006CEA5 /* AIRGoogleMapOverlay.m in Sources */, + 1125B2F21C4AD445007D0023 /* SMCalloutView.m in Sources */, + 2163AA501FEAEDD100BBEC95 /* AIRMapPolylineRenderer.m in Sources */, + 9B9498D02017EFB800158761 /* AIRGoogleMapPolylineManager.m in Sources */, + 1125B2E11C4AD3DA007D0023 /* AIRMapMarker.m in Sources */, + A8494E29218891020092506D /* AIRMapWMSTile.m in Sources */, + 9B9498CA2017EFB800158761 /* AIRGoogleMapUrlTile.m in Sources */, + 8B19A3C92257BBDF00BB8735 /* AIRMapCalloutSubviewManager.m in Sources */, + B5EA3BA92098E22B000E7AFD /* AIRDummyView.m in Sources */, + 9B9498CD2017EFB800158761 /* AIRGoogleMapCallout.m in Sources */, + 1125B2E21C4AD3DA007D0023 /* AIRMapMarkerManager.m in Sources */, + DA6C26381C9E2AFE0035349F /* AIRMapUrlTile.m in Sources */, + 628F81231FD16EFA0058313A /* AIRMapLocalTileManager.m in Sources */, + 9B9498D22017EFB800158761 /* AIRGoogleMapMarkerManager.m in Sources */, + 9B9498CC2017EFB800158761 /* AIRGMSPolygon.m in Sources */, + 1125B2DE1C4AD3DA007D0023 /* AIRMapCircleManager.m in Sources */, + 1125B2DC1C4AD3DA007D0023 /* AIRMapCalloutManager.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 11FA5C581C4A1296003AC2EE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 11FA5C591C4A1296003AC2EE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 11FA5C5B1C4A1296003AC2EE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8BC85FAD2107C0BD0006CEA5 /* User.xcconfig */; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../react-native/React/**", + "$(SRCROOT)/../../react-native/Libraries/Image", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 11FA5C5C1C4A1296003AC2EE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8BC85FAD2107C0BD0006CEA5 /* User.xcconfig */; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../react-native/React/**", + "$(SRCROOT)/../../react-native/Libraries/Image", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 11FA5C4C1C4A1296003AC2EE /* Build configuration list for PBXProject "AirMaps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 11FA5C581C4A1296003AC2EE /* Debug */, + 11FA5C591C4A1296003AC2EE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 11FA5C5A1C4A1296003AC2EE /* Build configuration list for PBXNativeTarget "AirMaps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 11FA5C5B1C4A1296003AC2EE /* Debug */, + 11FA5C5C1C4A1296003AC2EE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 11FA5C491C4A1296003AC2EE /* Project object */; +} diff --git a/lib/ios/AirMaps.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcuserdata/christopherdro.xcuserdatad/UserInterfaceState.xcuserstate b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcuserdata/christopherdro.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..10d8945 Binary files /dev/null and b/lib/ios/AirMaps.xcodeproj/project.xcworkspace/xcuserdata/christopherdro.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/AirMaps.xcscheme b/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/AirMaps.xcscheme new file mode 100644 index 0000000..d8082fa --- /dev/null +++ b/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/AirMaps.xcscheme @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/xcschememanagement.plist b/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..b143b64 --- /dev/null +++ b/lib/ios/AirMaps.xcodeproj/xcuserdata/christopherdro.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + AirMaps.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 11FA5C501C4A1296003AC2EE + + primary + + + + + diff --git a/lib/ios/AirMaps/AIRMap.h b/lib/ios/AirMaps/AIRMap.h new file mode 100644 index 0000000..e70d8f1 --- /dev/null +++ b/lib/ios/AirMaps/AIRMap.h @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import +#import "SMCalloutView.h" +#import "RCTConvert+AirMap.h" +#import "AIRMapCalloutSubview.h" + +@class AIRMapMarker; + +extern const CLLocationDegrees AIRMapDefaultSpan; +extern const NSTimeInterval AIRMapRegionChangeObserveInterval; +extern const CGFloat AIRMapZoomBoundBuffer; +extern const NSInteger AIRMapMaxZoomLevel; + +@interface AIRMap: MKMapView + +@property (nonatomic, strong) SMCalloutView *calloutView; +@property (nonatomic, strong) UIImageView *cacheImageView; +@property (nonatomic, strong) UIView *loadingView; + +@property (nonatomic, copy) NSString *userLocationAnnotationTitle; +@property (nonatomic, assign) BOOL followUserLocation; +@property (nonatomic, assign) BOOL hasStartedRendering; +@property (nonatomic, assign) BOOL cacheEnabled; +@property (nonatomic, assign) BOOL loadingEnabled; +@property (nonatomic, strong) UIColor *loadingBackgroundColor; +@property (nonatomic, strong) UIColor *loadingIndicatorColor; +@property (nonatomic, assign) BOOL hasShownInitialLoading; +@property (nonatomic, assign) CGFloat minDelta; +@property (nonatomic, assign) CGFloat maxDelta; +@property (nonatomic, assign) UIEdgeInsets legalLabelInsets; +@property (nonatomic, strong) NSTimer *regionChangeObserveTimer; +@property (nonatomic, assign) MKCoordinateRegion initialRegion; +@property (nonatomic, assign) MKMapCamera *initialCamera; +@property (nonatomic, assign) CGFloat minZoomLevel; +@property (nonatomic, assign) CGFloat maxZoomLevel; +@property (nonatomic, assign) CGPoint compassOffset; + +@property (nonatomic, assign) CLLocationCoordinate2D pendingCenter; +@property (nonatomic, assign) MKCoordinateSpan pendingSpan; + + +@property (nonatomic, assign) BOOL ignoreRegionChanges; + +@property (nonatomic, copy) RCTBubblingEventBlock onMapReady; +@property (nonatomic, copy) RCTBubblingEventBlock onChange; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, copy) RCTBubblingEventBlock onPanDrag; +@property (nonatomic, copy) RCTBubblingEventBlock onLongPress; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerPress; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerSelect; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerDeselect; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerDragStart; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerDrag; +@property (nonatomic, copy) RCTDirectEventBlock onMarkerDragEnd; +@property (nonatomic, copy) RCTDirectEventBlock onCalloutPress; +@property (nonatomic, copy) RCTDirectEventBlock onRegionChange; + +- (void)cacheViewIfNeeded; +- (void)beginLoading; +- (void)finishLoading; +- (NSArray *)getMapBoundaries; + +- (AIRMapMarker*) markerAtPoint:(CGPoint)point; +- (NSDictionary*) getMarkersFramesWithOnlyVisible:(BOOL)onlyVisible; + +@end diff --git a/lib/ios/AirMaps/AIRMap.m b/lib/ios/AirMaps/AIRMap.m new file mode 100644 index 0000000..6db0496 --- /dev/null +++ b/lib/ios/AirMaps/AIRMap.m @@ -0,0 +1,651 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMap.h" + +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapPolyline.h" +#import "AIRMapPolygon.h" +#import "AIRMapCircle.h" +#import +#import "AIRMapUrlTile.h" +#import "AIRMapWMSTile.h" +#import "AIRMapLocalTile.h" +#import "AIRMapOverlay.h" + +const CLLocationDegrees AIRMapDefaultSpan = 0.005; +const NSTimeInterval AIRMapRegionChangeObserveInterval = 0.1; +const CGFloat AIRMapZoomBoundBuffer = 0.01; +const NSInteger AIRMapMaxZoomLevel = 20; + + +@interface MKMapView (UIGestureRecognizer) + +// this tells the compiler that MKMapView actually implements this method +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; + +@end + +@interface AIRMap () + +@property (nonatomic, strong) UIActivityIndicatorView *activityIndicatorView; +@property (nonatomic, assign) NSNumber *shouldZoomEnabled; +@property (nonatomic, assign) NSNumber *shouldScrollEnabled; + +- (void)updateScrollEnabled; +- (void)updateZoomEnabled; + +@end + +@implementation AIRMap +{ + UIView *_legalLabel; + CLLocationManager *_locationManager; + BOOL _initialRegionSet; + BOOL _initialCameraSet; + + // Array to manually track RN subviews + // + // AIRMap implicitly creates subviews that aren't regular RN children + // (SMCalloutView injects an overlay subview), which otherwise confuses RN + // during component re-renders: + // https://github.com/facebook/react-native/blob/v0.16.0/React/Modules/RCTUIManager.m#L657 + // + // Implementation based on RCTTextField, another component with indirect children + // https://github.com/facebook/react-native/blob/v0.16.0/Libraries/Text/RCTTextField.m#L20 + NSMutableArray *_reactSubviews; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _hasStartedRendering = NO; + _reactSubviews = [NSMutableArray new]; + + // Find Apple link label + for (UIView *subview in self.subviews) { + if ([NSStringFromClass(subview.class) isEqualToString:@"MKAttributionLabel"]) { + // This check is super hacky, but the whole premise of moving around + // Apple's internal subviews is super hacky + _legalLabel = subview; + break; + } + } + + // 3rd-party callout view for MapKit that has more options than the built-in. It's painstakingly built to + // be identical to the built-in callout view (which has a private API) + self.calloutView = [SMCalloutView platformCalloutView]; + self.calloutView.delegate = self; + + self.minZoomLevel = 0; + self.maxZoomLevel = AIRMapMaxZoomLevel; + self.compassOffset = CGPointMake(0, 0); + } + return self; +} + +- (void)dealloc +{ + [_regionChangeObserveTimer invalidate]; +} + +-(void)addSubview:(UIView *)view { + if([view isKindOfClass:[AIRMapMarker class]]) { + [self addAnnotation:(id )view]; + } else { + [super addSubview:view]; + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex { + // Our desired API is to pass up markers/overlays as children to the mapview component. + // This is where we intercept them and do the appropriate underlying mapview action. + if ([subview isKindOfClass:[AIRMapMarker class]]) { + [self addAnnotation:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapPolyline class]]) { + ((AIRMapPolyline *)subview).map = self; + [self addOverlay:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapPolygon class]]) { + ((AIRMapPolygon *)subview).map = self; + [self addOverlay:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapCircle class]]) { + ((AIRMapCircle *)subview).map = self; + [self addOverlay:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapUrlTile class]]) { + ((AIRMapUrlTile *)subview).map = self; + [self addOverlay:(id)subview]; + }else if ([subview isKindOfClass:[AIRMapWMSTile class]]) { + ((AIRMapWMSTile *)subview).map = self; + [self addOverlay:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapLocalTile class]]) { + ((AIRMapLocalTile *)subview).map = self; + [self addOverlay:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapOverlay class]]) { + ((AIRMapOverlay *)subview).map = self; + [self addOverlay:(id)subview]; + } else { + NSArray> *childSubviews = [subview reactSubviews]; + for (int i = 0; i < childSubviews.count; i++) { + [self insertReactSubview:(UIView *)childSubviews[i] atIndex:atIndex]; + } + } + [_reactSubviews insertObject:(UIView *)subview atIndex:(NSUInteger) atIndex]; +} +#pragma clang diagnostic pop + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (void)removeReactSubview:(id)subview { + // similarly, when the children are being removed we have to do the appropriate + // underlying mapview action here. + if ([subview isKindOfClass:[AIRMapMarker class]]) { + [self removeAnnotation:(id)subview]; + } else if ([subview isKindOfClass:[AIRMapPolyline class]]) { + [self removeOverlay:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapPolygon class]]) { + [self removeOverlay:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapCircle class]]) { + [self removeOverlay:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapUrlTile class]]) { + [self removeOverlay:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapLocalTile class]]) { + [self removeOverlay:(id ) subview]; + } else if ([subview isKindOfClass:[AIRMapOverlay class]]) { + [self removeOverlay:(id ) subview]; + } else { + NSArray> *childSubviews = [subview reactSubviews]; + for (int i = 0; i < childSubviews.count; i++) { + [self removeReactSubview:(UIView *)childSubviews[i]]; + } + } + [_reactSubviews removeObject:(UIView *)subview]; +} +#pragma clang diagnostic pop + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" +- (NSArray> *)reactSubviews { + return _reactSubviews; +} +#pragma clang diagnostic pop + +#pragma mark Utils + +- (NSArray*) markers { + NSPredicate *filterMarkers = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + AIRMapMarker *marker = (AIRMapMarker *)evaluatedObject; + return [marker isKindOfClass:[AIRMapMarker class]]; + }]; + NSArray *filteredMarkers = [self.annotations filteredArrayUsingPredicate:filterMarkers]; + return filteredMarkers; +} + +- (AIRMapMarker*) markerForCallout:(AIRMapCallout*)callout { + AIRMapMarker* marker = nil; + NSArray* markers = [self markers]; + for (AIRMapMarker* mrk in markers) { + if (mrk.calloutView == callout) { + marker = mrk; + break; + } + } + return marker; +} + +- (CGRect) frameForMarker:(AIRMapMarker*) mrkAnn { + MKAnnotationView* mrkView = [self viewForAnnotation: mrkAnn]; + CGRect mrkFrame = mrkView.frame; + return mrkFrame; +} + +- (NSDictionary*) getMarkersFramesWithOnlyVisible:(BOOL)onlyVisible { + NSMutableDictionary* markersFrames = [NSMutableDictionary new]; + for (AIRMapMarker* mrkAnn in self.markers) { + CGRect frame = [self frameForMarker:mrkAnn]; + CGPoint point = [self convertCoordinate:mrkAnn.coordinate toPointToView:self]; + NSDictionary* frameDict = @{ + @"x": @(frame.origin.x), + @"y": @(frame.origin.y), + @"width": @(frame.size.width), + @"height": @(frame.size.height) + }; + NSDictionary* pointDict = @{ + @"x": @(point.x), + @"y": @(point.y) + }; + NSString* k = mrkAnn.identifier; + BOOL isVisible = CGRectIntersectsRect(self.bounds, frame); + if (k != nil && (!onlyVisible || isVisible)) { + [markersFrames setObject:@{ @"frame": frameDict, @"point": pointDict } forKey:k]; + } + } + return markersFrames; +} + +- (AIRMapMarker*) markerAtPoint:(CGPoint)point { + AIRMapMarker* mrk = nil; + for (AIRMapMarker* mrkAnn in self.markers) { + CGRect frame = [self frameForMarker:mrkAnn]; + if (CGRectContainsPoint(frame, point)) { + mrk = mrkAnn; + break; + } + } + return mrk; +} + +#pragma mark Overrides for Callout behavior + +// override UIGestureRecognizer's delegate method so we can prevent MKMapView's recognizer from firing +// when we interact with UIControl subclasses inside our callout view. +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { + if ([touch.view isDescendantOfView:self.calloutView]) + return NO; + else + return [super gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch]; +} + + +// Allow touches to be sent to our calloutview. +// See this for some discussion of why we need to override this: https://github.com/nfarina/calloutview/pull/9 +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + + CGPoint touchPoint = [self.calloutView convertPoint:point fromView:self]; + UIView *touchedView = [self.calloutView hitTest:touchPoint withEvent:event]; + + if (touchedView) { + UIWindow* win = [[[UIApplication sharedApplication] windows] firstObject]; + AIRMapCalloutSubview* calloutSubview = nil; + AIRMapCallout* callout = nil; + AIRMapMarker* marker = nil; + + UIView* tmp = touchedView; + while (tmp && tmp != win && tmp != self.calloutView) { + if ([tmp respondsToSelector:@selector(onPress)]) { + calloutSubview = (AIRMapCalloutSubview*) tmp; + } + if ([tmp isKindOfClass:[AIRMapCallout class]]) { + callout = (AIRMapCallout*) tmp; + break; + } + tmp = tmp.superview; + } + + if (callout) { + marker = [self markerForCallout:callout]; + if (marker) { + CGPoint touchPointReal = [marker.calloutView convertPoint:point fromView:self]; + if (![callout isPointInside:touchPointReal]) { + return [super hitTest:point withEvent:event]; + } + } + } + + return calloutSubview ? calloutSubview : touchedView; + } + + return [super hitTest:point withEvent:event]; +} + +#pragma mark SMCalloutViewDelegate + +- (NSTimeInterval)calloutView:(SMCalloutView *)calloutView delayForRepositionWithSize:(CGSize)offset { + + // When the callout is being asked to present in a way where it or its target will be partially offscreen, it asks us + // if we'd like to reposition our surface first so the callout is completely visible. Here we scroll the map into view, + // but it takes some math because we have to deal in lon/lat instead of the given offset in pixels. + + CLLocationCoordinate2D coordinate = self.region.center; + + // where's the center coordinate in terms of our view? + CGPoint center = [self convertCoordinate:coordinate toPointToView:self]; + + // move it by the requested offset + center.x -= offset.width; + center.y -= offset.height; + + // and translate it back into map coordinates + coordinate = [self convertPoint:center toCoordinateFromView:self]; + + // move the map! + [self setCenterCoordinate:coordinate animated:YES]; + + // tell the callout to wait for a while while we scroll (we assume the scroll delay for MKMapView matches UIScrollView) + return kSMCalloutViewRepositionDelayForUIScrollView; +} + +#pragma mark Accessors + +- (NSArray *)getMapBoundaries +{ + MKMapRect mapRect = self.visibleMapRect; + + CLLocationCoordinate2D northEast = MKCoordinateForMapPoint(MKMapPointMake(MKMapRectGetMaxX(mapRect), mapRect.origin.y)); + CLLocationCoordinate2D southWest = MKCoordinateForMapPoint(MKMapPointMake(mapRect.origin.x, MKMapRectGetMaxY(mapRect))); + + return @[ + @[ + [NSNumber numberWithDouble:northEast.longitude], + [NSNumber numberWithDouble:northEast.latitude] + ], + @[ + [NSNumber numberWithDouble:southWest.longitude], + [NSNumber numberWithDouble:southWest.latitude] + ] + ]; +} + +- (void)setShowsUserLocation:(BOOL)showsUserLocation +{ + if (self.showsUserLocation != showsUserLocation) { + if (showsUserLocation && !_locationManager) { + _locationManager = [CLLocationManager new]; + if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { + [_locationManager requestWhenInUseAuthorization]; + } + } + super.showsUserLocation = showsUserLocation; + } +} + +- (void)setFollowsUserLocation:(BOOL)followsUserLocation +{ + _followUserLocation = followsUserLocation; +} + +- (void)setHandlePanDrag:(BOOL)handleMapDrag { + for (UIGestureRecognizer *recognizer in [self gestureRecognizers]) { + if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) { + recognizer.enabled = handleMapDrag; + break; + } + } +} + +- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated +{ + // If location is invalid, abort + if (!CLLocationCoordinate2DIsValid(region.center)) { + return; + } + + // If new span values are nil, use old values instead + if (!region.span.latitudeDelta) { + region.span.latitudeDelta = self.region.span.latitudeDelta; + } + if (!region.span.longitudeDelta) { + region.span.longitudeDelta = self.region.span.longitudeDelta; + } + + // Animate/move to new position + [super setRegion:region animated:animated]; +} + +- (void)setInitialRegion:(MKCoordinateRegion)initialRegion { + if (!_initialRegionSet) { + _initialRegionSet = YES; + [self setRegion:initialRegion animated:NO]; + } +} + +- (void)setCamera:(MKMapCamera*)camera animated:(BOOL)animated +{ + [super setCamera:camera animated:animated]; +} + + +- (void)setInitialCamera:(MKMapCamera*)initialCamera { + if (!_initialCameraSet) { + _initialCameraSet = YES; + [self setCamera:initialCamera animated:NO]; + } +} + +- (void)setCacheEnabled:(BOOL)cacheEnabled { + _cacheEnabled = cacheEnabled; + if (self.cacheEnabled && self.cacheImageView.image == nil) { + self.loadingView.hidden = NO; + [self.activityIndicatorView startAnimating]; + } + else { + if (_loadingView != nil) { + self.loadingView.hidden = YES; + } + } +} + +- (void)setLoadingEnabled:(BOOL)loadingEnabled { + _loadingEnabled = loadingEnabled; + if (!self.hasShownInitialLoading) { + self.loadingView.hidden = !self.loadingEnabled; + } + else { + if (_loadingView != nil) { + self.loadingView.hidden = YES; + } + } +} + +- (UIColor *)loadingBackgroundColor { + return self.loadingView.backgroundColor; +} + +- (void)setLoadingBackgroundColor:(UIColor *)loadingBackgroundColor { + self.loadingView.backgroundColor = loadingBackgroundColor; +} + +- (UIColor *)loadingIndicatorColor { + return self.activityIndicatorView.color; +} + +- (void)setLoadingIndicatorColor:(UIColor *)loadingIndicatorColor { + self.activityIndicatorView.color = loadingIndicatorColor; +} + +// Include properties of MKMapView which are only available on iOS 9+ +// and check if their selector is available before calling super method. + +- (void)setShowsCompass:(BOOL)showsCompass { + if ([MKMapView instancesRespondToSelector:@selector(setShowsCompass:)]) { + [super setShowsCompass:showsCompass]; + } +} + +- (BOOL)showsCompass { + if ([MKMapView instancesRespondToSelector:@selector(showsCompass)]) { + return [super showsCompass]; + } else { + return NO; + } +} + +- (void)setShowsScale:(BOOL)showsScale { + if ([MKMapView instancesRespondToSelector:@selector(setShowsScale:)]) { + [super setShowsScale:showsScale]; + } +} + +- (BOOL)showsScale { + if ([MKMapView instancesRespondToSelector:@selector(showsScale)]) { + return [super showsScale]; + } else { + return NO; + } +} + +- (void)setShowsTraffic:(BOOL)showsTraffic { + if ([MKMapView instancesRespondToSelector:@selector(setShowsTraffic:)]) { + [super setShowsTraffic:showsTraffic]; + } +} + +- (BOOL)showsTraffic { + if ([MKMapView instancesRespondToSelector:@selector(showsTraffic)]) { + return [super showsTraffic]; + } else { + return NO; + } +} + +- (void)setScrollEnabled:(BOOL)scrollEnabled { + self.shouldScrollEnabled = [NSNumber numberWithBool:scrollEnabled]; + [self updateScrollEnabled]; +} + +- (void)updateScrollEnabled { + if (self.cacheEnabled) { + [super setScrollEnabled:NO]; + } + else if (self.shouldScrollEnabled != nil) { + [super setScrollEnabled:[self.shouldScrollEnabled boolValue]]; + } +} + +- (void)setZoomEnabled:(BOOL)zoomEnabled { + self.shouldZoomEnabled = [NSNumber numberWithBool:zoomEnabled]; + [self updateZoomEnabled]; +} + +- (void)updateZoomEnabled { + if (self.cacheEnabled) { + [super setZoomEnabled: NO]; + } + else if (self.shouldZoomEnabled != nil) { + [super setZoomEnabled:[self.shouldZoomEnabled boolValue]]; + } +} + +- (void)cacheViewIfNeeded { + if (self.hasShownInitialLoading) { + if (!self.cacheEnabled) { + if (_cacheImageView != nil) { + self.cacheImageView.hidden = YES; + self.cacheImageView.image = nil; + } + } + else { + self.cacheImageView.image = nil; + self.cacheImageView.hidden = YES; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + self.cacheImageView.image = nil; + self.cacheImageView.hidden = YES; + UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0); + [self.layer renderInContext:UIGraphicsGetCurrentContext()]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + self.cacheImageView.image = image; + self.cacheImageView.hidden = NO; + }); + } + + [self updateScrollEnabled]; + [self updateZoomEnabled]; + [self updateLegalLabelInsets]; + } +} + +- (void)updateLegalLabelInsets { + if (_legalLabel) { + dispatch_async(dispatch_get_main_queue(), ^{ + CGRect frame = self->_legalLabel.frame; + if (self->_legalLabelInsets.left) { + frame.origin.x = self->_legalLabelInsets.left; + } else if (self->_legalLabelInsets.right) { + frame.origin.x = self.frame.size.width - self->_legalLabelInsets.right - frame.size.width; + } + if (self->_legalLabelInsets.top) { + frame.origin.y = self->_legalLabelInsets.top; + } else if (self->_legalLabelInsets.bottom) { + frame.origin.y = self.frame.size.height - self->_legalLabelInsets.bottom - frame.size.height; + } + self->_legalLabel.frame = frame; + }); + } +} + + +- (void)setLegalLabelInsets:(UIEdgeInsets)legalLabelInsets { + _legalLabelInsets = legalLabelInsets; + [self updateLegalLabelInsets]; +} + +- (void)beginLoading { + if ((!self.hasShownInitialLoading && self.loadingEnabled) || (self.cacheEnabled && self.cacheImageView.image == nil)) { + self.loadingView.hidden = NO; + [self.activityIndicatorView startAnimating]; + } + else { + if (_loadingView != nil) { + self.loadingView.hidden = YES; + } + } +} + +- (void)finishLoading { + self.hasShownInitialLoading = YES; + if (_loadingView != nil) { + self.loadingView.hidden = YES; + } + [self cacheViewIfNeeded]; +} + +- (UIActivityIndicatorView *)activityIndicatorView { + if (_activityIndicatorView == nil) { + _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + _activityIndicatorView.center = self.loadingView.center; + _activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + _activityIndicatorView.color = [UIColor colorWithRed:96.f/255.f green:96.f/255.f blue:96.f/255.f alpha:1.f]; // defaults to #606060 + } + [self.loadingView addSubview:_activityIndicatorView]; + return _activityIndicatorView; +} + +- (UIView *)loadingView { + if (_loadingView == nil) { + _loadingView = [[UIView alloc] initWithFrame:self.bounds]; + _loadingView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; + _loadingView.backgroundColor = [UIColor whiteColor]; // defaults to #FFFFFF + [self addSubview:_loadingView]; + _loadingView.hidden = NO; + } + return _loadingView; +} + +- (UIImageView *)cacheImageView { + if (_cacheImageView == nil) { + _cacheImageView = [[UIImageView alloc] initWithFrame:self.bounds]; + _cacheImageView.contentMode = UIViewContentModeCenter; + _cacheImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; + [self addSubview:self.cacheImageView]; + _cacheImageView.hidden = YES; + } + return _cacheImageView; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + [self cacheViewIfNeeded]; + NSUInteger index = [[self subviews] indexOfObjectPassingTest:^BOOL(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSString *str = NSStringFromClass([obj class]); + return [str containsString:@"MKCompassView"]; + }]; + if (index != NSNotFound) { + UIView* compassButton; + compassButton = [self.subviews objectAtIndex:index]; + compassButton.frame = CGRectMake(compassButton.frame.origin.x + _compassOffset.x, compassButton.frame.origin.y + _compassOffset.y, compassButton.frame.size.width, compassButton.frame.size.height); + } +} + +@end diff --git a/lib/ios/AirMaps/AIRMapCallout.h b/lib/ios/AirMaps/AIRMapCallout.h new file mode 100644 index 0000000..da57fd7 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCallout.h @@ -0,0 +1,18 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import +#import + + +@interface AIRMapCallout : RCTView + +@property (nonatomic, assign) BOOL tooltip; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, assign) BOOL alphaHitTest; + +- (BOOL) isPointInside:(CGPoint)pointInCallout; + +@end diff --git a/lib/ios/AirMaps/AIRMapCallout.m b/lib/ios/AirMaps/AIRMapCallout.m new file mode 100644 index 0000000..b321e0f --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCallout.m @@ -0,0 +1,30 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "AIRMapCallout.h" + + +@implementation AIRMapCallout + +- (BOOL) isPointInside:(CGPoint)pointInCallout { + if (!self.alphaHitTest) + return TRUE; + CGFloat alpha = [self alphaOfPoint:pointInCallout]; + return alpha >= 0.01; +} + +- (CGFloat) alphaOfPoint:(CGPoint)point { + unsigned char pixel[4] = {0}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); + CGContextTranslateCTM(context, -point.x, -point.y); + [self.layer renderInContext:context]; + CGContextRelease(context); + CGColorSpaceRelease(colorSpace); + return pixel[3]/255.0; +} + + +@end diff --git a/lib/ios/AirMaps/AIRMapCalloutManager.h b/lib/ios/AirMaps/AIRMapCalloutManager.h new file mode 100644 index 0000000..411739a --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutManager.h @@ -0,0 +1,10 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + + +@interface AIRMapCalloutManager : RCTViewManager +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapCalloutManager.m b/lib/ios/AirMaps/AIRMapCalloutManager.m new file mode 100644 index 0000000..2594f5d --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutManager.m @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapCalloutManager.h" + +#import +#import +#import +#import +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapCallout.h" + +@interface AIRMapCalloutManager() + +@end + +@implementation AIRMapCalloutManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + return [AIRMapCallout new]; +} + +RCT_EXPORT_VIEW_PROPERTY(tooltip, BOOL) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(alphaHitTest, BOOL) + +@end diff --git a/lib/ios/AirMaps/AIRMapCalloutSubview.h b/lib/ios/AirMaps/AIRMapCalloutSubview.h new file mode 100644 index 0000000..18ef652 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutSubview.h @@ -0,0 +1,15 @@ +// +// AIRMapCalloutSubview.h +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#import +#import + +@interface AIRMapCalloutSubview : UIView +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@end + diff --git a/lib/ios/AirMaps/AIRMapCalloutSubview.m b/lib/ios/AirMaps/AIRMapCalloutSubview.m new file mode 100644 index 0000000..32f0361 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutSubview.m @@ -0,0 +1,15 @@ +// +// AIRMapCalloutSubview.m +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#import "AIRMapCalloutSubview.h" +#import +#import +#import + +@implementation AIRMapCalloutSubview +@end diff --git a/lib/ios/AirMaps/AIRMapCalloutSubviewManager.h b/lib/ios/AirMaps/AIRMapCalloutSubviewManager.h new file mode 100644 index 0000000..e7cb9f4 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutSubviewManager.h @@ -0,0 +1,14 @@ +// +// AIRMapCalloutSubviewManager.h +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#import + +@interface AIRMapCalloutSubviewManager : RCTViewManager + +@end + diff --git a/lib/ios/AirMaps/AIRMapCalloutSubviewManager.m b/lib/ios/AirMaps/AIRMapCalloutSubviewManager.m new file mode 100644 index 0000000..3b48fd3 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCalloutSubviewManager.m @@ -0,0 +1,24 @@ +// +// AIRMapCalloutSubviewManager.m +// AirMaps +// +// Created by Denis Oblogin on 10/8/18. +// +// + +#import "AIRMapCalloutSubviewManager.h" +#import "AIRMapCalloutSubview.h" +#import + +@implementation AIRMapCalloutSubviewManager +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapCalloutSubview *calloutSubview = [AIRMapCalloutSubview new]; + return calloutSubview; +} + +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end diff --git a/lib/ios/AirMaps/AIRMapCircle.h b/lib/ios/AirMaps/AIRMapCircle.h new file mode 100644 index 0000000..83a70f2 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCircle.h @@ -0,0 +1,44 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + +#import +#import + +#import +#import + +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + +@interface AIRMapCircle: MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKCircle *circle; +@property (nonatomic, strong) MKCircleRenderer *renderer; + +@property (nonatomic, assign) CLLocationCoordinate2D centerCoordinate; +@property (nonatomic, assign) CLLocationDistance radius; + +@property (nonatomic, strong) UIColor *fillColor; +@property (nonatomic, strong) UIColor *strokeColor; +@property (nonatomic, assign) CGFloat strokeWidth; +@property (nonatomic, assign) CGFloat miterLimit; +@property (nonatomic, assign) CGLineCap lineCap; +@property (nonatomic, assign) CGLineJoin lineJoin; +@property (nonatomic, assign) CGFloat lineDashPhase; +@property (nonatomic, strong) NSArray *lineDashPattern; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapCircle.m b/lib/ios/AirMaps/AIRMapCircle.m new file mode 100644 index 0000000..540c4d4 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCircle.m @@ -0,0 +1,169 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "AIRMapCircle.h" +#import + + +@implementation AIRMapCircle { + BOOL _radiusSet; + BOOL _centerSet; +} + +- (void)setFillColor:(UIColor *)fillColor { + _fillColor = fillColor; + [self update]; +} + +- (void)setStrokeColor:(UIColor *)strokeColor { + _strokeColor = strokeColor; + [self update]; +} + +- (void)setStrokeWidth:(CGFloat)strokeWidth { + _strokeWidth = strokeWidth; + [self update]; +} + +- (void)setLineJoin:(CGLineJoin)lineJoin { + _lineJoin = lineJoin; + [self update]; +} + +- (void)setLineCap:(CGLineCap)lineCap { + _lineCap = lineCap; + [self update]; +} + +- (void)setMiterLimit:(CGFloat)miterLimit { + _miterLimit = miterLimit; + [self update]; +} + +- (void)setLineDashPhase:(CGFloat)lineDashPhase { + _lineDashPhase = lineDashPhase; + [self update]; +} + +- (void)setLineDashPattern:(NSArray *)lineDashPattern { + _lineDashPattern = lineDashPattern; + [self update]; +} + +- (void)setRadius:(CLLocationDistance)radius { + _radius = radius; + _radiusSet = YES; + [self createCircleAndRendererIfPossible]; + [self update]; +} + +- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate{ + _centerCoordinate = centerCoordinate; + _centerSet = YES; + [self createCircleAndRendererIfPossible]; + [self update]; +} + +- (void) createCircleAndRendererIfPossible +{ + if (!_centerSet || !_radiusSet) return; + self.circle = [MKCircle circleWithCenterCoordinate:_centerCoordinate radius:_radius]; + self.renderer = [[MKCircleRenderer alloc] initWithCircle:self.circle]; +} + +- (void) update +{ + if (!_renderer) return; + _renderer.fillColor = _fillColor; + _renderer.strokeColor = _strokeColor; + _renderer.lineWidth = _strokeWidth; + _renderer.lineCap = _lineCap; + _renderer.lineJoin = _lineJoin; + _renderer.miterLimit = _miterLimit; + _renderer.lineDashPhase = _lineDashPhase; + _renderer.lineDashPattern = _lineDashPattern; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self]; +} + + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.circle.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.circle.boundingMapRect; +} + +- (BOOL)intersectsMapRect:(MKMapRect)mapRect +{ + BOOL answer = [self.circle intersectsMapRect:mapRect]; + return answer; +} + +- (BOOL)canReplaceMapContent +{ + return NO; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapCircleManager.h b/lib/ios/AirMaps/AIRMapCircleManager.h new file mode 100644 index 0000000..55f52a0 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCircleManager.h @@ -0,0 +1,10 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + + +@interface AIRMapCircleManager : RCTViewManager +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapCircleManager.m b/lib/ios/AirMaps/AIRMapCircleManager.m new file mode 100644 index 0000000..c7c4a2a --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCircleManager.m @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapCircleManager.h" + +#import +#import +#import +#import +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapCircle.h" + +@interface AIRMapCircleManager() + +@end + +@implementation AIRMapCircleManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapCircle *circle = [AIRMapCircle new]; + return circle; +} + +RCT_REMAP_VIEW_PROPERTY(center, centerCoordinate, CLLocationCoordinate2D) +RCT_EXPORT_VIEW_PROPERTY(radius, CLLocationDistance) +RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineCap, CGLineCap) +RCT_EXPORT_VIEW_PROPERTY(lineJoin, CGLineJoin) +RCT_EXPORT_VIEW_PROPERTY(miterLimit, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPhase, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPattern, NSArray) + +// NOTE(lmr): +// for now, onPress events for overlays will be left unimplemented. Seems it is possible with some work, but +// it is difficult to achieve in both ios and android so I decided to leave it out. +//RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end diff --git a/lib/ios/AirMaps/AIRMapCoordinate.h b/lib/ios/AirMaps/AIRMapCoordinate.h new file mode 100644 index 0000000..71ea0c5 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCoordinate.h @@ -0,0 +1,13 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import +#import + +@interface AIRMapCoordinate : NSObject + +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; + +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapCoordinate.m b/lib/ios/AirMaps/AIRMapCoordinate.m new file mode 100644 index 0000000..4a5cfe8 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapCoordinate.m @@ -0,0 +1,12 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "AIRMapCoordinate.h" + + +@implementation AIRMapCoordinate { + +} +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapLocalTile.h b/lib/ios/AirMaps/AIRMapLocalTile.h new file mode 100644 index 0000000..d03d7b1 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTile.h @@ -0,0 +1,36 @@ +// +// AIRMapLocalTile.h +// AirMaps +// +// Created by Peter Zavadsky on 01/12/2017. +// Copyright © 2017 Christopher. All rights reserved. +// + +#import +#import +#import + +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + +@interface AIRMapLocalTile : MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKTileOverlay *tileOverlay; +@property (nonatomic, strong) MKTileOverlayRenderer *renderer; + +@property (nonatomic, copy) NSString *pathTemplate; +@property (nonatomic, assign) CGFloat tileSize; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +//- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapLocalTile.m b/lib/ios/AirMaps/AIRMapLocalTile.m new file mode 100644 index 0000000..17e3882 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTile.m @@ -0,0 +1,68 @@ +// +// AIRMapLocalTile.m +// AirMaps +// +// Created by Peter Zavadsky on 01/12/2017. +// Copyright © 2017 Christopher. All rights reserved. +// + +#import "AIRMapLocalTile.h" +#import +#import "AIRMapLocalTileOverlay.h" + +@implementation AIRMapLocalTile { + BOOL _pathTemplateSet; + BOOL _tileSizeSet; +} + + +- (void)setPathTemplate:(NSString *)pathTemplate{ + _pathTemplate = pathTemplate; + _pathTemplateSet = YES; + [self createTileOverlayAndRendererIfPossible]; + [self update]; +} + +- (void)setTileSize:(CGFloat)tileSize{ + _tileSize = tileSize; + _tileSizeSet = YES; + [self createTileOverlayAndRendererIfPossible]; + [self update]; +} + +- (void) createTileOverlayAndRendererIfPossible +{ + if (!_pathTemplateSet || !_tileSizeSet) return; + self.tileOverlay = [[AIRMapLocalTileOverlay alloc] initWithURLTemplate:self.pathTemplate]; + self.tileOverlay.canReplaceMapContent = YES; + self.tileOverlay.tileSize = CGSizeMake(_tileSize, _tileSize); + self.renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:self.tileOverlay]; +} + +- (void) update +{ + if (!_renderer) return; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self level:MKOverlayLevelAboveLabels]; +} + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.tileOverlay.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.tileOverlay.boundingMapRect; +} + +- (BOOL)canReplaceMapContent +{ + return self.tileOverlay.canReplaceMapContent; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapLocalTileManager.h b/lib/ios/AirMaps/AIRMapLocalTileManager.h new file mode 100644 index 0000000..c6ee326 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTileManager.h @@ -0,0 +1,13 @@ +// +// AIRMapLocalTileManager.h +// AirMaps +// +// Created by Peter Zavadsky on 01/12/2017. +// Copyright © 2017 Christopher. All rights reserved. +// + +#import + +@interface AIRMapLocalTileManager : RCTViewManager + +@end diff --git a/lib/ios/AirMaps/AIRMapLocalTileManager.m b/lib/ios/AirMaps/AIRMapLocalTileManager.m new file mode 100644 index 0000000..a7997bf --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTileManager.m @@ -0,0 +1,38 @@ +// +// AIRMapLocalTileManager.m +// AirMaps +// +// Created by Peter Zavadsky on 01/12/2017. +// Copyright © 2017 Christopher. All rights reserved. +// + +#import +#import +#import +#import +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapLocalTile.h" + +#import "AIRMapLocalTileManager.h" + +@interface AIRMapLocalTileManager() + +@end + +@implementation AIRMapLocalTileManager + + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapLocalTile *tile = [AIRMapLocalTile new]; + return tile; +} + +RCT_EXPORT_VIEW_PROPERTY(pathTemplate, NSString) +RCT_EXPORT_VIEW_PROPERTY(tileSize, CGFloat) + +@end diff --git a/lib/ios/AirMaps/AIRMapLocalTileOverlay.h b/lib/ios/AirMaps/AIRMapLocalTileOverlay.h new file mode 100644 index 0000000..f588e10 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTileOverlay.h @@ -0,0 +1,12 @@ +// +// AIRMapLocalTileOverlay.h +// Pods +// +// Created by Peter Zavadsky on 04/12/2017. +// + +#import + +@interface AIRMapLocalTileOverlay : MKTileOverlay + +@end diff --git a/lib/ios/AirMaps/AIRMapLocalTileOverlay.m b/lib/ios/AirMaps/AIRMapLocalTileOverlay.m new file mode 100644 index 0000000..27b02fa --- /dev/null +++ b/lib/ios/AirMaps/AIRMapLocalTileOverlay.m @@ -0,0 +1,31 @@ +// +// AIRMapLocalTileOverlay.m +// Pods-AirMapsExplorer +// +// Created by Peter Zavadsky on 04/12/2017. +// + +#import "AIRMapLocalTileOverlay.h" + +@interface AIRMapLocalTileOverlay () + +@end + +@implementation AIRMapLocalTileOverlay + + +-(void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *, NSError *))result { + NSMutableString *tileFilePath = [self.URLTemplate mutableCopy]; + [tileFilePath replaceOccurrencesOfString: @"{x}" withString:[NSString stringWithFormat:@"%li", (long)path.x] options:0 range:NSMakeRange(0, tileFilePath.length)]; + [tileFilePath replaceOccurrencesOfString:@"{y}" withString:[NSString stringWithFormat:@"%li", (long)path.y] options:0 range:NSMakeRange(0, tileFilePath.length)]; + [tileFilePath replaceOccurrencesOfString:@"{z}" withString:[NSString stringWithFormat:@"%li", (long)path.z] options:0 range:NSMakeRange(0, tileFilePath.length)]; + if ([[NSFileManager defaultManager] fileExistsAtPath:tileFilePath]) { + NSData* tile = [NSData dataWithContentsOfFile:tileFilePath]; + result(tile,nil); + } else { + result(nil, nil); + } +} + + +@end diff --git a/lib/ios/AirMaps/AIRMapManager.h b/lib/ios/AirMaps/AIRMapManager.h new file mode 100644 index 0000000..1d73b40 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapManager.h @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "AIRMap.h" + +#define MERCATOR_RADIUS 85445659.44705395 +#define MERCATOR_OFFSET 268435456 + +@interface AIRMapManager : RCTViewManager + + +- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate + zoomLevel:(double)zoomLevel + animated:(BOOL)animated + mapView:(AIRMap *)mapView; + +- (MKCoordinateRegion)coordinateRegionWithMapView:(AIRMap *)mapView + centerCoordinate:(CLLocationCoordinate2D)centerCoordinate + andZoomLevel:(double)zoomLevel; +- (double) zoomLevel:(AIRMap *)mapView; + +@end diff --git a/lib/ios/AirMaps/AIRMapManager.m b/lib/ios/AirMaps/AIRMapManager.m new file mode 100644 index 0000000..63c93b5 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapManager.m @@ -0,0 +1,1252 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapManager.h" + +#import +#import +#import +#import +#import +#import +#import +#import "AIRMap.h" +#import "AIRMapMarker.h" +#import "AIRMapPolyline.h" +#import "AIRMapPolygon.h" +#import "AIRMapCircle.h" +#import "SMCalloutView.h" +#import "AIRMapUrlTile.h" +#import "AIRMapWMSTile.h" +#import "AIRMapLocalTile.h" +#import "AIRMapSnapshot.h" +#import "RCTConvert+AirMap.h" +#import "AIRMapOverlay.h" +#import "AIRWeakTimerReference.h" +#import "AIRWeakMapReference.h" +#import + +static NSString *const RCTMapViewKey = @"MapView"; + + +@interface AIRMapManager() + +@end + +@implementation AIRMapManager{ + BOOL _hasObserver; +} + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMap *map = [AIRMap new]; + map.delegate = self; + + map.isAccessibilityElement = YES; + map.accessibilityElementsHidden = NO; + + // MKMapView doesn't report tap events, so we attach gesture recognizers to it + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapTap:)]; + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapLongPress:)]; + UIPanGestureRecognizer *drag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleMapDrag:)]; + [drag setMinimumNumberOfTouches:1]; + [drag setMaximumNumberOfTouches:1]; + // setting this to NO allows the parent MapView to continue receiving marker selection events + tap.cancelsTouchesInView = NO; + longPress.cancelsTouchesInView = NO; + + // disable drag by default + drag.enabled = NO; + + [map addGestureRecognizer:tap]; + [map addGestureRecognizer:longPress]; + [map addGestureRecognizer:drag]; + + return map; +} + +RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString) +RCT_EXPORT_VIEW_PROPERTY(showsUserLocation, BOOL) +RCT_EXPORT_VIEW_PROPERTY(userLocationAnnotationTitle, NSString) +RCT_EXPORT_VIEW_PROPERTY(followsUserLocation, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsPointsOfInterest, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsBuildings, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsCompass, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsScale, BOOL) +RCT_EXPORT_VIEW_PROPERTY(showsTraffic, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zoomEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(kmlSrc, NSString) +RCT_EXPORT_VIEW_PROPERTY(rotateEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(scrollEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(pitchEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(cacheEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(loadingEnabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(loadingBackgroundColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(loadingIndicatorColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(handlePanDrag, BOOL) +RCT_EXPORT_VIEW_PROPERTY(maxDelta, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(minDelta, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(compassOffset, CGPoint) +RCT_EXPORT_VIEW_PROPERTY(legalLabelInsets, UIEdgeInsets) +RCT_EXPORT_VIEW_PROPERTY(mapType, MKMapType) +RCT_EXPORT_VIEW_PROPERTY(onMapReady, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPanDrag, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onLongPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerPress, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerSelect, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerDeselect, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerDragStart, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerDrag, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMarkerDragEnd, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onCalloutPress, RCTDirectEventBlock) +RCT_CUSTOM_VIEW_PROPERTY(initialRegion, MKCoordinateRegion, AIRMap) +{ + if (json == nil) return; + + // don't emit region change events when we are setting the initialRegion + BOOL originalIgnore = view.ignoreRegionChanges; + view.ignoreRegionChanges = YES; + [view setInitialRegion:[RCTConvert MKCoordinateRegion:json]]; + view.ignoreRegionChanges = originalIgnore; +} +RCT_CUSTOM_VIEW_PROPERTY(initialCamera, MKMapCamera, AIRMap) +{ + if (json == nil) return; + + // don't emit region change events when we are setting the initialCamera + BOOL originalIgnore = view.ignoreRegionChanges; + view.ignoreRegionChanges = YES; + [view setInitialCamera:[RCTConvert MKMapCamera:json]]; + view.ignoreRegionChanges = originalIgnore; +} + + +RCT_EXPORT_VIEW_PROPERTY(minZoomLevel, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(maxZoomLevel, CGFloat) + + +RCT_CUSTOM_VIEW_PROPERTY(region, MKCoordinateRegion, AIRMap) +{ + if (json == nil) return; + + // don't emit region change events when we are setting the region + BOOL originalIgnore = view.ignoreRegionChanges; + view.ignoreRegionChanges = YES; + [view setRegion:[RCTConvert MKCoordinateRegion:json] animated:NO]; + view.ignoreRegionChanges = originalIgnore; +} + +RCT_CUSTOM_VIEW_PROPERTY(camera, MKMapCamera*, AIRMap) +{ + if (json == nil) return; + + // don't emit region change events when we are setting the camera + BOOL originalIgnore = view.ignoreRegionChanges; + view.ignoreRegionChanges = YES; + [view setCamera:[RCTConvert MKMapCamera:json] animated:NO]; + view.ignoreRegionChanges = originalIgnore; +} + + +#pragma mark exported MapView methods + +RCT_EXPORT_METHOD(getMapBoundaries:(nonnull NSNumber *)reactTag + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + NSArray *boundingBox = [view getMapBoundaries]; + + resolve(@{ + @"northEast" : @{ + @"longitude" : boundingBox[0][0], + @"latitude" : boundingBox[0][1] + }, + @"southWest" : @{ + @"longitude" : boundingBox[1][0], + @"latitude" : boundingBox[1][1] + } + }); + } + }]; +} + + + +RCT_EXPORT_METHOD(getCamera:(nonnull NSNumber *)reactTag + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + AIRMap *mapView = (AIRMap *)view; + if (![view isKindOfClass:[AIRMap class]]) { + reject(@"Invalid argument", [NSString stringWithFormat:@"Invalid view returned from registry, expecting AIRMap, got: %@", view], NULL); + } else { + MKMapCamera *camera = [mapView camera]; + resolve(@{ + @"center": @{ + @"latitude": @(camera.centerCoordinate.latitude), + @"longitude": @(camera.centerCoordinate.longitude), + }, + @"pitch": @(camera.pitch), + @"heading": @(camera.heading), + @"altitude": @(camera.altitude), + }); + } + }]; +} + + +RCT_EXPORT_METHOD(setCamera:(nonnull NSNumber *)reactTag + camera:(id)json) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + + // Merge the changes given with the current camera + MKMapCamera *camera = [RCTConvert MKMapCameraWithDefaults:json existingCamera:[mapView camera]]; + + // don't emit region change events when we are setting the camera + BOOL originalIgnore = mapView.ignoreRegionChanges; + mapView.ignoreRegionChanges = YES; + [mapView setCamera:camera animated:NO]; + mapView.ignoreRegionChanges = originalIgnore; + } + }]; +} + + +RCT_EXPORT_METHOD(animateCamera:(nonnull NSNumber *)reactTag + withCamera:(id)json + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + + // Merge the changes given with the current camera + MKMapCamera *camera = [RCTConvert MKMapCameraWithDefaults:json existingCamera:[mapView camera]]; + + // don't emit region change events when we are setting the camera + BOOL originalIgnore = mapView.ignoreRegionChanges; + mapView.ignoreRegionChanges = YES; + [AIRMap animateWithDuration:duration/1000 animations:^{ + [mapView setCamera:camera animated:YES]; + } completion:^(BOOL finished){ + mapView.ignoreRegionChanges = originalIgnore; + }]; + } + }]; +} + + +RCT_EXPORT_METHOD(animateToNavigation:(nonnull NSNumber *)reactTag + withRegion:(MKCoordinateRegion)region + withBearing:(CGFloat)bearing + withAngle:(double)angle + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + MKMapCamera *mapCamera = [[mapView camera] copy]; + [mapCamera setPitch:angle]; + [mapCamera setHeading:bearing]; + + [AIRMap animateWithDuration:duration/1000 animations:^{ + [(AIRMap *)view setRegion:region animated:YES]; + [mapView setCamera:mapCamera animated:YES]; + }]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToRegion:(nonnull NSNumber *)reactTag + withRegion:(MKCoordinateRegion)region + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [AIRMap animateWithDuration:duration/1000 animations:^{ + [(AIRMap *)view setRegion:region animated:YES]; + }]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToCoordinate:(nonnull NSNumber *)reactTag + withRegion:(CLLocationCoordinate2D)latlng + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + MKCoordinateRegion region; + region.span = mapView.region.span; + region.center = latlng; + [AIRMap animateWithDuration:duration/1000 animations:^{ + [mapView setRegion:region animated:YES]; + }]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToViewingAngle:(nonnull NSNumber *)reactTag + withAngle:(double)angle + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + + MKMapCamera *mapCamera = [[mapView camera] copy]; + [mapCamera setPitch:angle]; + + [AIRMap animateWithDuration:duration/1000 animations:^{ + [mapView setCamera:mapCamera animated:YES]; + }]; + } + }]; +} + +RCT_EXPORT_METHOD(animateToBearing:(nonnull NSNumber *)reactTag + withBearing:(CGFloat)bearing + withDuration:(CGFloat)duration) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + + MKMapCamera *mapCamera = [[mapView camera] copy]; + [mapCamera setHeading:bearing]; + + [AIRMap animateWithDuration:duration/1000 animations:^{ + [mapView setCamera:mapCamera animated:YES]; + }]; + } + }]; +} + +RCT_EXPORT_METHOD(fitToElements:(nonnull NSNumber *)reactTag + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + // TODO(lmr): we potentially want to include overlays here... and could concat the two arrays together. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + [mapView showAnnotations:mapView.annotations animated:animated]; + }); + } + }]; +} + +RCT_EXPORT_METHOD(fitToSuppliedMarkers:(nonnull NSNumber *)reactTag + markers:(nonnull NSArray *)markers + edgePadding:(nonnull NSDictionary *)edgePadding + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + // TODO(lmr): we potentially want to include overlays here... and could concat the two arrays together. + // id annotations = mapView.annotations; + + NSPredicate *filterMarkers = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + AIRMapMarker *marker = (AIRMapMarker *)evaluatedObject; + return [marker isKindOfClass:[AIRMapMarker class]] && [markers containsObject:marker.identifier]; + }]; + + NSArray *filteredMarkers = [mapView.annotations filteredArrayUsingPredicate:filterMarkers]; + + [mapView showAnnotations:filteredMarkers animated:animated]; + + } + }]; +} + +RCT_EXPORT_METHOD(fitToCoordinates:(nonnull NSNumber *)reactTag + coordinates:(nonnull NSArray *)coordinates + edgePadding:(nonnull NSDictionary *)edgePadding + animated:(BOOL)animated) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + + // Create Polyline with coordinates + CLLocationCoordinate2D coords[coordinates.count]; + for(int i = 0; i < coordinates.count; i++) + { + coords[i] = coordinates[i].coordinate; + } + MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordinates.count]; + + // Set Map viewport + CGFloat top = [RCTConvert CGFloat:edgePadding[@"top"]]; + CGFloat right = [RCTConvert CGFloat:edgePadding[@"right"]]; + CGFloat bottom = [RCTConvert CGFloat:edgePadding[@"bottom"]]; + CGFloat left = [RCTConvert CGFloat:edgePadding[@"left"]]; + + [mapView setVisibleMapRect:[polyline boundingMapRect] edgePadding:UIEdgeInsetsMake(top, left, bottom, right) animated:animated]; + + } + }]; +} + +RCT_EXPORT_METHOD(takeSnapshot:(nonnull NSNumber *)reactTag + width:(nonnull NSNumber *)width + height:(nonnull NSNumber *)height + region:(MKCoordinateRegion)region + format:(nonnull NSString *)format + quality:(nonnull NSNumber *)quality + result:(nonnull NSString *)result + callback:(RCTResponseSenderBlock)callback) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMap class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + AIRMap *mapView = (AIRMap *)view; + MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init]; + + options.region = (region.center.latitude && region.center.longitude) ? region : mapView.region; + options.size = CGSizeMake( + ([width floatValue] == 0) ? mapView.bounds.size.width : [width floatValue], + ([height floatValue] == 0) ? mapView.bounds.size.height : [height floatValue] + ); + options.scale = [[UIScreen mainScreen] scale]; + + MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options]; + + [self takeMapSnapshot:mapView + snapshotter:snapshotter + format:format + quality:quality.floatValue + result:result + callback:callback]; + } + }]; +} + +RCT_EXPORT_METHOD(pointForCoordinate:(nonnull NSNumber *)reactTag + coordinate: (NSDictionary *)coordinate + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + AIRMap *mapView = (AIRMap *)view; + if (![view isKindOfClass:[AIRMap class]]) { + reject(@"Invalid argument", [NSString stringWithFormat:@"Invalid view returned from registry, expecting AIRMap, got: %@", view], NULL); + } else { + CGPoint touchPoint = [mapView convertCoordinate: + CLLocationCoordinate2DMake( + [coordinate[@"latitude"] doubleValue], + [coordinate[@"longitude"] doubleValue] + ) + toPointToView:mapView]; + + resolve(@{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }); + } + }]; +} + +RCT_EXPORT_METHOD(getMarkersFrames:(nonnull NSNumber *)reactTag + onlyVisible:(BOOL)onlyVisible + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + AIRMap *mapView = (AIRMap *)view; + if (![view isKindOfClass:[AIRMap class]]) { + reject(@"Invalid argument", [NSString stringWithFormat:@"Invalid view returned from registry, expecting AIRMap, got: %@", view], NULL); + } else { + resolve([mapView getMarkersFramesWithOnlyVisible:onlyVisible]); + } + }]; +} + + + +RCT_EXPORT_METHOD(coordinateForPoint:(nonnull NSNumber *)reactTag + point:(NSDictionary *)point + resolver: (RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + AIRMap *mapView = (AIRMap *)view; + if (![view isKindOfClass:[AIRMap class]]) { + reject(@"Invalid argument", [NSString stringWithFormat:@"Invalid view returned from registry, expecting AIRMap, got: %@", view], NULL); + } else { + CLLocationCoordinate2D coordinate = [mapView convertPoint: + CGPointMake( + [point[@"x"] doubleValue], + [point[@"y"] doubleValue] + ) + toCoordinateFromView:mapView]; + + resolve(@{ + @"latitude": @(coordinate.latitude), + @"longitude": @(coordinate.longitude), + }); + } + }]; +} + +#pragma mark Take Snapshot +- (void)takeMapSnapshot:(AIRMap *)mapView + snapshotter:(MKMapSnapshotter *) snapshotter + format:(NSString *)format + quality:(CGFloat) quality + result:(NSString *)result + callback:(RCTResponseSenderBlock) callback { + NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; + NSString *pathComponent = [NSString stringWithFormat:@"Documents/snapshot-%.20lf.%@", timeStamp, format]; + NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent: pathComponent]; + + [snapshotter startWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) + completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { + if (error) { + callback(@[error]); + return; + } + MKAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:nil]; + + UIImage *image = snapshot.image; + UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale); + { + [image drawAtPoint:CGPointMake(0.0f, 0.0f)]; + + CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); + + for (id overlay in mapView.overlays) { + if ([overlay respondsToSelector:@selector(drawToSnapshot:context:)]) { + [overlay drawToSnapshot:snapshot context:UIGraphicsGetCurrentContext()]; + } + } + + for (id annotation in mapView.annotations) { + CGPoint point = [snapshot pointForCoordinate:annotation.coordinate]; + + MKAnnotationView* anView = [mapView viewForAnnotation: annotation]; + + if (anView){ + pin = anView; + } + + if (CGRectContainsPoint(rect, point)) { + point.x = point.x + pin.centerOffset.x - (pin.bounds.size.width / 2.0f); + point.y = point.y + pin.centerOffset.y - (pin.bounds.size.height / 2.0f); + if (pin.image) { + [pin.image drawAtPoint:point]; + } else { + CGRect pinRect = CGRectMake(point.x, point.y, pin.bounds.size.width, pin.bounds.size.height); + [pin drawViewHierarchyInRect:pinRect afterScreenUpdates:NO]; + } + } + } + + UIImage *compositeImage = UIGraphicsGetImageFromCurrentImageContext(); + + NSData *data; + if ([format isEqualToString:@"png"]) { + data = UIImagePNGRepresentation(compositeImage); + } + else if([format isEqualToString:@"jpg"]) { + data = UIImageJPEGRepresentation(compositeImage, quality); + } + + if ([result isEqualToString:@"file"]) { + [data writeToFile:filePath atomically:YES]; + callback(@[[NSNull null], filePath]); + } + else if ([result isEqualToString:@"base64"]) { + callback(@[[NSNull null], [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]]); + } + else if ([result isEqualToString:@"legacy"]) { + + // In the initial (iOS only) implementation of takeSnapshot, + // both the uri and the base64 encoded string were returned. + // Returning both is rarely useful and in fact causes a + // performance penalty when only the file URI is desired. + // In that case the base64 encoded string was always marshalled + // over the JS-bridge (which is quite slow). + // A new more flexible API was created to cover this. + // This code should be removed in a future release when the + // old API is fully deprecated. + [data writeToFile:filePath atomically:YES]; + NSDictionary *snapshotData = @{ + @"uri": filePath, + @"data": [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn] + }; + callback(@[[NSNull null], snapshotData]); + } + } + UIGraphicsEndImageContext(); + }]; +} + +#pragma mark Gesture Recognizer Handlers + +#define MAX_DISTANCE_PX 10.0f +- (void)handleMapTap:(UITapGestureRecognizer *)recognizer { + AIRMap *map = (AIRMap *)recognizer.view; + + CGPoint tapPoint = [recognizer locationInView:map]; + CLLocationCoordinate2D tapCoordinate = [map convertPoint:tapPoint toCoordinateFromView:map]; + MKMapPoint mapPoint = MKMapPointForCoordinate(tapCoordinate); + CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y); + + double maxMeters = [self metersFromPixel:MAX_DISTANCE_PX atPoint:tapPoint forMap:map]; + float nearestDistance = MAXFLOAT; + AIRMapPolyline *nearestPolyline = nil; + + for (id overlay in map.overlays) { + if([overlay isKindOfClass:[AIRMapPolygon class]]){ + AIRMapPolygon *polygon = (AIRMapPolygon*) overlay; + if (polygon.onPress) { + CGMutablePathRef mpr = CGPathCreateMutable(); + + for(int i = 0; i < polygon.coordinates.count; i++) { + AIRMapCoordinate *c = polygon.coordinates[i]; + MKMapPoint mp = MKMapPointForCoordinate(c.coordinate); + if (i == 0) { + CGPathMoveToPoint(mpr, NULL, mp.x, mp.y); + } else { + CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y); + } + } + + if (CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE)) { + id event = @{ + @"action": @"polygon-press", + }; + polygon.onPress(event); + } + + CGPathRelease(mpr); + } + } + + if([overlay isKindOfClass:[AIRMapPolyline class]]){ + AIRMapPolyline *polyline = (AIRMapPolyline*) overlay; + if (polyline.onPress) { + float distance = [self distanceOfPoint:MKMapPointForCoordinate(tapCoordinate) + toPoly:polyline]; + if (distance < nearestDistance) { + nearestDistance = distance; + nearestPolyline = polyline; + } + } + } + + if ([overlay isKindOfClass:[AIRMapOverlay class]]) { + AIRMapOverlay *imageOverlay = (AIRMapOverlay*) overlay; + if (MKMapRectContainsPoint(imageOverlay.boundingMapRect, mapPoint)) { + if (imageOverlay.onPress) { + id event = @{ + @"action": @"image-overlay-press", + @"name": imageOverlay.name ?: @"unknown", + @"coordinate": @{ + @"latitude": @(imageOverlay.coordinate.latitude), + @"longitude": @(imageOverlay.coordinate.longitude) + } + }; + imageOverlay.onPress(event); + } + } + } + + } + + if (nearestDistance <= maxMeters) { + id event = @{ + @"action": @"polyline-press", + }; + nearestPolyline.onPress(event); + } + + if (!map.onPress) return; + map.onPress(@{ + @"coordinate": @{ + @"latitude": @(tapCoordinate.latitude), + @"longitude": @(tapCoordinate.longitude), + }, + @"position": @{ + @"x": @(tapPoint.x), + @"y": @(tapPoint.y), + }, + }); + +} + +- (void)handleMapDrag:(UIPanGestureRecognizer*)recognizer { + AIRMap *map = (AIRMap *)recognizer.view; + if (!map.onPanDrag) return; + + CGPoint touchPoint = [recognizer locationInView:map]; + CLLocationCoordinate2D coord = [map convertPoint:touchPoint toCoordinateFromView:map]; + map.onPanDrag(@{ + @"coordinate": @{ + @"latitude": @(coord.latitude), + @"longitude": @(coord.longitude), + }, + @"position": @{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }, + }); + +} + + +- (void)handleMapLongPress:(UITapGestureRecognizer *)recognizer { + + // NOTE: android only does the equivalent of "began", so we only send in this case + if (recognizer.state != UIGestureRecognizerStateBegan) return; + + AIRMap *map = (AIRMap *)recognizer.view; + if (!map.onLongPress) return; + + CGPoint touchPoint = [recognizer locationInView:map]; + CLLocationCoordinate2D coord = [map convertPoint:touchPoint toCoordinateFromView:map]; + + map.onLongPress(@{ + @"coordinate": @{ + @"latitude": @(coord.latitude), + @"longitude": @(coord.longitude), + }, + @"position": @{ + @"x": @(touchPoint.x), + @"y": @(touchPoint.y), + }, + }); +} + +#pragma mark MKMapViewDelegate + +#pragma mark Polyline stuff + +- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id )overlay{ + if ([overlay isKindOfClass:[AIRMapPolyline class]]) { + return ((AIRMapPolyline *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapPolygon class]]) { + return ((AIRMapPolygon *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapCircle class]]) { + return ((AIRMapCircle *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapUrlTile class]]) { + return ((AIRMapUrlTile *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapWMSTile class]]) { + return ((AIRMapWMSTile *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapLocalTile class]]) { + return ((AIRMapLocalTile *)overlay).renderer; + } else if ([overlay isKindOfClass:[AIRMapOverlay class]]) { + return ((AIRMapOverlay *)overlay).renderer; + } else if([overlay isKindOfClass:[MKTileOverlay class]]) { + return [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay]; + } else { + return nil; + } +} + + +#pragma mark Annotation Stuff + + + +- (void)mapView:(AIRMap *)mapView didSelectAnnotationView:(MKAnnotationView *)view +{ + if ([view.annotation isKindOfClass:[AIRMapMarker class]]) { + [(AIRMapMarker *)view.annotation showCalloutView]; + } else if ([view.annotation isKindOfClass:[MKUserLocation class]] && mapView.userLocationAnnotationTitle != nil && view.annotation.title != mapView.userLocationAnnotationTitle) { + [(MKUserLocation*)view.annotation setTitle: mapView.userLocationAnnotationTitle]; + } + +} + +- (void)mapView:(AIRMap *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { + if ([view.annotation isKindOfClass:[AIRMapMarker class]]) { + [(AIRMapMarker *)view.annotation hideCalloutView]; + } +} + +- (MKAnnotationView *)mapView:(__unused AIRMap *)mapView viewForAnnotation:(AIRMapMarker *)marker +{ + if (![marker isKindOfClass:[AIRMapMarker class]]) { + if ([marker isKindOfClass:[MKUserLocation class]] && mapView.userLocationAnnotationTitle != nil) { + [(MKUserLocation*)marker setTitle: mapView.userLocationAnnotationTitle]; + return nil; + } + return nil; + } + + marker.map = mapView; + return [marker getAnnotationView]; +} + +static int kDragCenterContext; + +- (void)mapView:(AIRMap *)mapView + annotationView:(MKAnnotationView *)view + didChangeDragState:(MKAnnotationViewDragState)newState + fromOldState:(MKAnnotationViewDragState)oldState +{ + if (![view.annotation isKindOfClass:[AIRMapMarker class]]) return; + AIRMapMarker *marker = (AIRMapMarker *)view.annotation; + + BOOL isPinView = [view isKindOfClass:[MKPinAnnotationView class]]; + + id event = @{ + @"id": marker.identifier ?: @"unknown", + @"coordinate": @{ + @"latitude": @(marker.coordinate.latitude), + @"longitude": @(marker.coordinate.longitude) + } + }; + + if (newState == MKAnnotationViewDragStateEnding || newState == MKAnnotationViewDragStateCanceling) { + if (!isPinView) { + [view setDragState:MKAnnotationViewDragStateNone animated:NO]; + } + if (mapView.onMarkerDragEnd) mapView.onMarkerDragEnd(event); + if (marker.onDragEnd) marker.onDragEnd(event); + + if(_hasObserver) [view removeObserver:self forKeyPath:@"center"]; + _hasObserver = NO; + } else if (newState == MKAnnotationViewDragStateStarting) { + // MapKit doesn't emit continuous drag events. To get around this, we are going to use KVO. + [view addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:&kDragCenterContext]; + _hasObserver = YES; + if (mapView.onMarkerDragStart) mapView.onMarkerDragStart(event); + if (marker.onDragStart) marker.onDragStart(event); + } +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + if ([keyPath isEqualToString:@"center"] && [object isKindOfClass:[MKAnnotationView class]]) { + MKAnnotationView *view = (MKAnnotationView *)object; + AIRMapMarker *marker = (AIRMapMarker *)view.annotation; + + // a marker we don't control might be getting dragged. Check just in case. + if (!marker) return; + + AIRMap *map = marker.map; + + // don't waste time calculating if there are no events to listen to it + if (!map.onMarkerDrag && !marker.onDrag) return; + + CGPoint position = CGPointMake(view.center.x - view.centerOffset.x, view.center.y - view.centerOffset.y); + CLLocationCoordinate2D coordinate = [map convertPoint:position toCoordinateFromView:map]; + + id event = @{ + @"id": marker.identifier ?: @"unknown", + @"position": @{ + @"x": @(position.x), + @"y": @(position.y), + }, + @"coordinate": @{ + @"latitude": @(coordinate.latitude), + @"longitude": @(coordinate.longitude), + } + }; + + if (map.onMarkerDrag) map.onMarkerDrag(event); + if (marker.onDrag) marker.onDrag(event); + + } else { + // This message is not for me; pass it on to super. + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + +- (void)mapView:(AIRMap *)mapView didUpdateUserLocation:(MKUserLocation *)location +{ + if (mapView.followUserLocation) { + MKCoordinateRegion region; + region.span.latitudeDelta = AIRMapDefaultSpan; + region.span.longitudeDelta = AIRMapDefaultSpan; + region.center = location.coordinate; + [mapView setRegion:region animated:YES]; + + // Move to user location only for the first time it loads up. + // mapView.followUserLocation = NO; + } +} + +- (void)mapView:(AIRMap *)mapView regionWillChangeAnimated:(__unused BOOL)animated +{ + [self _regionChanged:mapView]; + + AIRWeakTimerReference *weakTarget = [[AIRWeakTimerReference alloc] initWithTarget:self andSelector:@selector(_onTick:)]; + + mapView.regionChangeObserveTimer = [NSTimer timerWithTimeInterval:AIRMapRegionChangeObserveInterval + target:weakTarget + selector:@selector(timerDidFire:) + userInfo:@{ RCTMapViewKey: [[AIRWeakMapReference alloc] initWithMapView: mapView] } + repeats:YES]; + + [[NSRunLoop mainRunLoop] addTimer:mapView.regionChangeObserveTimer forMode:NSRunLoopCommonModes]; +} + +- (void)mapView:(AIRMap *)mapView regionDidChangeAnimated:(__unused BOOL)animated +{ + CGFloat zoomLevel = [self zoomLevel:mapView]; + [mapView.regionChangeObserveTimer invalidate]; + mapView.regionChangeObserveTimer = nil; + + [self _regionChanged:mapView]; + + if (zoomLevel < mapView.minZoomLevel) { + [self setCenterCoordinate:[mapView centerCoordinate] zoomLevel:mapView.minZoomLevel animated:TRUE mapView:mapView]; + } + else if (zoomLevel > mapView.maxZoomLevel) { + [self setCenterCoordinate:[mapView centerCoordinate] zoomLevel:mapView.maxZoomLevel animated:TRUE mapView:mapView]; + } + + // Don't send region did change events until map has + // started rendering, as these won't represent the final location + if (mapView.hasStartedRendering) { + [self _emitRegionChangeEvent:mapView continuous:NO]; + }; + + mapView.pendingCenter = mapView.region.center; + mapView.pendingSpan = mapView.region.span; +} + +- (void)mapViewWillStartRenderingMap:(AIRMap *)mapView +{ + if (!mapView.hasStartedRendering) { + mapView.onMapReady(@{}); + mapView.hasStartedRendering = YES; + } + [mapView beginLoading]; + [self _emitRegionChangeEvent:mapView continuous:NO]; +} + +- (void)mapViewDidFinishRenderingMap:(AIRMap *)mapView fullyRendered:(BOOL)fullyRendered +{ + [mapView finishLoading]; +} + +#pragma mark Private + +- (void)_onTick:(NSTimer *)timer +{ + AIRWeakMapReference *weakRef = timer.userInfo[RCTMapViewKey]; + [self _regionChanged:weakRef.mapView]; +} + +- (void)_regionChanged:(AIRMap *)mapView +{ + BOOL needZoom = NO; + CGFloat newLongitudeDelta = 0.0f; + MKCoordinateRegion region = mapView.region; + // On iOS 7, it's possible that we observe invalid locations during initialization of the map. + // Filter those out. + if (!CLLocationCoordinate2DIsValid(region.center)) { + return; + } + // Calculation on float is not 100% accurate. If user zoom to max/min and then move, it's likely the map will auto zoom to max/min from time to time. + // So let's try to make map zoom back to 99% max or 101% min so that there are some buffer that moving the map won't constantly hitting the max/min bound. + if (mapView.maxDelta > FLT_EPSILON && region.span.longitudeDelta > mapView.maxDelta) { + needZoom = YES; + newLongitudeDelta = mapView.maxDelta * (1 - AIRMapZoomBoundBuffer); + } else if (mapView.minDelta > FLT_EPSILON && region.span.longitudeDelta < mapView.minDelta) { + needZoom = YES; + newLongitudeDelta = mapView.minDelta * (1 + AIRMapZoomBoundBuffer); + } + if (needZoom) { + region.span.latitudeDelta = region.span.latitudeDelta / region.span.longitudeDelta * newLongitudeDelta; + region.span.longitudeDelta = newLongitudeDelta; + mapView.region = region; + } + + // Continuously observe region changes + [self _emitRegionChangeEvent:mapView continuous:YES]; +} + +- (void)_emitRegionChangeEvent:(AIRMap *)mapView continuous:(BOOL)continuous +{ + if (!mapView.ignoreRegionChanges && mapView.onChange) { + MKCoordinateRegion region = mapView.region; + if (!CLLocationCoordinate2DIsValid(region.center)) { + return; + } + +#define FLUSH_NAN(value) (isnan(value) ? 0 : value) + mapView.onChange(@{ + @"continuous": @(continuous), + @"region": @{ + @"latitude": @(FLUSH_NAN(region.center.latitude)), + @"longitude": @(FLUSH_NAN(region.center.longitude)), + @"latitudeDelta": @(FLUSH_NAN(region.span.latitudeDelta)), + @"longitudeDelta": @(FLUSH_NAN(region.span.longitudeDelta)), + } + }); + } +} + +/** Returns the distance of |pt| to |poly| in meters + * + * + */ +- (double)distanceOfPoint:(MKMapPoint)pt toPoly:(AIRMapPolyline *)poly +{ + double distance = MAXFLOAT; + for (int n = 0; n < poly.coordinates.count - 1; n++) { + + MKMapPoint ptA = MKMapPointForCoordinate(poly.coordinates[n].coordinate); + MKMapPoint ptB = MKMapPointForCoordinate(poly.coordinates[n + 1].coordinate); + + double xDelta = ptB.x - ptA.x; + double yDelta = ptB.y - ptA.y; + + if (xDelta == 0.0 && yDelta == 0.0) { + continue; + } + + double u = ((pt.x - ptA.x) * xDelta + (pt.y - ptA.y) * yDelta) / (xDelta * xDelta + yDelta * yDelta); + MKMapPoint ptClosest; + if (u < 0.0) { + ptClosest = ptA; + } + else if (u > 1.0) { + ptClosest = ptB; + } + else { + ptClosest = MKMapPointMake(ptA.x + u * xDelta, ptA.y + u * yDelta); + } + + distance = MIN(distance, MKMetersBetweenMapPoints(ptClosest, pt)); + } + + return distance; +} + + +/** Converts |px| to meters at location |pt| */ +- (double)metersFromPixel:(NSUInteger)px atPoint:(CGPoint)pt forMap:(AIRMap *)mapView +{ + CGPoint ptB = CGPointMake(pt.x + px, pt.y); + + CLLocationCoordinate2D coordA = [mapView convertPoint:pt toCoordinateFromView:mapView]; + CLLocationCoordinate2D coordB = [mapView convertPoint:ptB toCoordinateFromView:mapView]; + + return MKMetersBetweenMapPoints(MKMapPointForCoordinate(coordA), MKMapPointForCoordinate(coordB)); +} + ++ (double)longitudeToPixelSpaceX:(double)longitude +{ + return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0); +} + ++ (double)latitudeToPixelSpaceY:(double)latitude +{ + if (latitude == 90.0) { + return 0; + } else if (latitude == -90.0) { + return MERCATOR_OFFSET * 2; + } else { + return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0); + } +} + ++ (double)pixelSpaceXToLongitude:(double)pixelX +{ + return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI; +} + ++ (double)pixelSpaceYToLatitude:(double)pixelY +{ + return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI; +} + +#pragma mark - +#pragma mark Helper methods + +- (MKCoordinateSpan)coordinateSpanWithMapView:(AIRMap *)mapView + centerCoordinate:(CLLocationCoordinate2D)centerCoordinate + andZoomLevel:(double)zoomLevel +{ + // convert center coordiate to pixel space + double centerPixelX = [AIRMapManager longitudeToPixelSpaceX:centerCoordinate.longitude]; + double centerPixelY = [AIRMapManager latitudeToPixelSpaceY:centerCoordinate.latitude]; + + // determine the scale value from the zoom level + double zoomExponent = AIRMapMaxZoomLevel - zoomLevel; + double zoomScale = pow(2, zoomExponent); + + // scale the map’s size in pixel space + CGSize mapSizeInPixels = mapView.bounds.size; + double scaledMapWidth = mapSizeInPixels.width * zoomScale; + double scaledMapHeight = mapSizeInPixels.height * zoomScale; + + // figure out the position of the top-left pixel + double topLeftPixelX = centerPixelX - (scaledMapWidth / 2); + double topLeftPixelY = centerPixelY - (scaledMapHeight / 2); + + // find delta between left and right longitudes + CLLocationDegrees minLng = [AIRMapManager pixelSpaceXToLongitude:topLeftPixelX]; + CLLocationDegrees maxLng = [AIRMapManager pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth]; + CLLocationDegrees longitudeDelta = maxLng - minLng; + + // find delta between top and bottom latitudes + CLLocationDegrees minLat = [AIRMapManager pixelSpaceYToLatitude:topLeftPixelY]; + CLLocationDegrees maxLat = [AIRMapManager pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight]; + CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat); + + // create and return the lat/lng span + MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta); + return span; +} + +#pragma mark - +#pragma mark Public methods + +- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate + zoomLevel:(double)zoomLevel + animated:(BOOL)animated + mapView:(AIRMap *)mapView +{ + // clamp large numbers to 28 + zoomLevel = MIN(zoomLevel, AIRMapMaxZoomLevel); + + // use the zoom level to compute the region + MKCoordinateSpan span = [self coordinateSpanWithMapView:mapView centerCoordinate:centerCoordinate andZoomLevel:zoomLevel]; + MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span); + + // set the region like normal + [mapView setRegion:region animated:animated]; +} + +//KMapView cannot display tiles that cross the pole (as these would involve wrapping the map from top to bottom, something that a Mercator projection just cannot do). +-(MKCoordinateRegion)coordinateRegionWithMapView:(AIRMap *)mapView + centerCoordinate:(CLLocationCoordinate2D)centerCoordinate + andZoomLevel:(double)zoomLevel +{ + // clamp lat/long values to appropriate ranges + centerCoordinate.latitude = MIN(MAX(-90.0, centerCoordinate.latitude), 90.0); + centerCoordinate.longitude = fmod(centerCoordinate.longitude, 180.0); + + // convert center coordiate to pixel space + double centerPixelX = [AIRMapManager longitudeToPixelSpaceX:centerCoordinate.longitude]; + double centerPixelY = [AIRMapManager latitudeToPixelSpaceY:centerCoordinate.latitude]; + + // determine the scale value from the zoom level + double zoomExponent = AIRMapMaxZoomLevel - zoomLevel; + double zoomScale = pow(2, zoomExponent); + + // scale the map’s size in pixel space + CGSize mapSizeInPixels = mapView.bounds.size; + double scaledMapWidth = mapSizeInPixels.width * zoomScale; + double scaledMapHeight = mapSizeInPixels.height * zoomScale; + + // figure out the position of the left pixel + double topLeftPixelX = centerPixelX - (scaledMapWidth / 2); + + // find delta between left and right longitudes + CLLocationDegrees minLng = [AIRMapManager pixelSpaceXToLongitude:topLeftPixelX]; + CLLocationDegrees maxLng = [AIRMapManager pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth]; + CLLocationDegrees longitudeDelta = maxLng - minLng; + + // if we’re at a pole then calculate the distance from the pole towards the equator + // as MKMapView doesn’t like drawing boxes over the poles + double topPixelY = centerPixelY - (scaledMapHeight / 2); + double bottomPixelY = centerPixelY + (scaledMapHeight / 2); + BOOL adjustedCenterPoint = NO; + if (topPixelY > MERCATOR_OFFSET * 2) { + topPixelY = centerPixelY - scaledMapHeight; + bottomPixelY = MERCATOR_OFFSET * 2; + adjustedCenterPoint = YES; + } + + // find delta between top and bottom latitudes + CLLocationDegrees minLat = [AIRMapManager pixelSpaceYToLatitude:topPixelY]; + CLLocationDegrees maxLat = [AIRMapManager pixelSpaceYToLatitude:bottomPixelY]; + CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat); + + // create and return the lat/lng span + MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta); + MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span); + // once again, MKMapView doesn’t like drawing boxes over the poles + // so adjust the center coordinate to the center of the resulting region + if (adjustedCenterPoint) { + region.center.latitude = [AIRMapManager pixelSpaceYToLatitude:((bottomPixelY + topPixelY) / 2.0)]; + } + + return region; +} + +- (double) zoomLevel:(AIRMap *)mapView { + MKCoordinateRegion region = mapView.region; + + double centerPixelX = [AIRMapManager longitudeToPixelSpaceX: region.center.longitude]; + double topLeftPixelX = [AIRMapManager longitudeToPixelSpaceX: region.center.longitude - region.span.longitudeDelta / 2]; + + double scaledMapWidth = (centerPixelX - topLeftPixelX) * 2; + CGSize mapSizeInPixels = mapView.bounds.size; + double zoomScale = scaledMapWidth / mapSizeInPixels.width; + double zoomExponent = log(zoomScale) / log(2); + double zoomLevel = AIRMapMaxZoomLevel - zoomExponent; + + return zoomLevel; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapMarker.h b/lib/ios/AirMaps/AIRMapMarker.h new file mode 100644 index 0000000..0613544 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapMarker.h @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapMarker.h" +#import "AIRMapCallout.h" + +#import +#import + +#import +#import "AIRMap.h" +#import "SMCalloutView.h" +#import "RCTConvert+AirMap.h" + +@class RCTBridge; + +@interface AIRMapMarker : MKAnnotationView + +@property (nonatomic, strong) AIRMapCallout *calloutView; +@property (nonatomic, weak) AIRMap *map; +@property (nonatomic, weak) RCTBridge *bridge; + +@property (nonatomic, strong) NSString *identifier; +@property (nonatomic, copy) NSString *imageSrc; +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *subtitle; +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; +@property (nonatomic, strong) UIColor *pinColor; +@property (nonatomic, assign) NSInteger zIndex; +@property (nonatomic, assign) double opacity; + +@property (nonatomic, copy) RCTBubblingEventBlock onPress; +@property (nonatomic, copy) RCTDirectEventBlock onSelect; +@property (nonatomic, copy) RCTDirectEventBlock onDeselect; +@property (nonatomic, copy) RCTDirectEventBlock onCalloutPress; +@property (nonatomic, copy) RCTDirectEventBlock onDragStart; +@property (nonatomic, copy) RCTDirectEventBlock onDrag; +@property (nonatomic, copy) RCTDirectEventBlock onDragEnd; + + +- (MKAnnotationView *)getAnnotationView; +- (void)fillCalloutView:(SMCalloutView *)calloutView; +- (BOOL)shouldShowCalloutView; +- (void)showCalloutView; +- (void)hideCalloutView; +- (void)addTapGestureRecognizer; + +@end + + +@interface AIREmptyCalloutBackgroundView : SMCalloutBackgroundView +@end diff --git a/lib/ios/AirMaps/AIRMapMarker.m b/lib/ios/AirMaps/AIRMapMarker.m new file mode 100644 index 0000000..dc703bc --- /dev/null +++ b/lib/ios/AirMaps/AIRMapMarker.m @@ -0,0 +1,359 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapMarker.h" + +#import +#import +#import +#import +#import + +NSInteger const AIR_CALLOUT_OPEN_ZINDEX_BASELINE = 999; + +@implementation AIREmptyCalloutBackgroundView +@end + +@implementation AIRMapMarker { + BOOL _hasSetCalloutOffset; + RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; + MKPinAnnotationView *_pinView; + BOOL _calloutIsOpen; + NSInteger _zIndexBeforeOpen; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self.layer addObserver:self forKeyPath:@"zPosition" options:NSKeyValueObservingOptionNew context:nil]; + } + return self; +} + +- (void)reactSetFrame:(CGRect)frame +{ + // Make sure we use the image size when available + CGSize size = self.image ? self.image.size : frame.size; + CGRect bounds = {CGPointZero, size}; + + // The MapView is basically in charge of figuring out the center position of the marker view. If the view changed in + // height though, we need to compensate in such a way that the bottom of the marker stays at the same spot on the + // map. + CGFloat dy = (bounds.size.height - self.bounds.size.height) / 2; + CGPoint center = (CGPoint){ self.center.x, self.center.y - dy }; + + // Avoid crashes due to nan coords + if (isnan(center.x) || isnan(center.y) || + isnan(bounds.origin.x) || isnan(bounds.origin.y) || + isnan(bounds.size.width) || isnan(bounds.size.height)) { + RCTLogError(@"Invalid layout for (%@)%@. position: %@. bounds: %@", + self.reactTag, self, NSStringFromCGPoint(center), NSStringFromCGRect(bounds)); + return; + } + + self.center = center; + self.bounds = bounds; +} + +- (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex { + if ([subview isKindOfClass:[AIRMapCallout class]]) { + self.calloutView = (AIRMapCallout *)subview; + } else { + [super insertReactSubview:(UIView *)subview atIndex:atIndex]; + } +} + +- (void)removeReactSubview:(id)subview { + if ([subview isKindOfClass:[AIRMapCallout class]] && self.calloutView == subview) { + self.calloutView = nil; + } else { + [super removeReactSubview:(UIView *)subview]; + } +} + +- (MKAnnotationView *)getAnnotationView +{ + if ([self shouldUsePinView]) { + // In this case, we want to render a platform "default" marker. + if (_pinView == nil) { + _pinView = [[MKPinAnnotationView alloc] initWithAnnotation:self reuseIdentifier: nil]; + [self addGestureRecognizerToView:_pinView]; + _pinView.annotation = self; + } + + _pinView.draggable = self.draggable; + _pinView.layer.zPosition = self.zIndex; + + // TODO(lmr): Looks like this API was introduces in iOS 8. We may want to handle differently for earlier + // versions. Right now it's just leaving it with the default color. People needing the colors are free to + // use their own custom markers. + if ([_pinView respondsToSelector:@selector(setPinTintColor:)]) { + _pinView.pinTintColor = self.pinColor; + } + + return _pinView; + } else { + // If it has subviews, it means we are wanting to render a custom marker with arbitrary react views. + // if it has a non-null image, it means we want to render a custom marker with the image. + // In either case, we want to return the AIRMapMarker since it is both an MKAnnotation and an + // MKAnnotationView all at the same time. + self.layer.zPosition = self.zIndex; + return self; + } +} + +- (void)fillCalloutView:(SMCalloutView *)calloutView +{ + // Set everything necessary on the calloutView before it becomes visible. + + // Apply the MKAnnotationView's desired calloutOffset (from the top-middle of the view) + if ([self shouldUsePinView] && !_hasSetCalloutOffset) { + calloutView.calloutOffset = CGPointMake(-8,0); + } else { + calloutView.calloutOffset = self.calloutOffset; + } + + if (self.calloutView) { + calloutView.title = nil; + calloutView.subtitle = nil; + if (self.calloutView.tooltip) { + // if tooltip is true, then the user wants their react view to be the "tooltip" as wwell, so we set + // the background view to something empty/transparent + calloutView.backgroundView = [AIREmptyCalloutBackgroundView new]; + } else { + // the default tooltip look is wanted, and the user is just filling the content with their react subviews. + // as a result, we use the default "masked" background view. + calloutView.backgroundView = [SMCalloutMaskedBackgroundView new]; + } + + // when this is set, the callout's content will be whatever react views the user has put as the callout's + // children. + calloutView.contentView = self.calloutView; + + } else { + + // if there is no calloutView, it means the user wants to use the default callout behavior with title/subtitle + // pairs. + calloutView.title = self.title; + calloutView.subtitle = self.subtitle; + calloutView.contentView = nil; + calloutView.backgroundView = [SMCalloutMaskedBackgroundView new]; + } +} + +- (void)showCalloutView +{ + _calloutIsOpen = YES; + [self setZIndex:_zIndexBeforeOpen]; + + MKAnnotationView *annotationView = [self getAnnotationView]; + + [self setSelected:YES animated:NO]; + + id event = @{ + @"action": @"marker-select", + @"id": self.identifier ?: @"unknown", + @"coordinate": @{ + @"latitude": @(self.coordinate.latitude), + @"longitude": @(self.coordinate.longitude) + } + }; + + if (self.map.onMarkerSelect) self.map.onMarkerSelect(event); + if (self.onSelect) self.onSelect(event); + + if (![self shouldShowCalloutView]) { + // no callout to show + return; + } + + [self fillCalloutView:self.map.calloutView]; + + // This is where we present our custom callout view... MapKit's built-in callout doesn't have the flexibility + // we need, but a lot of work was done by Nick Farina to make this identical to MapKit's built-in. + [self.map.calloutView presentCalloutFromRect:annotationView.bounds + inView:annotationView + constrainedToView:self.map + animated:YES]; +} + +#pragma mark - Tap Gesture & Events. + +- (void)addTapGestureRecognizer { + [self addGestureRecognizerToView:nil]; +} + +- (void)addGestureRecognizerToView:(UIView *)view { + if (!view) { + view = self; + } + UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTap:)]; + // setting this to NO allows the parent MapView to continue receiving marker selection events + tapGestureRecognizer.cancelsTouchesInView = NO; + [view addGestureRecognizer:tapGestureRecognizer]; +} + +- (void)_handleTap:(UITapGestureRecognizer *)recognizer { + AIRMapMarker *marker = self; + if (!marker) return; + + if (marker.selected) { + CGPoint touchPoint = [recognizer locationInView:marker.map.calloutView]; + CGRect bubbleFrame = [self.calloutView convertRect:marker.map.calloutView.bounds toView:marker.map]; + CGPoint touchPointReal = [recognizer locationInView:self.calloutView]; + + UIView *calloutView = [marker.map.calloutView hitTest:touchPoint withEvent:nil]; + if (calloutView) { + // the callout (or its subview) got clicked, not the marker + UIWindow* win = [[[UIApplication sharedApplication] windows] firstObject]; + AIRMapCalloutSubview* calloutSubview = nil; + UIView* tmp = calloutView; + while (tmp && tmp != win && tmp != self.calloutView && tmp != self.map) { + if ([tmp respondsToSelector:@selector(onPress)]) { + calloutSubview = (AIRMapCalloutSubview*) tmp; + break; + } + tmp = tmp.superview; + } + + id event = @{ + @"action": calloutSubview ? @"callout-inside-press" : @"callout-press", + @"id": marker.identifier ?: @"unknown", + @"point": @{ + @"x": @(touchPointReal.x), + @"y": @(touchPointReal.y), + }, + @"frame": @{ + @"x": @(bubbleFrame.origin.x), + @"y": @(bubbleFrame.origin.y), + @"width": @(bubbleFrame.size.width), + @"height": @(bubbleFrame.size.height), + } + }; + + if (calloutSubview) calloutSubview.onPress(event); + if (marker.onCalloutPress) marker.onCalloutPress(event); + if (marker.calloutView && marker.calloutView.onPress) marker.calloutView.onPress(event); + if (marker.map.onCalloutPress) marker.map.onCalloutPress(event); + return; + } + } + + // the actual marker got clicked + id event = @{ + @"action": @"marker-press", + @"id": marker.identifier ?: @"unknown", + @"coordinate": @{ + @"latitude": @(marker.coordinate.latitude), + @"longitude": @(marker.coordinate.longitude) + } + }; + + if (marker.onPress) marker.onPress(event); + if (marker.map.onMarkerPress) marker.map.onMarkerPress(event); + + [marker.map selectAnnotation:marker animated:NO]; +} + +- (void)hideCalloutView +{ + _calloutIsOpen = NO; + [self setZIndex:_zIndexBeforeOpen]; + // hide the callout view + [self.map.calloutView dismissCalloutAnimated:YES]; + + [self setSelected:NO animated:NO]; + + id event = @{ + @"action": @"marker-deselect", + @"id": self.identifier ?: @"unknown", + @"coordinate": @{ + @"latitude": @(self.coordinate.latitude), + @"longitude": @(self.coordinate.longitude) + } + }; + + if (self.map.onMarkerDeselect) self.map.onMarkerDeselect(event); + if (self.onDeselect) self.onDeselect(event); +} + +- (void)setCalloutOffset:(CGPoint)calloutOffset +{ + _hasSetCalloutOffset = YES; + [super setCalloutOffset:calloutOffset]; +} + +- (BOOL)shouldShowCalloutView +{ + return self.calloutView != nil || self.title != nil || self.subtitle != nil; +} + +- (BOOL)shouldUsePinView +{ + return self.reactSubviews.count == 0 && !self.imageSrc; +} + +- (void)setOpacity:(double)opacity +{ + [self setAlpha:opacity]; +} + +- (void)setImageSrc:(NSString *)imageSrc +{ + _imageSrc = imageSrc; + + if (_reloadImageCancellationBlock) { + _reloadImageCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:_imageSrc] + size:self.bounds.size + scale:RCTScreenScale() + clipped:YES + resizeMode:RCTResizeModeCenter + progressBlock:nil + partialLoadBlock:nil + completionBlock:^(NSError *error, UIImage *image) { + if (error) { + // TODO(lmr): do something with the error? + NSLog(@"%@", error); + } + dispatch_async(dispatch_get_main_queue(), ^{ + self.image = image; + }); + }]; +} + +- (void)setPinColor:(UIColor *)pinColor +{ + _pinColor = pinColor; + + if ([_pinView respondsToSelector:@selector(setPinTintColor:)]) { + _pinView.pinTintColor = _pinColor; + } +} + +- (void)setZIndex:(NSInteger)zIndex +{ + _zIndexBeforeOpen = zIndex; + _zIndex = _calloutIsOpen ? zIndex + AIR_CALLOUT_OPEN_ZINDEX_BASELINE : zIndex; + self.layer.zPosition = zIndex; +} + +- (void)dealloc { + [self.layer removeObserver:self forKeyPath:@"zPosition"]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if ([keyPath isEqualToString:@"zPosition"]) { + self.layer.zPosition = _zIndex; + } +} + +@end diff --git a/lib/ios/AirMaps/AIRMapMarkerManager.h b/lib/ios/AirMaps/AIRMapMarkerManager.h new file mode 100644 index 0000000..1fc4460 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapMarkerManager.h @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AIRMapMarkerManager : RCTViewManager + +@end diff --git a/lib/ios/AirMaps/AIRMapMarkerManager.m b/lib/ios/AirMaps/AIRMapMarkerManager.m new file mode 100644 index 0000000..ddadd61 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapMarkerManager.m @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapMarkerManager.h" + +#import +#import +#import +#import "AIRMapMarker.h" + +@interface AIRMapMarkerManager () + +@end + +@implementation AIRMapMarkerManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapMarker *marker = [AIRMapMarker new]; + [marker addTapGestureRecognizer]; + marker.bridge = self.bridge; + marker.isAccessibilityElement = YES; + marker.accessibilityElementsHidden = NO; + return marker; +} + +RCT_EXPORT_VIEW_PROPERTY(identifier, NSString) +RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString) +//RCT_EXPORT_VIEW_PROPERTY(reuseIdentifier, NSString) +RCT_EXPORT_VIEW_PROPERTY(title, NSString) +RCT_REMAP_VIEW_PROPERTY(description, subtitle, NSString) +RCT_EXPORT_VIEW_PROPERTY(coordinate, CLLocationCoordinate2D) +RCT_EXPORT_VIEW_PROPERTY(centerOffset, CGPoint) +RCT_EXPORT_VIEW_PROPERTY(calloutOffset, CGPoint) +RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString) +RCT_EXPORT_VIEW_PROPERTY(pinColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(draggable, BOOL) +RCT_EXPORT_VIEW_PROPERTY(zIndex, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(opacity, double) + +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onSelect, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDeselect, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onCalloutPress, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDragStart, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDrag, RCTDirectEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTDirectEventBlock) + + +RCT_EXPORT_METHOD(showCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [(AIRMapMarker *) view showCalloutView]; + } + }]; +} + +RCT_EXPORT_METHOD(hideCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + [(AIRMapMarker *) view hideCalloutView]; + } + }]; +} + +RCT_EXPORT_METHOD(redrawCallout:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + id view = viewRegistry[reactTag]; + if (![view isKindOfClass:[AIRMapMarker class]]) { + RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view); + } else { + //no need to do anything here + } + }]; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapOverlay.h b/lib/ios/AirMaps/AIRMapOverlay.h new file mode 100644 index 0000000..e3be7cb --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlay.h @@ -0,0 +1,36 @@ +#import "AIRMapCallout.h" + +#import +#import + +#import "RCTConvert+AirMap.h" +#import +#import "AIRMap.h" +#import "AIRMapOverlayRenderer.h" + +@class RCTBridge; + +@interface AIRMapOverlay : UIView + +@property (nonatomic, strong) AIRMapOverlayRenderer *renderer; +@property (nonatomic, weak) AIRMap *map; +@property (nonatomic, weak) RCTBridge *bridge; + +@property (nonatomic, strong) NSString *name; +@property (nonatomic, copy) NSString *imageSrc; +@property (nonatomic, strong, readonly) UIImage *overlayImage; +@property (nonatomic, copy) NSArray *boundsRect; +@property (nonatomic, assign) NSInteger rotation; +@property (nonatomic, assign) CGFloat transparency; +@property (nonatomic, assign) NSInteger zIndex; + +@property (nonatomic, copy) RCTBubblingEventBlock onPress; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapOverlay.m b/lib/ios/AirMaps/AIRMapOverlay.m new file mode 100644 index 0000000..316fd88 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlay.m @@ -0,0 +1,103 @@ +#import "AIRMapOverlay.h" + +#import +#import +#import +#import +#import + +@interface AIRMapOverlay() +@property (nonatomic, strong, readwrite) UIImage *overlayImage; +@end + +@implementation AIRMapOverlay { + RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; + CLLocationCoordinate2D _southWest; + CLLocationCoordinate2D _northEast; + MKMapRect _mapRect; +} + +- (void)setImageSrc:(NSString *)imageSrc +{ + NSLog(@">>> SET IMAGESRC: %@", imageSrc); + _imageSrc = imageSrc; + + if (_reloadImageCancellationBlock) { + _reloadImageCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + __weak typeof(self) weakSelf = self; + _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:_imageSrc] + size:weakSelf.bounds.size + scale:RCTScreenScale() + clipped:YES + resizeMode:RCTResizeModeCenter + progressBlock:nil + partialLoadBlock:nil + completionBlock:^(NSError *error, UIImage *image) { + if (error) { + NSLog(@"%@", error); + } + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@">>> IMAGE: %@", image); + weakSelf.overlayImage = image; + [weakSelf createOverlayRendererIfPossible]; + [weakSelf update]; + }); + }]; +} + +- (void)setBoundsRect:(NSArray *)boundsRect { + _boundsRect = boundsRect; + + _southWest = CLLocationCoordinate2DMake([boundsRect[1][0] doubleValue], [boundsRect[0][1] doubleValue]); + _northEast = CLLocationCoordinate2DMake([boundsRect[0][0] doubleValue], [boundsRect[1][1] doubleValue]); + + MKMapPoint southWest = MKMapPointForCoordinate(_southWest); + MKMapPoint northEast = MKMapPointForCoordinate(_northEast); + + _mapRect = MKMapRectMake(southWest.x, northEast.y, northEast.x - southWest.x, northEast.y - southWest.y); + + [self update]; +} + +- (void)createOverlayRendererIfPossible +{ + if (MKMapRectIsEmpty(_mapRect) || !self.overlayImage) return; + __weak typeof(self) weakSelf = self; + self.renderer = [[AIRMapOverlayRenderer alloc] initWithOverlay:weakSelf]; +} + +- (void)update +{ + if (!_renderer) return; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self]; +} + + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D)coordinate +{ + return MKCoordinateForMapPoint(MKMapPointMake(MKMapRectGetMidX(_mapRect), MKMapRectGetMidY(_mapRect))); +} + +- (MKMapRect)boundingMapRect +{ + return _mapRect; +} + +- (BOOL)intersectsMapRect:(MKMapRect)mapRect +{ + return MKMapRectIntersectsRect(_mapRect, mapRect); +} + +- (BOOL)canReplaceMapContent +{ + return NO; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapOverlayManager.h b/lib/ios/AirMaps/AIRMapOverlayManager.h new file mode 100644 index 0000000..410288d --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlayManager.h @@ -0,0 +1,5 @@ +#import + +@interface AIRMapOverlayManager : RCTViewManager + +@end diff --git a/lib/ios/AirMaps/AIRMapOverlayManager.m b/lib/ios/AirMaps/AIRMapOverlayManager.m new file mode 100644 index 0000000..a6ed765 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlayManager.m @@ -0,0 +1,27 @@ +#import "AIRMapOverlayManager.h" + +#import +#import +#import +#import "AIRMapOverlay.h" + +@interface AIRMapOverlayManager () + +@end + +@implementation AIRMapOverlayManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapOverlay *overlay = [AIRMapOverlay new]; + overlay.bridge = self.bridge; + return overlay; +} + +RCT_REMAP_VIEW_PROPERTY(bounds, boundsRect, NSArray) +RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString) + +@end + diff --git a/lib/ios/AirMaps/AIRMapOverlayRenderer.h b/lib/ios/AirMaps/AIRMapOverlayRenderer.h new file mode 100644 index 0000000..dfe9c88 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlayRenderer.h @@ -0,0 +1,8 @@ +#import + +@interface AIRMapOverlayRenderer : MKOverlayRenderer + +@property (nonatomic, assign) NSInteger rotation; +@property (nonatomic, assign) CGFloat transparency; + +@end diff --git a/lib/ios/AirMaps/AIRMapOverlayRenderer.m b/lib/ios/AirMaps/AIRMapOverlayRenderer.m new file mode 100644 index 0000000..4cd0067 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapOverlayRenderer.m @@ -0,0 +1,29 @@ +#import "AIRMapOverlayRenderer.h" +#import "AIRMapOverlay.h" + +@implementation AIRMapOverlayRenderer + +- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { + UIImage *image = [(AIRMapOverlay *)self.overlay overlayImage]; + + CGContextSaveGState(context); + + CGImageRef imageReference = image.CGImage; + + MKMapRect theMapRect = [self.overlay boundingMapRect]; + CGRect theRect = [self rectForMapRect:theMapRect]; + + CGContextRotateCTM(context, M_PI); + CGContextScaleCTM(context, -1.0, 1.0); + CGContextAddRect(context, theRect); + CGContextDrawImage(context, theRect, imageReference); + + CGContextRestoreGState(context); +} + +- (BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale { + return [(AIRMapOverlay *)self.overlay overlayImage] != nil; +} + +@end + diff --git a/lib/ios/AirMaps/AIRMapPolygon.h b/lib/ios/AirMaps/AIRMapPolygon.h new file mode 100644 index 0000000..611d942 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolygon.h @@ -0,0 +1,46 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + +#import +#import + +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + + + +@interface AIRMapPolygon: MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKPolygon *polygon; +@property (nonatomic, strong) MKPolygonRenderer *renderer; +@property (nonatomic, strong) NSArray *interiorPolygons; + +@property (nonatomic, strong) NSArray *coordinates; +@property (nonatomic, strong) NSArray *> *holes; +@property (nonatomic, strong) UIColor *fillColor; +@property (nonatomic, strong) UIColor *strokeColor; +@property (nonatomic, assign) CGFloat strokeWidth; +@property (nonatomic, assign) CGFloat miterLimit; +@property (nonatomic, assign) CGLineCap lineCap; +@property (nonatomic, assign) CGLineJoin lineJoin; +@property (nonatomic, assign) CGFloat lineDashPhase; +@property (nonatomic, strong) NSArray *lineDashPattern; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapPolygon.m b/lib/ios/AirMaps/AIRMapPolygon.m new file mode 100644 index 0000000..3ab7eb7 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolygon.m @@ -0,0 +1,178 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "AIRMapPolygon.h" +#import + + +@implementation AIRMapPolygon { + +} + +- (void)setFillColor:(UIColor *)fillColor { + _fillColor = fillColor; + [self update]; +} + +- (void)setStrokeColor:(UIColor *)strokeColor { + _strokeColor = strokeColor; + [self update]; +} + +- (void)setStrokeWidth:(CGFloat)strokeWidth { + _strokeWidth = strokeWidth; + [self update]; +} + +- (void)setLineJoin:(CGLineJoin)lineJoin { + _lineJoin = lineJoin; + [self update]; +} + +- (void)setLineCap:(CGLineCap)lineCap { + _lineCap = lineCap; + [self update]; +} + +- (void)setMiterLimit:(CGFloat)miterLimit { + _miterLimit = miterLimit; + [self update]; +} + +- (void)setLineDashPhase:(CGFloat)lineDashPhase { + _lineDashPhase = lineDashPhase; + [self update]; +} + +- (void)setLineDashPattern:(NSArray *)lineDashPattern { + _lineDashPattern = lineDashPattern; + [self update]; +} + +- (void)setCoordinates:(NSArray *)coordinates { + _coordinates = coordinates; + CLLocationCoordinate2D coords[coordinates.count]; + for(int i = 0; i < coordinates.count; i++) + { + coords[i] = coordinates[i].coordinate; + } + self.polygon = [MKPolygon polygonWithCoordinates:coords count:coordinates.count interiorPolygons:_interiorPolygons]; + // TODO: we could lazy-initialize the polygon, since we don't need it until the + // polygon is in view. + self.renderer = [[MKPolygonRenderer alloc] initWithPolygon:self.polygon]; + [self update]; +} + +- (void)setHoles:(NSArray *> *)holes { + _holes = holes; + if (holes.count) + { + NSMutableArray *polygons = [NSMutableArray array]; + for(int h = 0; h < holes.count; h++) + { + CLLocationCoordinate2D coords[holes[h].count]; + for(int i = 0; i < holes[h].count; i++) + { + coords[i] = holes[h][i].coordinate; + } + [polygons addObject:[MKPolygon polygonWithCoordinates:coords count:holes[h].count]]; + } + _interiorPolygons = polygons; + } +} + +- (void) update +{ + if (!_renderer) return; + _renderer.fillColor = _fillColor; + _renderer.strokeColor = _strokeColor; + _renderer.lineWidth = _strokeWidth; + _renderer.lineCap = _lineCap; + _renderer.lineJoin = _lineJoin; + _renderer.miterLimit = _miterLimit; + _renderer.lineDashPhase = _lineDashPhase; + _renderer.lineDashPattern = _lineDashPattern; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self]; +} + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.polygon.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.polygon.boundingMapRect; +} + +- (BOOL)intersectsMapRect:(MKMapRect)mapRect +{ + BOOL answer = [self.polygon intersectsMapRect:mapRect]; + return answer; +} + +- (BOOL)canReplaceMapContent +{ + return NO; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@end diff --git a/lib/ios/AirMaps/AIRMapPolygonManager.h b/lib/ios/AirMaps/AIRMapPolygonManager.h new file mode 100644 index 0000000..5dbfb6c --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolygonManager.h @@ -0,0 +1,10 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + + +@interface AIRMapPolygonManager : RCTViewManager +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapPolygonManager.m b/lib/ios/AirMaps/AIRMapPolygonManager.m new file mode 100644 index 0000000..543644e --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolygonManager.m @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapPolygonManager.h" + +#import +#import +#import +#import +#import +#import +#import "RCTConvert+AirMap.h" +#import "AIRMapMarker.h" +#import "AIRMapPolygon.h" + +@interface AIRMapPolygonManager() + +@end + +@implementation AIRMapPolygonManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapPolygon *polygon = [AIRMapPolygon new]; + return polygon; +} + +RCT_EXPORT_VIEW_PROPERTY(coordinates, AIRMapCoordinateArray) +RCT_EXPORT_VIEW_PROPERTY(holes, AIRMapCoordinateArrayArray) +RCT_EXPORT_VIEW_PROPERTY(fillColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineCap, CGLineCap) +RCT_EXPORT_VIEW_PROPERTY(lineJoin, CGLineJoin) +RCT_EXPORT_VIEW_PROPERTY(miterLimit, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPhase, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPattern, NSArray) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + + +@end diff --git a/lib/ios/AirMaps/AIRMapPolyline.h b/lib/ios/AirMaps/AIRMapPolyline.h new file mode 100644 index 0000000..d34a1dd --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolyline.h @@ -0,0 +1,44 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + +#import +#import + +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + + +@interface AIRMapPolyline: MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKPolyline *polyline; +@property (nonatomic, strong) MKOverlayPathRenderer *renderer; + +@property (nonatomic, strong) NSArray *coordinates; +@property (nonatomic, strong) UIColor *fillColor; +@property (nonatomic, strong) UIColor *strokeColor; +@property (nonatomic, strong) NSArray *strokeColors; +@property (nonatomic, assign) CGFloat strokeWidth; +@property (nonatomic, assign) CGFloat miterLimit; +@property (nonatomic, assign) CGLineCap lineCap; +@property (nonatomic, assign) CGLineJoin lineJoin; +@property (nonatomic, assign) CGFloat lineDashPhase; +@property (nonatomic, strong) NSArray *lineDashPattern; +@property (nonatomic, copy) RCTBubblingEventBlock onPress; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapPolyline.m b/lib/ios/AirMaps/AIRMapPolyline.m new file mode 100644 index 0000000..b230ec7 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolyline.m @@ -0,0 +1,147 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "AIRMapPolyline.h" +#import "AIRMapPolylineRenderer.h" +#import + + +@implementation AIRMapPolyline { + +} + +- (void)setFillColor:(UIColor *)fillColor { + _fillColor = fillColor; + [self update]; +} + +- (void)setStrokeColor:(UIColor *)strokeColor { + _strokeColor = strokeColor; + [self update]; +} + +- (void)setStrokeColors:(NSArray *)strokeColors { + _strokeColors = strokeColors; + if ((self.renderer != nil) && ![_renderer isKindOfClass:[AIRMapPolylineRenderer class]]) { + self.renderer = [self createRenderer]; + } + [self update]; +} + +- (void)setStrokeWidth:(CGFloat)strokeWidth { + _strokeWidth = strokeWidth; + [self update]; +} + +- (void)setLineJoin:(CGLineJoin)lineJoin { + _lineJoin = lineJoin; + [self update]; +} + +- (void)setLineCap:(CGLineCap)lineCap { + _lineCap = lineCap; + [self update]; +} + +- (void)setMiterLimit:(CGFloat)miterLimit { + _miterLimit = miterLimit; + [self update]; +} + +- (void)setLineDashPhase:(CGFloat)lineDashPhase { + _lineDashPhase = lineDashPhase; + [self update]; +} + +- (void)setLineDashPattern:(NSArray *)lineDashPattern { + _lineDashPattern = lineDashPattern; + [self update]; +} + +- (void)setCoordinates:(NSArray *)coordinates { + _coordinates = coordinates; + CLLocationCoordinate2D coords[coordinates.count]; + for(int i = 0; i < coordinates.count; i++) + { + coords[i] = coordinates[i].coordinate; + } + self.polyline = [MKPolyline polylineWithCoordinates:coords count:coordinates.count]; + self.renderer = [self createRenderer]; + [self update]; +} + +- (MKOverlayPathRenderer*)createRenderer { + if (self.polyline == nil) return nil; + if (self.strokeColors == nil) { + // Use the default renderer when no array of stroke-colors is defined. + // This behaviour may be changed in the future if we permanently want to + // use the custom renderer, because it can add funtionality that is not + // supported by the default renderer. + return [[MKPolylineRenderer alloc] initWithPolyline:self.polyline]; + } + else { + return [[AIRMapPolylineRenderer alloc] initWithOverlay:self polyline:self.polyline]; + } +} + +- (void) update +{ + if (!_renderer) return; + [self updateRenderer:_renderer]; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self]; +} + +- (void) updateRenderer:(MKOverlayPathRenderer*)renderer { + renderer.fillColor = _fillColor; + renderer.strokeColor = _strokeColor; + renderer.lineWidth = _strokeWidth; + renderer.lineCap = _lineCap; + renderer.lineJoin = _lineJoin; + renderer.miterLimit = _miterLimit; + renderer.lineDashPhase = _lineDashPhase; + renderer.lineDashPattern = _lineDashPattern; + + if ([renderer isKindOfClass:[AIRMapPolylineRenderer class]]) { + ((AIRMapPolylineRenderer*)renderer).strokeColors = _strokeColors; + } +} + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.polyline.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.polyline.boundingMapRect; +} + +- (BOOL)intersectsMapRect:(MKMapRect)mapRect +{ + BOOL answer = [self.polyline intersectsMapRect:mapRect]; + return answer; +} + +- (BOOL)canReplaceMapContent +{ + return NO; +} + + +#pragma mark AIRMapSnapshot implementation + +- (void) drawToSnapshot:(MKMapSnapshot *) snapshot context:(CGContextRef) context +{ + AIRMapPolylineRenderer* renderer = [[AIRMapPolylineRenderer alloc] initWithSnapshot:snapshot overlay:self polyline:self.polyline]; + [self updateRenderer:renderer]; + [renderer drawWithZoomScale:2 inContext:context]; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapPolylineManager.h b/lib/ios/AirMaps/AIRMapPolylineManager.h new file mode 100644 index 0000000..aa5313b --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolylineManager.h @@ -0,0 +1,10 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import + + +@interface AIRMapPolylineManager : RCTViewManager +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/AIRMapPolylineManager.m b/lib/ios/AirMaps/AIRMapPolylineManager.m new file mode 100644 index 0000000..fb807fd --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolylineManager.m @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRMapPolylineManager.h" + +#import +#import +#import +#import +#import +#import +#import "RCTConvert+AirMap.h" +#import "AIRMapMarker.h" +#import "AIRMapPolyline.h" + +@interface AIRMapPolylineManager() + +@end + +@implementation AIRMapPolylineManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapPolyline *polyline = [AIRMapPolyline new]; + return polyline; +} + +RCT_EXPORT_VIEW_PROPERTY(coordinates, AIRMapCoordinateArray) +RCT_EXPORT_VIEW_PROPERTY(strokeColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(strokeColors, UIColorArray) +RCT_EXPORT_VIEW_PROPERTY(strokeWidth, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineCap, CGLineCap) +RCT_EXPORT_VIEW_PROPERTY(lineJoin, CGLineJoin) +RCT_EXPORT_VIEW_PROPERTY(miterLimit, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPhase, CGFloat) +RCT_EXPORT_VIEW_PROPERTY(lineDashPattern, NSArray) +RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) + +@end diff --git a/lib/ios/AirMaps/AIRMapPolylineRenderer.h b/lib/ios/AirMaps/AIRMapPolylineRenderer.h new file mode 100644 index 0000000..f4684c6 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolylineRenderer.h @@ -0,0 +1,19 @@ +// +// AIRMapPolylineRenderer.h +// mapDemo +// +// Created by IjzerenHein on 13-11-21. +// Copyright (c) 2017 IjzerenHein. All rights reserved. +// + +#import + +@interface AIRMapPolylineRenderer : MKOverlayPathRenderer + +-(id)initWithOverlay:(id)overlay polyline:(MKPolyline*)polyline; +-(id)initWithSnapshot:(MKMapSnapshot*)snapshot overlay:(id)overlay polyline:(MKPolyline*)polyline; +-(void)drawWithZoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context; + +@property (nonatomic, strong) NSArray *strokeColors; + +@end diff --git a/lib/ios/AirMaps/AIRMapPolylineRenderer.m b/lib/ios/AirMaps/AIRMapPolylineRenderer.m new file mode 100644 index 0000000..b9e8c06 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapPolylineRenderer.m @@ -0,0 +1,240 @@ +// +// AIRMapPolylineRenderer.h +// mapDemo +// +// Created by IjzerenHein on 13-11-21. +// Copyright (c) 2017 IjzerenHein. All rights reserved. +// + +#import "AIRMapPolylineRenderer.h" + +@interface AIRMapPolylineRendererSegment : NSObject +- (id)initWithPoint:(CGPoint)point color:(UIColor*)color; +- (void) addPoint:(CGPoint)point color:(UIColor*)color; +@property CGMutablePathRef path; +@property UIColor *startColor; +@property UIColor *endColor; +@property CGPoint startPoint; +@property CGPoint endPoint; +@end +@implementation AIRMapPolylineRendererSegment +- (id)initWithPoint:(CGPoint)point color:(UIColor*)color +{ + self = [super init]; + if (self){ + self.path = CGPathCreateMutable(); + self.startColor = color; + self.startPoint = point; + self.endPoint = point; + CGPathMoveToPoint(self.path, nil, point.x, point.y); + } + return self; +} +- (void) addPoint:(CGPoint)point color:(UIColor*)color +{ + self.endPoint = point; + self.endColor = color; + CGPathAddLineToPoint(self.path, nil, point.x, point.y); +} +@end + +@implementation AIRMapPolylineRenderer { + MKPolyline* _polyline; + NSArray *_strokeColors; + MKMapSnapshot* _snapshot; + CLLocationCoordinate2D* _coordinates; +} + +@synthesize strokeColors; + +- (id)initWithOverlay:(id)overlay polyline:(MKPolyline*)polyline +{ + self = [super initWithOverlay:overlay]; + if (self){ + _polyline = polyline; + [self createPath]; + } + return self; +} + +- (id)initWithSnapshot:(MKMapSnapshot*)snapshot overlay:(id)overlay polyline:(MKPolyline*)polyline +{ + self = [super initWithOverlay:overlay]; + if (self){ + _snapshot = snapshot; + _polyline = polyline; + _coordinates = malloc(sizeof(CLLocationCoordinate2D) * [_polyline pointCount]); + [_polyline getCoordinates:_coordinates range:NSMakeRange(0, [_polyline pointCount])]; + } + return self; +} + +- (void) dealloc +{ + if (_coordinates) free(_coordinates); +} + +- (CGPoint) pointForIndex:(NSUInteger)index +{ + if (_snapshot != nil) { + return [_snapshot pointForCoordinate:_coordinates[index]]; + } + else { + return [self pointForMapPoint:_polyline.points[index]]; + } +} + +- (UIColor*) colorForIndex:(NSUInteger)index +{ + if ((_strokeColors == nil) || !_strokeColors.count) return self.strokeColor; + index = MIN(index, _strokeColors.count - 1); + UIColor* color = _strokeColors[index]; + CGFloat pc_r,pc_g,pc_b,pc_a; + [color getRed:&pc_r green:&pc_g blue:&pc_b alpha:&pc_a]; + return (pc_a == 0) ? nil : color; +} + +- (void) createPath +{ + CGMutablePathRef path = CGPathCreateMutable(); + BOOL first = YES; + for (NSUInteger i = 0, n = _polyline.pointCount; i < n; i++){ + CGPoint point = [self pointForIndex:i]; + if (first) { + CGPathMoveToPoint(path, nil, point.x, point.y); + first = NO; + } else { + CGPathAddLineToPoint(path, nil, point.x, point.y); + } + } + self.path = path; +} + +- (NSArray*) createSegments +{ + NSMutableArray* segments = [NSMutableArray new]; + if (_polyline.pointCount <= 1) return segments; + AIRMapPolylineRendererSegment* segment = nil; + for (NSUInteger i = 0, n = _polyline.pointCount; i < n; i++){ + CGPoint point = [self pointForIndex:i]; + UIColor* color = [self colorForIndex:i]; + if (segment == nil) { + + // Start new segment + segment = [[AIRMapPolylineRendererSegment alloc] initWithPoint:point color:color]; + [segments addObject:segment]; + } + else if (((color == nil) && (segment.endColor == nil)) || + ((color != nil) && [segment.startColor isEqual:color])) { + + // Append point to segment + [segment addPoint:point color: color]; + } + else { + + // Close the last segment if needed + if (segment.endColor == nil) { + [segment addPoint:point color:color]; + } + else { + + // Add transition gradient + segment = [[AIRMapPolylineRendererSegment alloc] initWithPoint:segment.endPoint color:segment.endColor]; + [segment addPoint:point color:color]; + [segments addObject:segment]; + } + + // Start new segment + if (i < (n - 1)) { + segment = [[AIRMapPolylineRendererSegment alloc] initWithPoint:point color:color]; + [segments addObject:segment]; + } + } + } + + // Remove last segment in case it only contains a single path point + if ((segment != nil) && (segment.endColor == nil)) { + [segments removeLastObject]; + } + + return segments; +} + +- (void) setStrokeColors:(NSArray *)strokeColors +{ + if (_strokeColors != strokeColors) { + _strokeColors = strokeColors; + } +} + +- (void) setStrokeColor:(UIColor *)strokeColor +{ + if (super.strokeColor != strokeColor) { + super.strokeColor = strokeColor; + } +} + +- (void) drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context +{ + CGRect pointsRect = CGPathGetBoundingBox(self.path); + CGRect mapRectCG = [self rectForMapRect:mapRect]; + if (!CGRectIntersectsRect(pointsRect, mapRectCG)) return; + + [self drawWithZoomScale:zoomScale inContext:context]; +} + +- (void) drawWithZoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context +{ + CGFloat lineWidth = (self.lineWidth / zoomScale) * 2.0; + CGContextSetLineWidth(context, lineWidth); + CGContextSetLineCap(context, self.lineCap); + CGContextSetLineJoin(context, self.lineJoin); + CGContextSetFillColorWithColor(context, self.fillColor.CGColor); + CGContextSetMiterLimit(context, self.miterLimit); + CGFloat dashes[self.lineDashPattern.count]; + for (NSUInteger i = 0; i < self.lineDashPattern.count; i++) { + dashes[i] = self.lineDashPattern[i].floatValue; + } + CGContextSetLineDash(context, self.lineDashPhase, dashes, self.lineDashPattern.count); + + NSArray* segments = [self createSegments]; + for (NSUInteger i = 0, n = segments.count; i < n; i++) { + AIRMapPolylineRendererSegment* segment = segments[i]; + + CGContextBeginPath(context); + CGContextAddPath(context, segment.path); + + // When segment has two colors, draw it as a gradient + if (![segment.startColor isEqual:segment.endColor]) { + CGFloat pc_r,pc_g,pc_b,pc_a, + cc_r,cc_g,cc_b,cc_a; + [segment.startColor getRed:&pc_r green:&pc_g blue:&pc_b alpha:&pc_a]; + [segment.endColor getRed:&cc_r green:&cc_g blue:&cc_b alpha:&cc_a]; + CGFloat gradientColors[8] = {pc_r,pc_g,pc_b,pc_a, + cc_r,cc_g,cc_b,cc_a}; + CGFloat gradientLocation[2] = {0,1}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradientColors, gradientLocation, 2); + CGColorSpaceRelease(colorSpace); + + CGContextReplacePathWithStrokedPath(context); + CGContextClip(context); + CGContextDrawLinearGradient( + context, + gradient, + segment.startPoint, + segment.endPoint, + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation + ); + CGGradientRelease(gradient); + CGContextResetClip(context); + } + else { + CGContextSetStrokeColorWithColor(context, segment.startColor.CGColor); + CGContextStrokePath(context); + } + } +} + +@end + diff --git a/lib/ios/AirMaps/AIRMapSnapshot.h b/lib/ios/AirMaps/AIRMapSnapshot.h new file mode 100644 index 0000000..49d3637 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapSnapshot.h @@ -0,0 +1,17 @@ +// +// AIRMapSnapshot.h +// AirMaps +// +// Created by Hein Rutjes on 26/09/16. +// Copyright © 2016 Christopher. All rights reserved. +// + +#ifndef AIRMapSnapshot_h +#define AIRMapSnapshot_h + +@protocol AIRMapSnapshot +@optional +- (void) drawToSnapshot:(MKMapSnapshot *) snapshot context:(CGContextRef) context; +@end + +#endif /* AIRMapSnapshot_h */ diff --git a/lib/ios/AirMaps/AIRMapUrlTile.h b/lib/ios/AirMaps/AIRMapUrlTile.h new file mode 100644 index 0000000..947ed99 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapUrlTile.h @@ -0,0 +1,39 @@ +// +// AIRUrlTileOverlay.h +// AirMaps +// +// Created by cascadian on 3/19/16. +// Copyright © 2016. All rights reserved. +// + +#import +#import +#import + +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + +@interface AIRMapUrlTile : MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKTileOverlay *tileOverlay; +@property (nonatomic, strong) MKTileOverlayRenderer *renderer; +@property (nonatomic, copy) NSString *urlTemplate; +@property NSInteger maximumZ; +@property NSInteger minimumZ; +@property BOOL flipY; +@property BOOL shouldReplaceMapContent; +@property CGFloat tileSize; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +//- (BOOL)intersectsMapRect:(MKMapRect)mapRect; +- (BOOL)canReplaceMapContent; + +@end diff --git a/lib/ios/AirMaps/AIRMapUrlTile.m b/lib/ios/AirMaps/AIRMapUrlTile.m new file mode 100644 index 0000000..9d0fcb4 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapUrlTile.m @@ -0,0 +1,121 @@ +// +// AIRUrlTileOverlay.m +// AirMaps +// +// Created by cascadian on 3/19/16. +// Copyright © 2016. All rights reserved. +// + +#import "AIRMapUrlTile.h" +#import + +@implementation AIRMapUrlTile { + BOOL _urlTemplateSet; + BOOL _tileSizeSet; +} + +- (void)setShouldReplaceMapContent:(BOOL)shouldReplaceMapContent +{ + _shouldReplaceMapContent = shouldReplaceMapContent; + if(self.tileOverlay) { + self.tileOverlay.canReplaceMapContent = _shouldReplaceMapContent; + } + [self update]; +} + +- (void)setMaximumZ:(NSUInteger)maximumZ +{ + _maximumZ = maximumZ; + if(self.tileOverlay) { + self.tileOverlay.maximumZ = _maximumZ; + } + [self update]; +} + +- (void)setMinimumZ:(NSUInteger)minimumZ +{ + _minimumZ = minimumZ; + if(self.tileOverlay) { + self.tileOverlay.minimumZ = _minimumZ; + } + [self update]; +} + +- (void)setFlipY:(BOOL)flipY +{ + _flipY = flipY; + if (self.tileOverlay) { + self.tileOverlay.geometryFlipped = _flipY; + } +} + +- (void)setUrlTemplate:(NSString *)urlTemplate{ + _urlTemplate = urlTemplate; + _urlTemplateSet = YES; + [self createTileOverlayAndRendererIfPossible]; + [self update]; +} + +- (void)setTileSize:(CGFloat)tileSize{ + _tileSize = tileSize; + _tileSizeSet = YES; + [self createTileOverlayAndRendererIfPossible]; + [self update]; +} + +- (void) createTileOverlayAndRendererIfPossible +{ + if (!_urlTemplateSet) return; + self.tileOverlay = [[MKTileOverlay alloc] initWithURLTemplate:self.urlTemplate]; + + self.tileOverlay.canReplaceMapContent = self.shouldReplaceMapContent; + + if(self.minimumZ) { + self.tileOverlay.minimumZ = self.minimumZ; + } + if (self.maximumZ) { + self.tileOverlay.maximumZ = self.maximumZ; + } + if (self.flipY) { + self.tileOverlay.geometryFlipped = self.flipY; + } + if (_tileSizeSet) { + self.tileOverlay.tileSize = CGSizeMake(self.tileSize, self.tileSize); + } + self.renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:self.tileOverlay]; +} + +- (void) update +{ + if (!_renderer) return; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self level:MKOverlayLevelAboveLabels]; + for (id overlay in _map.overlays) { + if ([overlay isKindOfClass:[AIRMapUrlTile class]]) { + continue; + } + [_map removeOverlay:overlay]; + [_map addOverlay:overlay]; + } +} + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.tileOverlay.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.tileOverlay.boundingMapRect; +} + +- (BOOL)canReplaceMapContent +{ + return self.tileOverlay.canReplaceMapContent; +} + +@end diff --git a/lib/ios/AirMaps/AIRMapUrlTileManager.h b/lib/ios/AirMaps/AIRMapUrlTileManager.h new file mode 100644 index 0000000..aaee4e4 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapUrlTileManager.h @@ -0,0 +1,14 @@ +// +// AIRMapUrlTileManager.h +// AirMaps +// +// Created by cascadian on 3/19/16. +// Copyright © 2016. All rights reserved. +// + + +#import + +@interface AIRMapUrlTileManager : RCTViewManager + +@end diff --git a/lib/ios/AirMaps/AIRMapUrlTileManager.m b/lib/ios/AirMaps/AIRMapUrlTileManager.m new file mode 100644 index 0000000..6fe2ba6 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapUrlTileManager.m @@ -0,0 +1,42 @@ +// +// AIRMapUrlTileManager.m +// AirMaps +// +// Created by cascadian on 3/19/16. +// Copyright © 2016. All rights reserved. +// + +#import +#import +#import +#import +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapUrlTile.h" + +#import "AIRMapUrlTileManager.h" + +@interface AIRMapUrlTileManager() + +@end + +@implementation AIRMapUrlTileManager + + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapUrlTile *tile = [AIRMapUrlTile new]; + return tile; +} + +RCT_EXPORT_VIEW_PROPERTY(urlTemplate, NSString) +RCT_EXPORT_VIEW_PROPERTY(maximumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(minimumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(flipY, BOOL) +RCT_EXPORT_VIEW_PROPERTY(shouldReplaceMapContent, BOOL) +RCT_EXPORT_VIEW_PROPERTY(tileSize, CGFloat) + +@end diff --git a/lib/ios/AirMaps/AIRMapWMSTile.h b/lib/ios/AirMaps/AIRMapWMSTile.h new file mode 100644 index 0000000..3f8c2b8 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapWMSTile.h @@ -0,0 +1,41 @@ +// +// AIRMapWMSTile.h +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + + +#import +#import +#import + +#import +#import +#import "AIRMapCoordinate.h" +#import "AIRMap.h" +#import "RCTConvert+AirMap.h" + +@interface AIRMapWMSTile : MKAnnotationView + +@property (nonatomic, weak) AIRMap *map; + +@property (nonatomic, strong) MKTileOverlay *tileOverlay; +@property (nonatomic, strong) MKTileOverlayRenderer *renderer; +@property (nonatomic, copy) NSString *urlTemplate; +@property NSInteger maximumZ; +@property NSInteger minimumZ; +@property NSInteger tileSize; +@property BOOL shouldReplaceMapContent; + +#pragma mark MKOverlay protocol + +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; +@property(nonatomic, readonly) MKMapRect boundingMapRect; +- (BOOL)canReplaceMapContent; +@end + +@interface TileOverlay : MKTileOverlay +@property (nonatomic) double MapX,MapY,FULL; +@end diff --git a/lib/ios/AirMaps/AIRMapWMSTile.m b/lib/ios/AirMaps/AIRMapWMSTile.m new file mode 100644 index 0000000..c864b4c --- /dev/null +++ b/lib/ios/AirMaps/AIRMapWMSTile.m @@ -0,0 +1,149 @@ +// +// AIRMapWMSTile.m +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + +#import "AIRMapWMSTile.h" +#import + +@implementation AIRMapWMSTile { + BOOL _urlTemplateSet; +} + +- (void)setShouldReplaceMapContent:(BOOL)shouldReplaceMapContent +{ + _shouldReplaceMapContent = shouldReplaceMapContent; + if(self.tileOverlay) { + self.tileOverlay.canReplaceMapContent = _shouldReplaceMapContent; + } + [self update]; +} + +- (void)setMaximumZ:(NSUInteger)maximumZ +{ + _maximumZ = maximumZ; + if(self.tileOverlay) { + self.tileOverlay.maximumZ = _maximumZ; + } + [self update]; +} + +- (void)setMinimumZ:(NSUInteger)minimumZ +{ + _minimumZ = minimumZ; + if(self.tileOverlay) { + self.tileOverlay.minimumZ = _minimumZ; + } + [self update]; +} + +- (void)setTileSize:(NSInteger)tileSize +{ + _tileSize = tileSize; + if(self.tileOverlay) { + self.tileOverlay.tileSize = CGSizeMake(tileSize, tileSize); + } + [self update]; +} +- (void)setUrlTemplate:(NSString *)urlTemplate{ + _urlTemplate = urlTemplate; + _urlTemplateSet = YES; + [self createTileOverlayAndRendererIfPossible]; + [self update]; +} + +- (void) createTileOverlayAndRendererIfPossible +{ + if (!_urlTemplateSet) return; + self.tileOverlay = [[TileOverlay alloc] initWithURLTemplate:self.urlTemplate]; + self.tileOverlay.canReplaceMapContent = self.shouldReplaceMapContent; + + if(self.minimumZ) { + self.tileOverlay.minimumZ = self.minimumZ; + } + if (self.maximumZ) { + self.tileOverlay.maximumZ = self.maximumZ; + } + if (self.tileSize) { + self.tileOverlay.tileSize = CGSizeMake(self.tileSize, self.tileSize);; + } + self.renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:self.tileOverlay]; +} + +- (void) update +{ + if (!_renderer) return; + + if (_map == nil) return; + [_map removeOverlay:self]; + [_map addOverlay:self level:MKOverlayLevelAboveLabels]; + for (id overlay in _map.overlays) { + if ([overlay isKindOfClass:[AIRMapWMSTile class]]) { + continue; + } + [_map removeOverlay:overlay]; + [_map addOverlay:overlay]; + } +} + +#pragma mark MKOverlay implementation + +- (CLLocationCoordinate2D) coordinate +{ + return self.tileOverlay.coordinate; +} + +- (MKMapRect) boundingMapRect +{ + return self.tileOverlay.boundingMapRect; +} + +- (BOOL)canReplaceMapContent +{ + return self.tileOverlay.canReplaceMapContent; +} + +@end + +@implementation TileOverlay +@synthesize MapX; +@synthesize MapY; +@synthesize FULL; + +-(id) initWithURLTemplate:(NSString *)URLTemplate { + self = [super initWithURLTemplate:URLTemplate]; + MapX = -20037508.34789244; + MapY = 20037508.34789244; + FULL = 20037508.34789244 * 2; + return self ; +} + +-(NSURL *)URLForTilePath:(MKTileOverlayPath)path{ + NSArray *bb = [self getBoundBox:path.x yAxis:path.y zoom:path.z]; + NSMutableString *url = [self.URLTemplate mutableCopy]; + [url replaceOccurrencesOfString: @"{minX}" withString:[NSString stringWithFormat:@"%@", bb[0]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{minY}" withString:[NSString stringWithFormat:@"%@", bb[1]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{maxX}" withString:[NSString stringWithFormat:@"%@", bb[2]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{maxY}" withString:[NSString stringWithFormat:@"%@", bb[3]] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{width}" withString:[NSString stringWithFormat:@"%d", (int)self.tileSize.width] options:0 range:NSMakeRange(0, url.length)]; + [url replaceOccurrencesOfString: @"{height}" withString:[NSString stringWithFormat:@"%d", (int)self.tileSize.height] options:0 range:NSMakeRange(0, url.length)]; + return [NSURL URLWithString:url]; +} + +-(NSArray *)getBoundBox:(NSInteger)x yAxis:(NSInteger)y zoom:(NSInteger)zoom{ + double tile = FULL / pow(2.0, (double)zoom); + + NSArray *result =[[NSArray alloc] initWithObjects: + [NSNumber numberWithDouble:MapX + (double)x * tile ], + [NSNumber numberWithDouble:MapY - (double)(y+1) * tile ], + [NSNumber numberWithDouble:MapX + (double)(x+1) * tile ], + [NSNumber numberWithDouble:MapY - (double)y * tile ], + nil]; + + return result; + +} +@end diff --git a/lib/ios/AirMaps/AIRMapWMSTileManager.h b/lib/ios/AirMaps/AIRMapWMSTileManager.h new file mode 100644 index 0000000..5ca4a19 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapWMSTileManager.h @@ -0,0 +1,14 @@ +// +// AIRMapWMSTileManager.h +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + + +#import + +@interface AIRMapWMSTileManager : RCTViewManager + +@end diff --git a/lib/ios/AirMaps/AIRMapWMSTileManager.m b/lib/ios/AirMaps/AIRMapWMSTileManager.m new file mode 100644 index 0000000..bfbdcf7 --- /dev/null +++ b/lib/ios/AirMaps/AIRMapWMSTileManager.m @@ -0,0 +1,42 @@ +// +// AIRMapWMSTileManager.m +// AirMaps +// +// Created by nizam on 10/28/18. +// Copyright © 2018. All rights reserved. +// + + +#import +#import +#import +#import +#import +#import +#import "AIRMapMarker.h" +#import "AIRMapWMSTile.h" + +#import "AIRMapWMSTileManager.h" + +@interface AIRMapWMSTileManager() + +@end + +@implementation AIRMapWMSTileManager + + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + AIRMapWMSTile *tile = [AIRMapWMSTile new]; + return tile; +} + +RCT_EXPORT_VIEW_PROPERTY(urlTemplate, NSString) +RCT_EXPORT_VIEW_PROPERTY(maximumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(minimumZ, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(tileSize, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(shouldReplaceMapContent, BOOL) + +@end diff --git a/lib/ios/AirMaps/AIRWeakMapReference.h b/lib/ios/AirMaps/AIRWeakMapReference.h new file mode 100644 index 0000000..798c285 --- /dev/null +++ b/lib/ios/AirMaps/AIRWeakMapReference.h @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "AIRMap.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface AIRWeakMapReference : NSObject + +@property (nonatomic, weak) AIRMap *mapView; + +- (instancetype)initWithMapView:(AIRMap *)mapView; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/lib/ios/AirMaps/AIRWeakMapReference.m b/lib/ios/AirMaps/AIRWeakMapReference.m new file mode 100644 index 0000000..1ffe239 --- /dev/null +++ b/lib/ios/AirMaps/AIRWeakMapReference.m @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRWeakMapReference.h" + +@implementation AIRWeakMapReference + + +- (instancetype)initWithMapView:(AIRMap *)mapView { + self = [super init]; + if (self) { + _mapView = mapView; + } + return self; +} + +@end diff --git a/lib/ios/AirMaps/AIRWeakTimerReference.h b/lib/ios/AirMaps/AIRWeakTimerReference.h new file mode 100644 index 0000000..272626e --- /dev/null +++ b/lib/ios/AirMaps/AIRWeakTimerReference.h @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface AIRWeakTimerReference : NSObject + +- (instancetype)initWithTarget:(id)target andSelector:(SEL)selector; +- (void)timerDidFire:(NSTimer *)timer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/lib/ios/AirMaps/AIRWeakTimerReference.m b/lib/ios/AirMaps/AIRWeakTimerReference.m new file mode 100644 index 0000000..58a2fbb --- /dev/null +++ b/lib/ios/AirMaps/AIRWeakTimerReference.m @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AIRWeakTimerReference.h" + +@implementation AIRWeakTimerReference +{ + __weak NSObject *_target; + SEL _selector; +} + + +- (instancetype)initWithTarget:(id)target andSelector:(SEL)selector { + self = [super init]; + if (self) { + _target = target; + _selector = selector; + } + return self; +} + + +- (void)timerDidFire:(NSTimer *)timer +{ + if(_target) + { + [_target performSelector:_selector withObject:timer]; + } + else + { + [timer invalidate]; + } +} + + +@end diff --git a/lib/ios/AirMaps/Callout/SMCalloutView.h b/lib/ios/AirMaps/Callout/SMCalloutView.h new file mode 100644 index 0000000..1281c30 --- /dev/null +++ b/lib/ios/AirMaps/Callout/SMCalloutView.h @@ -0,0 +1,204 @@ +#import +#import + +/* + +SMCalloutView +------------- +Created by Nick Farina (nfarina@gmail.com) +Version 2.1.2 + +*/ + +/// options for which directions the callout is allowed to "point" in. +typedef NS_OPTIONS(NSUInteger, SMCalloutArrowDirection) { + SMCalloutArrowDirectionUp = 1 << 0, + SMCalloutArrowDirectionDown = 1 << 1, + SMCalloutArrowDirectionAny = SMCalloutArrowDirectionUp | SMCalloutArrowDirectionDown +}; + +/// options for the callout present/dismiss animation +typedef NS_ENUM(NSInteger, SMCalloutAnimation) { + /// the "bounce" animation we all know and love from @c UIAlertView + SMCalloutAnimationBounce, + /// a simple fade in or out + SMCalloutAnimationFade, + /// grow or shrink linearly, like in the iPad Calendar app + SMCalloutAnimationStretch +}; + +NS_ASSUME_NONNULL_BEGIN + +/// when delaying our popup in order to scroll content into view, you can use this amount to match the +/// animation duration of UIScrollView when using @c -setContentOffset:animated. +extern NSTimeInterval const kSMCalloutViewRepositionDelayForUIScrollView; + +@protocol SMCalloutViewDelegate; +@class SMCalloutBackgroundView; + +// +// Callout view. +// + +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 100000 +@interface SMCalloutView : UIView +#else +@interface SMCalloutView : UIView +#endif + +@property (nonatomic, weak, nullable) id delegate; +/// title/titleView relationship mimics UINavigationBar. +@property (nonatomic, copy, nullable) NSString *title; +@property (nonatomic, copy, nullable) NSString *subtitle; + +/// Left accessory view for the call out +@property (nonatomic, strong, nullable) UIView *leftAccessoryView; +/// Right accessoty view for the call out +@property (nonatomic, strong, nullable) UIView *rightAccessoryView; +/// Default @c SMCalloutArrowDirectionDown +@property (nonatomic, assign) SMCalloutArrowDirection permittedArrowDirection; +/// The current arrow direction +@property (nonatomic, readonly) SMCalloutArrowDirection currentArrowDirection; +/// if the @c UIView you're constraining to has portions that are overlapped by nav bar, tab bar, etc. you'll need to tell us those insets. +@property (nonatomic, assign) UIEdgeInsets constrainedInsets; +/// default is @c SMCalloutMaskedBackgroundView, or @c SMCalloutDrawnBackgroundView when using @c SMClassicCalloutView +@property (nonatomic, strong) SMCalloutBackgroundView *backgroundView; + +/** + @brief Custom title view. + + @disucssion Keep in mind that @c SMCalloutView calls @c -sizeThatFits on titleView/subtitleView if defined, so your view + may be resized as a result of that (especially if you're using @c UILabel/UITextField). You may want to subclass and override @c -sizeThatFits, or just wrap your view in a "generic" @c UIView if you do not want it to be auto-sized. + + @warning If this is set, the respective @c title property will be ignored. + */ +@property (nonatomic, strong, nullable) UIView *titleView; + +/** + @brief Custom subtitle view. + + @discussion Keep in mind that @c SMCalloutView calls @c -sizeThatFits on subtitleView if defined, so your view + may be resized as a result of that (especially if you're using @c UILabel/UITextField). You may want to subclass and override @c -sizeThatFits, or just wrap your view in a "generic" @c UIView if you do not want it to be auto-sized. + + @warning If this is set, the respective @c subtitle property will be ignored. + */ +@property (nonatomic, strong, nullable) UIView *subtitleView; + +/// Custom "content" view that can be any width/height. If this is set, title/subtitle/titleView/subtitleView are all ignored. +@property (nonatomic, retain, nullable) UIView *contentView; + +/// Custom content view margin +@property (nonatomic, assign) UIEdgeInsets contentViewInset; + +/// calloutOffset is the offset in screen points from the top-middle of the target view, where the anchor of the callout should be shown. +@property (nonatomic, assign) CGPoint calloutOffset; + +/// default SMCalloutAnimationBounce, SMCalloutAnimationFade respectively +@property (nonatomic, assign) SMCalloutAnimation presentAnimation, dismissAnimation; + +/// Returns a new instance of SMCalloutView if running on iOS 7 or better, otherwise a new instance of SMClassicCalloutView if available. ++ (SMCalloutView *)platformCalloutView; + +/** + @brief Presents a callout view by adding it to "inView" and pointing at the given rect of inView's bounds. + + @discussion Constrains the callout to the bounds of the given view. Optionally scrolls the given rect into view (plus margins) + if @c -delegate is set and responds to @c -delayForRepositionWithSize. + + @param rect @c CGRect to present the view from + @param view view to 'constrain' the @c constrainedView to + @param constrainedView @c UIView to be constrainted in @c view + @param animated @c BOOL if presentation should be animated + */ +- (void)presentCalloutFromRect:(CGRect)rect inView:(UIView *)view constrainedToView:(UIView *)constrainedView animated:(BOOL)animated; + +/** + @brief Present a callout layer in the `layer` and pointing at the given rect of the `layer` bounds + + @discussion Same as the view-based presentation, but inserts the callout into a CALayer hierarchy instead. + @note Be aware that you'll have to direct your own touches to any accessory views, since CALayer doesn't relay touch events. + + @param rect @c CGRect to present the view from + @param layer layer to 'constrain' the @c constrainedLayer to + @param constrainedLayer @c CALayer to be constrained in @c layer + @param animated @c BOOL if presentation should be animated + */ +- (void)presentCalloutFromRect:(CGRect)rect inLayer:(CALayer *)layer constrainedToLayer:(CALayer *)constrainedLayer animated:(BOOL)animated; + +/** + Dismiss the callout view + + @param animated @c BOOL if dismissal should be animated + */ +- (void)dismissCalloutAnimated:(BOOL)animated; + +/// For subclassers. You can override this method to provide your own custom animation for presenting/dismissing the callout. +- (CAAnimation *)animationWithType:(SMCalloutAnimation)type presenting:(BOOL)presenting; + +@end + +// +// Background view - default draws the iOS 7 system background style (translucent white with rounded arrow). +// + +/// Abstract base class +@interface SMCalloutBackgroundView : UIView +/// indicates where the tip of the arrow should be drawn, as a pixel offset +@property (nonatomic, assign) CGPoint arrowPoint; +/// will be set by the callout when the callout is in a highlighted state +@property (nonatomic, assign) BOOL highlighted; +/// returns an optional layer whose contents should mask the callout view's contents (not honored by @c SMClassicCalloutView ) +@property (nonatomic, assign) CALayer *contentMask; +/// height of the callout "arrow" +@property (nonatomic, assign) CGFloat anchorHeight; +/// the smallest possible distance from the edge of our control to the "tip" of the anchor, from either left or right +@property (nonatomic, assign) CGFloat anchorMargin; +@end + +/// Default for iOS 7, this reproduces the "masked" behavior of the iOS 7-style callout view. +/// Accessories are masked by the shape of the callout (including the arrow itself). +@interface SMCalloutMaskedBackgroundView : SMCalloutBackgroundView +@end + +// +// Delegate methods +// + +@protocol SMCalloutViewDelegate +@optional + +/// Controls whether the callout "highlights" when pressed. default YES. You must also respond to @c -calloutViewClicked below. +/// Not honored by @c SMClassicCalloutView. +- (BOOL)calloutViewShouldHighlight:(SMCalloutView *)calloutView; + +/// Called when the callout view is clicked. Not honored by @c SMClassicCalloutView. +- (void)calloutViewClicked:(SMCalloutView *)calloutView; + +/** + Called when the callout view detects that it will be outside the constrained view when it appears, + or if the target rect was already outside the constrained view. You can implement this selector + to respond to this situation by repositioning your content first in order to make everything visible. + The @c CGSize passed is the calculated offset necessary to make everything visible (plus a nice margin). + It expects you to return the amount of time you need to reposition things so the popup can be delayed. + Typically you would return @c kSMCalloutViewRepositionDelayForUIScrollView if you're repositioning by calling @c [UIScrollView @c setContentOffset:animated:]. + + @param calloutView the @c SMCalloutView to reposition + @param offset calculated offset necessary to make everything visible + @returns @c NSTimeInterval to delay the repositioning + */ +- (NSTimeInterval)calloutView:(SMCalloutView *)calloutView delayForRepositionWithSize:(CGSize)offset; + +/// Called before the callout view appears on screen, or before the appearance animation will start. +- (void)calloutViewWillAppear:(SMCalloutView *)calloutView; + +/// Called after the callout view appears on screen, or after the appearance animation is complete. +- (void)calloutViewDidAppear:(SMCalloutView *)calloutView; + +/// Called before the callout view is removed from the screen, or before the disappearance animation is complete. +- (void)calloutViewWillDisappear:(SMCalloutView *)calloutView; + +/// Called after the callout view is removed from the screen, or after the disappearance animation is complete. +- (void)calloutViewDidDisappear:(SMCalloutView *)calloutView; + +NS_ASSUME_NONNULL_END +@end diff --git a/lib/ios/AirMaps/Callout/SMCalloutView.m b/lib/ios/AirMaps/Callout/SMCalloutView.m new file mode 100644 index 0000000..9472a70 --- /dev/null +++ b/lib/ios/AirMaps/Callout/SMCalloutView.m @@ -0,0 +1,858 @@ +#import "SMCalloutView.h" + +// +// UIView frame helpers - we do a lot of UIView frame fiddling in this class; these functions help keep things readable. +// + +@interface UIView (SMFrameAdditions) +@property (nonatomic, assign) CGPoint frameOrigin; +@property (nonatomic, assign) CGSize frameSize; +@property (nonatomic, assign) CGFloat frameX, frameY, frameWidth, frameHeight; // normal rect properties +@property (nonatomic, assign) CGFloat frameLeft, frameTop, frameRight, frameBottom; // these will stretch/shrink the rect +@end + +// +// Callout View. +// + +#define CALLOUT_DEFAULT_CONTAINER_HEIGHT 44 // height of just the main portion without arrow +#define CALLOUT_SUB_DEFAULT_CONTAINER_HEIGHT 52 // height of just the main portion without arrow (when subtitle is present) +#define CALLOUT_MIN_WIDTH 61 // minimum width of system callout +#define TITLE_HMARGIN 12 // the title/subtitle view's normal horizontal margin from the edges of our callout view or from the accessories +#define TITLE_TOP 11 // the top of the title view when no subtitle is present +#define TITLE_SUB_TOP 4 // the top of the title view when a subtitle IS present +#define TITLE_HEIGHT 21 // title height, fixed +#define SUBTITLE_TOP 28 // the top of the subtitle, when present +#define SUBTITLE_HEIGHT 15 // subtitle height, fixed +#define BETWEEN_ACCESSORIES_MARGIN 7 // margin between accessories when no title/subtitle is present +#define TOP_ANCHOR_MARGIN 13 // all the above measurements assume a bottom anchor! if we're pointing "up" we'll need to add this top margin to everything. +#define COMFORTABLE_MARGIN 10 // when we try to reposition content to be visible, we'll consider this margin around your target rect + +NSTimeInterval const kSMCalloutViewRepositionDelayForUIScrollView = 1.0/3.0; + +@interface SMCalloutView () +@property (nonatomic, strong) UIButton *containerView; // for masking and interaction +@property (nonatomic, strong) UILabel *titleLabel, *subtitleLabel; +@property (nonatomic, assign) SMCalloutArrowDirection currentArrowDirection; +@property (nonatomic, assign) BOOL popupCancelled; +@end + +@implementation SMCalloutView + ++ (SMCalloutView *)platformCalloutView { + + // if you haven't compiled SMClassicCalloutView into your app, then we can't possibly create an instance of it! + if (!NSClassFromString(@"SMClassicCalloutView")) + return [SMCalloutView new]; + + // ok we have both - so choose the best one based on current platform + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) + return [SMCalloutView new]; // iOS 7+ + else + return [NSClassFromString(@"SMClassicCalloutView") new]; +} + +- (id)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.permittedArrowDirection = SMCalloutArrowDirectionDown; + self.presentAnimation = SMCalloutAnimationBounce; + self.dismissAnimation = SMCalloutAnimationFade; + self.backgroundColor = [UIColor clearColor]; + self.containerView = [UIButton new]; + self.containerView.isAccessibilityElement = NO; + self.isAccessibilityElement = NO; + self.contentViewInset = UIEdgeInsetsMake(12, 12, 12, 12); + + [self.containerView addTarget:self action:@selector(highlightIfNecessary) forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragInside]; + [self.containerView addTarget:self action:@selector(unhighlightIfNecessary) forControlEvents:UIControlEventTouchDragOutside | UIControlEventTouchCancel | UIControlEventTouchUpOutside | UIControlEventTouchUpInside]; + [self.containerView addTarget:self action:@selector(calloutClicked) forControlEvents:UIControlEventTouchUpInside]; + } + return self; +} + +- (BOOL)supportsHighlighting { + if (![self.delegate respondsToSelector:@selector(calloutViewClicked:)]) + return NO; + if ([self.delegate respondsToSelector:@selector(calloutViewShouldHighlight:)]) + return [self.delegate calloutViewShouldHighlight:self]; + return YES; +} + +- (void)highlightIfNecessary { if (self.supportsHighlighting) self.backgroundView.highlighted = YES; } +- (void)unhighlightIfNecessary { if (self.supportsHighlighting) self.backgroundView.highlighted = NO; } + +- (void)calloutClicked { + if ([self.delegate respondsToSelector:@selector(calloutViewClicked:)]) + [self.delegate calloutViewClicked:self]; +} + +- (UIView *)titleViewOrDefault { + if (self.titleView) + // if you have a custom title view defined, return that. + return self.titleView; + else { + if (!self.titleLabel) { + // create a default titleView + self.titleLabel = [UILabel new]; + self.titleLabel.frameHeight = TITLE_HEIGHT; + self.titleLabel.opaque = NO; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.font = [UIFont systemFontOfSize:17]; + self.titleLabel.textColor = [UIColor blackColor]; + } + return self.titleLabel; + } +} + +- (UIView *)subtitleViewOrDefault { + if (self.subtitleView) + // if you have a custom subtitle view defined, return that. + return self.subtitleView; + else { + if (!self.subtitleLabel) { + // create a default subtitleView + self.subtitleLabel = [UILabel new]; + self.subtitleLabel.frameHeight = SUBTITLE_HEIGHT; + self.subtitleLabel.opaque = NO; + self.subtitleLabel.backgroundColor = [UIColor clearColor]; + self.subtitleLabel.font = [UIFont systemFontOfSize:12]; + self.subtitleLabel.textColor = [UIColor blackColor]; + } + return self.subtitleLabel; + } +} + +- (SMCalloutBackgroundView *)backgroundView { + // create our default background on first access only if it's nil, since you might have set your own background anyway. + return _backgroundView ? _backgroundView : (_backgroundView = [self defaultBackgroundView]); +} + +- (SMCalloutBackgroundView *)defaultBackgroundView { + return [SMCalloutMaskedBackgroundView new]; +} + +- (void)rebuildSubviews { + // remove and re-add our appropriate subviews in the appropriate order + [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + [self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + [self setNeedsDisplay]; + + [self addSubview:self.backgroundView]; + [self addSubview:self.containerView]; + + if (self.contentView) { + [self.containerView addSubview:self.contentView]; + } + else { + if (self.titleViewOrDefault) [self.containerView addSubview:self.titleViewOrDefault]; + if (self.subtitleViewOrDefault) [self.containerView addSubview:self.subtitleViewOrDefault]; + } + if (self.leftAccessoryView) [self.containerView addSubview:self.leftAccessoryView]; + if (self.rightAccessoryView) [self.containerView addSubview:self.rightAccessoryView]; +} + +// Accessory margins. Accessories are centered vertically when shorter +// than the callout, otherwise they grow from the upper corner. + +- (CGFloat)leftAccessoryVerticalMargin { + if (self.leftAccessoryView.frameHeight < self.calloutContainerHeight) + return roundf((self.calloutContainerHeight - self.leftAccessoryView.frameHeight) / 2); + else + return 0; +} + +- (CGFloat)leftAccessoryHorizontalMargin { + return fminf(self.leftAccessoryVerticalMargin, TITLE_HMARGIN); +} + +- (CGFloat)rightAccessoryVerticalMargin { + if (self.rightAccessoryView.frameHeight < self.calloutContainerHeight) + return roundf((self.calloutContainerHeight - self.rightAccessoryView.frameHeight) / 2); + else + return 0; +} + +- (CGFloat)rightAccessoryHorizontalMargin { + return fminf(self.rightAccessoryVerticalMargin, TITLE_HMARGIN); +} + +- (CGFloat)innerContentMarginLeft { + if (self.leftAccessoryView) + return self.leftAccessoryHorizontalMargin + self.leftAccessoryView.frameWidth + TITLE_HMARGIN; + else + return self.contentViewInset.left; +} + +- (CGFloat)innerContentMarginRight { + if (self.rightAccessoryView) + return self.rightAccessoryHorizontalMargin + self.rightAccessoryView.frameWidth + TITLE_HMARGIN; + else + return self.contentViewInset.right; +} + +- (CGFloat)calloutHeight { + return self.calloutContainerHeight + self.backgroundView.anchorHeight; +} + +- (CGFloat)calloutContainerHeight { + if (self.contentView) + return self.contentView.frameHeight + self.contentViewInset.bottom + self.contentViewInset.top; + else if (self.subtitleView || self.subtitle.length > 0) + return CALLOUT_SUB_DEFAULT_CONTAINER_HEIGHT; + else + return CALLOUT_DEFAULT_CONTAINER_HEIGHT; +} + +- (CGSize)sizeThatFits:(CGSize)size { + + // calculate how much non-negotiable space we need to reserve for margin and accessories + CGFloat margin = self.innerContentMarginLeft + self.innerContentMarginRight; + + // how much room is left for text? + CGFloat availableWidthForText = size.width - margin - 1; + + // no room for text? then we'll have to squeeze into the given size somehow. + if (availableWidthForText < 0) + availableWidthForText = 0; + + CGSize preferredTitleSize = [self.titleViewOrDefault sizeThatFits:CGSizeMake(availableWidthForText, TITLE_HEIGHT)]; + CGSize preferredSubtitleSize = [self.subtitleViewOrDefault sizeThatFits:CGSizeMake(availableWidthForText, SUBTITLE_HEIGHT)]; + + // total width we'd like + CGFloat preferredWidth; + + if (self.contentView) { + + // if we have a content view, then take our preferred size directly from that + preferredWidth = self.contentView.frameWidth + margin; + } + else if (preferredTitleSize.width >= 0.000001 || preferredSubtitleSize.width >= 0.000001) { + + // if we have a title or subtitle, then our assumed margins are valid, and we can apply them + preferredWidth = fmaxf(preferredTitleSize.width, preferredSubtitleSize.width) + margin; + } + else { + // ok we have no title or subtitle to speak of. In this case, the system callout would actually not display + // at all! But we can handle it. + preferredWidth = self.leftAccessoryView.frameWidth + self.rightAccessoryView.frameWidth + self.leftAccessoryHorizontalMargin + self.rightAccessoryHorizontalMargin; + + if (self.leftAccessoryView && self.rightAccessoryView) + preferredWidth += BETWEEN_ACCESSORIES_MARGIN; + } + + // ensure we're big enough to fit our graphics! + preferredWidth = fmaxf(preferredWidth, CALLOUT_MIN_WIDTH); + + // ask to be smaller if we have space, otherwise we'll fit into what we have by truncating the title/subtitle. + return CGSizeMake(fminf(preferredWidth, size.width), self.calloutHeight); +} + +- (CGSize)offsetToContainRect:(CGRect)innerRect inRect:(CGRect)outerRect { + CGFloat nudgeRight = fmaxf(0, CGRectGetMinX(outerRect) - CGRectGetMinX(innerRect)); + CGFloat nudgeLeft = fminf(0, CGRectGetMaxX(outerRect) - CGRectGetMaxX(innerRect)); + CGFloat nudgeTop = fmaxf(0, CGRectGetMinY(outerRect) - CGRectGetMinY(innerRect)); + CGFloat nudgeBottom = fminf(0, CGRectGetMaxY(outerRect) - CGRectGetMaxY(innerRect)); + return CGSizeMake(nudgeLeft ? nudgeLeft : nudgeRight, nudgeTop ? nudgeTop : nudgeBottom); +} + +- (void)presentCalloutFromRect:(CGRect)rect inView:(UIView *)view constrainedToView:(UIView *)constrainedView animated:(BOOL)animated { + [self presentCalloutFromRect:rect inLayer:view.layer ofView:view constrainedToLayer:constrainedView.layer animated:animated]; +} + +- (void)presentCalloutFromRect:(CGRect)rect inLayer:(CALayer *)layer constrainedToLayer:(CALayer *)constrainedLayer animated:(BOOL)animated { + [self presentCalloutFromRect:rect inLayer:layer ofView:nil constrainedToLayer:constrainedLayer animated:animated]; +} + +// this private method handles both CALayer and UIView parents depending on what's passed. +- (void)presentCalloutFromRect:(CGRect)rect inLayer:(CALayer *)layer ofView:(UIView *)view constrainedToLayer:(CALayer *)constrainedLayer animated:(BOOL)animated { + + // Sanity check: dismiss this callout immediately if it's displayed somewhere + if (self.layer.superlayer) [self dismissCalloutAnimated:NO]; + + // cancel any presenting animation that may be in progress + [self.layer removeAnimationForKey:@"present"]; + + // figure out the constrained view's rect in our popup view's coordinate system + CGRect constrainedRect = [constrainedLayer convertRect:constrainedLayer.bounds toLayer:layer]; + + // apply our edge constraints + constrainedRect = UIEdgeInsetsInsetRect(constrainedRect, self.constrainedInsets); + + constrainedRect = CGRectInset(constrainedRect, COMFORTABLE_MARGIN, COMFORTABLE_MARGIN); + + // form our subviews based on our content set so far + [self rebuildSubviews]; + + // apply title/subtitle (if present + self.titleLabel.text = self.title; + self.subtitleLabel.text = self.subtitle; + + // size the callout to fit the width constraint as best as possible + self.frameSize = [self sizeThatFits:CGSizeMake(constrainedRect.size.width, self.calloutHeight)]; + + // how much room do we have in the constraint box, both above and below our target rect? + CGFloat topSpace = CGRectGetMinY(rect) - CGRectGetMinY(constrainedRect); + CGFloat bottomSpace = CGRectGetMaxY(constrainedRect) - CGRectGetMaxY(rect); + + // we prefer to point our arrow down. + SMCalloutArrowDirection bestDirection = SMCalloutArrowDirectionDown; + + // we'll point it up though if that's the only option you gave us. + if (self.permittedArrowDirection == SMCalloutArrowDirectionUp) + bestDirection = SMCalloutArrowDirectionUp; + + // or, if we don't have enough space on the top and have more space on the bottom, and you + // gave us a choice, then pointing up is the better option. + if (self.permittedArrowDirection == SMCalloutArrowDirectionAny && topSpace < self.calloutHeight && bottomSpace > topSpace) + bestDirection = SMCalloutArrowDirectionUp; + + self.currentArrowDirection = bestDirection; + + // we want to point directly at the horizontal center of the given rect. calculate our "anchor point" in terms of our + // target view's coordinate system. make sure to offset the anchor point as requested if necessary. + CGFloat anchorX = self.calloutOffset.x + CGRectGetMidX(rect); + CGFloat anchorY = self.calloutOffset.y + (bestDirection == SMCalloutArrowDirectionDown ? CGRectGetMinY(rect) : CGRectGetMaxY(rect)); + + // we prefer to sit centered directly above our anchor + CGFloat calloutX = roundf(anchorX - self.frameWidth / 2); + + // but not if it's going to get too close to the edge of our constraints + if (calloutX < constrainedRect.origin.x) + calloutX = constrainedRect.origin.x; + + if (calloutX > constrainedRect.origin.x+constrainedRect.size.width-self.frameWidth) + calloutX = constrainedRect.origin.x+constrainedRect.size.width-self.frameWidth; + + // what's the farthest to the left and right that we could point to, given our background image constraints? + CGFloat minPointX = calloutX + self.backgroundView.anchorMargin; + CGFloat maxPointX = calloutX + self.frameWidth - self.backgroundView.anchorMargin; + + // we may need to scoot over to the left or right to point at the correct spot + CGFloat adjustX = 0; + if (anchorX < minPointX) adjustX = anchorX - minPointX; + if (anchorX > maxPointX) adjustX = anchorX - maxPointX; + + // add the callout to the given layer (or view if possible, to receive touch events) + if (view) + [view addSubview:self]; + else + [layer addSublayer:self.layer]; + + CGPoint calloutOrigin = { + .x = calloutX + adjustX, + .y = bestDirection == SMCalloutArrowDirectionDown ? (anchorY - self.calloutHeight) : anchorY + }; + + self.frameOrigin = calloutOrigin; + + // now set the *actual* anchor point for our layer so that our "popup" animation starts from this point. + CGPoint anchorPoint = [layer convertPoint:CGPointMake(anchorX, anchorY) toLayer:self.layer]; + + // pass on the anchor point to our background view so it knows where to draw the arrow + self.backgroundView.arrowPoint = anchorPoint; + + // adjust it to unit coordinates for the actual layer.anchorPoint property + anchorPoint.x /= self.frameWidth; + anchorPoint.y /= self.frameHeight; + self.layer.anchorPoint = anchorPoint; + + // setting the anchor point moves the view a bit, so we need to reset + self.frameOrigin = calloutOrigin; + + // make sure our frame is not on half-pixels or else we may be blurry! + CGFloat scale = [UIScreen mainScreen].scale; + self.frameX = floorf(self.frameX*scale)/scale; + self.frameY = floorf(self.frameY*scale)/scale; + + // layout now so we can immediately start animating to the final position if needed + [self setNeedsLayout]; + [self layoutIfNeeded]; + + // if we're outside the bounds of our constraint rect, we'll give our delegate an opportunity to shift us into position. + // consider both our size and the size of our target rect (which we'll assume to be the size of the content you want to scroll into view. + CGRect contentRect = CGRectUnion(self.frame, rect); + CGSize offset = [self offsetToContainRect:contentRect inRect:constrainedRect]; + + NSTimeInterval delay = 0; + self.popupCancelled = NO; // reset this before calling our delegate below + + if ([self.delegate respondsToSelector:@selector(calloutView:delayForRepositionWithSize:)] && !CGSizeEqualToSize(offset, CGSizeZero)) + delay = [self.delegate calloutView:(id)self delayForRepositionWithSize:offset]; + + // there's a chance that user code in the delegate method may have called -dismissCalloutAnimated to cancel things; if that + // happened then we need to bail! + if (self.popupCancelled) return; + + // now we want to mask our contents to our background view (if requested) to match the iOS 7 style + self.containerView.layer.mask = self.backgroundView.contentMask; + + // if we need to delay, we don't want to be visible while we're delaying, so hide us in preparation for our popup + self.hidden = YES; + + // create the appropriate animation, even if we're not animated + CAAnimation *animation = [self animationWithType:self.presentAnimation presenting:YES]; + + // nuke the duration if no animation requested - we'll still need to "run" the animation to get delays and callbacks + if (!animated) + animation.duration = 0.0000001; // can't be zero or the animation won't "run" + + animation.beginTime = CACurrentMediaTime() + delay; + animation.delegate = self; + + [self.layer addAnimation:animation forKey:@"present"]; +} + +- (void)animationDidStart:(CAAnimation *)anim { + BOOL presenting = [[anim valueForKey:@"presenting"] boolValue]; + + if (presenting) { + if ([_delegate respondsToSelector:@selector(calloutViewWillAppear:)]) + [_delegate calloutViewWillAppear:(id)self]; + + // ok, animation is on, let's make ourselves visible! + self.hidden = NO; + } + else if (!presenting) { + if ([_delegate respondsToSelector:@selector(calloutViewWillDisappear:)]) + [_delegate calloutViewWillDisappear:(id)self]; + } +} + +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)finished { + BOOL presenting = [[anim valueForKey:@"presenting"] boolValue]; + + if (presenting && finished) { + if ([_delegate respondsToSelector:@selector(calloutViewDidAppear:)]) + [_delegate calloutViewDidAppear:(id)self]; + } + else if (!presenting && finished) { + + [self removeFromParent]; + [self.layer removeAnimationForKey:@"dismiss"]; + + if ([_delegate respondsToSelector:@selector(calloutViewDidDisappear:)]) + [_delegate calloutViewDidDisappear:(id)self]; + } +} + +- (void)dismissCalloutAnimated:(BOOL)animated { + + // cancel all animations that may be in progress + [self.layer removeAnimationForKey:@"present"]; + [self.layer removeAnimationForKey:@"dismiss"]; + + self.popupCancelled = YES; + + if (animated) { + CAAnimation *animation = [self animationWithType:self.dismissAnimation presenting:NO]; + animation.delegate = self; + [self.layer addAnimation:animation forKey:@"dismiss"]; + } + else { + [self removeFromParent]; + } +} + +- (void)removeFromParent { + if (self.superview) + [self removeFromSuperview]; + else { + // removing a layer from a superlayer causes an implicit fade-out animation that we wish to disable. + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [self.layer removeFromSuperlayer]; + [CATransaction commit]; + } +} + +- (CAAnimation *)animationWithType:(SMCalloutAnimation)type presenting:(BOOL)presenting { + CAAnimation *animation = nil; + + if (type == SMCalloutAnimationBounce) { + + CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"opacity"]; + fade.duration = 0.23; + fade.fromValue = presenting ? @0.0 : @1.0; + fade.toValue = presenting ? @1.0 : @0.0; + fade.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + + CABasicAnimation *bounce = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; + bounce.duration = 0.23; + bounce.fromValue = presenting ? @0.7 : @1.0; + bounce.toValue = presenting ? @1.0 : @0.7; + bounce.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.59367:0.12066:0.18878:1.5814]; + + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.animations = @[fade, bounce]; + group.duration = 0.23; + + animation = group; + } + else if (type == SMCalloutAnimationFade) { + CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"opacity"]; + fade.duration = 1.0/3.0; + fade.fromValue = presenting ? @0.0 : @1.0; + fade.toValue = presenting ? @1.0 : @0.0; + animation = fade; + } + else if (type == SMCalloutAnimationStretch) { + CABasicAnimation *stretch = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; + stretch.duration = 0.1; + stretch.fromValue = presenting ? @0.0 : @1.0; + stretch.toValue = presenting ? @1.0 : @0.0; + animation = stretch; + } + + // CAAnimation is KVC compliant, so we can store whether we're presenting for lookup in our delegate methods + [animation setValue:@(presenting) forKey:@"presenting"]; + + animation.fillMode = kCAFillModeForwards; + animation.removedOnCompletion = NO; + return animation; +} + +- (void)layoutSubviews { + + self.containerView.frame = self.bounds; + self.backgroundView.frame = self.bounds; + + // if we're pointing up, we'll need to push almost everything down a bit + CGFloat dy = self.currentArrowDirection == SMCalloutArrowDirectionUp ? TOP_ANCHOR_MARGIN : 0; + + self.titleViewOrDefault.frameX = self.innerContentMarginLeft; + self.titleViewOrDefault.frameY = (self.subtitleView || self.subtitle.length ? TITLE_SUB_TOP : TITLE_TOP) + dy; + self.titleViewOrDefault.frameWidth = self.frameWidth - self.innerContentMarginLeft - self.innerContentMarginRight; + + self.subtitleViewOrDefault.frameX = self.titleViewOrDefault.frameX; + self.subtitleViewOrDefault.frameY = SUBTITLE_TOP + dy; + self.subtitleViewOrDefault.frameWidth = self.titleViewOrDefault.frameWidth; + + self.leftAccessoryView.frameX = self.leftAccessoryHorizontalMargin; + self.leftAccessoryView.frameY = self.leftAccessoryVerticalMargin + dy; + + self.rightAccessoryView.frameX = self.frameWidth - self.rightAccessoryHorizontalMargin - self.rightAccessoryView.frameWidth; + self.rightAccessoryView.frameY = self.rightAccessoryVerticalMargin + dy; + + if (self.contentView) { + self.contentView.frameX = self.innerContentMarginLeft; + self.contentView.frameY = self.contentViewInset.top + dy; + } +} + +#pragma mark - Accessibility + +- (NSInteger)accessibilityElementCount { + return (!!self.leftAccessoryView + !!self.titleViewOrDefault + + !!self.subtitleViewOrDefault + !!self.rightAccessoryView); +} + +- (id)accessibilityElementAtIndex:(NSInteger)index { + if (index == 0) { + return self.leftAccessoryView ? self.leftAccessoryView : self.titleViewOrDefault; + } + if (index == 1) { + return self.leftAccessoryView ? self.titleViewOrDefault : self.subtitleViewOrDefault; + } + if (index == 2) { + return self.leftAccessoryView ? self.subtitleViewOrDefault : self.rightAccessoryView; + } + if (index == 3) { + return self.leftAccessoryView ? self.rightAccessoryView : nil; + } + return nil; +} + +- (NSInteger)indexOfAccessibilityElement:(id)element { + if (element == nil) return NSNotFound; + if (element == self.leftAccessoryView) return 0; + if (element == self.titleViewOrDefault) { + return self.leftAccessoryView ? 1 : 0; + } + if (element == self.subtitleViewOrDefault) { + return self.leftAccessoryView ? 2 : 1; + } + if (element == self.rightAccessoryView) { + return self.leftAccessoryView ? 3 : 2; + } + return NSNotFound; +} + +@end + +// import this known "private API" from SMCalloutBackgroundView +@interface SMCalloutBackgroundView (EmbeddedImages) ++ (UIImage *)embeddedImageNamed:(NSString *)name; +@end + +// +// Callout Background View. +// + +@interface SMCalloutMaskedBackgroundView () +@property (nonatomic, strong) UIView *containerView, *containerBorderView, *arrowView; +@property (nonatomic, strong) UIImageView *arrowImageView, *arrowHighlightedImageView, *arrowBorderView; +@end + +static UIImage *blackArrowImage = nil, *whiteArrowImage = nil, *grayArrowImage = nil; + +@implementation SMCalloutMaskedBackgroundView + +- (id)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + + // Here we're mimicking the very particular (and odd) structure of the system callout view. + // The hierarchy and view/layer values were discovered by inspecting map kit using Reveal.app + + self.containerView = [UIView new]; + self.containerView.backgroundColor = [UIColor whiteColor]; + self.containerView.alpha = 0.96; + self.containerView.layer.cornerRadius = 8; + self.containerView.layer.shadowRadius = 30; + self.containerView.layer.shadowOpacity = 0.1; + + self.containerBorderView = [UIView new]; + self.containerBorderView.layer.borderColor = [UIColor colorWithWhite:0 alpha:0.1].CGColor; + self.containerBorderView.layer.borderWidth = 0.5; + self.containerBorderView.layer.cornerRadius = 8.5; + + if (!blackArrowImage) { + blackArrowImage = [SMCalloutBackgroundView embeddedImageNamed:@"CalloutArrow"]; + whiteArrowImage = [self image:blackArrowImage withColor:[UIColor whiteColor]]; + grayArrowImage = [self image:blackArrowImage withColor:[UIColor colorWithWhite:0.85 alpha:1]]; + } + + self.anchorHeight = 13; + self.anchorMargin = 27; + + self.arrowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, blackArrowImage.size.width, blackArrowImage.size.height)]; + self.arrowView.alpha = 0.96; + self.arrowImageView = [[UIImageView alloc] initWithImage:whiteArrowImage]; + self.arrowHighlightedImageView = [[UIImageView alloc] initWithImage:grayArrowImage]; + self.arrowHighlightedImageView.hidden = YES; + self.arrowBorderView = [[UIImageView alloc] initWithImage:blackArrowImage]; + self.arrowBorderView.alpha = 0.1; + self.arrowBorderView.frameY = 0.5; + + [self addSubview:self.containerView]; + [self.containerView addSubview:self.containerBorderView]; + [self addSubview:self.arrowView]; + [self.arrowView addSubview:self.arrowBorderView]; + [self.arrowView addSubview:self.arrowImageView]; + [self.arrowView addSubview:self.arrowHighlightedImageView]; + } + return self; +} + +// Make sure we relayout our images when our arrow point changes! +- (void)setArrowPoint:(CGPoint)arrowPoint { + [super setArrowPoint:arrowPoint]; + [self setNeedsLayout]; +} + +- (void)setHighlighted:(BOOL)highlighted { + [super setHighlighted:highlighted]; + self.containerView.backgroundColor = highlighted ? [UIColor colorWithWhite:0.85 alpha:1] : [UIColor whiteColor]; + self.arrowImageView.hidden = highlighted; + self.arrowHighlightedImageView.hidden = !highlighted; +} + +- (UIImage *)image:(UIImage *)image withColor:(UIColor *)color { + + UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); + CGRect imageRect = (CGRect){.size=image.size}; + CGContextRef c = UIGraphicsGetCurrentContext(); + CGContextTranslateCTM(c, 0, image.size.height); + CGContextScaleCTM(c, 1, -1); + CGContextClipToMask(c, imageRect, image.CGImage); + [color setFill]; + CGContextFillRect(c, imageRect); + UIImage *whiteImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return whiteImage; +} + +- (void)layoutSubviews { + + BOOL pointingUp = self.arrowPoint.y < self.frameHeight/2; + + // if we're pointing up, we'll need to push almost everything down a bit + CGFloat dy = pointingUp ? TOP_ANCHOR_MARGIN : 0; + + self.containerView.frame = CGRectMake(0, dy, self.frameWidth, self.frameHeight - self.arrowView.frameHeight + 0.5); + self.containerBorderView.frame = CGRectInset(self.containerView.bounds, -0.5, -0.5); + + self.arrowView.frameX = roundf(self.arrowPoint.x - self.arrowView.frameWidth / 2); + + if (pointingUp) { + self.arrowView.frameY = 1; + self.arrowView.transform = CGAffineTransformMakeRotation(M_PI); + } + else { + self.arrowView.frameY = self.containerView.frameHeight - 0.5; + self.arrowView.transform = CGAffineTransformIdentity; + } +} + +- (CALayer *)contentMask { + + UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0); + + [self.layer renderInContext:UIGraphicsGetCurrentContext()]; + + UIImage *maskImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + CALayer *layer = [CALayer layer]; + layer.frame = self.bounds; + layer.contents = (id)maskImage.CGImage; + return layer; +} + +@end + +@implementation SMCalloutBackgroundView + ++ (NSData *)dataWithBase64EncodedString:(NSString *)string { + // + // NSData+Base64.m + // + // Version 1.0.2 + // + // Created by Nick Lockwood on 12/01/2012. + // Copyright (C) 2012 Charcoal Design + // + // Distributed under the permissive zlib License + // Get the latest version from here: + // + // https://github.com/nicklockwood/Base64 + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // + // 3. This notice may not be removed or altered from any source distribution. + // + const char lookup[] = { + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99, + 99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 99, 99, 99, 99, 99, + 99, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 99, 99, 99, 99, 99 + }; + + NSData *inputData = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; + long long inputLength = [inputData length]; + const unsigned char *inputBytes = [inputData bytes]; + + long long maxOutputLength = (inputLength / 4 + 1) * 3; + NSMutableData *outputData = [NSMutableData dataWithLength:(NSUInteger)maxOutputLength]; + unsigned char *outputBytes = (unsigned char *)[outputData mutableBytes]; + + int accumulator = 0; + long long outputLength = 0; + unsigned char accumulated[] = {0, 0, 0, 0}; + for (long long i = 0; i < inputLength; i++) { + unsigned char decoded = lookup[inputBytes[i] & 0x7F]; + if (decoded != 99) { + accumulated[accumulator] = decoded; + if (accumulator == 3) { + outputBytes[outputLength++] = (accumulated[0] << 2) | (accumulated[1] >> 4); + outputBytes[outputLength++] = (accumulated[1] << 4) | (accumulated[2] >> 2); + outputBytes[outputLength++] = (accumulated[2] << 6) | accumulated[3]; + } + accumulator = (accumulator + 1) % 4; + } + } + + //handle left-over data + if (accumulator > 0) outputBytes[outputLength] = (accumulated[0] << 2) | (accumulated[1] >> 4); + if (accumulator > 1) outputBytes[++outputLength] = (accumulated[1] << 4) | (accumulated[2] >> 2); + if (accumulator > 2) outputLength++; + + //truncate data to match actual output length + outputData.length = (NSUInteger)outputLength; + return outputLength? outputData: nil; +} + ++ (UIImage *)embeddedImageNamed:(NSString *)name { + CGFloat screenScale = [UIScreen mainScreen].scale; + if (screenScale > 1.0) { + name = [name stringByAppendingString:@"_2x"]; + screenScale = 2.0; + } + + SEL selector = NSSelectorFromString(name); + + if (![(id)self respondsToSelector:selector]) { + NSLog(@"Could not find an embedded image. Ensure that you've added a class-level method named +%@", name); + return nil; + } + + // We need to hush the compiler here - but we know what we're doing! +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + NSString *base64String = [(id)self performSelector:selector]; +#pragma clang diagnostic pop + + UIImage *rawImage = [UIImage imageWithData:[self dataWithBase64EncodedString:base64String]]; + return [UIImage imageWithCGImage:rawImage.CGImage scale:screenScale orientation:UIImageOrientationUp]; +} + ++ (NSString *)CalloutArrow { return @"iVBORw0KGgoAAAANSUhEUgAAACcAAAANCAYAAAAqlHdlAAAAHGlET1QAAAACAAAAAAAAAAcAAAAoAAAABwAAAAYAAADJEgYpIwAAAJVJREFUOBFiYIAAdn5+fkFOTkE5Dg5eW05O3lJOTr6zQPyfDhhoD28pxF5BOZA7gE5ih7oLN8XJyR8MdNwrGjkQaC5/MG7biZDh4OBXBDruLpUdeBdkLhHWE1bCzs6nAnTcUyo58DnIPMK2kqAC6DALIP5JoQNB+i1IsJZ4pcBEm0iJ40D6ibeNDJVAx00k04ETSbUOAAAA//+SwicfAAAAe0lEQVRjYCAdMHNy8u7l5OT7Tzzm3Qu0hpl0q8jQwcPDIwp02B0iHXeHl5dXhAxryNfCzc2tC3TcJwIO/ARSR74tFOjk4uL1BzruHw4H/gPJU2A85Vq5uPjTgY77g+bAPyBxyk2nggkcHPxOnJz8B4AOfAGiQXwqGMsAACGK1kPPMHNBAAAAAElFTkSuQmCC"; } + ++ (NSString *)CalloutArrow_2x { return @"iVBORw0KGgoAAAANSUhEUgAAAE4AAAAaCAYAAAAZtWr8AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAHGlET1QAAAACAAAAAAAAAA0AAAAoAAAADQAAAA0AAAFMRh0LGwAAARhJREFUWAnclbENwjAQRZ0mih2fDYgsQEVDxQZMgKjpWYAJkBANI8AGDIEoM0WkzBDRAf8klB44g0OkU1zE3/+9RIpS7VVY730/y/woTWlsjJ9iPcN9pbXfY85auyvm/qcDNmb0e2Z+sk/ZBTthN0oVttX12mJIWeaWEFf+kbySmZQa0msu3nzaGJprTXV3BVLNDG/if7bNOTeAvFP35NGJu39GL7Abb27bFXncVQBZLgJf3jp+ebSWIxZMgrxdvPJoJ4gqHpXgV36ITR46HUGaiNMKB6YQd4lI3gV8qTBjmDhrbQFxVQTyKu4ShjJQap7nE4hrfiiv4Q6B8MLGat1bQNztB/JwZm8Rli5wujFu821xfGZgLPUAAAD//4wvm4gAAAD7SURBVOWXMQ6CMBiFgaFpi6VyBEedXJy4hMQTeBSvRDgJEySegI3EQWOivkZnqUB/k0LyL7R9L++D9G+DwP0TCZGUqCdRlYgUuY9F4JCmqQa0hgBcY7wIItFZMLZYS5l0ruAZbXhs6BIROgmhcoB7OIAHTZUTRqG3wp9xmhqc0aRPQu8YAlwxIbwCEUL6GH9wfDcLXY2HpyvvmkHf9+BcrwCuHQGvNRp9Pl6OY0PPAO42AB7WqMxLKLahpFR7gLv/AA9zPe+gtvAMCIC7WMC7CqEPtrqzmBfHyy3A1V/g1Th27GYBY0BIxrk6Ap65254/VZp30GID9JwteQEZrVMWXqGn8gAAAABJRU5ErkJggg=="; } + +@end + +// +// Our UIView frame helpers implementation +// + +@implementation UIView (SMFrameAdditions) + +- (CGPoint)frameOrigin { return self.frame.origin; } +- (void)setFrameOrigin:(CGPoint)origin { self.frame = (CGRect){ .origin=origin, .size=self.frame.size }; } + +- (CGFloat)frameX { return self.frame.origin.x; } +- (void)setFrameX:(CGFloat)x { self.frame = (CGRect){ .origin.x=x, .origin.y=self.frame.origin.y, .size=self.frame.size }; } + +- (CGFloat)frameY { return self.frame.origin.y; } +- (void)setFrameY:(CGFloat)y { self.frame = (CGRect){ .origin.x=self.frame.origin.x, .origin.y=y, .size=self.frame.size }; } + +- (CGSize)frameSize { return self.frame.size; } +- (void)setFrameSize:(CGSize)size { self.frame = (CGRect){ .origin=self.frame.origin, .size=size }; } + +- (CGFloat)frameWidth { return self.frame.size.width; } +- (void)setFrameWidth:(CGFloat)width { self.frame = (CGRect){ .origin=self.frame.origin, .size.width=width, .size.height=self.frame.size.height }; } + +- (CGFloat)frameHeight { return self.frame.size.height; } +- (void)setFrameHeight:(CGFloat)height { self.frame = (CGRect){ .origin=self.frame.origin, .size.width=self.frame.size.width, .size.height=height }; } + +- (CGFloat)frameLeft { return self.frame.origin.x; } +- (void)setFrameLeft:(CGFloat)left { self.frame = (CGRect){ .origin.x=left, .origin.y=self.frame.origin.y, .size.width=fmaxf(self.frame.origin.x+self.frame.size.width-left,0), .size.height=self.frame.size.height }; } + +- (CGFloat)frameTop { return self.frame.origin.y; } +- (void)setFrameTop:(CGFloat)top { self.frame = (CGRect){ .origin.x=self.frame.origin.x, .origin.y=top, .size.width=self.frame.size.width, .size.height=fmaxf(self.frame.origin.y+self.frame.size.height-top,0) }; } + +- (CGFloat)frameRight { return self.frame.origin.x + self.frame.size.width; } +- (void)setFrameRight:(CGFloat)right { self.frame = (CGRect){ .origin=self.frame.origin, .size.width=fmaxf(right-self.frame.origin.x,0), .size.height=self.frame.size.height }; } + +- (CGFloat)frameBottom { return self.frame.origin.y + self.frame.size.height; } +- (void)setFrameBottom:(CGFloat)bottom { self.frame = (CGRect){ .origin=self.frame.origin, .size.width=self.frame.size.width, .size.height=fmaxf(bottom-self.frame.origin.y,0) }; } + +@end \ No newline at end of file diff --git a/lib/ios/AirMaps/RCTConvert+AirMap.h b/lib/ios/AirMaps/RCTConvert+AirMap.h new file mode 100644 index 0000000..6098377 --- /dev/null +++ b/lib/ios/AirMaps/RCTConvert+AirMap.h @@ -0,0 +1,18 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import +#import +#import + +@interface RCTConvert (AirMap) + ++ (MKCoordinateSpan)MKCoordinateSpan:(id)json; ++ (MKCoordinateRegion)MKCoordinateRegion:(id)json; ++ (MKMapCamera*)MKMapCamera:(id)json; ++ (MKMapCamera*)MKMapCameraWithDefaults:(id)json existingCamera:(MKMapCamera*)camera; ++ (MKMapType)MKMapType:(id)json; + +@end diff --git a/lib/ios/AirMaps/RCTConvert+AirMap.m b/lib/ios/AirMaps/RCTConvert+AirMap.m new file mode 100644 index 0000000..338ed8b --- /dev/null +++ b/lib/ios/AirMaps/RCTConvert+AirMap.m @@ -0,0 +1,88 @@ +// +// Created by Leland Richardson on 12/27/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "RCTConvert+AirMap.h" + +#import +#import "AIRMapCoordinate.h" + +@implementation RCTConvert (AirMap) + ++ (MKCoordinateSpan)MKCoordinateSpan:(id)json +{ + json = [self NSDictionary:json]; + return (MKCoordinateSpan){ + [self CLLocationDegrees:json[@"latitudeDelta"]], + [self CLLocationDegrees:json[@"longitudeDelta"]] + }; +} + ++ (MKCoordinateRegion)MKCoordinateRegion:(id)json +{ + return (MKCoordinateRegion){ + [self CLLocationCoordinate2D:json], + [self MKCoordinateSpan:json] + }; +} + ++ (MKMapCamera*)MKMapCamera:(id)json +{ + json = [self NSDictionary:json]; + return [RCTConvert MKMapCameraWithDefaults:json existingCamera:nil]; +} + ++ (MKMapCamera*)MKMapCameraWithDefaults:(id)json existingCamera:(MKMapCamera*)camera +{ + json = [self NSDictionary:json]; + if (camera == nil) { + camera = [[MKMapCamera alloc] init]; + } else { + camera = [camera copy]; + } + if (json[@"center"]) { + camera.centerCoordinate = [self CLLocationCoordinate2D:json[@"center"]]; + } + if (json[@"pitch"]) { + camera.pitch = [self double:json[@"pitch"]]; + } + if (json[@"altitude"]) { + camera.altitude = [self double:json[@"altitude"]]; + } + if (json[@"heading"]) { + camera.heading = [self double:json[@"heading"]]; + } + return camera; +} + + +RCT_ENUM_CONVERTER(MKMapType, (@{ + @"standard": @(MKMapTypeStandard), + @"satellite": @(MKMapTypeSatellite), + @"hybrid": @(MKMapTypeHybrid), + @"satelliteFlyover": @(MKMapTypeSatelliteFlyover), + @"hybridFlyover": @(MKMapTypeHybridFlyover), + @"mutedStandard": @(MKMapTypeMutedStandard) +}), MKMapTypeStandard, integerValue) + +// NOTE(lmr): +// This is a bit of a hack, but I'm using this class to simply wrap +// around a `CLLocationCoordinate2D`, since I was unable to figure out +// how to handle an array of structs like CLLocationCoordinate2D. Would love +// to get rid of this if someone can show me how... ++ (AIRMapCoordinate *)AIRMapCoordinate:(id)json +{ + AIRMapCoordinate *coord = [AIRMapCoordinate new]; + coord.coordinate = [self CLLocationCoordinate2D:json]; + return coord; +} + +RCT_ARRAY_CONVERTER(AIRMapCoordinate) + ++ (NSArray *> *)AIRMapCoordinateArrayArray:(id)json +{ + return RCTConvertArrayValue(@selector(AIRMapCoordinateArray:), json); +} + +@end diff --git a/lib/ios/User.xcconfig b/lib/ios/User.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..13a9642 --- /dev/null +++ b/metro.config.js @@ -0,0 +1,17 @@ +/** + * Metro configuration for React Native + * https://github.com/facebook/react-native + * + * @format + */ + +module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..c9f69d0 --- /dev/null +++ b/package.json @@ -0,0 +1,93 @@ +{ + "_from": "react-native-maps@0.25.0", + "_id": "react-native-maps@0.25.0", + "_inBundle": false, + "_integrity": "sha512-PFJuW1pt+HnnnN0m0OGk29RSvICFVkK/DScX6cUk0SuCSN2DAHx0y6y57lZyYXcYqU4J4usNpfxgp/ccjASDiw==", + "_location": "/react-native-maps", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "react-native-maps@0.25.0", + "name": "react-native-maps", + "escapedName": "react-native-maps", + "rawSpec": "0.25.0", + "saveSpec": null, + "fetchSpec": "0.25.0" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/react-native-maps/-/react-native-maps-0.25.0.tgz", + "_shasum": "81bc51eb50e33811a9e1c345cc48869413ead67d", + "_spec": "react-native-maps@0.25.0", + "_where": "/Users/atar/PrortigerWorkspace/buyer/housing-app", + "author": { + "name": "Leland Richardson", + "email": "leland.m.richardson@gmail.com" + }, + "bugs": { + "url": "https://github.com/react-native-community/react-native-maps/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "React Native Mapview component for iOS + Android", + "devDependencies": { + "@babel/core": "^7.4.3", + "@babel/runtime": "^7.4.3", + "@react-native-community/eslint-config": "0.0.5", + "babel-eslint": "^10.0.1", + "babel-plugin-module-resolver": "^3.2.0", + "eslint": "^5.16.0", + "eslint-plugin-import": "^2.17.2", + "eslint-plugin-jsx-a11y": "^6.2.1", + "eslint-plugin-prefer-object-spread": "^1.2.1", + "eslint-plugin-react": "^7.13.0", + "gitbook-cli": "^2.3.0", + "lodash": "^4.17.2", + "metro-react-native-babel-preset": "^0.53.1", + "react": "16.8.3", + "react-native": "0.59.3" + }, + "homepage": "https://github.com/react-native-community/react-native-maps#readme", + "keywords": [ + "react", + "react-native", + "react-component", + "map", + "mapview", + "google-maps", + "mapkit" + ], + "main": "index.js", + "name": "react-native-maps", + "peerDependencies": { + "prop-types": "^15.0 || ^16.0", + "react": ">= 16.0 || < 17.0", + "react-native": ">= 0.51" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/react-native-community/react-native-maps.git" + }, + "rnpm": { + "android": { + "sourceDir": "./lib/android" + } + }, + "scripts": { + "build": "npm run build:js && npm run build:android && npm run build:ios", + "build:android": "./gradlew :react-native-maps:assembleDebug", + "build:ios": "bundle install --path ./example/ios/bundles && bundle exec pod install --project-directory=./example/ios/", + "build:js": "exit 0", + "ci": "npm run lint", + "lint": "./node_modules/eslint/bin/eslint.js .", + "preversion": "./scripts/update-version.js", + "run:android": "./gradlew installDebug && npm run start:android", + "run:ios": "react-native run-ios --project-path ./example/ios", + "run:packager": "./node_modules/react-native/scripts/packager.sh", + "start": "node node_modules/react-native/local-cli/cli.js start", + "start:android": "adb shell am start -n com.airbnb.android.react.maps.example/.MainActivity" + }, + "version": "0.25.0" +} diff --git a/react-native-google-maps.podspec b/react-native-google-maps.podspec new file mode 100644 index 0000000..8631145 --- /dev/null +++ b/react-native-google-maps.podspec @@ -0,0 +1,22 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = "react-native-google-maps" + s.version = package['version'] + s.summary = "React Native Mapview component for iOS + Android" + + s.authors = { "intelligibabble" => "leland.m.richardson@gmail.com" } + s.homepage = "https://github.com/react-native-community/react-native-maps#readme" + s.license = "MIT" + s.platform = :ios, "8.0" + + s.source = { :git => "https://github.com/react-native-community/react-native-maps.git" } + s.source_files = "lib/ios/AirGoogleMaps/**/*.{h,m}" + s.compiler_flags = '-DHAVE_GOOGLE_MAPS=1', '-DHAVE_GOOGLE_MAPS_UTILS=1', '-fno-modules' + + s.dependency 'React' + s.dependency 'GoogleMaps', '3.1.0' + s.dependency 'Google-Maps-iOS-Utils', '2.1.0' +end diff --git a/react-native-maps.podspec b/react-native-maps.podspec new file mode 100644 index 0000000..9743ea8 --- /dev/null +++ b/react-native-maps.podspec @@ -0,0 +1,19 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = "react-native-maps" + s.version = package['version'] + s.summary = "React Native Mapview component for iOS + Android" + + s.authors = { "intelligibabble" => "leland.m.richardson@gmail.com" } + s.homepage = "https://github.com/react-native-community/react-native-maps#readme" + s.license = "MIT" + s.platform = :ios, "8.0" + + s.source = { :git => "https://github.com/react-native-community/react-native-maps.git" } + s.source_files = "lib/ios/AirMaps/**/*.{h,m}" + + s.dependency 'React' +end diff --git a/rn-cli.config.js b/rn-cli.config.js new file mode 100644 index 0000000..d58725e --- /dev/null +++ b/rn-cli.config.js @@ -0,0 +1,11 @@ +const config = { + /** + * Returns a regular expression for modules that should be ignored by the + * packager on a given platform. + */ + getBlacklistRE() { + return /_book\//; + }, +}; + +module.exports = config; diff --git a/scripts/update-version.js b/scripts/update-version.js new file mode 100755 index 0000000..3b7395f --- /dev/null +++ b/scripts/update-version.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node + +/** + * Script that runs as part of `npm version`. It updates any files that have a + * reference to the current package version: + * + * - gradle.properties + * x react-native-maps.podspec // <-- this is now dynamic + * x react-native-google-maps.podspec // <-- this is now dynamic + * + * And `git add`s them. + */ + +const { exec } = require('child_process'); +const pkg = require('../package.json'); + +const filesToUpdate = ['gradle.properties']; + +function doExec(cmdString) { + return new Promise((resolve, reject) => { + exec(cmdString, (err, stdout) => { + if (err) { + reject(err); + return; + } + resolve(stdout); + }); + }); +} + +function updateVersionInFile(currentVersion, nextVersion, relativePath) { + process.stdout.write(`• ${relativePath}\n`); + return doExec( + `sed -i '' 's/${escapeDots(currentVersion)}/${escapeDots( + nextVersion + )}/g' ./${relativePath}` + ); +} + +function escapeDots(version) { + return version.replace(/\./g, '\\.'); +} + +function run() { + const currentVersion = pkg.version; + const nextVersion = process.env.npm_package_version; + + Promise.resolve() + .then(() => updateFiles(currentVersion, nextVersion)) + .then(() => gitAdd()); +} + +// Tasks + +function updateFiles(currentVersion, nextVersion) { + process.stdout.write(`Updating ${currentVersion} ➞ ${nextVersion}:\n`); + return Promise.all( + filesToUpdate.map(relativePath => + updateVersionInFile(currentVersion, nextVersion, relativePath) + ) + ); +} + +function gitAdd() { + return doExec(`git add ${filesToUpdate.join(' ')}`); +} + +// Do it. + +run(); diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..4196dd5 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,7 @@ +rootProject.name = 'react-native-maps' + +include ":example-android" +project(":example-android").projectDir = file("./example/android/app") + +include ":react-native-maps-lib" +project(":react-native-maps-lib").projectDir = file("./lib/android") diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..950f73f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7265 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== + dependencies: + "@babel/types" "^7.3.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-create-class-features-plugin@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.4.tgz#092711a7a3ad8ea34de3e541644c2ce6af1f6f0c" + integrity sha512-uFpzw6L2omjibjxa8VGZsJUPL5wJH0zzGKpoz0ccBkzIa6C8kWNUbiBmQ0rgOKWlHJ6qzmfa6lTiGchiV8SC+g== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" + integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" + integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" + +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== + +"@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + +"@babel/plugin-external-helpers@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" + integrity sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.4.tgz#410f5173b3dc45939f9ab30ca26684d72901405e" + integrity sha512-lUf8D3HLs4yYlAo8zjuneLvfxN7qfKv1Yzbj5vjqaqMJxgJA3Ipwp4VUJ+OrOdz53Wbww6ahwB8UhB2HQyLotA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.2.0.tgz#737b0da44b9254b6152fe29bb99c64e5691f6f68" + integrity sha512-NVfNe7F6nsasG1FnvcFxh2FN0l04ZNe75qTOAVOILWPam0tw9a63RtT/Dab8dPjedZa4fTQaQ83yMMywF9OSug== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.2.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.2.0.tgz#c3fda766187b2f2162657354407247a758ee9cf9" + integrity sha512-QXj/YjFuFJd68oDvoc1e8aqLr2wz7Kofzvp6Ekd/o7MWZl+nZ0/cpStxND+hlZ7DpRWAp7OmuyT2areZ2V3YUA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz#47f73cf7f2a721aad5c0261205405c642e424654" + integrity sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-optional-chaining@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" + integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" + integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" + integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz#4e45408d3c3da231c0e7b823f407a53a7eb3048c" + integrity sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz#5c22c339de234076eee96c8783b2fed61202c5c4" + integrity sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz#dc173cb999c6c5297e0b5f2277fdaaec3739d0cc" + integrity sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" + integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz#00156236defb7dedddc2d3c9477dcc01a4494327" + integrity sha512-PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-object-assign@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" + integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.0.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz#3a873e07114e1a5bee17d04815662c8317f10e30" + integrity sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz#1601655c362f5b38eead6a52631f5106b29fa46a" + integrity sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.3.4.tgz#57805ac8c1798d102ecd75c03b024a5b3ea9b431" + integrity sha512-PaoARuztAdd5MgeVjAxnIDAIUet5KpogqaefQvPOmPYCxYoaPhautxDh3aO8a4xHsKgT/b9gSxR0BKK1MIewPA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typescript@^7.0.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.3.2.tgz#59a7227163e55738842f043d9e5bd7c040447d96" + integrity sha512-Pvco0x0ZSCnexJnshMfaibQ5hnK8aUHSvjCQhC1JR8eeg+iBwt0AtCO7gWxJ358zZevuf9wPSO5rv+WJcbHPXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/register@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== + dependencies: + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/runtime@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc" + integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/runtime@^7.4.5": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.4.tgz#cb7d1ad7c6d65676e66b47186577930465b5271b" + integrity sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@react-native-community/cli@^1.2.1": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.6.0.tgz#889fbb1eff961945df28bb7e896dcee8516b010f" + integrity sha512-OV3N5O/wzjb8OTZDiFerX0gf9/KzLJOvDttU38BqIvn8+OLkH6SIgGrKked9vrKKvH5bFG6jmCmKCW5gP+tOwQ== + dependencies: + chalk "^1.1.1" + commander "^2.19.0" + compression "^1.7.1" + connect "^3.6.5" + denodeify "^1.2.1" + envinfo "^5.7.0" + errorhandler "^1.5.0" + escape-string-regexp "^1.0.5" + execa "^1.0.0" + fs-extra "^7.0.1" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + lodash "^4.17.5" + metro "^0.51.0" + metro-config "^0.51.0" + metro-core "^0.51.0" + metro-memory-fs "^0.51.0" + metro-react-native-babel-transformer "^0.51.0" + mime "^1.3.4" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-fetch "^2.2.0" + node-notifier "^5.2.1" + opn "^3.0.2" + plist "^3.0.0" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + slash "^2.0.0" + ws "^1.1.0" + xcode "^2.0.0" + xmldoc "^0.4.0" + +"@react-native-community/eslint-config@0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-0.0.5.tgz#584f6493258202a57efc22e7be66966e43832795" + integrity sha512-jwO2tnKaTPTLX5XYXMHGEnFdf543SU7jz98/OF5mDH3b7lP+BOaCD+jVfqqHoDRkcqyPlYiR1CgwVGWpi0vMWg== + dependencies: + "@typescript-eslint/eslint-plugin" "^1.5.0" + "@typescript-eslint/parser" "^1.5.0" + babel-eslint "10.0.1" + eslint-plugin-eslint-comments "^3.1.1" + eslint-plugin-flowtype "2.50.3" + eslint-plugin-jest "22.4.1" + eslint-plugin-prettier "2.6.2" + eslint-plugin-react "7.12.4" + eslint-plugin-react-hooks "^1.5.1" + eslint-plugin-react-native "3.6.0" + prettier "1.16.4" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@typescript-eslint/eslint-plugin@^1.5.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz#870f752c520db04db6d3668af7479026a6f2fb9a" + integrity sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw== + dependencies: + "@typescript-eslint/experimental-utils" "1.11.0" + eslint-utils "^1.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" + tsutils "^3.7.0" + +"@typescript-eslint/experimental-utils@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz#594abe47091cbeabac1d6f9cfed06d0ad99eb7e3" + integrity sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw== + dependencies: + "@typescript-eslint/typescript-estree" "1.11.0" + eslint-scope "^4.0.0" + +"@typescript-eslint/parser@^1.5.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.11.0.tgz#2f6d4f7e64eeb1e7c25b422f8df14d0c9e508e36" + integrity sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "1.11.0" + "@typescript-eslint/typescript-estree" "1.11.0" + eslint-visitor-keys "^1.0.0" + +"@typescript-eslint/typescript-estree@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz#b7b5782aab22e4b3b6d84633652c9f41e62d37d5" + integrity sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +JSONStream@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1, abbrev@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +abbrev@~1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + +accepts@~1.3.3, accepts@~1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + +acorn@^6.0.7: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" + integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== + +agent-base@4, agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.3.0.tgz#6d5de5829afd3be2712201a39275fd11c651857c" + dependencies: + humanize-ms "^1.2.1" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.9.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.1.tgz#ebf8d3af22552df9dd049bfbe50cc2390e823593" + integrity sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0, ansi-regex@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +ansi@^0.3.0, ansi@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +aproba@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +art@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/art/-/art-0.10.1.tgz#38541883e399225c5e193ff246e8f157cf7b2146" + +asap@^2.0.0, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async-some@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-some/-/async-some-1.0.2.tgz#4d8a81620d5958791b5b98f802d3207776e95509" + dependencies: + dezalgo "^1.0.2" + +async@^2.0.1, async@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +axobject-query@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + +babel-eslint@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" + integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-eslint@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456" + integrity sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-plugin-module-resolver@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" + integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-fbjs@^3.0.0, babel-preset-fbjs@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz#c0e6347d3e0379ed84b3c2434d3467567aa05297" + integrity sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +base64-js@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bash-color@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bash-color/-/bash-color-0.0.4.tgz#e9be8ce33540cada4881768c59bd63865736e913" + +basic-auth@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + dependencies: + safe-buffer "5.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +big-integer@^1.6.7: + version "1.6.26" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.26.tgz#3af1672fa62daf2d5ecafacf6e5aa0d25e02c1c8" + +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +block-stream@*, block-stream@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.0, bluebird@~3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +boxen@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +bplist-creator@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" + dependencies: + stream-buffers "~2.2.0" + +bplist-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" + dependencies: + big-integer "^1.6.7" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtins@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.0: + version "10.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.2.tgz#105a93a162bbedf3a25da42e1939ed99ffb145f8" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^5.0.0" + unique-filename "^1.1.0" + y18n "^3.2.1" + +cacache@^9.2.9: + version "9.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.3.0.tgz#9cd58f2dd0b8c8cacf685b7067b416d6d3cf9db1" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^4.1.6" + unique-filename "^1.1.0" + y18n "^3.2.1" + +cacache@~9.2.9: + version "9.2.9" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.2.9.tgz#f9d7ffe039851ec94c28290662afa4dd4bb9e8dd" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^4.1.6" + unique-filename "^1.1.0" + y18n "^3.2.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-limit@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +char-spinner@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chmodr@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" + +chownr@^1.0.1, chownr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commander@^2.11.0, commander@^2.19.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@^2.9.0, commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +compressible@~2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" + dependencies: + mime-db ">= 1.33.0 < 2" + +compression@^1.7.1: + version "1.7.2" + resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + dependencies: + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.13" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@~1.1.10, config-chain@~1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect@^3.6.5: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +convert-source-map@^1.1.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.2.2, core-js@^2.4.1: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + +core-js@^2.5.7: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cosmiconfig@^5.0.5: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.1.0.tgz#6c5c35e97f37f985061cdf653f114784231185cf" + integrity sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.9.0" + lodash.get "^4.4.2" + parse-json "^4.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-react-class@^15.6.3: + version "15.6.3" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +damerau-levenshtein@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" + integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@^1.0.2, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexify@^3.4.2, duplexify@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editor@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +envinfo@^5.7.0: + version "5.12.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.12.1.tgz#83068c33e0972eb657d6bc69a6df30badefb46ef" + integrity sha512-pwdo0/G3CIkQ0y6PCXq4RdkvId2elvtPCJMG0konqlrfkWQbf1DWeH9K2b/cvu2YgGvPPTOnonZxXM1gikFu1w== + +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.6" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +errorhandler@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.0.tgz#eaba64ca5d542a311ac945f582defc336165d9f4" + dependencies: + accepts "~1.3.3" + escape-html "~1.0.3" + +es-abstract@^1.11.0, es-abstract@^1.12.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + 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.0.12" + +es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.0.3: + version "4.2.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.2.tgz#f722d7769af88bd33bc13ec6605e1f92966b82d9" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-eslint-comments@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz#4ef6c488dbe06aa1627fea107b3e5d059fc8a395" + integrity sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-flowtype@2.50.3: + version "2.50.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" + integrity sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ== + dependencies: + lodash "^4.17.10" + +eslint-plugin-import@^2.17.2: + version "2.18.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" + integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-plugin-jest@22.4.1: + version "22.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" + integrity sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg== + +eslint-plugin-jsx-a11y@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-prefer-object-spread@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-object-spread/-/eslint-plugin-prefer-object-spread-1.2.1.tgz#27fb91853690cceb3ae6101d9c8aecc6a67a402c" + integrity sha1-J/uRhTaQzOs65hAdnIrsxqZ6QCw= + +eslint-plugin-prettier@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz#71998c60aedfa2141f7bfcbf9d1c459bf98b4fad" + integrity sha512-tGek5clmW5swrAx1mdPYM8oThrBE83ePh7LeseZHBWfHVGrHPhKn7Y5zgRMbU/9D5Td9K4CEmUPjGxA7iw98Og== + dependencies: + fast-diff "^1.1.1" + jest-docblock "^21.0.0" + +eslint-plugin-react-hooks@^1.5.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz#3c66a5515ea3e0a221ffc5d4e75c971c217b1a4c" + integrity sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.6.0.tgz#7cad3b7c6159df6d26fe3252c6c5417a17f27b4b" + integrity sha512-BEQcHZ06hZSBYWFVuNEq0xuui5VEsWpHDsZGBtfadHfCRqRMUrkYPgdDb3bpc60qShHE83kqIv59uKdinEg91Q== + dependencies: + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@7.12.4: + version "7.12.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c" + integrity sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + object.fromentries "^2.0.0" + prop-types "^15.6.2" + resolve "^1.9.0" + +eslint-plugin-react@^7.13.0: + version "7.14.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz#94c193cc77a899ac0ecbb2766fbef88685b7ecc1" + integrity sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.1.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0" + object.values "^1.1.0" + prop-types "^15.7.2" + resolve "^1.10.1" + +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0, eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + 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" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-target-shim@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" + +eventemitter3@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.0.1.tgz#4ce66c3fc5b5a6b9f2245e359e1938f1ab10f960" + +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-diff@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs-scripts@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.1.0.tgz#d9e855aed19b572be9dfe39da70d8aece724eed9" + integrity sha512-VMCpHJd76YI2nYOfVM/d9LDAIFTH4uw4/7sAIGEgxk6kaNmirgTY9bLgpla9DTu+DvV2+ufvDxehGbl2U9bYCA== + dependencies: + "@babel/core" "^7.0.0" + ansi-colors "^1.0.1" + babel-preset-fbjs "^3.0.0" + core-js "^2.4.1" + cross-spawn "^5.1.0" + fancy-log "^1.3.2" + object-assign "^4.0.1" + plugin-error "^0.1.2" + semver "^5.1.0" + through2 "^2.0.0" + +fbjs@^0.8.16, fbjs@^0.8.9: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-babel-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flush-write-stream@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~1.0.0-rc4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.10" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-vacuum@~1.2.10, fs-vacuum@~1.2.9: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10, fs-write-stream-atomic@~1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.2.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream-ignore@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream-npm@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.1.1.tgz#6b9175db6239a83d8209e232426c494dbb29690c" + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream-npm@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10, fstream@~1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +genfun@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +gitbook-cli@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/gitbook-cli/-/gitbook-cli-2.3.2.tgz#5e893582e1f743f6fa920c3c3eb36b62ea4a31a0" + dependencies: + bash-color "0.0.4" + commander "2.11.0" + fs-extra "3.0.1" + lodash "4.17.4" + npm "5.1.0" + npmi "1.0.1" + optimist "0.6.1" + q "1.5.0" + semver "5.3.0" + tmp "0.0.31" + user-home "2.0.0" + +github-url-from-git@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" + +github-url-from-username-repo@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^11.1.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.11, graceful-fs@~4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-unicode@^2.0.0, has-unicode@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= + +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +hosted-git-info@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +http-cache-semantics@^3.8.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + +http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy-agent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" + dependencies: + agent-base "4" + debug "2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + dependencies: + ms "^2.0.0" + +iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iferr@^0.1.5, iferr@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.5: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + +image-size@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.2.tgz#8ee316d4298b028b965091b673d5f1537adee5b4" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4, inflight@~1.0.4, inflight@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4, ini@~1.3.0, ini@~1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +init-package-json@~1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +init-package-json@~1.9.4: + version "1.9.6" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.6.tgz#789fc2b74466a4952b9ea77c0575bc78ebd60a61" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.2.2: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.17.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jest-docblock@^21.0.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== + +jest-haste-map@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.6.tgz#fb2c785080f391b923db51846b86840d0d773076" + integrity sha512-+NO2HMbjvrG8BC39ieLukdpFrcPhhjCJGhpbHodHNZygH1Tt06WrlNYGpZtWKx/zpf533tCtMQXO/q59JenjNw== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-serializer "^24.0.0-alpha.6" + jest-worker "^24.0.0-alpha.6" + micromatch "^2.3.11" + sane "^3.0.0" + +jest-serializer@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.6.tgz#27d2fee4b1a85698717a30c3ec2ab80767312597" + integrity sha512-IPA5T6/GhlE6dedSk7Cd7YfuORnYjN0VD5iJVFn1Q81RJjpj++Hen5kJbKcg547vXsQ1TddV15qOA/zeIfOCLw== + +jest-serializer@^24.0.0-alpha.6: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b" + integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw== + +jest-worker@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.6.tgz#463681b92c117c57107135c14b9b9d6cd51d80ce" + integrity sha512-iXtH7MR9bjWlNnlnRBcrBRrb4cSVxML96La5vsnmBvDI+mJnkP5uEt6Fgpo5Y8f3z9y2Rd7wuPnKRxqQsiU/dA== + dependencies: + merge-stream "^1.0.1" + +jest-worker@^24.0.0-alpha.6: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d" + integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" + +js-tokens@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.9.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-parse-better-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0, jsx-ast-utils@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" + integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-property@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lockfile@~1.0.1, lockfile@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + +lodash.uniq@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + +lodash@4.17.4, lodash@^4.14.0, lodash@^4.3.0, lodash@^4.6.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lodash@^4.17.12: + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== + +lodash@^4.17.5: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +make-dir@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + dependencies: + pify "^3.0.0" + +make-fetch-happen@^2.4.13: + version "2.6.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-2.6.0.tgz#8474aa52198f6b1ae4f3094c04e8370d35ea8a38" + dependencies: + agentkeepalive "^3.3.0" + cacache "^10.0.0" + http-cache-semantics "^3.8.0" + http-proxy-agent "^2.0.0" + https-proxy-agent "^2.1.0" + lru-cache "^4.1.1" + mississippi "^1.2.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^3.0.1" + ssri "^5.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +metro-babel-register@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.51.0.tgz#d86d3f2d90b45c7a3c6ae67a53bd1e50bad7a24d" + integrity sha512-rhdvHFOZ7/ub019A3+aYs8YeLydb02/FAMsKr2Nz2Jlf6VUxWrMnrcT0NYX16F9TGdi2ulRlJ9dwvUmdhkk+Bw== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + core-js "^2.2.2" + escape-string-regexp "^1.0.5" + +metro-babel-transformer@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.51.0.tgz#9ee5199163ac46b2057527b3f8cbd8b089ffc03e" + integrity sha512-M7KEY/hjD3E8tJEliWgI0VOSaJtqaznC0ItM6FiMrhoGDqqa1BvGofl+EPcKqjBSOV1UgExua/T1VOIWbjwQsw== + dependencies: + "@babel/core" "^7.0.0" + +metro-babel-transformer@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.51.1.tgz#97be9e2b96c78aa202b52ae05fb86f71327aef72" + integrity sha512-+tOnZZzOzufB86ASdfimUEGB1jBKsdsVpPdjNJZkueTFyvYlGqWDQKHM1w9bwKMeM/czPQ48Y6m8Bou6le0X4w== + dependencies: + "@babel/core" "^7.0.0" + +metro-babel7-plugin-react-transform@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.0.tgz#af27dd81666b91f05d2b371b0d6d283c585e38b6" + integrity sha512-dZ95kXcE2FJMoRsYhxr7YLCbOlHWKwe0bOpihRhfImDTgFfuKIzU4ROQwMUbE0NCbzB+ATFsa2FZ3pHDJ5GI0w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-babel7-plugin-react-transform@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.1.tgz#9cce2c340cc4006fc82aa6dfab27af22d592607e" + integrity sha512-wzn4X9KgmAMZ7Bi6v9KxA7dw+AHGL0RODPxU5NDJ3A6d0yERvzfZ3qkzWhz8jbFkVBK12cu5DTho3HBazKQDOw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-babel7-plugin-react-transform@0.53.1: + version "0.53.1" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.53.1.tgz#9ad31e5c84f5003333a6a3cf79f2d093cd3b2ddc" + integrity sha512-98lEpTu7mox/7QurxVuLnbjrGDdayjpS2Z1T4vkLcP+mBxzloKJuTRnmtyWC8cNlx9qjimHGDlqtNY78rQ8rsA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-cache@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.51.1.tgz#d0b296eab8e009214413bba87e4eac3d9b44cd04" + integrity sha512-0m1+aicsw77LVAehNuTxDpE1c/7Xv/ajRD+UL/lFCWUxnrjSbxVtIKr8l5DxEY11082c1axVRuaV9e436W+eXg== + dependencies: + jest-serializer "24.0.0-alpha.6" + metro-core "0.51.1" + mkdirp "^0.5.1" + rimraf "^2.5.4" + +metro-config@0.51.1, metro-config@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.51.1.tgz#8f1a241ce2c0b521cd492c39bc5c6c69e3397b82" + integrity sha512-WCNd0tTI9gb/ubgTqK1+ljZL4b3hsXVinsOAtep4nHiVb6DSDdbO2yXDD2rpYx3NE6hDRMFS9HHg6G0139pAqQ== + dependencies: + cosmiconfig "^5.0.5" + metro "0.51.1" + metro-cache "0.51.1" + metro-core "0.51.1" + pretty-format "24.0.0-alpha.6" + +metro-core@0.51.1, metro-core@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.51.1.tgz#e7227fb1dd1bb3f953272fad9876e6201140b038" + integrity sha512-sG1yACjdFqmIzZN50HqLTKUMp1oy0AehHhmIuYeIllo1DjX6Y2o3UAT3rGP8U+SAqJGXf/OWzl6VNyRPGDENfA== + dependencies: + jest-haste-map "24.0.0-alpha.6" + lodash.throttle "^4.1.1" + metro-resolver "0.51.1" + wordwrap "^1.0.0" + +metro-memory-fs@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.51.1.tgz#624291f5956b0fd11532d80b1b85d550926f96c9" + integrity sha512-dXVUpLPLwfQcYHd1HlqHGVzBsiwvUdT92TDSbdc10152TP+iynHBqLDWbxt0MAtd6c/QXwOuGZZ1IcX3+lv5iw== + +metro-minify-uglify@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.51.1.tgz#60cd8fe4d3e82d6670c717b8ddb52ae63199c0e4" + integrity sha512-HAqd/rFrQ6mnbqVAszDXIKTg2rqHlY9Fm8DReakgbkAeyMbF2mH3kEgtesPmTrhajdFk81UZcNSm6wxj1JMgVg== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.0.tgz#978d960acf2d214bbbe43e59145878d663bd07de" + integrity sha512-Y/aPeLl4RzY8IEAneOyDcpdjto/8yjIuX9eUWRngjSqdHYhGQtqiSBpfTpo0BvXpwNRLwCLHyXo58gNpckTJFw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.51.0" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-preset@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.1.tgz#44aeeedfea37f7c2ab8f6f273fa71b90fe65f089" + integrity sha512-e9tsYDFhU70gar0jQWcZXRPJVCv4k7tEs6Pm74wXO2OO/T1MEumbvniDIGwGG8bG8RUnYdHhjcaiub2Vc5BRWw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.51.1" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-preset@^0.53.1: + version "0.53.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.53.1.tgz#6cd9e41a1b9a6e210e71ef2adf114219b4eaf2ec" + integrity sha512-Uf8EGL8kIPhDkoSdAAysNPxPQclUS2R1QC4cwnc8bkk2f6yqGn+1CorfiY9AaqlLEth5mKQqdtRYFDTFfB9QyA== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.53.1" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-transformer@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.51.0.tgz#57a695e97a19d95de63c9633f9d0dc024ee8e99a" + integrity sha512-VFnqtE0qrVmU1HV9B04o53+NZHvDwR+CWCoEx4+7vCqJ9Tvas741biqCjah9xtifoKdElQELk6x0soOAWCDFJA== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.0.1" + metro-babel-transformer "0.51.0" + metro-react-native-babel-preset "0.51.0" + +metro-react-native-babel-transformer@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.51.1.tgz#bac34f988c150c725cd1875c13701cc2032615f9" + integrity sha512-D0KU+JPb/Z76nUWt3+bkjKggOlGvqAVI2BpIH2JFKprpUyBjWaCRqHnkBfZGixYwUfmu93MIlKJWr6iKzzFrlg== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.0.1" + metro-babel-transformer "0.51.1" + metro-react-native-babel-preset "0.51.1" + +metro-resolver@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.51.1.tgz#4c26f0baee47d30250187adca3d34c902e627611" + integrity sha512-zmWbD/287NDA/jLPuPV0hne/YMMSG0dljzu21TYMg2lXRLur/zROJHHhyepZvuBHgInXBi4Vhr2wvuSnY39SuA== + dependencies: + absolute-path "^0.0.0" + +metro-source-map@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.51.1.tgz#1a8da138e98e184304d5558b4f92a5c2141822d0" + integrity sha512-JyrE+RV4YumrboHPHTGsUUGERjQ681ImRLrSYDGcmNv4tfpk9nvAK26UAas4IvBYFCC9oW90m0udt3kaQGv59Q== + dependencies: + source-map "^0.5.6" + +metro@0.51.1, metro@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.51.1.tgz#b0aad4731593b9f244261bad1abb2a006d1c8969" + integrity sha512-nM0dqn8LQlMjhChl2fzTUq2EWiUebZM7nkesD9vQe47W10bj/tbRLPiIIAxht6SRDbPd/hRA+t39PxLhPSKEKg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.0.1" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "24.0.0-alpha.6" + jest-worker "24.0.0-alpha.6" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-babel-transformer "0.51.1" + metro-cache "0.51.1" + metro-config "0.51.1" + metro-core "0.51.1" + metro-minify-uglify "0.51.1" + metro-react-native-babel-preset "0.51.1" + metro-resolver "0.51.1" + metro-source-map "0.51.1" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.0" + react-transform-hmr "^1.0.4" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + write-file-atomic "^1.2.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^9.0.0" + +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + 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.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-db@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" + dependencies: + mime-db "~1.23.0" + +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime-types@~2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^1.2.0, mississippi@^1.3.0, mississippi@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^1.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +morgan@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + dependencies: + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.1" + on-finished "~2.3.0" + on-headers "~1.0.1" + +move-concurrently@^1.0.1, move-concurrently@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^2.0.0, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +mute-stream@0.0.7, mute-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + +node-gyp@~3.6.0, node-gyp@~3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +"nopt@2 || 3", nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1, nopt@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-git-url@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@~2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + +npm-install-checks@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-1.0.7.tgz#6d91aeda0ac96801f1ed7aadee116a6c0a086a57" + dependencies: + npmlog "0.1 || 1 || 2" + semver "^2.3.0 || 3.x || 4 || 5" + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +"npm-package-arg@^3.0.0 || ^4.0.0", npm-package-arg@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" + dependencies: + hosted-git-info "^2.1.5" + semver "^5.1.0" + +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^5.1.2, npm-package-arg@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" + dependencies: + hosted-git-info "^2.4.2" + osenv "^0.1.4" + semver "^5.1.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.1.1.tgz#86d9dca985b4c5e5d59772dfd5de6919998a495a" + dependencies: + hosted-git-info "^2.1.4" + semver "4 || 5" + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-pick-manifest@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8" + dependencies: + npm-package-arg "^5.1.2" + semver "^5.3.0" + +npm-registry-client@~7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + optionalDependencies: + npmlog "~2.0.0 || ~3.1.0" + +npm-registry-client@~8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.4.0.tgz#d52b901685647fc62a4c03eafecb6ceaa5018d4c" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + ssri "^4.1.2" + optionalDependencies: + npmlog "2 || ^3.1.0 || ^4.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npm-user-validate@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" + +npm-user-validate@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" + +npm@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-5.1.0.tgz#cf8201e044018e9c89532041c90094541982b2c0" + dependencies: + JSONStream "~1.3.1" + abbrev "~1.1.0" + ansi-regex "~3.0.0" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "~1.1.2" + archy "~1.0.0" + bluebird "~3.5.0" + cacache "~9.2.9" + call-limit "~1.1.0" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.11" + detect-indent "~5.0.0" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.10" + fs-write-stream-atomic "~1.0.10" + fstream "~1.0.11" + fstream-npm "~1.2.1" + glob "~7.1.2" + graceful-fs "~4.1.11" + has-unicode "~2.0.1" + hosted-git-info "~2.5.0" + iferr "~0.1.5" + inflight "~1.0.6" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.10.1" + lazy-property "~1.0.0" + lockfile "~1.0.3" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + lru-cache "~4.1.1" + mississippi "~1.3.0" + mkdirp "~0.5.1" + move-concurrently "~1.0.1" + node-gyp "~3.6.2" + nopt "~4.0.1" + normalize-package-data "~2.4.0" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-package-arg "~5.1.2" + npm-registry-client "~8.4.0" + npm-user-validate "~1.0.0" + npmlog "~4.1.2" + once "~1.4.0" + opener "~1.4.3" + osenv "~0.1.4" + pacote "~2.7.38" + path-is-inside "~1.0.2" + promise-inflight "~1.0.1" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "~2.0.9" + read-package-tree "~5.1.6" + readable-stream "~2.3.2" + request "~2.81.0" + retry "~0.10.1" + rimraf "~2.6.1" + safe-buffer "~5.1.1" + semver "~5.3.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + sorted-union-stream "~2.1.3" + ssri "~4.1.6" + strip-ansi "~4.0.0" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "~1.1.0" + unpipe "~1.0.0" + update-notifier "~2.2.0" + uuid "~3.1.0" + validate-npm-package-name "~3.0.0" + which "~1.2.14" + worker-farm "~1.3.1" + wrappy "~1.0.2" + write-file-atomic "~2.1.0" + +npm@^2.1.12: + version "2.15.12" + resolved "https://registry.yarnpkg.com/npm/-/npm-2.15.12.tgz#df7c3ed5a277c3f9d4b5d819b05311d10a200ae6" + dependencies: + abbrev "~1.0.9" + ansi "~0.3.1" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + archy "~1.0.0" + async-some "~1.0.2" + block-stream "0.0.9" + char-spinner "~1.0.1" + chmodr "~1.0.2" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.10" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.9" + fs-write-stream-atomic "~1.0.8" + fstream "~1.0.10" + fstream-npm "~1.1.1" + github-url-from-git "~1.4.0" + github-url-from-username-repo "~1.0.2" + glob "~7.0.6" + graceful-fs "~4.1.6" + hosted-git-info "~2.1.5" + inflight "~1.0.4" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.9.4" + lockfile "~1.0.1" + lru-cache "~4.0.1" + minimatch "~3.0.3" + mkdirp "~0.5.1" + node-gyp "~3.6.0" + nopt "~3.0.6" + normalize-git-url "~3.0.2" + normalize-package-data "~2.3.5" + npm-cache-filename "~1.0.2" + npm-install-checks "~1.0.7" + npm-package-arg "~4.1.0" + npm-registry-client "~7.2.1" + npm-user-validate "~0.1.5" + npmlog "~2.0.4" + once "~1.4.0" + opener "~1.4.1" + osenv "~0.1.3" + path-is-inside "~1.0.0" + read "~1.0.7" + read-installed "~4.0.3" + read-package-json "~2.0.4" + readable-stream "~2.1.5" + realize-package-specifier "~3.0.1" + request "~2.74.0" + retry "~0.10.0" + rimraf "~2.5.4" + semver "~5.1.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.0" + spdx-license-ids "~1.2.2" + strip-ansi "~3.0.1" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + validate-npm-package-license "~3.0.1" + validate-npm-package-name "~2.2.2" + which "~1.2.11" + wrappy "~1.0.2" + write-file-atomic "~1.1.4" + +npmi@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npmi/-/npmi-1.0.1.tgz#15d769273547545e6809dcf0ce18aed48b0290e2" + dependencies: + npm "^2.1.12" + semver "^4.1.0" + +"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2, npmlog@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +"npmlog@0.1 || 1 || 2", npmlog@^2.0.4, npmlog@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" + dependencies: + ansi "~0.3.1" + are-we-there-yet "~1.1.2" + gauge "~1.2.5" + +"npmlog@~2.0.0 || ~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +nullthrows@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opener@~1.4.1, opener@~1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + +opn@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" + dependencies: + object-assign "^4.0.1" + +optimist@0.6.1, optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4, osenv@~0.1.3, osenv@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pacote@~2.7.38: + version "2.7.38" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1" + dependencies: + bluebird "^3.5.0" + cacache "^9.2.9" + glob "^7.1.2" + lru-cache "^4.1.1" + make-fetch-happen "^2.4.13" + minimatch "^3.0.4" + mississippi "^1.2.0" + normalize-package-data "^2.4.0" + npm-package-arg "^5.1.2" + npm-pick-manifest "^1.0.4" + osenv "^0.1.4" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^4.0.0" + safe-buffer "^5.1.1" + semver "^5.3.0" + ssri "^4.1.6" + tar-fs "^1.15.3" + tar-stream "^1.5.4" + unique-filename "^1.1.0" + which "^1.2.12" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.0, path-is-inside@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +plist@^3.0.0, plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier@1.16.4: + version "1.16.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" + integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== + +pretty-format@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz#25ad2fa46b342d6278bf241c5d2114d4376fbac1" + integrity sha512-zG2m6YJeuzwBFqb5EIdmwYVf30sap+iMRuYNPytOccEXZMAJbPIFGKVJ/U0WjQegmnQbRo9CI7j6j3HtDaifiA== + dependencies: + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1, promise-inflight@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + dependencies: + read "1" + +prop-types@^15.5.8: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +protoduck@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e" + dependencies: + genfun "^4.0.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-clone-referenced-element@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682" + +react-deep-force-update@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c" + +react-devtools-core@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.1.tgz#51af81ceada65209bbccb8b547a01187cd1cbf04" + integrity sha512-I/LSX+tpeTrGKaF1wXSfJ/kP+6iaP2JfshEjW8LtQBdz6c6HhzOJtjZXhqOUrAdysuey8M1/JgPY1flSVVt8Ig== + dependencies: + shell-quote "^1.6.1" + ws "^3.3.1" + +react-is@^16.8.1: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d" + integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA== + +react-native@0.59.3: + version "0.59.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.59.3.tgz#b984bbe457f63d5515046d32ea5721fd22843548" + integrity sha512-dv3AA2rH0L0IccxRkIs4YsriaECy9ttTXrwrgwETXqmE45uVrBFRGePUFnqjcikYkkm6sS0FRxcva088un76JA== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^1.2.1" + absolute-path "^0.0.0" + art "^0.10.0" + base64-js "^1.1.2" + chalk "^2.4.1" + commander "^2.9.0" + compression "^1.7.1" + connect "^3.6.5" + create-react-class "^15.6.3" + debug "^2.2.0" + denodeify "^1.2.1" + errorhandler "^1.5.0" + escape-string-regexp "^1.0.5" + event-target-shim "^1.0.5" + fbjs "^1.0.0" + fbjs-scripts "^1.0.0" + fs-extra "^1.0.0" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + invariant "^2.2.4" + lodash "^4.17.5" + metro-babel-register "0.51.0" + metro-react-native-babel-transformer "0.51.0" + mime "^1.3.4" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-fetch "^2.2.0" + node-notifier "^5.2.1" + npmlog "^2.0.4" + nullthrows "^1.1.0" + opn "^3.0.2" + optimist "^0.6.1" + plist "^3.0.0" + pretty-format "24.0.0-alpha.6" + promise "^7.1.1" + prop-types "^15.5.8" + react-clone-referenced-element "^1.0.1" + react-devtools-core "^3.6.0" + regenerator-runtime "^0.11.0" + rimraf "^2.5.4" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + stacktrace-parser "^0.1.3" + ws "^1.1.5" + xmldoc "^0.4.0" + yargs "^9.0.0" + +react-proxy@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" + dependencies: + lodash "^4.6.1" + react-deep-force-update "^1.0.0" + +react-transform-hmr@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" + dependencies: + global "^4.3.0" + react-proxy "^1.1.7" + +react@16.8.3: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9" + integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.3" + +read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4, read-package-json@~2.0.9: + version "2.0.12" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.12.tgz#68ea45f98b3741cb6e10ae3bbd42a605026a6951" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.0" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@~5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.6.tgz#4f03e83d0486856fb60d97c94882841c2a7b1b7a" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.10: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +realize-package-specifier@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" + dependencies: + dezalgo "^1.0.1" + npm-package-arg "^4.1.1" + +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== + dependencies: + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.1.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +request@2, request@^2.74.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +request@~2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.1, resolve@^1.11.0, resolve@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== + dependencies: + path-parse "^1.0.6" + +resolve@^1.3.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0, retry@~0.10.0, retry@~0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + +rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@~2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +sax@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" + +scheduler@^0.13.3: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", semver@5.5.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@^5.5.0, semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +semver@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + 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.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + +serve-static@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@1.6.1, shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-plist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.0.0.tgz#bed3085633b22f371e111f45d159a1ccf94b81eb" + integrity sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g== + dependencies: + bplist-creator "0.0.7" + bplist-parser "0.1.1" + plist "^3.0.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +socks-proxy-agent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" + dependencies: + agent-base "^4.1.0" + socks "^1.1.10" + +socks@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + +sorted-object@~2.0.0, sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + +sorted-union-stream@~2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" + dependencies: + from2 "^1.3.0" + stream-iterate "^1.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2, spdx-license-ids@~1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^4.1.2, ssri@^4.1.6, ssri@~4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" + dependencies: + safe-buffer "^5.1.0" + +ssri@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.1.0.tgz#2cbf1df36b74d0fc91fcf89640a4b3e1d10b1899" + dependencies: + safe-buffer "^5.1.0" + +stacktrace-parser@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-buffers@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-iterate@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" + dependencies: + readable-stream "^2.1.5" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0, strip-ansi@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +table@^5.2.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tar-fs@^1.15.3: + version "1.16.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2, tar-stream@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@^2.0.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tmp@0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tsutils@^3.7.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.14.0.tgz#bf8d5a7bae5369331fa0f2b0a5a10bd7f7396c77" + integrity sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@^0.7.18: + version "0.7.19" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" + integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== + +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + +umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.0, unique-filename@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + dependencies: + builtins "^1.0.3" + +validate-npm-package-name@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" + dependencies: + builtins "0.0.7" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +which@~1.2.11, which@~1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +worker-farm@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1, wrappy@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.1.4.tgz#b1f52dc2e8dc0e3cb04d187a25f758a38a90ca3b" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^1.1.0, ws@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xcode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.0.0.tgz#134f1f94c26fbfe8a9aaa9724bfb2772419da1a2" + integrity sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw== + dependencies: + simple-plist "^1.0.0" + uuid "^3.3.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldoc@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" + dependencies: + sax "~1.1.1" + +xmldom@0.1.x: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + +xpipe@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.0.0, yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.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.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0"