├── promo.png ├── firebase.json ├── cloud_intelligence ├── android │ ├── gradle.properties │ ├── app │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── example │ │ │ │ │ │ └── cloud_intelligence │ │ │ │ │ │ └── MainActivity.java │ │ │ │ └── AndroidManifest.xml │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ └── build.gradle ├── ios │ ├── Flutter │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── AppFrameworkInfo.plist │ ├── Runner │ │ ├── AppDelegate.h │ │ ├── Assets.xcassets │ │ │ ├── LaunchImage.imageset │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ ├── README.md │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ │ └── Contents.json │ │ ├── main.m │ │ ├── AppDelegate.m │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ └── project.pbxproj │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── WorkspaceSettings.xcsettings │ ├── Podfile │ └── Podfile.lock ├── .metadata ├── README.md ├── lib │ ├── video_analysis.dart │ ├── video_player.dart │ └── main.dart ├── test │ └── widget_test.dart ├── .gitignore ├── pubspec.yaml └── pubspec.lock ├── functions ├── .gitignore ├── tsconfig.json ├── package.json ├── src │ └── index.ts └── package-lock.json ├── README.md └── .gitignore /promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/promo.png -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "functions": { 3 | "predeploy": "npm --prefix \"$RESOURCE_DIR\" run build" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /cloud_intelligence/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | ## Compiled JavaScript files 2 | **/*.js 3 | **/*.js.map 4 | 5 | # Typescript v1 declaration files 6 | typings/ 7 | 8 | node_modules/ -------------------------------------------------------------------------------- /cloud_intelligence/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfianlosari/flutter_google_cloud_video_intelligence/HEAD/cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cloud_intelligence/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip 7 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /functions/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "noImplicitReturns": true, 5 | "noUnusedLocals": true, 6 | "outDir": "lib", 7 | "sourceMap": true, 8 | "strict": true, 9 | "target": "es2017" 10 | }, 11 | "compileOnSave": true, 12 | "include": [ 13 | "src" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /cloud_intelligence/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 9937d3dfb1569e658cee30cc514c59a47102e3a5 8 | channel: master 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/java/com/example/cloud_intelligence/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.cloud_intelligence; 2 | 3 | import android.os.Bundle; 4 | import io.flutter.app.FlutterActivity; 5 | import io.flutter.plugins.GeneratedPluginRegistrant; 6 | 7 | public class MainActivity extends FlutterActivity { 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | GeneratedPluginRegistrant.registerWith(this); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cloud_intelligence/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /cloud_intelligence/README.md: -------------------------------------------------------------------------------- 1 | # cloud_intelligence 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /cloud_intelligence/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.2.1' 9 | classpath 'com.google.gms:google-services:4.2.0' 10 | 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "scripts": { 4 | "build": "tsc", 5 | "serve": "npm run build && firebase serve --only functions", 6 | "shell": "npm run build && firebase functions:shell", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "engines": { 12 | "node": "8" 13 | }, 14 | "main": "lib/index.js", 15 | "dependencies": { 16 | "@google-cloud/video-intelligence": "^1.6.0", 17 | "firebase-admin": "~7.0.0", 18 | "firebase-functions": "^2.3.0" 19 | }, 20 | "devDependencies": { 21 | "typescript": "^3.2.2" 22 | }, 23 | "private": true 24 | } 25 | -------------------------------------------------------------------------------- /cloud_intelligence/lib/video_analysis.dart: -------------------------------------------------------------------------------- 1 | class VideoAnalysis { 2 | final List annotations; 3 | 4 | VideoAnalysis({this.annotations}); 5 | 6 | factory VideoAnalysis.fromJson(Map json) { 7 | List annotations = []; 8 | 9 | final result = json['annotation_results'][0]; 10 | 11 | if (result['segment_label_annotations'] != null) { 12 | final segmentAnnotations = result['segment_label_annotations'] as List; 13 | 14 | annotations = segmentAnnotations 15 | .map((s) => LabelAnnotation(title: s['entity']['description'])) 16 | .toList(); 17 | } 18 | 19 | return VideoAnalysis(annotations: annotations); 20 | } 21 | } 22 | 23 | class LabelAnnotation { 24 | final String title; 25 | 26 | LabelAnnotation({this.title}); 27 | } 28 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /cloud_intelligence/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:cloud_intelligence/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter App using Google Cloud Video Intelligence API 2 | 3 | ![Alt text](./promo.png?raw=true "iOS & Android") 4 | 5 | ## Description 6 | Google Cloud Video Intelligence API has pre-trained machine learning models that automatically recognize a vast number of objects, places, and actions in stored and streaming video. 7 | - Client upload video to Google Cloud Storage 8 | - A serveless function is triggered after a file uploaded that invokes the Video Intelligence API passing the bucket URI and bucket output URI 9 | - The function also updates the status to a firestore collection 10 | - The client listens in realtime the changes in the document, then retrieve the results when it finishes and display it in UI. 11 | 12 | 13 | ## Requirements 14 | Firebase Account(https://firebase.google.com) 15 | Flutter SDK (https://www.flutter.dev) 16 | Firebase SDK (npm install -g firebase-tools) 17 | 18 | ## Getting Started 19 | - Register for Firebase and create new project, set account to Blaze plan 20 | - Initialize Firebase project in directory using SDK 21 | - Go to functions folder and run npm install 22 | - Go to root path and run firebase deploy --only functions to develop your functions trigger 23 | - Create google-services-info.plist (iOS) and google-services.json (android) for a firebase app then copy to the flutter project 24 | -------------------------------------------------------------------------------- /cloud_intelligence/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # Visual Studio Code related 19 | .vscode/ 20 | 21 | # Flutter/Dart/Pub related 22 | **/doc/api/ 23 | .dart_tool/ 24 | .flutter-plugins 25 | .packages 26 | .pub-cache/ 27 | .pub/ 28 | /build/ 29 | 30 | # Android related 31 | **/android/**/gradle-wrapper.jar 32 | **/android/.gradle 33 | **/android/captures/ 34 | **/android/gradlew 35 | **/android/gradlew.bat 36 | **/android/local.properties 37 | **/android/**/GeneratedPluginRegistrant.java 38 | 39 | # iOS/XCode related 40 | **/ios/**/*.mode1v3 41 | **/ios/**/*.mode2v3 42 | **/ios/**/*.moved-aside 43 | **/ios/**/*.pbxuser 44 | **/ios/**/*.perspectivev3 45 | **/ios/**/*sync/ 46 | **/ios/**/.sconsign.dblite 47 | **/ios/**/.tags* 48 | **/ios/**/.vagrant/ 49 | **/ios/**/DerivedData/ 50 | **/ios/**/Icon? 51 | **/ios/**/Pods/ 52 | **/ios/**/.symlinks/ 53 | **/ios/**/profile 54 | **/ios/**/xcuserdata 55 | **/ios/.generated/ 56 | **/ios/Flutter/App.framework 57 | **/ios/Flutter/Flutter.framework 58 | **/ios/Flutter/Generated.xcconfig 59 | **/ios/Flutter/app.flx 60 | **/ios/Flutter/app.zip 61 | **/ios/Flutter/flutter_assets/ 62 | **/ios/ServiceDefinitions.json 63 | **/ios/Runner/GeneratedPluginRegistrant.* 64 | 65 | # Exceptions to above rules. 66 | !**/ios/**/default.mode1v3 67 | !**/ios/**/default.mode2v3 68 | !**/ios/**/default.pbxuser 69 | !**/ios/**/default.perspectivev3 70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 71 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 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 | 26 | 27 | -------------------------------------------------------------------------------- /functions/src/index.ts: -------------------------------------------------------------------------------- 1 | import * as functions from 'firebase-functions'; 2 | import * as admin from 'firebase-admin'; 3 | 4 | admin.initializeApp(); 5 | const runtimeOpts = { 6 | timeoutSeconds: 360, 7 | } 8 | 9 | const resultsCollection = admin.firestore().collection('results'); 10 | 11 | exports.storage = functions.runWith(runtimeOpts).storage.object().onFinalize(async (object) => { 12 | 13 | const video = require('@google-cloud/video-intelligence').v1; 14 | const client = new video.VideoIntelligenceServiceClient(); 15 | 16 | const gcsUri = getGSURL(object); 17 | 18 | if (gcsUri.includes('.json')) { 19 | let filenameJSON = object.name!.replace('.json', ''); 20 | 21 | try { 22 | const userRef = resultsCollection.doc(filenameJSON); 23 | await userRef.set({ 24 | status: 'finished', 25 | location: gcsUri 26 | }); 27 | } catch (error) { 28 | throw error; 29 | } 30 | return true; 31 | 32 | } 33 | 34 | if (!gcsUri.includes('.mp4')) { 35 | return true; 36 | } 37 | 38 | const request = { 39 | inputUri: gcsUri, 40 | outputUri: gcsUri.replace('.mp4', '.json'), 41 | features: ['LABEL_DETECTION'], 42 | }; 43 | 44 | let filename = object.name!.replace('.mp4', ''); 45 | 46 | try { 47 | const userRef = resultsCollection.doc(filename); 48 | await userRef.set({ 49 | status: 'starting' 50 | }); 51 | } catch (error) { 52 | throw error; 53 | } 54 | 55 | return client.annotateVideo(request); 56 | }) 57 | 58 | function getGSURL(object: functions.storage.ObjectMetadata): string { 59 | let arr = object.id.split('/'); 60 | arr.pop(); 61 | return `gs://${arr.join('/')}` 62 | } 63 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 13 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSMicrophoneUsageDescription 6 | app wants to access mics 7 | NSAppleMusicUsageDescription 8 | app wants to access media 9 | NSCameraUsageDescription 10 | app wants to access camera 11 | CFBundleDevelopmentRegion 12 | en 13 | CFBundleExecutable 14 | $(EXECUTABLE_NAME) 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | cloud_intelligence 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | $(FLUTTER_BUILD_NAME) 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | $(FLUTTER_BUILD_NUMBER) 29 | LSRequiresIPhoneOS 30 | 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | UIMainStoryboardFile 34 | Main 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | UIViewControllerBasedStatusBarAppearance 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /cloud_intelligence/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | android { 28 | compileSdkVersion 28 29 | 30 | lintOptions { 31 | disable 'InvalidPackage' 32 | } 33 | 34 | defaultConfig { 35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 36 | applicationId "com.alfianlosari.fluttertraining" 37 | minSdkVersion 21 38 | targetSdkVersion 28 39 | versionCode flutterVersionCode.toInteger() 40 | versionName flutterVersionName 41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | testImplementation 'junit:junit:4.12' 59 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 60 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 61 | } 62 | 63 | apply plugin: 'com.google.gms.google-services' 64 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 37 | # referring to absolute paths on developers' machines. 38 | system('rm -rf .symlinks') 39 | system('mkdir -p .symlinks/plugins') 40 | 41 | # Flutter Pods 42 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 43 | if generated_xcode_build_settings.empty? 44 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 45 | end 46 | generated_xcode_build_settings.map { |p| 47 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 48 | symlink = File.join('.symlinks', 'flutter') 49 | File.symlink(File.dirname(p[:path]), symlink) 50 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 51 | end 52 | } 53 | 54 | # Plugin Pods 55 | plugin_pods = parse_KV_file('../.flutter-plugins') 56 | plugin_pods.map { |p| 57 | symlink = File.join('.symlinks', 'plugins', p[:name]) 58 | File.symlink(p[:path], symlink) 59 | pod p[:name], :path => File.join(symlink, 'ios') 60 | } 61 | end 62 | 63 | post_install do |installer| 64 | installer.pods_project.targets.each do |target| 65 | target.build_configurations.each do |config| 66 | config.build_settings['ENABLE_BITCODE'] = 'NO' 67 | end 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /cloud_intelligence/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: cloud_intelligence 2 | description: A new Flutter project. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: ">=2.1.0 <3.0.0" 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | cupertino_icons: ^0.1.2 24 | 25 | 26 | firebase_core: ^0.3.1+1 27 | firebase_storage: ^2.1.0 28 | 29 | cloud_firestore: ^0.9.5 30 | 31 | 32 | chewie: ^0.9.6 33 | 34 | path_provider: ^0.5.0+1 35 | camera: ^0.4.2 36 | image_picker: ^0.6.0+2 37 | 38 | video_player: ^0.10.0+2 39 | 40 | uuid: 2.0.1 41 | http: ^0.12.0+2 42 | 43 | dev_dependencies: 44 | flutter_test: 45 | sdk: flutter 46 | 47 | 48 | # For information on the generic Dart part of this file, see the 49 | # following page: https://www.dartlang.org/tools/pub/pubspec 50 | 51 | # The following section is specific to Flutter. 52 | flutter: 53 | 54 | # The following line ensures that the Material Icons font is 55 | # included with your application, so that you can use the icons in 56 | # the material Icons class. 57 | uses-material-design: true 58 | 59 | # To add assets to your application, add an assets section, like this: 60 | # assets: 61 | # - images/a_dot_burr.jpeg 62 | # - images/a_dot_ham.jpeg 63 | 64 | # An image asset can refer to one or more resolution-specific "variants", see 65 | # https://flutter.dev/assets-and-images/#resolution-aware. 66 | 67 | # For details regarding adding assets from package dependencies, see 68 | # https://flutter.dev/assets-and-images/#from-packages 69 | 70 | # To add custom fonts to your application, add a fonts section here, 71 | # in this "flutter" section. Each entry in this list should have a 72 | # "family" key with the font family name, and a "fonts" key with a 73 | # list giving the asset and other descriptors for the font. For 74 | # example: 75 | # fonts: 76 | # - family: Schyler 77 | # fonts: 78 | # - asset: fonts/Schyler-Regular.ttf 79 | # - asset: fonts/Schyler-Italic.ttf 80 | # style: italic 81 | # - family: Trajan Pro 82 | # fonts: 83 | # - asset: fonts/TrajanPro.ttf 84 | # - asset: fonts/TrajanPro_Bold.ttf 85 | # weight: 700 86 | # 87 | # For details regarding fonts from package dependencies, 88 | # see https://flutter.dev/custom-fonts/#from-packages 89 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | firebase-debug.log* 8 | 9 | # Firebase cache 10 | .firebase/ 11 | serviceAccount.json 12 | 13 | GoogleService-Info.plist 14 | google-services.json 15 | 16 | # Firebase config 17 | 18 | # Uncomment this if you'd like others to create their own Firebase project. 19 | # For a team working on the same Firebase project(s), it is recommended to leave 20 | # it commented so all members can deploy to the same project(s) in .firebaserc. 21 | # .firebaserc 22 | 23 | # Runtime data 24 | pids 25 | *.pid 26 | *.seed 27 | *.pid.lock 28 | 29 | # Directory for instrumented libs generated by jscoverage/JSCover 30 | lib-cov 31 | 32 | # Coverage directory used by tools like istanbul 33 | coverage 34 | 35 | # nyc test coverage 36 | .nyc_output 37 | .firebaserc 38 | 39 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 40 | .grunt 41 | 42 | # Bower dependency directory (https://bower.io/) 43 | bower_components 44 | 45 | # node-waf configuration 46 | .lock-wscript 47 | 48 | # Compiled binary addons (http://nodejs.org/api/addons.html) 49 | build/Release 50 | 51 | # Dependency directories 52 | node_modules/ 53 | 54 | # Optional npm cache directory 55 | .npm 56 | 57 | # Optional eslint cache 58 | .eslintcache 59 | 60 | # Optional REPL history 61 | .node_repl_history 62 | 63 | # Output of 'npm pack' 64 | *.tgz 65 | 66 | # Yarn Integrity file 67 | .yarn-integrity 68 | 69 | # dotenv environment variables file 70 | .env 71 | 72 | # Miscellaneous 73 | *.class 74 | *.log 75 | *.pyc 76 | *.swp 77 | .DS_Store 78 | .atom/ 79 | .buildlog/ 80 | .history 81 | .svn/ 82 | 83 | # IntelliJ related 84 | *.iml 85 | *.ipr 86 | *.iws 87 | .idea/ 88 | 89 | # Visual Studio Code related 90 | .vscode/ 91 | 92 | # Flutter/Dart/Pub related 93 | **/doc/api/ 94 | .dart_tool/ 95 | .flutter-plugins 96 | .packages 97 | .pub-cache/ 98 | .pub/ 99 | /build/ 100 | 101 | # Android related 102 | **/android/**/gradle-wrapper.jar 103 | **/android/.gradle 104 | **/android/captures/ 105 | **/android/gradlew 106 | **/android/gradlew.bat 107 | **/android/local.properties 108 | **/android/**/GeneratedPluginRegistrant.java 109 | 110 | # iOS/XCode related 111 | **/ios/**/*.mode1v3 112 | **/ios/**/*.mode2v3 113 | **/ios/**/*.moved-aside 114 | **/ios/**/*.pbxuser 115 | **/ios/**/*.perspectivev3 116 | **/ios/**/*sync/ 117 | **/ios/**/.sconsign.dblite 118 | **/ios/**/.tags* 119 | **/ios/**/.vagrant/ 120 | **/ios/**/DerivedData/ 121 | **/ios/**/Icon? 122 | **/ios/**/Pods/ 123 | **/ios/**/.symlinks/ 124 | **/ios/**/profile 125 | **/ios/**/xcuserdata 126 | **/ios/.generated/ 127 | **/ios/Flutter/App.framework 128 | **/ios/Flutter/Flutter.framework 129 | **/ios/Flutter/Generated.xcconfig 130 | **/ios/Flutter/app.flx 131 | **/ios/Flutter/app.zip 132 | **/ios/Flutter/flutter_assets/ 133 | **/ios/ServiceDefinitions.json 134 | **/ios/Runner/GeneratedPluginRegistrant.* 135 | 136 | # Exceptions to above rules. 137 | !**/ios/**/default.mode1v3 138 | !**/ios/**/default.mode2v3 139 | !**/ios/**/default.pbxuser 140 | !**/ios/**/default.perspectivev3 141 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /cloud_intelligence/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.2.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.0.4" 18 | camera: 19 | dependency: "direct main" 20 | description: 21 | name: camera 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "0.4.3+2" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.1.2" 32 | chewie: 33 | dependency: "direct main" 34 | description: 35 | name: chewie 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "0.9.7" 39 | cloud_firestore: 40 | dependency: "direct main" 41 | description: 42 | name: cloud_firestore 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "0.9.13+1" 46 | collection: 47 | dependency: transitive 48 | description: 49 | name: collection 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.14.11" 53 | convert: 54 | dependency: transitive 55 | description: 56 | name: convert 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.1" 60 | crypto: 61 | dependency: transitive 62 | description: 63 | name: crypto 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "2.0.6" 67 | cupertino_icons: 68 | dependency: "direct main" 69 | description: 70 | name: cupertino_icons 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "0.1.2" 74 | firebase_core: 75 | dependency: "direct main" 76 | description: 77 | name: firebase_core 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "0.3.4" 81 | firebase_storage: 82 | dependency: "direct main" 83 | description: 84 | name: firebase_storage 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "2.1.1+2" 88 | flutter: 89 | dependency: "direct main" 90 | description: flutter 91 | source: sdk 92 | version: "0.0.0" 93 | flutter_test: 94 | dependency: "direct dev" 95 | description: flutter 96 | source: sdk 97 | version: "0.0.0" 98 | http: 99 | dependency: "direct main" 100 | description: 101 | name: http 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.12.0+2" 105 | http_parser: 106 | dependency: transitive 107 | description: 108 | name: http_parser 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "3.1.3" 112 | image_picker: 113 | dependency: "direct main" 114 | description: 115 | name: image_picker 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "0.6.0+2" 119 | matcher: 120 | dependency: transitive 121 | description: 122 | name: matcher 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "0.12.5" 126 | meta: 127 | dependency: transitive 128 | description: 129 | name: meta 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "1.1.6" 133 | open_iconic_flutter: 134 | dependency: transitive 135 | description: 136 | name: open_iconic_flutter 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "0.3.0" 140 | path: 141 | dependency: transitive 142 | description: 143 | name: path 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "1.6.2" 147 | path_provider: 148 | dependency: "direct main" 149 | description: 150 | name: path_provider 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "0.5.0+1" 154 | pedantic: 155 | dependency: transitive 156 | description: 157 | name: pedantic 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "1.5.0" 161 | quiver: 162 | dependency: transitive 163 | description: 164 | name: quiver 165 | url: "https://pub.dartlang.org" 166 | source: hosted 167 | version: "2.0.3" 168 | screen: 169 | dependency: transitive 170 | description: 171 | name: screen 172 | url: "https://pub.dartlang.org" 173 | source: hosted 174 | version: "0.0.5" 175 | sky_engine: 176 | dependency: transitive 177 | description: flutter 178 | source: sdk 179 | version: "0.0.99" 180 | source_span: 181 | dependency: transitive 182 | description: 183 | name: source_span 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "1.5.5" 187 | stack_trace: 188 | dependency: transitive 189 | description: 190 | name: stack_trace 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "1.9.3" 194 | stream_channel: 195 | dependency: transitive 196 | description: 197 | name: stream_channel 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "2.0.0" 201 | string_scanner: 202 | dependency: transitive 203 | description: 204 | name: string_scanner 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.0.4" 208 | term_glyph: 209 | dependency: transitive 210 | description: 211 | name: term_glyph 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "1.1.0" 215 | test_api: 216 | dependency: transitive 217 | description: 218 | name: test_api 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "0.2.5" 222 | typed_data: 223 | dependency: transitive 224 | description: 225 | name: typed_data 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "1.1.6" 229 | uuid: 230 | dependency: "direct main" 231 | description: 232 | name: uuid 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "2.0.1" 236 | vector_math: 237 | dependency: transitive 238 | description: 239 | name: vector_math 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "2.0.8" 243 | video_player: 244 | dependency: "direct main" 245 | description: 246 | name: video_player 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "0.10.0+8" 250 | sdks: 251 | dart: ">=2.2.0 <3.0.0" 252 | flutter: ">=1.2.0 <2.0.0" 253 | -------------------------------------------------------------------------------- /cloud_intelligence/lib/video_player.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'dart:async'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:chewie/chewie.dart'; 5 | import 'package:video_player/video_player.dart'; 6 | import 'package:cloud_firestore/cloud_firestore.dart'; 7 | import 'package:firebase_storage/firebase_storage.dart'; 8 | import 'package:http/http.dart' as http; 9 | import 'dart:convert'; 10 | import 'video_analysis.dart'; 11 | 12 | class VideoPlayerWidget extends StatefulWidget { 13 | final File file; 14 | final String uuid; 15 | 16 | VideoPlayerWidget({this.file, this.uuid}); 17 | 18 | @override 19 | State createState() { 20 | return VideoPlayerWidgetState(); 21 | } 22 | } 23 | 24 | class VideoPlayerWidgetState extends State { 25 | TargetPlatform _platform; 26 | VideoPlayerController _videoPlayerController; 27 | ChewieController _chewieController; 28 | final FirebaseStorage _storage = FirebaseStorage.instance; 29 | 30 | @override 31 | void initState() { 32 | super.initState(); 33 | 34 | _videoPlayerController = VideoPlayerController.file(widget.file); 35 | 36 | _chewieController = ChewieController( 37 | videoPlayerController: _videoPlayerController, 38 | aspectRatio: 1, 39 | // aspectRatio: _video.aspectRatio, 40 | autoPlay: true, 41 | looping: true, 42 | allowedScreenSleep: true, 43 | allowFullScreen: true); 44 | } 45 | 46 | @override 47 | void dispose() { 48 | _videoPlayerController.dispose(); 49 | _chewieController.dispose(); 50 | super.dispose(); 51 | } 52 | 53 | Future getURLAndDownloadFile() async { 54 | final StorageReference ref = _storage.ref().child("${widget.uuid}.json"); 55 | final String url = await ref.getDownloadURL(); 56 | final http.Response response = await http.get(url); 57 | 58 | if (response.statusCode == 200) { 59 | // If server returns an OK response, parse the JSON 60 | final analysis = VideoAnalysis.fromJson(json.decode(response.body)); 61 | return analysis; 62 | } else { 63 | throw Exception('Failed to load post'); 64 | } 65 | } 66 | 67 | @override 68 | Widget build(BuildContext context) { 69 | return Scaffold( 70 | appBar: AppBar( 71 | centerTitle: true, 72 | title: Text('Video Analysis Result'), 73 | ), 74 | body: Container( 75 | child: Stack( 76 | children: [ 77 | Positioned( 78 | left: 0, 79 | bottom: 0, 80 | right: 0, 81 | child: Container( 82 | height: 214, 83 | child: StreamBuilder( 84 | stream: Firestore.instance 85 | .collection('results') 86 | .document(widget.uuid) 87 | .snapshots(), 88 | builder: (BuildContext context, 89 | AsyncSnapshot snapshotDoc) { 90 | if (snapshotDoc.hasError) 91 | return Center( 92 | child: Text('Error: ${snapshotDoc.error}')); 93 | 94 | switch (snapshotDoc.connectionState) { 95 | case ConnectionState.waiting: 96 | return Center(child: Text('Loading...')); 97 | 98 | default: 99 | if (snapshotDoc.hasData && 100 | snapshotDoc.data.data != null) { 101 | final data = snapshotDoc.data.data; 102 | final status = data['status']; 103 | if (status == 'finished') { 104 | return FutureBuilder( 105 | future: getURLAndDownloadFile(), 106 | builder: (build, snapshot) { 107 | if (snapshot.hasData) { 108 | final widgets = snapshot.data.annotations 109 | .map((f) => CategoryBadgeItem( 110 | text: f.title, 111 | )) 112 | .toList(); 113 | 114 | return Padding( 115 | padding: EdgeInsets.all(16.0), 116 | child: ListView( 117 | children: [ 118 | Wrap( 119 | children: widgets, 120 | ) 121 | ], 122 | )); 123 | } else if (snapshot.hasError) { 124 | return Center( 125 | child: Text(snapshot.error.toString()), 126 | ); 127 | } 128 | return Center( 129 | child: CircularProgressIndicator(), 130 | ); 131 | }, 132 | ); 133 | } else { 134 | return Center( 135 | child: Text('Analyzing Video Context...'), 136 | ); 137 | } 138 | } else { 139 | return Center( 140 | child: CircularProgressIndicator(), 141 | ); 142 | } 143 | } 144 | }, 145 | ))), 146 | Positioned( 147 | top: 0, 148 | left: 0, 149 | right: 0, 150 | bottom: 214, 151 | child: Container( 152 | color: Colors.black, 153 | child: Chewie( 154 | controller: _chewieController, 155 | ), 156 | ), 157 | ) 158 | ], 159 | ), 160 | ), 161 | ); 162 | } 163 | } 164 | 165 | class CategoryBadgeItem extends StatelessWidget { 166 | final String text; 167 | 168 | CategoryBadgeItem({this.text}); 169 | 170 | @override 171 | Widget build(BuildContext context) { 172 | return Padding( 173 | padding: EdgeInsets.only(right: 4, bottom: 4), 174 | child: Container( 175 | child: Text( 176 | this.text, 177 | style: Theme.of(context).textTheme.body1.apply(color: Colors.white), 178 | ), 179 | padding: EdgeInsets.all(8), 180 | decoration: BoxDecoration( 181 | color: Colors.blue, borderRadius: BorderRadius.circular(4.0)), 182 | )); 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - BoringSSL-GRPC (0.0.2): 3 | - BoringSSL-GRPC/Implementation (= 0.0.2) 4 | - BoringSSL-GRPC/Interface (= 0.0.2) 5 | - BoringSSL-GRPC/Implementation (0.0.2): 6 | - BoringSSL-GRPC/Interface (= 0.0.2) 7 | - BoringSSL-GRPC/Interface (0.0.2) 8 | - camera (0.0.1): 9 | - Flutter 10 | - cloud_firestore (0.0.1): 11 | - Firebase/Auth 12 | - Firebase/Core 13 | - Firebase/Database 14 | - Firebase/Firestore 15 | - Flutter 16 | - Firebase/Auth (5.18.0): 17 | - Firebase/CoreOnly 18 | - FirebaseAuth (= 5.4.0) 19 | - Firebase/Core (5.18.0): 20 | - Firebase/CoreOnly 21 | - FirebaseAnalytics (= 5.7.0) 22 | - Firebase/CoreOnly (5.18.0): 23 | - FirebaseCore (= 5.3.1) 24 | - Firebase/Database (5.18.0): 25 | - Firebase/CoreOnly 26 | - FirebaseDatabase (= 5.1.0) 27 | - Firebase/Firestore (5.18.0): 28 | - Firebase/CoreOnly 29 | - FirebaseFirestore (= 1.0.2) 30 | - Firebase/Storage (5.18.0): 31 | - Firebase/CoreOnly 32 | - FirebaseStorage (= 3.1.0) 33 | - firebase_core (0.0.1): 34 | - Firebase/Core 35 | - Flutter 36 | - firebase_storage (0.0.1): 37 | - Firebase/Storage 38 | - Flutter 39 | - FirebaseAnalytics (5.7.0): 40 | - FirebaseCore (~> 5.3) 41 | - FirebaseInstanceID (~> 3.6) 42 | - GoogleAppMeasurement (= 5.7.0) 43 | - GoogleUtilities/AppDelegateSwizzler (~> 5.2) 44 | - GoogleUtilities/MethodSwizzler (~> 5.2) 45 | - GoogleUtilities/Network (~> 5.2) 46 | - "GoogleUtilities/NSData+zlib (~> 5.2)" 47 | - nanopb (~> 0.3) 48 | - FirebaseAuth (5.4.0): 49 | - FirebaseAuthInterop (~> 1.0) 50 | - FirebaseCore (~> 5.2) 51 | - GoogleUtilities/Environment (~> 5.2) 52 | - GTMSessionFetcher/Core (~> 1.1) 53 | - FirebaseAuthInterop (1.0.0) 54 | - FirebaseCore (5.3.1): 55 | - GoogleUtilities/Logger (~> 5.2) 56 | - FirebaseDatabase (5.1.0): 57 | - FirebaseAuthInterop (~> 1.0) 58 | - FirebaseCore (~> 5.2) 59 | - leveldb-library (~> 1.18) 60 | - FirebaseFirestore (1.0.2): 61 | - FirebaseAuthInterop (~> 1.0) 62 | - FirebaseCore (~> 5.2) 63 | - FirebaseFirestore/abseil-cpp (= 1.0.2) 64 | - "gRPC-C++ (= 0.0.6)" 65 | - leveldb-library (~> 1.20) 66 | - nanopb (~> 0.3.901) 67 | - Protobuf (~> 3.1) 68 | - FirebaseFirestore/abseil-cpp (1.0.2): 69 | - FirebaseAuthInterop (~> 1.0) 70 | - FirebaseCore (~> 5.2) 71 | - "gRPC-C++ (= 0.0.6)" 72 | - leveldb-library (~> 1.20) 73 | - nanopb (~> 0.3.901) 74 | - Protobuf (~> 3.1) 75 | - FirebaseInstanceID (3.7.0): 76 | - FirebaseCore (~> 5.2) 77 | - GoogleUtilities/Environment (~> 5.2) 78 | - GoogleUtilities/UserDefaults (~> 5.2) 79 | - FirebaseStorage (3.1.0): 80 | - FirebaseAuthInterop (~> 1.0) 81 | - FirebaseCore (~> 5.2) 82 | - GTMSessionFetcher/Core (~> 1.1) 83 | - Flutter (1.0.0) 84 | - GoogleAppMeasurement (5.7.0): 85 | - GoogleUtilities/AppDelegateSwizzler (~> 5.2) 86 | - GoogleUtilities/MethodSwizzler (~> 5.2) 87 | - GoogleUtilities/Network (~> 5.2) 88 | - "GoogleUtilities/NSData+zlib (~> 5.2)" 89 | - nanopb (~> 0.3) 90 | - GoogleUtilities/AppDelegateSwizzler (5.5.0): 91 | - GoogleUtilities/Environment 92 | - GoogleUtilities/Logger 93 | - GoogleUtilities/Network 94 | - GoogleUtilities/Environment (5.5.0) 95 | - GoogleUtilities/Logger (5.5.0): 96 | - GoogleUtilities/Environment 97 | - GoogleUtilities/MethodSwizzler (5.5.0): 98 | - GoogleUtilities/Logger 99 | - GoogleUtilities/Network (5.5.0): 100 | - GoogleUtilities/Logger 101 | - "GoogleUtilities/NSData+zlib" 102 | - GoogleUtilities/Reachability 103 | - "GoogleUtilities/NSData+zlib (5.5.0)" 104 | - GoogleUtilities/Reachability (5.5.0): 105 | - GoogleUtilities/Logger 106 | - GoogleUtilities/UserDefaults (5.5.0): 107 | - GoogleUtilities/Logger 108 | - "gRPC-C++ (0.0.6)": 109 | - "gRPC-C++/Implementation (= 0.0.6)" 110 | - "gRPC-C++/Interface (= 0.0.6)" 111 | - "gRPC-C++/Implementation (0.0.6)": 112 | - "gRPC-C++/Interface (= 0.0.6)" 113 | - gRPC-Core (= 1.17.0) 114 | - nanopb (~> 0.3) 115 | - "gRPC-C++/Interface (0.0.6)" 116 | - gRPC-Core (1.17.0): 117 | - gRPC-Core/Implementation (= 1.17.0) 118 | - gRPC-Core/Interface (= 1.17.0) 119 | - gRPC-Core/Implementation (1.17.0): 120 | - BoringSSL-GRPC (= 0.0.2) 121 | - gRPC-Core/Interface (= 1.17.0) 122 | - nanopb (~> 0.3) 123 | - gRPC-Core/Interface (1.17.0) 124 | - GTMSessionFetcher/Core (1.2.1) 125 | - image_picker (0.0.1): 126 | - Flutter 127 | - leveldb-library (1.20) 128 | - nanopb (0.3.901): 129 | - nanopb/decode (= 0.3.901) 130 | - nanopb/encode (= 0.3.901) 131 | - nanopb/decode (0.3.901) 132 | - nanopb/encode (0.3.901) 133 | - path_provider (0.0.1): 134 | - Flutter 135 | - Protobuf (3.7.0) 136 | - screen (0.0.1): 137 | - Flutter 138 | - video_player (0.0.1): 139 | - Flutter 140 | 141 | DEPENDENCIES: 142 | - camera (from `.symlinks/plugins/camera/ios`) 143 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 144 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 145 | - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) 146 | - Flutter (from `.symlinks/flutter/ios`) 147 | - image_picker (from `.symlinks/plugins/image_picker/ios`) 148 | - path_provider (from `.symlinks/plugins/path_provider/ios`) 149 | - screen (from `.symlinks/plugins/screen/ios`) 150 | - video_player (from `.symlinks/plugins/video_player/ios`) 151 | 152 | SPEC REPOS: 153 | https://github.com/cocoapods/specs.git: 154 | - BoringSSL-GRPC 155 | - Firebase 156 | - FirebaseAnalytics 157 | - FirebaseAuth 158 | - FirebaseAuthInterop 159 | - FirebaseCore 160 | - FirebaseDatabase 161 | - FirebaseFirestore 162 | - FirebaseInstanceID 163 | - FirebaseStorage 164 | - GoogleAppMeasurement 165 | - GoogleUtilities 166 | - "gRPC-C++" 167 | - gRPC-Core 168 | - GTMSessionFetcher 169 | - leveldb-library 170 | - nanopb 171 | - Protobuf 172 | 173 | EXTERNAL SOURCES: 174 | camera: 175 | :path: ".symlinks/plugins/camera/ios" 176 | cloud_firestore: 177 | :path: ".symlinks/plugins/cloud_firestore/ios" 178 | firebase_core: 179 | :path: ".symlinks/plugins/firebase_core/ios" 180 | firebase_storage: 181 | :path: ".symlinks/plugins/firebase_storage/ios" 182 | Flutter: 183 | :path: ".symlinks/flutter/ios" 184 | image_picker: 185 | :path: ".symlinks/plugins/image_picker/ios" 186 | path_provider: 187 | :path: ".symlinks/plugins/path_provider/ios" 188 | screen: 189 | :path: ".symlinks/plugins/screen/ios" 190 | video_player: 191 | :path: ".symlinks/plugins/video_player/ios" 192 | 193 | SPEC CHECKSUMS: 194 | BoringSSL-GRPC: 2a230d9cd93e7ce39916044f645cebb31f37dde6 195 | camera: d56ad165545ae5a0ffb892376033760a969c68c8 196 | cloud_firestore: cd6e849ecb8ab43e5a7a5f1f169304ca65436c03 197 | Firebase: 02f3281965c075426141a0ce1277e9de6649cab9 198 | firebase_core: ce5006bb48508ee4e71e0f429a3f519bb8ee2961 199 | firebase_storage: 2543f377090a6e219caab9224dead5bbcb30ef33 200 | FirebaseAnalytics: 23851fe602c872130a2c5c55040b302120346cc2 201 | FirebaseAuth: d85d052354447f30b4b2a805ab91b511458b56a6 202 | FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc 203 | FirebaseCore: 52f851b30e11360f1e67cf04b1edfebf0a47a2d3 204 | FirebaseDatabase: 23acb0c53cd4d4070a427b60100b2e4aaa97c45d 205 | FirebaseFirestore: ccdaffb8a73c591ff61872b8f7905ad0c237ef50 206 | FirebaseInstanceID: bd6fc5a258884e206fd5c474ebe4f5b00e21770e 207 | FirebaseStorage: 29075f874c2b3cf61e5221a62c4ceefc809e5412 208 | Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a 209 | GoogleAppMeasurement: 6cf307834da065863f9faf4c0de0a936d81dd832 210 | GoogleUtilities: 6481e6318c5fcabaaa8513ef8120f329055d7c10 211 | "gRPC-C++": e76441995900ac90e9bd98644ab4733f12521edf 212 | gRPC-Core: 4028031ed2c5267cca0d846c876d8046b1ecb9b6 213 | GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca 214 | image_picker: 16e5fec1fbc87fd3b297c53e4048521eaf17cd06 215 | leveldb-library: 08cba283675b7ed2d99629a4bc5fd052cd2bb6a5 216 | nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48 217 | path_provider: f96fff6166a8867510d2c25fdcc346327cc4b259 218 | Protobuf: 7a877b7f3e5964e3fce995e2eb323dbc6831bb5a 219 | screen: abd91ca7bf3426e1cc3646d27e9b2358d6bf07b0 220 | video_player: 3964090a33353060ed7f58aa6427c7b4b208ec21 221 | 222 | PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09 223 | 224 | COCOAPODS: 1.6.0.beta.2 225 | -------------------------------------------------------------------------------- /cloud_intelligence/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:cloud_firestore/cloud_firestore.dart'; 4 | import 'package:path_provider/path_provider.dart'; 5 | import 'package:video_player/video_player.dart'; 6 | import 'package:camera/camera.dart'; 7 | import 'package:uuid/uuid.dart'; 8 | import 'package:firebase_storage/firebase_storage.dart'; 9 | import 'video_player.dart'; 10 | import 'package:image_picker/image_picker.dart'; 11 | 12 | void main() { 13 | final db = Firestore.instance; 14 | db.settings(timestampsInSnapshotsEnabled: true, persistenceEnabled: false); 15 | 16 | runApp(MyApp()); 17 | } 18 | 19 | class MyApp extends StatelessWidget { 20 | // This widget is the root of your application. 21 | @override 22 | Widget build(BuildContext context) { 23 | return MaterialApp( 24 | title: 'Flutter Demo', 25 | debugShowCheckedModeBanner: false, 26 | theme: ThemeData( 27 | // This is the theme of your application. 28 | // 29 | // Try running your application with "flutter run". You'll see the 30 | // application has a blue toolbar. Then, without quitting the app, try 31 | // changing the primarySwatch below to Colors.green and then invoke 32 | // "hot reload" (press "r" in the console where you ran "flutter run", 33 | // or simply save your changes to "hot reload" in a Flutter IDE). 34 | // Notice that the counter didn't reset back to zero; the application 35 | // is not restarted. 36 | primarySwatch: Colors.blue, 37 | ), 38 | home: MyHomePage(title: 'Flutter Demo Home Page'), 39 | ); 40 | } 41 | } 42 | 43 | class MyHomePage extends StatefulWidget { 44 | MyHomePage({Key key, this.title}) : super(key: key); 45 | 46 | final String title; 47 | 48 | @override 49 | _MyHomePageState createState() => _MyHomePageState(); 50 | } 51 | 52 | class _MyHomePageState extends State { 53 | final GlobalKey _scaffoldKey = GlobalKey(); 54 | final FirebaseStorage _storage = FirebaseStorage.instance; 55 | // final IVideoService _videoService = FirestoreVideoService(); 56 | StorageUploadTask _task; 57 | 58 | List cameras; 59 | CameraController controller; 60 | String imagePath; 61 | String videoPath; 62 | VideoPlayerController videoController; 63 | VoidCallback videoPlayerListener; 64 | 65 | Future _getVideo() async { 66 | final video = await ImagePicker.pickVideo(source: ImageSource.gallery); 67 | if (video != null) { 68 | uploadFile(video); 69 | } 70 | } 71 | 72 | @override 73 | Widget build(BuildContext context) { 74 | return Scaffold( 75 | key: _scaffoldKey, 76 | appBar: AppBar( 77 | title: const Text('Google Cloud Video Intelligence ML'), 78 | actions: [ 79 | FlatButton( 80 | textColor: Colors.white, 81 | onPressed: () { 82 | _getVideo(); 83 | }, 84 | child: Text("Pick from Gallery"), 85 | ) 86 | ], 87 | ), 88 | body: cameras == null 89 | ? null 90 | : Column( 91 | children: [ 92 | Expanded( 93 | child: Container( 94 | child: Padding( 95 | padding: const EdgeInsets.all(1.0), 96 | child: Center( 97 | child: _cameraPreviewWidget(), 98 | ), 99 | ), 100 | decoration: BoxDecoration( 101 | color: Colors.black, 102 | border: Border.all( 103 | color: controller != null && 104 | controller.value.isRecordingVideo 105 | ? Colors.redAccent 106 | : Colors.grey, 107 | width: 3.0, 108 | ), 109 | ), 110 | ), 111 | ), 112 | _task != null ? Text('Uploading') : _captureControlRowWidget(), 113 | Padding( 114 | padding: const EdgeInsets.all(5.0), 115 | child: Row( 116 | mainAxisAlignment: MainAxisAlignment.start, 117 | children: _task != null 118 | ? [] 119 | : [ 120 | _cameraTogglesRowWidget(), 121 | ], 122 | ), 123 | ), 124 | ], 125 | ), 126 | ); 127 | } 128 | 129 | void initializeCamera() async { 130 | try { 131 | final cameras = await availableCameras(); 132 | setState(() { 133 | this.cameras = cameras; 134 | }); 135 | } on CameraException catch (e) { 136 | print(e.description); 137 | } 138 | } 139 | 140 | IconData getCameraLensIcon(CameraLensDirection direction) { 141 | switch (direction) { 142 | case CameraLensDirection.back: 143 | return Icons.camera_rear; 144 | case CameraLensDirection.front: 145 | return Icons.camera_front; 146 | case CameraLensDirection.external: 147 | return Icons.camera; 148 | } 149 | throw ArgumentError('Unknown lens direction'); 150 | } 151 | 152 | @override 153 | void initState() { 154 | super.initState(); 155 | initializeCamera(); 156 | } 157 | 158 | /// Display the preview from the camera (or a message if the preview is not available). 159 | Widget _cameraPreviewWidget() { 160 | if (controller == null || !controller.value.isInitialized) { 161 | return const Text( 162 | 'Tap a camera', 163 | style: TextStyle( 164 | color: Colors.white, 165 | fontSize: 24.0, 166 | fontWeight: FontWeight.w900, 167 | ), 168 | ); 169 | } else { 170 | return AspectRatio( 171 | aspectRatio: controller.value.aspectRatio, 172 | child: CameraPreview(controller), 173 | ); 174 | } 175 | } 176 | 177 | /// Display the control bar with buttons to take pictures and record videos. 178 | Widget _captureControlRowWidget() { 179 | return Row( 180 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 181 | mainAxisSize: MainAxisSize.max, 182 | children: [ 183 | IconButton( 184 | icon: const Icon(Icons.videocam), 185 | color: Colors.blue, 186 | onPressed: controller != null && 187 | controller.value.isInitialized && 188 | !controller.value.isRecordingVideo 189 | ? onVideoRecordButtonPressed 190 | : null, 191 | ), 192 | IconButton( 193 | icon: const Icon(Icons.stop), 194 | color: Colors.red, 195 | onPressed: controller != null && 196 | controller.value.isInitialized && 197 | controller.value.isRecordingVideo 198 | ? onStopButtonPressed 199 | : null, 200 | ) 201 | ], 202 | ); 203 | } 204 | 205 | /// Display a row of toggle to select the camera (or a message if no camera is available). 206 | Widget _cameraTogglesRowWidget() { 207 | final List toggles = []; 208 | 209 | if (cameras.isEmpty) { 210 | return const Text('No camera found'); 211 | } else { 212 | for (CameraDescription cameraDescription in cameras) { 213 | toggles.add( 214 | SizedBox( 215 | width: 90.0, 216 | child: RadioListTile( 217 | title: Icon(getCameraLensIcon(cameraDescription.lensDirection)), 218 | groupValue: controller?.description, 219 | value: cameraDescription, 220 | onChanged: controller != null && controller.value.isRecordingVideo 221 | ? null 222 | : onNewCameraSelected, 223 | ), 224 | ), 225 | ); 226 | } 227 | } 228 | 229 | return Row(children: toggles); 230 | } 231 | 232 | String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); 233 | 234 | void showInSnackBar(String message) { 235 | _scaffoldKey.currentState.showSnackBar( 236 | SnackBar(content: Text(message), duration: Duration(seconds: 2)), 237 | ); 238 | } 239 | 240 | void onNewCameraSelected(CameraDescription cameraDescription) async { 241 | if (controller != null) { 242 | await controller.dispose(); 243 | } 244 | controller = CameraController(cameraDescription, ResolutionPreset.high); 245 | 246 | // If the controller is updated then update the UI. 247 | controller.addListener(() { 248 | if (mounted) setState(() {}); 249 | if (controller.value.hasError) { 250 | showInSnackBar('Camera error ${controller.value.errorDescription}'); 251 | } 252 | }); 253 | 254 | try { 255 | await controller.initialize(); 256 | } on CameraException catch (e) { 257 | _showCameraException(e); 258 | } 259 | 260 | if (mounted) { 261 | setState(() {}); 262 | } 263 | } 264 | 265 | void onVideoRecordButtonPressed() { 266 | startVideoRecording().then((String filePath) { 267 | if (mounted) setState(() {}); 268 | }); 269 | } 270 | 271 | void onStopButtonPressed() { 272 | stopVideoRecording().then((_) { 273 | if (mounted) setState(() {}); 274 | if (videoPath != null) { 275 | uploadFile(File(videoPath)); 276 | } 277 | }); 278 | } 279 | 280 | Future startVideoRecording() async { 281 | if (!controller.value.isInitialized) { 282 | showInSnackBar('Error: select a camera first.'); 283 | return null; 284 | } 285 | 286 | final Directory extDir = await getTemporaryDirectory(); 287 | final String dirPath = '${extDir.path}/Movies/flutter_test'; 288 | await Directory(dirPath).create(recursive: true); 289 | final String filePath = '$dirPath/${timestamp()}.mp4'; 290 | 291 | if (controller.value.isRecordingVideo) { 292 | return null; 293 | } 294 | 295 | try { 296 | videoPath = filePath; 297 | await controller.startVideoRecording(filePath); 298 | } on CameraException catch (e) { 299 | _showCameraException(e); 300 | return null; 301 | } 302 | return filePath; 303 | } 304 | 305 | Future stopVideoRecording() async { 306 | if (!controller.value.isRecordingVideo) { 307 | return null; 308 | } 309 | 310 | try { 311 | await controller.stopVideoRecording(); 312 | } on CameraException catch (e) { 313 | _showCameraException(e); 314 | return null; 315 | } 316 | } 317 | 318 | uploadFile(File file) { 319 | final uuid = Uuid().v4(); 320 | 321 | final StorageReference ref = _storage.ref().child("$uuid.mp4"); 322 | final StorageUploadTask task = ref.putFile( 323 | file, 324 | StorageMetadata( 325 | contentType: 'video/mp4', 326 | ), 327 | ); 328 | 329 | setState(() { 330 | _task = task; 331 | }); 332 | 333 | task.onComplete.then((value) { 334 | showInSnackBar('Uploaded Video!'); 335 | 336 | Navigator.push( 337 | context, 338 | MaterialPageRoute( 339 | builder: (context) => VideoPlayerWidget( 340 | uuid: uuid, 341 | file: file, 342 | )), 343 | ); 344 | 345 | setState(() { 346 | _task = null; 347 | videoPath = null; 348 | }); 349 | }, onError: (error) { 350 | setState(() { 351 | _task = null; 352 | videoPath = null; 353 | }); 354 | 355 | showInSnackBar('Upload Fails'); 356 | }); 357 | 358 | showInSnackBar('Uploading Video...'); 359 | } 360 | 361 | void _showCameraException(CameraException e) { 362 | showInSnackBar('Error: ${e.code}\n${e.description}'); 363 | } 364 | } 365 | -------------------------------------------------------------------------------- /cloud_intelligence/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 05919A6F6500438E2F8A45CD /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F4CF6F5E36C11116B56F0AC8 /* libPods-Runner.a */; }; 11 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 14 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | 8B9DA1D02281FA80002336FE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8B9DA1CF2281FA80002336FE /* GoogleService-Info.plist */; }; 16 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 17 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 18 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 19 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 20 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 21 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 22 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 23 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXCopyFilesBuildPhase section */ 27 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 28 | isa = PBXCopyFilesBuildPhase; 29 | buildActionMask = 2147483647; 30 | dstPath = ""; 31 | dstSubfolderSpec = 10; 32 | files = ( 33 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 34 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 35 | ); 36 | name = "Embed Frameworks"; 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXCopyFilesBuildPhase section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 43 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 44 | 2B67FE9DE60DBBB1163BF070 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 45 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 46 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 47 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 48 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 49 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 50 | 8B9DA1CF2281FA80002336FE /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 51 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 52 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 53 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 54 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 56 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 57 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 58 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 59 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 60 | AC79DB0CEE98AB511BB8CF27 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 61 | CCDFE187A8FAF953A1E56D97 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 62 | F4CF6F5E36C11116B56F0AC8 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | /* End PBXFileReference section */ 64 | 65 | /* Begin PBXFrameworksBuildPhase section */ 66 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 67 | isa = PBXFrameworksBuildPhase; 68 | buildActionMask = 2147483647; 69 | files = ( 70 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 71 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 72 | 05919A6F6500438E2F8A45CD /* libPods-Runner.a in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 0AB09533E314C247D94E231E /* Pods */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | CCDFE187A8FAF953A1E56D97 /* Pods-Runner.debug.xcconfig */, 83 | AC79DB0CEE98AB511BB8CF27 /* Pods-Runner.release.xcconfig */, 84 | 2B67FE9DE60DBBB1163BF070 /* Pods-Runner.profile.xcconfig */, 85 | ); 86 | name = Pods; 87 | path = Pods; 88 | sourceTree = ""; 89 | }; 90 | 39E0EEFD2F9B97D14BBC21B5 /* Frameworks */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | F4CF6F5E36C11116B56F0AC8 /* libPods-Runner.a */, 94 | ); 95 | name = Frameworks; 96 | sourceTree = ""; 97 | }; 98 | 9740EEB11CF90186004384FC /* Flutter */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 3B80C3931E831B6300D905FE /* App.framework */, 102 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 103 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 104 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 105 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 106 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 107 | ); 108 | name = Flutter; 109 | sourceTree = ""; 110 | }; 111 | 97C146E51CF9000F007C117D = { 112 | isa = PBXGroup; 113 | children = ( 114 | 9740EEB11CF90186004384FC /* Flutter */, 115 | 97C146F01CF9000F007C117D /* Runner */, 116 | 97C146EF1CF9000F007C117D /* Products */, 117 | 0AB09533E314C247D94E231E /* Pods */, 118 | 39E0EEFD2F9B97D14BBC21B5 /* Frameworks */, 119 | ); 120 | sourceTree = ""; 121 | }; 122 | 97C146EF1CF9000F007C117D /* Products */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 97C146EE1CF9000F007C117D /* Runner.app */, 126 | ); 127 | name = Products; 128 | sourceTree = ""; 129 | }; 130 | 97C146F01CF9000F007C117D /* Runner */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, 134 | 8B9DA1CF2281FA80002336FE /* GoogleService-Info.plist */, 135 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 136 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 137 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 138 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 139 | 97C147021CF9000F007C117D /* Info.plist */, 140 | 97C146F11CF9000F007C117D /* Supporting Files */, 141 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 142 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 143 | ); 144 | path = Runner; 145 | sourceTree = ""; 146 | }; 147 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | 97C146F21CF9000F007C117D /* main.m */, 151 | ); 152 | name = "Supporting Files"; 153 | sourceTree = ""; 154 | }; 155 | /* End PBXGroup section */ 156 | 157 | /* Begin PBXNativeTarget section */ 158 | 97C146ED1CF9000F007C117D /* Runner */ = { 159 | isa = PBXNativeTarget; 160 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 161 | buildPhases = ( 162 | BB760A4BC749403ED1D699D9 /* [CP] Check Pods Manifest.lock */, 163 | 9740EEB61CF901F6004384FC /* Run Script */, 164 | 97C146EA1CF9000F007C117D /* Sources */, 165 | 97C146EB1CF9000F007C117D /* Frameworks */, 166 | 97C146EC1CF9000F007C117D /* Resources */, 167 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 168 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 169 | FCAFB6523D24AAC4686DF183 /* [CP] Embed Pods Frameworks */, 170 | C6E8D7296018C5E4513AE3D3 /* [CP] Copy Pods Resources */, 171 | ); 172 | buildRules = ( 173 | ); 174 | dependencies = ( 175 | ); 176 | name = Runner; 177 | productName = Runner; 178 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 179 | productType = "com.apple.product-type.application"; 180 | }; 181 | /* End PBXNativeTarget section */ 182 | 183 | /* Begin PBXProject section */ 184 | 97C146E61CF9000F007C117D /* Project object */ = { 185 | isa = PBXProject; 186 | attributes = { 187 | LastUpgradeCheck = 0910; 188 | ORGANIZATIONNAME = "The Chromium Authors"; 189 | TargetAttributes = { 190 | 97C146ED1CF9000F007C117D = { 191 | CreatedOnToolsVersion = 7.3.1; 192 | }; 193 | }; 194 | }; 195 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 196 | compatibilityVersion = "Xcode 3.2"; 197 | developmentRegion = English; 198 | hasScannedForEncodings = 0; 199 | knownRegions = ( 200 | English, 201 | en, 202 | Base, 203 | ); 204 | mainGroup = 97C146E51CF9000F007C117D; 205 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 206 | projectDirPath = ""; 207 | projectRoot = ""; 208 | targets = ( 209 | 97C146ED1CF9000F007C117D /* Runner */, 210 | ); 211 | }; 212 | /* End PBXProject section */ 213 | 214 | /* Begin PBXResourcesBuildPhase section */ 215 | 97C146EC1CF9000F007C117D /* Resources */ = { 216 | isa = PBXResourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 220 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 221 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 222 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 223 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 224 | 8B9DA1D02281FA80002336FE /* GoogleService-Info.plist in Resources */, 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | /* End PBXResourcesBuildPhase section */ 229 | 230 | /* Begin PBXShellScriptBuildPhase section */ 231 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 232 | isa = PBXShellScriptBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | ); 236 | inputPaths = ( 237 | ); 238 | name = "Thin Binary"; 239 | outputPaths = ( 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | shellPath = /bin/sh; 243 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 244 | }; 245 | 9740EEB61CF901F6004384FC /* Run Script */ = { 246 | isa = PBXShellScriptBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | ); 250 | inputPaths = ( 251 | ); 252 | name = "Run Script"; 253 | outputPaths = ( 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | shellPath = /bin/sh; 257 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 258 | }; 259 | BB760A4BC749403ED1D699D9 /* [CP] Check Pods Manifest.lock */ = { 260 | isa = PBXShellScriptBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | ); 264 | inputFileListPaths = ( 265 | ); 266 | inputPaths = ( 267 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 268 | "${PODS_ROOT}/Manifest.lock", 269 | ); 270 | name = "[CP] Check Pods Manifest.lock"; 271 | outputFileListPaths = ( 272 | ); 273 | outputPaths = ( 274 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | shellPath = /bin/sh; 278 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 279 | showEnvVarsInLog = 0; 280 | }; 281 | C6E8D7296018C5E4513AE3D3 /* [CP] Copy Pods Resources */ = { 282 | isa = PBXShellScriptBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | ); 286 | inputFileListPaths = ( 287 | ); 288 | inputPaths = ( 289 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", 290 | "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-C++/gRPCCertificates.bundle", 291 | ); 292 | name = "[CP] Copy Pods Resources"; 293 | outputFileListPaths = ( 294 | ); 295 | outputPaths = ( 296 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | shellPath = /bin/sh; 300 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 301 | showEnvVarsInLog = 0; 302 | }; 303 | FCAFB6523D24AAC4686DF183 /* [CP] Embed Pods Frameworks */ = { 304 | isa = PBXShellScriptBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | inputFileListPaths = ( 309 | ); 310 | inputPaths = ( 311 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", 312 | "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", 313 | ); 314 | name = "[CP] Embed Pods Frameworks"; 315 | outputFileListPaths = ( 316 | ); 317 | outputPaths = ( 318 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", 319 | ); 320 | runOnlyForDeploymentPostprocessing = 0; 321 | shellPath = /bin/sh; 322 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 323 | showEnvVarsInLog = 0; 324 | }; 325 | /* End PBXShellScriptBuildPhase section */ 326 | 327 | /* Begin PBXSourcesBuildPhase section */ 328 | 97C146EA1CF9000F007C117D /* Sources */ = { 329 | isa = PBXSourcesBuildPhase; 330 | buildActionMask = 2147483647; 331 | files = ( 332 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, 333 | 97C146F31CF9000F007C117D /* main.m in Sources */, 334 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | /* End PBXSourcesBuildPhase section */ 339 | 340 | /* Begin PBXVariantGroup section */ 341 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 342 | isa = PBXVariantGroup; 343 | children = ( 344 | 97C146FB1CF9000F007C117D /* Base */, 345 | ); 346 | name = Main.storyboard; 347 | sourceTree = ""; 348 | }; 349 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 350 | isa = PBXVariantGroup; 351 | children = ( 352 | 97C147001CF9000F007C117D /* Base */, 353 | ); 354 | name = LaunchScreen.storyboard; 355 | sourceTree = ""; 356 | }; 357 | /* End PBXVariantGroup section */ 358 | 359 | /* Begin XCBuildConfiguration section */ 360 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 361 | isa = XCBuildConfiguration; 362 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 367 | CLANG_CXX_LIBRARY = "libc++"; 368 | CLANG_ENABLE_MODULES = YES; 369 | CLANG_ENABLE_OBJC_ARC = YES; 370 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_COMMA = YES; 373 | CLANG_WARN_CONSTANT_CONVERSION = YES; 374 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 375 | CLANG_WARN_EMPTY_BODY = YES; 376 | CLANG_WARN_ENUM_CONVERSION = YES; 377 | CLANG_WARN_INFINITE_RECURSION = YES; 378 | CLANG_WARN_INT_CONVERSION = YES; 379 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 380 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 382 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 383 | CLANG_WARN_STRICT_PROTOTYPES = YES; 384 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 385 | CLANG_WARN_UNREACHABLE_CODE = YES; 386 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 387 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 388 | COPY_PHASE_STRIP = NO; 389 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 390 | ENABLE_NS_ASSERTIONS = NO; 391 | ENABLE_STRICT_OBJC_MSGSEND = YES; 392 | GCC_C_LANGUAGE_STANDARD = gnu99; 393 | GCC_NO_COMMON_BLOCKS = YES; 394 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 395 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 396 | GCC_WARN_UNDECLARED_SELECTOR = YES; 397 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 398 | GCC_WARN_UNUSED_FUNCTION = YES; 399 | GCC_WARN_UNUSED_VARIABLE = YES; 400 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 401 | MTL_ENABLE_DEBUG_INFO = NO; 402 | SDKROOT = iphoneos; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Profile; 407 | }; 408 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 414 | DEVELOPMENT_TEAM = S8QB4VV633; 415 | ENABLE_BITCODE = NO; 416 | FRAMEWORK_SEARCH_PATHS = ( 417 | "$(inherited)", 418 | "$(PROJECT_DIR)/Flutter", 419 | ); 420 | INFOPLIST_FILE = Runner/Info.plist; 421 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 422 | LIBRARY_SEARCH_PATHS = ( 423 | "$(inherited)", 424 | "$(PROJECT_DIR)/Flutter", 425 | ); 426 | PRODUCT_BUNDLE_IDENTIFIER = "com.alfianlosari.flutter-training-com.alfianlosari.flutter-training"; 427 | PRODUCT_NAME = "$(TARGET_NAME)"; 428 | VERSIONING_SYSTEM = "apple-generic"; 429 | }; 430 | name = Profile; 431 | }; 432 | 97C147031CF9000F007C117D /* Debug */ = { 433 | isa = XCBuildConfiguration; 434 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 435 | buildSettings = { 436 | ALWAYS_SEARCH_USER_PATHS = NO; 437 | CLANG_ANALYZER_NONNULL = YES; 438 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 439 | CLANG_CXX_LIBRARY = "libc++"; 440 | CLANG_ENABLE_MODULES = YES; 441 | CLANG_ENABLE_OBJC_ARC = YES; 442 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 443 | CLANG_WARN_BOOL_CONVERSION = YES; 444 | CLANG_WARN_COMMA = YES; 445 | CLANG_WARN_CONSTANT_CONVERSION = YES; 446 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 447 | CLANG_WARN_EMPTY_BODY = YES; 448 | CLANG_WARN_ENUM_CONVERSION = YES; 449 | CLANG_WARN_INFINITE_RECURSION = YES; 450 | CLANG_WARN_INT_CONVERSION = YES; 451 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 452 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 453 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 454 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 455 | CLANG_WARN_STRICT_PROTOTYPES = YES; 456 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 457 | CLANG_WARN_UNREACHABLE_CODE = YES; 458 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 459 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 460 | COPY_PHASE_STRIP = NO; 461 | DEBUG_INFORMATION_FORMAT = dwarf; 462 | ENABLE_STRICT_OBJC_MSGSEND = YES; 463 | ENABLE_TESTABILITY = YES; 464 | GCC_C_LANGUAGE_STANDARD = gnu99; 465 | GCC_DYNAMIC_NO_PIC = NO; 466 | GCC_NO_COMMON_BLOCKS = YES; 467 | GCC_OPTIMIZATION_LEVEL = 0; 468 | GCC_PREPROCESSOR_DEFINITIONS = ( 469 | "DEBUG=1", 470 | "$(inherited)", 471 | ); 472 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 473 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 474 | GCC_WARN_UNDECLARED_SELECTOR = YES; 475 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 476 | GCC_WARN_UNUSED_FUNCTION = YES; 477 | GCC_WARN_UNUSED_VARIABLE = YES; 478 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 479 | MTL_ENABLE_DEBUG_INFO = YES; 480 | ONLY_ACTIVE_ARCH = YES; 481 | SDKROOT = iphoneos; 482 | TARGETED_DEVICE_FAMILY = "1,2"; 483 | }; 484 | name = Debug; 485 | }; 486 | 97C147041CF9000F007C117D /* Release */ = { 487 | isa = XCBuildConfiguration; 488 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 489 | buildSettings = { 490 | ALWAYS_SEARCH_USER_PATHS = NO; 491 | CLANG_ANALYZER_NONNULL = YES; 492 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 493 | CLANG_CXX_LIBRARY = "libc++"; 494 | CLANG_ENABLE_MODULES = YES; 495 | CLANG_ENABLE_OBJC_ARC = YES; 496 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 497 | CLANG_WARN_BOOL_CONVERSION = YES; 498 | CLANG_WARN_COMMA = YES; 499 | CLANG_WARN_CONSTANT_CONVERSION = YES; 500 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 501 | CLANG_WARN_EMPTY_BODY = YES; 502 | CLANG_WARN_ENUM_CONVERSION = YES; 503 | CLANG_WARN_INFINITE_RECURSION = YES; 504 | CLANG_WARN_INT_CONVERSION = YES; 505 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 506 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 507 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 508 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 509 | CLANG_WARN_STRICT_PROTOTYPES = YES; 510 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 511 | CLANG_WARN_UNREACHABLE_CODE = YES; 512 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 513 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 514 | COPY_PHASE_STRIP = NO; 515 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 516 | ENABLE_NS_ASSERTIONS = NO; 517 | ENABLE_STRICT_OBJC_MSGSEND = YES; 518 | GCC_C_LANGUAGE_STANDARD = gnu99; 519 | GCC_NO_COMMON_BLOCKS = YES; 520 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 521 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 522 | GCC_WARN_UNDECLARED_SELECTOR = YES; 523 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 524 | GCC_WARN_UNUSED_FUNCTION = YES; 525 | GCC_WARN_UNUSED_VARIABLE = YES; 526 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 527 | MTL_ENABLE_DEBUG_INFO = NO; 528 | SDKROOT = iphoneos; 529 | TARGETED_DEVICE_FAMILY = "1,2"; 530 | VALIDATE_PRODUCT = YES; 531 | }; 532 | name = Release; 533 | }; 534 | 97C147061CF9000F007C117D /* Debug */ = { 535 | isa = XCBuildConfiguration; 536 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 537 | buildSettings = { 538 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 539 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 540 | ENABLE_BITCODE = NO; 541 | FRAMEWORK_SEARCH_PATHS = ( 542 | "$(inherited)", 543 | "$(PROJECT_DIR)/Flutter", 544 | ); 545 | INFOPLIST_FILE = Runner/Info.plist; 546 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 547 | LIBRARY_SEARCH_PATHS = ( 548 | "$(inherited)", 549 | "$(PROJECT_DIR)/Flutter", 550 | ); 551 | PRODUCT_BUNDLE_IDENTIFIER = "com.alfianlosari.flutter-training-com.alfianlosari.flutter-training"; 552 | PRODUCT_NAME = "$(TARGET_NAME)"; 553 | VERSIONING_SYSTEM = "apple-generic"; 554 | }; 555 | name = Debug; 556 | }; 557 | 97C147071CF9000F007C117D /* Release */ = { 558 | isa = XCBuildConfiguration; 559 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 560 | buildSettings = { 561 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 562 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 563 | ENABLE_BITCODE = NO; 564 | FRAMEWORK_SEARCH_PATHS = ( 565 | "$(inherited)", 566 | "$(PROJECT_DIR)/Flutter", 567 | ); 568 | INFOPLIST_FILE = Runner/Info.plist; 569 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 570 | LIBRARY_SEARCH_PATHS = ( 571 | "$(inherited)", 572 | "$(PROJECT_DIR)/Flutter", 573 | ); 574 | PRODUCT_BUNDLE_IDENTIFIER = "com.alfianlosari.flutter-training-com.alfianlosari.flutter-training"; 575 | PRODUCT_NAME = "$(TARGET_NAME)"; 576 | VERSIONING_SYSTEM = "apple-generic"; 577 | }; 578 | name = Release; 579 | }; 580 | /* End XCBuildConfiguration section */ 581 | 582 | /* Begin XCConfigurationList section */ 583 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 584 | isa = XCConfigurationList; 585 | buildConfigurations = ( 586 | 97C147031CF9000F007C117D /* Debug */, 587 | 97C147041CF9000F007C117D /* Release */, 588 | 249021D3217E4FDB00AE95B9 /* Profile */, 589 | ); 590 | defaultConfigurationIsVisible = 0; 591 | defaultConfigurationName = Release; 592 | }; 593 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 594 | isa = XCConfigurationList; 595 | buildConfigurations = ( 596 | 97C147061CF9000F007C117D /* Debug */, 597 | 97C147071CF9000F007C117D /* Release */, 598 | 249021D4217E4FDB00AE95B9 /* Profile */, 599 | ); 600 | defaultConfigurationIsVisible = 0; 601 | defaultConfigurationName = Release; 602 | }; 603 | /* End XCConfigurationList section */ 604 | }; 605 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 606 | } 607 | -------------------------------------------------------------------------------- /functions/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@firebase/app": { 7 | "version": "0.3.17", 8 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.17.tgz", 9 | "integrity": "sha512-/8lDeeIxgdCIMffrfBPQ3bcdSkF8bx4KCp8pKMPOG/HYKoeM8I9eP4zlzxL5ABzRjvcdhK9KOYOn0jRrNrGD9g==", 10 | "requires": { 11 | "@firebase/app-types": "0.3.10", 12 | "@firebase/util": "0.2.14", 13 | "dom-storage": "2.1.0", 14 | "tslib": "1.9.3", 15 | "xmlhttprequest": "1.8.0" 16 | } 17 | }, 18 | "@firebase/app-types": { 19 | "version": "0.3.10", 20 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.10.tgz", 21 | "integrity": "sha512-l+5BJtSQopalBXiY/YuSaB9KF9PnDj37FLV0Sx3qJjh5B3IthCuZbPc1Vpbbbee/QZgudl0G212BBsUMGHP+fQ==" 22 | }, 23 | "@firebase/database": { 24 | "version": "0.3.20", 25 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.20.tgz", 26 | "integrity": "sha512-fZHRIlRQlND/UrzI1beUTRKfktjMvMEiUOar6ylFZqOj2KNVO4CrF95UGqRl0HBGhZzlBKzaDYAcJze2D6C4+Q==", 27 | "requires": { 28 | "@firebase/database-types": "0.3.11", 29 | "@firebase/logger": "0.1.13", 30 | "@firebase/util": "0.2.14", 31 | "faye-websocket": "0.11.1", 32 | "tslib": "1.9.3" 33 | } 34 | }, 35 | "@firebase/database-types": { 36 | "version": "0.3.11", 37 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.11.tgz", 38 | "integrity": "sha512-iRAZzs7Zlmmvh7r0XlR1MAO6I6bm1HjW9m1ytfJ6E/8+zItHnbVH4iiVVkC39r1wMGrtPMz8FiIUWoaasPF5dA==" 39 | }, 40 | "@firebase/logger": { 41 | "version": "0.1.13", 42 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.13.tgz", 43 | "integrity": "sha512-wIbLwQ2oJCkvHIE7J3FDxpScKY84fSctEEjOi0PB+Yn2dN8AwqtM7YF8rtcY8cxntv8dyR+i7GNg1Nd89cGxkA==" 44 | }, 45 | "@firebase/util": { 46 | "version": "0.2.14", 47 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.14.tgz", 48 | "integrity": "sha512-2ke1Lra0R5T+5ucCMWft/IB2rI/IzumHHYm9aqrM9lJ3XURiWmBHAYrvaPVP7///gDhJAo+NNDUCAJH/Y4PmvA==", 49 | "requires": { 50 | "tslib": "1.9.3" 51 | } 52 | }, 53 | "@google-cloud/common": { 54 | "version": "0.32.1", 55 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", 56 | "integrity": "sha512-bLdPzFvvBMtVkwsoBtygE9oUm3yrNmPa71gvOgucYI/GqvNP2tb6RYsDHPq98kvignhcgHGDI5wyNgxaCo8bKQ==", 57 | "optional": true, 58 | "requires": { 59 | "@google-cloud/projectify": "^0.3.3", 60 | "@google-cloud/promisify": "^0.4.0", 61 | "@types/request": "^2.48.1", 62 | "arrify": "^2.0.0", 63 | "duplexify": "^3.6.0", 64 | "ent": "^2.2.0", 65 | "extend": "^3.0.2", 66 | "google-auth-library": "^3.1.1", 67 | "pify": "^4.0.1", 68 | "retry-request": "^4.0.0", 69 | "teeny-request": "^3.11.3" 70 | }, 71 | "dependencies": { 72 | "arrify": { 73 | "version": "2.0.1", 74 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 75 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", 76 | "optional": true 77 | } 78 | } 79 | }, 80 | "@google-cloud/firestore": { 81 | "version": "1.3.0", 82 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-1.3.0.tgz", 83 | "integrity": "sha512-KUKcHUU+FwwBmJH1LqJcd+XtLPzMcS/Vni6/WCJGHBGrOBmXCey4i3Gc41ZsuSk1Qx4msH5f+4h0b3t6YLyydg==", 84 | "optional": true, 85 | "requires": { 86 | "bun": "^0.0.12", 87 | "deep-equal": "^1.0.1", 88 | "functional-red-black-tree": "^1.0.1", 89 | "google-gax": "^0.25.0", 90 | "lodash.merge": "^4.6.1", 91 | "through2": "^3.0.0" 92 | } 93 | }, 94 | "@google-cloud/paginator": { 95 | "version": "0.2.0", 96 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-0.2.0.tgz", 97 | "integrity": "sha512-2ZSARojHDhkLvQ+CS32K+iUhBsWg3AEw+uxtqblA7xoCABDyhpj99FPp35xy6A+XlzMhOSrHHaxFE+t6ZTQq0w==", 98 | "optional": true, 99 | "requires": { 100 | "arrify": "^1.0.1", 101 | "extend": "^3.0.1", 102 | "split-array-stream": "^2.0.0", 103 | "stream-events": "^1.0.4" 104 | } 105 | }, 106 | "@google-cloud/projectify": { 107 | "version": "0.3.3", 108 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.3.tgz", 109 | "integrity": "sha512-7522YHQ4IhaafgSunsFF15nG0TGVmxgXidy9cITMe+256RgqfcrfWphiMufW+Ou4kqagW/u3yxwbzVEW3dk2Uw==", 110 | "optional": true 111 | }, 112 | "@google-cloud/promisify": { 113 | "version": "0.4.0", 114 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.4.0.tgz", 115 | "integrity": "sha512-4yAHDC52TEMCNcMzVC8WlqnKKKq+Ssi2lXoUg9zWWkZ6U6tq9ZBRYLHHCRdfU+EU9YJsVmivwGcKYCjRGjnf4Q==" 116 | }, 117 | "@google-cloud/storage": { 118 | "version": "2.5.0", 119 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-2.5.0.tgz", 120 | "integrity": "sha512-q1mwB6RUebIahbA3eriRs8DbG2Ij81Ynb9k8hMqTPkmbd8/S6Z0d6hVvfPmnyvX9Ej13IcmEYIbymuq/RBLghA==", 121 | "optional": true, 122 | "requires": { 123 | "@google-cloud/common": "^0.32.0", 124 | "@google-cloud/paginator": "^0.2.0", 125 | "@google-cloud/promisify": "^0.4.0", 126 | "arrify": "^1.0.0", 127 | "async": "^2.0.1", 128 | "compressible": "^2.0.12", 129 | "concat-stream": "^2.0.0", 130 | "date-and-time": "^0.6.3", 131 | "duplexify": "^3.5.0", 132 | "extend": "^3.0.0", 133 | "gcs-resumable-upload": "^1.0.0", 134 | "hash-stream-validation": "^0.2.1", 135 | "mime": "^2.2.0", 136 | "mime-types": "^2.0.8", 137 | "onetime": "^5.1.0", 138 | "pumpify": "^1.5.1", 139 | "snakeize": "^0.1.0", 140 | "stream-events": "^1.0.1", 141 | "teeny-request": "^3.11.3", 142 | "through2": "^3.0.0", 143 | "xdg-basedir": "^3.0.0" 144 | } 145 | }, 146 | "@google-cloud/video-intelligence": { 147 | "version": "1.6.0", 148 | "resolved": "https://registry.npmjs.org/@google-cloud/video-intelligence/-/video-intelligence-1.6.0.tgz", 149 | "integrity": "sha512-H1a6uq1EqVhvaiO7QySv9I+nGInOAwi0ysa/z9mVu4NfIAo6ov1rZc4M7h5uJZVZ9+mle/M2yPmFs2jAJHvPFw==", 150 | "requires": { 151 | "google-gax": "^0.25.0", 152 | "lodash.merge": "^4.6.1", 153 | "protobufjs": "^6.8.6" 154 | } 155 | }, 156 | "@grpc/grpc-js": { 157 | "version": "0.3.6", 158 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.3.6.tgz", 159 | "integrity": "sha512-SmLNuPGlUur64bNS9aHZguqWDVQ8+Df1CGn+xsh7l6T2wiP5ArOMlywZ3TZo6z/rwKtGQgUJY9ZrPYUmHEXd/Q==", 160 | "requires": { 161 | "semver": "^5.5.0" 162 | }, 163 | "dependencies": { 164 | "semver": { 165 | "version": "5.7.0", 166 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 167 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 168 | } 169 | } 170 | }, 171 | "@grpc/proto-loader": { 172 | "version": "0.4.0", 173 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.4.0.tgz", 174 | "integrity": "sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==", 175 | "requires": { 176 | "lodash.camelcase": "^4.3.0", 177 | "protobufjs": "^6.8.6" 178 | } 179 | }, 180 | "@protobufjs/aspromise": { 181 | "version": "1.1.2", 182 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 183 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 184 | }, 185 | "@protobufjs/base64": { 186 | "version": "1.1.2", 187 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 188 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 189 | }, 190 | "@protobufjs/codegen": { 191 | "version": "2.0.4", 192 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 193 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 194 | }, 195 | "@protobufjs/eventemitter": { 196 | "version": "1.1.0", 197 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 198 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 199 | }, 200 | "@protobufjs/fetch": { 201 | "version": "1.1.0", 202 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 203 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 204 | "requires": { 205 | "@protobufjs/aspromise": "^1.1.1", 206 | "@protobufjs/inquire": "^1.1.0" 207 | } 208 | }, 209 | "@protobufjs/float": { 210 | "version": "1.0.2", 211 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 212 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 213 | }, 214 | "@protobufjs/inquire": { 215 | "version": "1.1.0", 216 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 217 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 218 | }, 219 | "@protobufjs/path": { 220 | "version": "1.1.2", 221 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 222 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 223 | }, 224 | "@protobufjs/pool": { 225 | "version": "1.1.0", 226 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 227 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 228 | }, 229 | "@protobufjs/utf8": { 230 | "version": "1.1.0", 231 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 232 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 233 | }, 234 | "@types/body-parser": { 235 | "version": "1.17.0", 236 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 237 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 238 | "requires": { 239 | "@types/connect": "*", 240 | "@types/node": "*" 241 | } 242 | }, 243 | "@types/caseless": { 244 | "version": "0.12.2", 245 | "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", 246 | "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", 247 | "optional": true 248 | }, 249 | "@types/connect": { 250 | "version": "3.4.32", 251 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 252 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 253 | "requires": { 254 | "@types/node": "*" 255 | } 256 | }, 257 | "@types/cors": { 258 | "version": "2.8.5", 259 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.5.tgz", 260 | "integrity": "sha512-GmK8AKu8i+s+EChK/uZ5IbrXPcPaQKWaNSGevDT/7o3gFObwSUQwqb1jMqxuo+YPvj0ckGzINI+EO7EHcmJjKg==", 261 | "requires": { 262 | "@types/express": "*" 263 | } 264 | }, 265 | "@types/express": { 266 | "version": "4.16.1", 267 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", 268 | "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", 269 | "requires": { 270 | "@types/body-parser": "*", 271 | "@types/express-serve-static-core": "*", 272 | "@types/serve-static": "*" 273 | } 274 | }, 275 | "@types/express-serve-static-core": { 276 | "version": "4.16.4", 277 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.4.tgz", 278 | "integrity": "sha512-x/8h6FHm14rPWnW2HP5likD/rsqJ3t/77OWx2PLxym0hXbeBWQmcPyHmwX+CtCQpjIfgrUdEoDFcLPwPZWiqzQ==", 279 | "requires": { 280 | "@types/node": "*", 281 | "@types/range-parser": "*" 282 | } 283 | }, 284 | "@types/form-data": { 285 | "version": "2.2.1", 286 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", 287 | "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", 288 | "optional": true, 289 | "requires": { 290 | "@types/node": "*" 291 | } 292 | }, 293 | "@types/jsonwebtoken": { 294 | "version": "7.2.8", 295 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz", 296 | "integrity": "sha512-XENN3YzEB8D6TiUww0O8SRznzy1v+77lH7UmuN54xq/IHIsyWjWOzZuFFTtoiRuaE782uAoRwBe/wwow+vQXZw==", 297 | "requires": { 298 | "@types/node": "*" 299 | } 300 | }, 301 | "@types/lodash": { 302 | "version": "4.14.123", 303 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", 304 | "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==" 305 | }, 306 | "@types/long": { 307 | "version": "4.0.0", 308 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 309 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 310 | }, 311 | "@types/mime": { 312 | "version": "2.0.1", 313 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 314 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" 315 | }, 316 | "@types/node": { 317 | "version": "8.10.48", 318 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz", 319 | "integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==" 320 | }, 321 | "@types/range-parser": { 322 | "version": "1.2.3", 323 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 324 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 325 | }, 326 | "@types/request": { 327 | "version": "2.48.1", 328 | "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", 329 | "integrity": "sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==", 330 | "optional": true, 331 | "requires": { 332 | "@types/caseless": "*", 333 | "@types/form-data": "*", 334 | "@types/node": "*", 335 | "@types/tough-cookie": "*" 336 | } 337 | }, 338 | "@types/serve-static": { 339 | "version": "1.13.2", 340 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 341 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 342 | "requires": { 343 | "@types/express-serve-static-core": "*", 344 | "@types/mime": "*" 345 | } 346 | }, 347 | "@types/tough-cookie": { 348 | "version": "2.3.5", 349 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", 350 | "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", 351 | "optional": true 352 | }, 353 | "abort-controller": { 354 | "version": "3.0.0", 355 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 356 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 357 | "requires": { 358 | "event-target-shim": "^5.0.0" 359 | } 360 | }, 361 | "accepts": { 362 | "version": "1.3.7", 363 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 364 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 365 | "requires": { 366 | "mime-types": "~2.1.24", 367 | "negotiator": "0.6.2" 368 | } 369 | }, 370 | "agent-base": { 371 | "version": "4.2.1", 372 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", 373 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", 374 | "requires": { 375 | "es6-promisify": "^5.0.0" 376 | } 377 | }, 378 | "ansi-regex": { 379 | "version": "2.1.1", 380 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 381 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 382 | }, 383 | "array-flatten": { 384 | "version": "1.1.1", 385 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 386 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 387 | }, 388 | "arrify": { 389 | "version": "1.0.1", 390 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 391 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 392 | "optional": true 393 | }, 394 | "ascli": { 395 | "version": "1.0.1", 396 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 397 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 398 | "requires": { 399 | "colour": "~0.7.1", 400 | "optjs": "~3.2.2" 401 | } 402 | }, 403 | "async": { 404 | "version": "2.6.2", 405 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", 406 | "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", 407 | "optional": true, 408 | "requires": { 409 | "lodash": "^4.17.11" 410 | } 411 | }, 412 | "balanced-match": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 415 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 416 | }, 417 | "base64-js": { 418 | "version": "1.3.0", 419 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 420 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 421 | }, 422 | "bignumber.js": { 423 | "version": "7.2.1", 424 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", 425 | "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" 426 | }, 427 | "body-parser": { 428 | "version": "1.18.3", 429 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 430 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 431 | "requires": { 432 | "bytes": "3.0.0", 433 | "content-type": "~1.0.4", 434 | "debug": "2.6.9", 435 | "depd": "~1.1.2", 436 | "http-errors": "~1.6.3", 437 | "iconv-lite": "0.4.23", 438 | "on-finished": "~2.3.0", 439 | "qs": "6.5.2", 440 | "raw-body": "2.3.3", 441 | "type-is": "~1.6.16" 442 | }, 443 | "dependencies": { 444 | "debug": { 445 | "version": "2.6.9", 446 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 447 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 448 | "requires": { 449 | "ms": "2.0.0" 450 | } 451 | }, 452 | "ms": { 453 | "version": "2.0.0", 454 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 455 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 456 | } 457 | } 458 | }, 459 | "brace-expansion": { 460 | "version": "1.1.11", 461 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 462 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 463 | "requires": { 464 | "balanced-match": "^1.0.0", 465 | "concat-map": "0.0.1" 466 | } 467 | }, 468 | "buffer-equal-constant-time": { 469 | "version": "1.0.1", 470 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 471 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 472 | }, 473 | "buffer-from": { 474 | "version": "1.1.1", 475 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 476 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 477 | "optional": true 478 | }, 479 | "bun": { 480 | "version": "0.0.12", 481 | "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", 482 | "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", 483 | "optional": true, 484 | "requires": { 485 | "readable-stream": "~1.0.32" 486 | } 487 | }, 488 | "bytebuffer": { 489 | "version": "5.0.1", 490 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 491 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 492 | "requires": { 493 | "long": "~3" 494 | }, 495 | "dependencies": { 496 | "long": { 497 | "version": "3.2.0", 498 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 499 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 500 | } 501 | } 502 | }, 503 | "bytes": { 504 | "version": "3.0.0", 505 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 506 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 507 | }, 508 | "camelcase": { 509 | "version": "2.1.1", 510 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 511 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 512 | }, 513 | "cliui": { 514 | "version": "3.2.0", 515 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 516 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 517 | "requires": { 518 | "string-width": "^1.0.1", 519 | "strip-ansi": "^3.0.1", 520 | "wrap-ansi": "^2.0.0" 521 | } 522 | }, 523 | "code-point-at": { 524 | "version": "1.1.0", 525 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 526 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 527 | }, 528 | "colour": { 529 | "version": "0.7.1", 530 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 531 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 532 | }, 533 | "compressible": { 534 | "version": "2.0.17", 535 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", 536 | "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", 537 | "optional": true, 538 | "requires": { 539 | "mime-db": ">= 1.40.0 < 2" 540 | } 541 | }, 542 | "concat-map": { 543 | "version": "0.0.1", 544 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 545 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 546 | }, 547 | "concat-stream": { 548 | "version": "2.0.0", 549 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 550 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 551 | "optional": true, 552 | "requires": { 553 | "buffer-from": "^1.0.0", 554 | "inherits": "^2.0.3", 555 | "readable-stream": "^3.0.2", 556 | "typedarray": "^0.0.6" 557 | }, 558 | "dependencies": { 559 | "readable-stream": { 560 | "version": "3.3.0", 561 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", 562 | "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", 563 | "optional": true, 564 | "requires": { 565 | "inherits": "^2.0.3", 566 | "string_decoder": "^1.1.1", 567 | "util-deprecate": "^1.0.1" 568 | } 569 | }, 570 | "string_decoder": { 571 | "version": "1.2.0", 572 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 573 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 574 | "optional": true, 575 | "requires": { 576 | "safe-buffer": "~5.1.0" 577 | } 578 | } 579 | } 580 | }, 581 | "configstore": { 582 | "version": "4.0.0", 583 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", 584 | "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", 585 | "optional": true, 586 | "requires": { 587 | "dot-prop": "^4.1.0", 588 | "graceful-fs": "^4.1.2", 589 | "make-dir": "^1.0.0", 590 | "unique-string": "^1.0.0", 591 | "write-file-atomic": "^2.0.0", 592 | "xdg-basedir": "^3.0.0" 593 | } 594 | }, 595 | "content-disposition": { 596 | "version": "0.5.2", 597 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 598 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 599 | }, 600 | "content-type": { 601 | "version": "1.0.4", 602 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 603 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 604 | }, 605 | "cookie": { 606 | "version": "0.3.1", 607 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 608 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 609 | }, 610 | "cookie-signature": { 611 | "version": "1.0.6", 612 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 613 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 614 | }, 615 | "core-util-is": { 616 | "version": "1.0.2", 617 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 618 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 619 | }, 620 | "cors": { 621 | "version": "2.8.5", 622 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 623 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 624 | "requires": { 625 | "object-assign": "^4", 626 | "vary": "^1" 627 | } 628 | }, 629 | "crypto-random-string": { 630 | "version": "1.0.0", 631 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 632 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 633 | "optional": true 634 | }, 635 | "date-and-time": { 636 | "version": "0.6.3", 637 | "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.6.3.tgz", 638 | "integrity": "sha512-lcWy3AXDRJOD7MplwZMmNSRM//kZtJaLz4n6D1P5z9wEmZGBKhJRBIr1Xs9KNQJmdXPblvgffynYji4iylUTcA==", 639 | "optional": true 640 | }, 641 | "debug": { 642 | "version": "3.2.6", 643 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 644 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 645 | "requires": { 646 | "ms": "^2.1.1" 647 | } 648 | }, 649 | "decamelize": { 650 | "version": "1.2.0", 651 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 652 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 653 | }, 654 | "deep-equal": { 655 | "version": "1.0.1", 656 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 657 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 658 | "optional": true 659 | }, 660 | "depd": { 661 | "version": "1.1.2", 662 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 663 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 664 | }, 665 | "destroy": { 666 | "version": "1.0.4", 667 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 668 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 669 | }, 670 | "dom-storage": { 671 | "version": "2.1.0", 672 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 673 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 674 | }, 675 | "dot-prop": { 676 | "version": "4.2.0", 677 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 678 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 679 | "optional": true, 680 | "requires": { 681 | "is-obj": "^1.0.0" 682 | } 683 | }, 684 | "duplexify": { 685 | "version": "3.7.1", 686 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 687 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 688 | "requires": { 689 | "end-of-stream": "^1.0.0", 690 | "inherits": "^2.0.1", 691 | "readable-stream": "^2.0.0", 692 | "stream-shift": "^1.0.0" 693 | }, 694 | "dependencies": { 695 | "isarray": { 696 | "version": "1.0.0", 697 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 698 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 699 | }, 700 | "readable-stream": { 701 | "version": "2.3.6", 702 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 703 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 704 | "requires": { 705 | "core-util-is": "~1.0.0", 706 | "inherits": "~2.0.3", 707 | "isarray": "~1.0.0", 708 | "process-nextick-args": "~2.0.0", 709 | "safe-buffer": "~5.1.1", 710 | "string_decoder": "~1.1.1", 711 | "util-deprecate": "~1.0.1" 712 | } 713 | }, 714 | "string_decoder": { 715 | "version": "1.1.1", 716 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 717 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 718 | "requires": { 719 | "safe-buffer": "~5.1.0" 720 | } 721 | } 722 | } 723 | }, 724 | "ecdsa-sig-formatter": { 725 | "version": "1.0.11", 726 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 727 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 728 | "requires": { 729 | "safe-buffer": "^5.0.1" 730 | } 731 | }, 732 | "ee-first": { 733 | "version": "1.1.1", 734 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 735 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 736 | }, 737 | "encodeurl": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 740 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 741 | }, 742 | "end-of-stream": { 743 | "version": "1.4.1", 744 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 745 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 746 | "requires": { 747 | "once": "^1.4.0" 748 | } 749 | }, 750 | "ent": { 751 | "version": "2.2.0", 752 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 753 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", 754 | "optional": true 755 | }, 756 | "es6-promise": { 757 | "version": "4.2.6", 758 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", 759 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" 760 | }, 761 | "es6-promisify": { 762 | "version": "5.0.0", 763 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 764 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 765 | "requires": { 766 | "es6-promise": "^4.0.3" 767 | } 768 | }, 769 | "escape-html": { 770 | "version": "1.0.3", 771 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 772 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 773 | }, 774 | "etag": { 775 | "version": "1.8.1", 776 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 777 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 778 | }, 779 | "event-target-shim": { 780 | "version": "5.0.1", 781 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 782 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 783 | }, 784 | "express": { 785 | "version": "4.16.4", 786 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 787 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 788 | "requires": { 789 | "accepts": "~1.3.5", 790 | "array-flatten": "1.1.1", 791 | "body-parser": "1.18.3", 792 | "content-disposition": "0.5.2", 793 | "content-type": "~1.0.4", 794 | "cookie": "0.3.1", 795 | "cookie-signature": "1.0.6", 796 | "debug": "2.6.9", 797 | "depd": "~1.1.2", 798 | "encodeurl": "~1.0.2", 799 | "escape-html": "~1.0.3", 800 | "etag": "~1.8.1", 801 | "finalhandler": "1.1.1", 802 | "fresh": "0.5.2", 803 | "merge-descriptors": "1.0.1", 804 | "methods": "~1.1.2", 805 | "on-finished": "~2.3.0", 806 | "parseurl": "~1.3.2", 807 | "path-to-regexp": "0.1.7", 808 | "proxy-addr": "~2.0.4", 809 | "qs": "6.5.2", 810 | "range-parser": "~1.2.0", 811 | "safe-buffer": "5.1.2", 812 | "send": "0.16.2", 813 | "serve-static": "1.13.2", 814 | "setprototypeof": "1.1.0", 815 | "statuses": "~1.4.0", 816 | "type-is": "~1.6.16", 817 | "utils-merge": "1.0.1", 818 | "vary": "~1.1.2" 819 | }, 820 | "dependencies": { 821 | "debug": { 822 | "version": "2.6.9", 823 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 824 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 825 | "requires": { 826 | "ms": "2.0.0" 827 | } 828 | }, 829 | "ms": { 830 | "version": "2.0.0", 831 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 832 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 833 | } 834 | } 835 | }, 836 | "extend": { 837 | "version": "3.0.2", 838 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 839 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 840 | }, 841 | "fast-text-encoding": { 842 | "version": "1.0.0", 843 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", 844 | "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" 845 | }, 846 | "faye-websocket": { 847 | "version": "0.11.1", 848 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", 849 | "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", 850 | "requires": { 851 | "websocket-driver": ">=0.5.1" 852 | } 853 | }, 854 | "finalhandler": { 855 | "version": "1.1.1", 856 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 857 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 858 | "requires": { 859 | "debug": "2.6.9", 860 | "encodeurl": "~1.0.2", 861 | "escape-html": "~1.0.3", 862 | "on-finished": "~2.3.0", 863 | "parseurl": "~1.3.2", 864 | "statuses": "~1.4.0", 865 | "unpipe": "~1.0.0" 866 | }, 867 | "dependencies": { 868 | "debug": { 869 | "version": "2.6.9", 870 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 871 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 872 | "requires": { 873 | "ms": "2.0.0" 874 | } 875 | }, 876 | "ms": { 877 | "version": "2.0.0", 878 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 879 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 880 | } 881 | } 882 | }, 883 | "firebase-admin": { 884 | "version": "7.0.0", 885 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-7.0.0.tgz", 886 | "integrity": "sha512-uYJVRuq8/b9PeJrgZwE2OIfr/MQAVhWxUpOa4AnWEEjzM7hzw2CQjY2iFzH6o0/7rTyAiGeFPQQQLBMg/xuQ6w==", 887 | "requires": { 888 | "@firebase/app": "^0.3.4", 889 | "@firebase/database": "^0.3.6", 890 | "@google-cloud/firestore": "^1.0.1", 891 | "@google-cloud/storage": "^2.3.0", 892 | "@types/node": "^8.0.53", 893 | "jsonwebtoken": "8.1.0", 894 | "node-forge": "0.7.4" 895 | } 896 | }, 897 | "firebase-functions": { 898 | "version": "2.3.0", 899 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-2.3.0.tgz", 900 | "integrity": "sha512-bUhaX5aW5SaLxDsC+F7Phbbb4KPPYyn4XlhqR8jdQCbiQMC9udxIOYy21d+vGR2XvSPH2fE7vgHsvOOzEQ0SmQ==", 901 | "requires": { 902 | "@types/cors": "^2.8.1", 903 | "@types/express": "^4.11.1", 904 | "@types/jsonwebtoken": "^7.2.6", 905 | "@types/lodash": "^4.14.34", 906 | "cors": "^2.8.4", 907 | "express": "^4.16.2", 908 | "jsonwebtoken": "^8.2.1", 909 | "lodash": "^4.6.1" 910 | }, 911 | "dependencies": { 912 | "jsonwebtoken": { 913 | "version": "8.5.1", 914 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 915 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 916 | "requires": { 917 | "jws": "^3.2.2", 918 | "lodash.includes": "^4.3.0", 919 | "lodash.isboolean": "^3.0.3", 920 | "lodash.isinteger": "^4.0.4", 921 | "lodash.isnumber": "^3.0.3", 922 | "lodash.isplainobject": "^4.0.6", 923 | "lodash.isstring": "^4.0.1", 924 | "lodash.once": "^4.0.0", 925 | "ms": "^2.1.1", 926 | "semver": "^5.6.0" 927 | } 928 | }, 929 | "semver": { 930 | "version": "5.7.0", 931 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 932 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 933 | } 934 | } 935 | }, 936 | "forwarded": { 937 | "version": "0.1.2", 938 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 939 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 940 | }, 941 | "fresh": { 942 | "version": "0.5.2", 943 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 944 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 945 | }, 946 | "fs.realpath": { 947 | "version": "1.0.0", 948 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 949 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 950 | }, 951 | "functional-red-black-tree": { 952 | "version": "1.0.1", 953 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 954 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 955 | "optional": true 956 | }, 957 | "gaxios": { 958 | "version": "1.8.4", 959 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", 960 | "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", 961 | "requires": { 962 | "abort-controller": "^3.0.0", 963 | "extend": "^3.0.2", 964 | "https-proxy-agent": "^2.2.1", 965 | "node-fetch": "^2.3.0" 966 | } 967 | }, 968 | "gcp-metadata": { 969 | "version": "1.0.0", 970 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz", 971 | "integrity": "sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==", 972 | "requires": { 973 | "gaxios": "^1.0.2", 974 | "json-bigint": "^0.3.0" 975 | } 976 | }, 977 | "gcs-resumable-upload": { 978 | "version": "1.1.0", 979 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-1.1.0.tgz", 980 | "integrity": "sha512-uBz7uHqp44xjSDzG3kLbOYZDjxxR/UAGbB47A0cC907W6yd2LkcyFDTHg+bjivkHMwiJlKv4guVWcjPCk2zScg==", 981 | "optional": true, 982 | "requires": { 983 | "abort-controller": "^2.0.2", 984 | "configstore": "^4.0.0", 985 | "gaxios": "^1.5.0", 986 | "google-auth-library": "^3.0.0", 987 | "pumpify": "^1.5.1", 988 | "stream-events": "^1.0.4" 989 | }, 990 | "dependencies": { 991 | "abort-controller": { 992 | "version": "2.0.3", 993 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-2.0.3.tgz", 994 | "integrity": "sha512-EPSq5wr2aFyAZ1PejJB32IX9Qd4Nwus+adnp7STYFM5/23nLPBazqZ1oor6ZqbH+4otaaGXTlC8RN5hq3C8w9Q==", 995 | "optional": true, 996 | "requires": { 997 | "event-target-shim": "^5.0.0" 998 | } 999 | } 1000 | } 1001 | }, 1002 | "glob": { 1003 | "version": "7.1.3", 1004 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1005 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1006 | "requires": { 1007 | "fs.realpath": "^1.0.0", 1008 | "inflight": "^1.0.4", 1009 | "inherits": "2", 1010 | "minimatch": "^3.0.4", 1011 | "once": "^1.3.0", 1012 | "path-is-absolute": "^1.0.0" 1013 | } 1014 | }, 1015 | "google-auth-library": { 1016 | "version": "3.1.2", 1017 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", 1018 | "integrity": "sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==", 1019 | "requires": { 1020 | "base64-js": "^1.3.0", 1021 | "fast-text-encoding": "^1.0.0", 1022 | "gaxios": "^1.2.1", 1023 | "gcp-metadata": "^1.0.0", 1024 | "gtoken": "^2.3.2", 1025 | "https-proxy-agent": "^2.2.1", 1026 | "jws": "^3.1.5", 1027 | "lru-cache": "^5.0.0", 1028 | "semver": "^5.5.0" 1029 | }, 1030 | "dependencies": { 1031 | "semver": { 1032 | "version": "5.7.0", 1033 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 1034 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 1035 | } 1036 | } 1037 | }, 1038 | "google-gax": { 1039 | "version": "0.25.6", 1040 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.25.6.tgz", 1041 | "integrity": "sha512-+CVtOSLQt42mwVvJJirhBiAvWsp8zKeb9zW5Wy3wyvb3VG9OugHzZpwvYO9D4yNPPspe7L9CpIs80I5nUJlS8w==", 1042 | "requires": { 1043 | "@grpc/grpc-js": "^0.3.0", 1044 | "@grpc/proto-loader": "^0.4.0", 1045 | "duplexify": "^3.6.0", 1046 | "google-auth-library": "^3.0.0", 1047 | "google-proto-files": "^0.20.0", 1048 | "grpc": "^1.16.0", 1049 | "grpc-gcp": "^0.1.1", 1050 | "is-stream-ended": "^0.1.4", 1051 | "lodash.at": "^4.6.0", 1052 | "lodash.has": "^4.5.2", 1053 | "protobufjs": "^6.8.8", 1054 | "retry-request": "^4.0.0", 1055 | "semver": "^6.0.0", 1056 | "walkdir": "^0.3.2" 1057 | } 1058 | }, 1059 | "google-p12-pem": { 1060 | "version": "1.0.4", 1061 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 1062 | "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", 1063 | "requires": { 1064 | "node-forge": "^0.8.0", 1065 | "pify": "^4.0.0" 1066 | }, 1067 | "dependencies": { 1068 | "node-forge": { 1069 | "version": "0.8.2", 1070 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz", 1071 | "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==" 1072 | } 1073 | } 1074 | }, 1075 | "google-proto-files": { 1076 | "version": "0.20.0", 1077 | "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.20.0.tgz", 1078 | "integrity": "sha512-ORU+XhOeDv/UPtnCYLkO1ItmfhRCRPR3ZoeVQ7GfVzEs7PVitPIhsYlY5ZzG8XXnsdmtK27ENurfQ1jhAWpZHg==", 1079 | "requires": { 1080 | "@google-cloud/promisify": "^0.4.0", 1081 | "protobufjs": "^6.8.0", 1082 | "walkdir": "^0.3.0" 1083 | } 1084 | }, 1085 | "graceful-fs": { 1086 | "version": "4.1.15", 1087 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1088 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 1089 | "optional": true 1090 | }, 1091 | "grpc": { 1092 | "version": "1.20.3", 1093 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.20.3.tgz", 1094 | "integrity": "sha512-GsEsi0NVj6usS/xor8pF/xDbDiwZQR59aZl5NUZ59Sy2bdPQFZ3UePr5wevZjHboirRCIQCKRI1cCgvSWUe2ag==", 1095 | "requires": { 1096 | "lodash.camelcase": "^4.3.0", 1097 | "lodash.clone": "^4.5.0", 1098 | "nan": "^2.13.2", 1099 | "node-pre-gyp": "^0.13.0", 1100 | "protobufjs": "^5.0.3" 1101 | }, 1102 | "dependencies": { 1103 | "abbrev": { 1104 | "version": "1.1.1", 1105 | "bundled": true 1106 | }, 1107 | "ansi-regex": { 1108 | "version": "2.1.1", 1109 | "bundled": true 1110 | }, 1111 | "aproba": { 1112 | "version": "1.2.0", 1113 | "bundled": true 1114 | }, 1115 | "are-we-there-yet": { 1116 | "version": "1.1.5", 1117 | "bundled": true, 1118 | "requires": { 1119 | "delegates": "^1.0.0", 1120 | "readable-stream": "^2.0.6" 1121 | } 1122 | }, 1123 | "balanced-match": { 1124 | "version": "1.0.0", 1125 | "bundled": true 1126 | }, 1127 | "brace-expansion": { 1128 | "version": "1.1.11", 1129 | "bundled": true, 1130 | "requires": { 1131 | "balanced-match": "^1.0.0", 1132 | "concat-map": "0.0.1" 1133 | } 1134 | }, 1135 | "chownr": { 1136 | "version": "1.1.1", 1137 | "bundled": true 1138 | }, 1139 | "code-point-at": { 1140 | "version": "1.1.0", 1141 | "bundled": true 1142 | }, 1143 | "concat-map": { 1144 | "version": "0.0.1", 1145 | "bundled": true 1146 | }, 1147 | "console-control-strings": { 1148 | "version": "1.1.0", 1149 | "bundled": true 1150 | }, 1151 | "core-util-is": { 1152 | "version": "1.0.2", 1153 | "bundled": true 1154 | }, 1155 | "deep-extend": { 1156 | "version": "0.6.0", 1157 | "bundled": true 1158 | }, 1159 | "delegates": { 1160 | "version": "1.0.0", 1161 | "bundled": true 1162 | }, 1163 | "detect-libc": { 1164 | "version": "1.0.3", 1165 | "bundled": true 1166 | }, 1167 | "fs-minipass": { 1168 | "version": "1.2.5", 1169 | "bundled": true, 1170 | "requires": { 1171 | "minipass": "^2.2.1" 1172 | } 1173 | }, 1174 | "fs.realpath": { 1175 | "version": "1.0.0", 1176 | "bundled": true 1177 | }, 1178 | "gauge": { 1179 | "version": "2.7.4", 1180 | "bundled": true, 1181 | "requires": { 1182 | "aproba": "^1.0.3", 1183 | "console-control-strings": "^1.0.0", 1184 | "has-unicode": "^2.0.0", 1185 | "object-assign": "^4.1.0", 1186 | "signal-exit": "^3.0.0", 1187 | "string-width": "^1.0.1", 1188 | "strip-ansi": "^3.0.1", 1189 | "wide-align": "^1.1.0" 1190 | } 1191 | }, 1192 | "has-unicode": { 1193 | "version": "2.0.1", 1194 | "bundled": true 1195 | }, 1196 | "iconv-lite": { 1197 | "version": "0.4.23", 1198 | "bundled": true, 1199 | "requires": { 1200 | "safer-buffer": ">= 2.1.2 < 3" 1201 | } 1202 | }, 1203 | "ignore-walk": { 1204 | "version": "3.0.1", 1205 | "bundled": true, 1206 | "requires": { 1207 | "minimatch": "^3.0.4" 1208 | } 1209 | }, 1210 | "inflight": { 1211 | "version": "1.0.6", 1212 | "bundled": true, 1213 | "requires": { 1214 | "once": "^1.3.0", 1215 | "wrappy": "1" 1216 | } 1217 | }, 1218 | "inherits": { 1219 | "version": "2.0.3", 1220 | "bundled": true 1221 | }, 1222 | "ini": { 1223 | "version": "1.3.5", 1224 | "bundled": true 1225 | }, 1226 | "is-fullwidth-code-point": { 1227 | "version": "1.0.0", 1228 | "bundled": true, 1229 | "requires": { 1230 | "number-is-nan": "^1.0.0" 1231 | } 1232 | }, 1233 | "isarray": { 1234 | "version": "1.0.0", 1235 | "bundled": true 1236 | }, 1237 | "minimatch": { 1238 | "version": "3.0.4", 1239 | "bundled": true, 1240 | "requires": { 1241 | "brace-expansion": "^1.1.7" 1242 | } 1243 | }, 1244 | "minimist": { 1245 | "version": "1.2.0", 1246 | "bundled": true 1247 | }, 1248 | "minipass": { 1249 | "version": "2.3.5", 1250 | "bundled": true, 1251 | "requires": { 1252 | "safe-buffer": "^5.1.2", 1253 | "yallist": "^3.0.0" 1254 | } 1255 | }, 1256 | "minizlib": { 1257 | "version": "1.2.1", 1258 | "bundled": true, 1259 | "requires": { 1260 | "minipass": "^2.2.1" 1261 | } 1262 | }, 1263 | "mkdirp": { 1264 | "version": "0.5.1", 1265 | "bundled": true, 1266 | "requires": { 1267 | "minimist": "0.0.8" 1268 | }, 1269 | "dependencies": { 1270 | "minimist": { 1271 | "version": "0.0.8", 1272 | "bundled": true 1273 | } 1274 | } 1275 | }, 1276 | "needle": { 1277 | "version": "2.3.1", 1278 | "bundled": true, 1279 | "requires": { 1280 | "debug": "^4.1.0", 1281 | "iconv-lite": "^0.4.4", 1282 | "sax": "^1.2.4" 1283 | }, 1284 | "dependencies": { 1285 | "debug": { 1286 | "version": "4.1.1", 1287 | "bundled": true, 1288 | "requires": { 1289 | "ms": "^2.1.1" 1290 | } 1291 | }, 1292 | "ms": { 1293 | "version": "2.1.1", 1294 | "bundled": true 1295 | } 1296 | } 1297 | }, 1298 | "node-pre-gyp": { 1299 | "version": "0.13.0", 1300 | "bundled": true, 1301 | "requires": { 1302 | "detect-libc": "^1.0.2", 1303 | "mkdirp": "^0.5.1", 1304 | "needle": "^2.2.1", 1305 | "nopt": "^4.0.1", 1306 | "npm-packlist": "^1.1.6", 1307 | "npmlog": "^4.0.2", 1308 | "rc": "^1.2.7", 1309 | "rimraf": "^2.6.1", 1310 | "semver": "^5.3.0", 1311 | "tar": "^4" 1312 | } 1313 | }, 1314 | "nopt": { 1315 | "version": "4.0.1", 1316 | "bundled": true, 1317 | "requires": { 1318 | "abbrev": "1", 1319 | "osenv": "^0.1.4" 1320 | } 1321 | }, 1322 | "npm-bundled": { 1323 | "version": "1.0.6", 1324 | "bundled": true 1325 | }, 1326 | "npm-packlist": { 1327 | "version": "1.4.1", 1328 | "bundled": true, 1329 | "requires": { 1330 | "ignore-walk": "^3.0.1", 1331 | "npm-bundled": "^1.0.1" 1332 | } 1333 | }, 1334 | "npmlog": { 1335 | "version": "4.1.2", 1336 | "bundled": true, 1337 | "requires": { 1338 | "are-we-there-yet": "~1.1.2", 1339 | "console-control-strings": "~1.1.0", 1340 | "gauge": "~2.7.3", 1341 | "set-blocking": "~2.0.0" 1342 | } 1343 | }, 1344 | "number-is-nan": { 1345 | "version": "1.0.1", 1346 | "bundled": true 1347 | }, 1348 | "object-assign": { 1349 | "version": "4.1.1", 1350 | "bundled": true 1351 | }, 1352 | "once": { 1353 | "version": "1.4.0", 1354 | "bundled": true, 1355 | "requires": { 1356 | "wrappy": "1" 1357 | } 1358 | }, 1359 | "os-homedir": { 1360 | "version": "1.0.2", 1361 | "bundled": true 1362 | }, 1363 | "os-tmpdir": { 1364 | "version": "1.0.2", 1365 | "bundled": true 1366 | }, 1367 | "osenv": { 1368 | "version": "0.1.5", 1369 | "bundled": true, 1370 | "requires": { 1371 | "os-homedir": "^1.0.0", 1372 | "os-tmpdir": "^1.0.0" 1373 | } 1374 | }, 1375 | "path-is-absolute": { 1376 | "version": "1.0.1", 1377 | "bundled": true 1378 | }, 1379 | "process-nextick-args": { 1380 | "version": "2.0.0", 1381 | "bundled": true 1382 | }, 1383 | "protobufjs": { 1384 | "version": "5.0.3", 1385 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 1386 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 1387 | "requires": { 1388 | "ascli": "~1", 1389 | "bytebuffer": "~5", 1390 | "glob": "^7.0.5", 1391 | "yargs": "^3.10.0" 1392 | } 1393 | }, 1394 | "rc": { 1395 | "version": "1.2.8", 1396 | "bundled": true, 1397 | "requires": { 1398 | "deep-extend": "^0.6.0", 1399 | "ini": "~1.3.0", 1400 | "minimist": "^1.2.0", 1401 | "strip-json-comments": "~2.0.1" 1402 | } 1403 | }, 1404 | "readable-stream": { 1405 | "version": "2.3.6", 1406 | "bundled": true, 1407 | "requires": { 1408 | "core-util-is": "~1.0.0", 1409 | "inherits": "~2.0.3", 1410 | "isarray": "~1.0.0", 1411 | "process-nextick-args": "~2.0.0", 1412 | "safe-buffer": "~5.1.1", 1413 | "string_decoder": "~1.1.1", 1414 | "util-deprecate": "~1.0.1" 1415 | } 1416 | }, 1417 | "rimraf": { 1418 | "version": "2.6.3", 1419 | "bundled": true, 1420 | "requires": { 1421 | "glob": "^7.1.3" 1422 | }, 1423 | "dependencies": { 1424 | "glob": { 1425 | "version": "7.1.3", 1426 | "bundled": true, 1427 | "requires": { 1428 | "fs.realpath": "^1.0.0", 1429 | "inflight": "^1.0.4", 1430 | "inherits": "2", 1431 | "minimatch": "^3.0.4", 1432 | "once": "^1.3.0", 1433 | "path-is-absolute": "^1.0.0" 1434 | } 1435 | } 1436 | } 1437 | }, 1438 | "safe-buffer": { 1439 | "version": "5.1.2", 1440 | "bundled": true 1441 | }, 1442 | "safer-buffer": { 1443 | "version": "2.1.2", 1444 | "bundled": true 1445 | }, 1446 | "sax": { 1447 | "version": "1.2.4", 1448 | "bundled": true 1449 | }, 1450 | "semver": { 1451 | "version": "5.7.0", 1452 | "bundled": true 1453 | }, 1454 | "set-blocking": { 1455 | "version": "2.0.0", 1456 | "bundled": true 1457 | }, 1458 | "signal-exit": { 1459 | "version": "3.0.2", 1460 | "bundled": true 1461 | }, 1462 | "string-width": { 1463 | "version": "1.0.2", 1464 | "bundled": true, 1465 | "requires": { 1466 | "code-point-at": "^1.0.0", 1467 | "is-fullwidth-code-point": "^1.0.0", 1468 | "strip-ansi": "^3.0.0" 1469 | } 1470 | }, 1471 | "string_decoder": { 1472 | "version": "1.1.1", 1473 | "bundled": true, 1474 | "requires": { 1475 | "safe-buffer": "~5.1.0" 1476 | } 1477 | }, 1478 | "strip-ansi": { 1479 | "version": "3.0.1", 1480 | "bundled": true, 1481 | "requires": { 1482 | "ansi-regex": "^2.0.0" 1483 | } 1484 | }, 1485 | "strip-json-comments": { 1486 | "version": "2.0.1", 1487 | "bundled": true 1488 | }, 1489 | "tar": { 1490 | "version": "4.4.8", 1491 | "bundled": true, 1492 | "requires": { 1493 | "chownr": "^1.1.1", 1494 | "fs-minipass": "^1.2.5", 1495 | "minipass": "^2.3.4", 1496 | "minizlib": "^1.1.1", 1497 | "mkdirp": "^0.5.0", 1498 | "safe-buffer": "^5.1.2", 1499 | "yallist": "^3.0.2" 1500 | } 1501 | }, 1502 | "util-deprecate": { 1503 | "version": "1.0.2", 1504 | "bundled": true 1505 | }, 1506 | "wide-align": { 1507 | "version": "1.1.3", 1508 | "bundled": true, 1509 | "requires": { 1510 | "string-width": "^1.0.2 || 2" 1511 | } 1512 | }, 1513 | "wrappy": { 1514 | "version": "1.0.2", 1515 | "bundled": true 1516 | }, 1517 | "yallist": { 1518 | "version": "3.0.3", 1519 | "bundled": true 1520 | } 1521 | } 1522 | }, 1523 | "grpc-gcp": { 1524 | "version": "0.1.1", 1525 | "resolved": "https://registry.npmjs.org/grpc-gcp/-/grpc-gcp-0.1.1.tgz", 1526 | "integrity": "sha512-MAt0Ae9QuL2Lbbt2d+kDta5AxqRD1JVXtBcJuQKp9GeFL5TxPw/hxIyDNyivPjKEXjbG3cBGwSE3CXq6a3KHEQ==", 1527 | "requires": { 1528 | "grpc": "^1.16.0", 1529 | "protobufjs": "^6.8.8" 1530 | } 1531 | }, 1532 | "gtoken": { 1533 | "version": "2.3.3", 1534 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 1535 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 1536 | "requires": { 1537 | "gaxios": "^1.0.4", 1538 | "google-p12-pem": "^1.0.0", 1539 | "jws": "^3.1.5", 1540 | "mime": "^2.2.0", 1541 | "pify": "^4.0.0" 1542 | } 1543 | }, 1544 | "hash-stream-validation": { 1545 | "version": "0.2.1", 1546 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", 1547 | "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", 1548 | "optional": true, 1549 | "requires": { 1550 | "through2": "^2.0.0" 1551 | }, 1552 | "dependencies": { 1553 | "isarray": { 1554 | "version": "1.0.0", 1555 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1556 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1557 | "optional": true 1558 | }, 1559 | "readable-stream": { 1560 | "version": "2.3.6", 1561 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1562 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1563 | "optional": true, 1564 | "requires": { 1565 | "core-util-is": "~1.0.0", 1566 | "inherits": "~2.0.3", 1567 | "isarray": "~1.0.0", 1568 | "process-nextick-args": "~2.0.0", 1569 | "safe-buffer": "~5.1.1", 1570 | "string_decoder": "~1.1.1", 1571 | "util-deprecate": "~1.0.1" 1572 | } 1573 | }, 1574 | "string_decoder": { 1575 | "version": "1.1.1", 1576 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1577 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1578 | "optional": true, 1579 | "requires": { 1580 | "safe-buffer": "~5.1.0" 1581 | } 1582 | }, 1583 | "through2": { 1584 | "version": "2.0.5", 1585 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1586 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1587 | "optional": true, 1588 | "requires": { 1589 | "readable-stream": "~2.3.6", 1590 | "xtend": "~4.0.1" 1591 | } 1592 | } 1593 | } 1594 | }, 1595 | "http-errors": { 1596 | "version": "1.6.3", 1597 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1598 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1599 | "requires": { 1600 | "depd": "~1.1.2", 1601 | "inherits": "2.0.3", 1602 | "setprototypeof": "1.1.0", 1603 | "statuses": ">= 1.4.0 < 2" 1604 | } 1605 | }, 1606 | "http-parser-js": { 1607 | "version": "0.5.0", 1608 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", 1609 | "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" 1610 | }, 1611 | "https-proxy-agent": { 1612 | "version": "2.2.1", 1613 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 1614 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 1615 | "requires": { 1616 | "agent-base": "^4.1.0", 1617 | "debug": "^3.1.0" 1618 | } 1619 | }, 1620 | "iconv-lite": { 1621 | "version": "0.4.23", 1622 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 1623 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 1624 | "requires": { 1625 | "safer-buffer": ">= 2.1.2 < 3" 1626 | } 1627 | }, 1628 | "imurmurhash": { 1629 | "version": "0.1.4", 1630 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1631 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1632 | "optional": true 1633 | }, 1634 | "inflight": { 1635 | "version": "1.0.6", 1636 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1637 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1638 | "requires": { 1639 | "once": "^1.3.0", 1640 | "wrappy": "1" 1641 | } 1642 | }, 1643 | "inherits": { 1644 | "version": "2.0.3", 1645 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1646 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1647 | }, 1648 | "invert-kv": { 1649 | "version": "1.0.0", 1650 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1651 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1652 | }, 1653 | "ipaddr.js": { 1654 | "version": "1.9.0", 1655 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 1656 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 1657 | }, 1658 | "is-fullwidth-code-point": { 1659 | "version": "1.0.0", 1660 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1661 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1662 | "requires": { 1663 | "number-is-nan": "^1.0.0" 1664 | } 1665 | }, 1666 | "is-obj": { 1667 | "version": "1.0.1", 1668 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1669 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1670 | "optional": true 1671 | }, 1672 | "is-stream-ended": { 1673 | "version": "0.1.4", 1674 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 1675 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 1676 | }, 1677 | "isarray": { 1678 | "version": "0.0.1", 1679 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1680 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1681 | "optional": true 1682 | }, 1683 | "json-bigint": { 1684 | "version": "0.3.0", 1685 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", 1686 | "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", 1687 | "requires": { 1688 | "bignumber.js": "^7.0.0" 1689 | } 1690 | }, 1691 | "jsonwebtoken": { 1692 | "version": "8.1.0", 1693 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", 1694 | "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", 1695 | "requires": { 1696 | "jws": "^3.1.4", 1697 | "lodash.includes": "^4.3.0", 1698 | "lodash.isboolean": "^3.0.3", 1699 | "lodash.isinteger": "^4.0.4", 1700 | "lodash.isnumber": "^3.0.3", 1701 | "lodash.isplainobject": "^4.0.6", 1702 | "lodash.isstring": "^4.0.1", 1703 | "lodash.once": "^4.0.0", 1704 | "ms": "^2.0.0", 1705 | "xtend": "^4.0.1" 1706 | } 1707 | }, 1708 | "jwa": { 1709 | "version": "1.4.1", 1710 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1711 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1712 | "requires": { 1713 | "buffer-equal-constant-time": "1.0.1", 1714 | "ecdsa-sig-formatter": "1.0.11", 1715 | "safe-buffer": "^5.0.1" 1716 | } 1717 | }, 1718 | "jws": { 1719 | "version": "3.2.2", 1720 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1721 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1722 | "requires": { 1723 | "jwa": "^1.4.1", 1724 | "safe-buffer": "^5.0.1" 1725 | } 1726 | }, 1727 | "lcid": { 1728 | "version": "1.0.0", 1729 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1730 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1731 | "requires": { 1732 | "invert-kv": "^1.0.0" 1733 | } 1734 | }, 1735 | "lodash": { 1736 | "version": "4.17.11", 1737 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1738 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1739 | }, 1740 | "lodash.at": { 1741 | "version": "4.6.0", 1742 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", 1743 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=" 1744 | }, 1745 | "lodash.camelcase": { 1746 | "version": "4.3.0", 1747 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1748 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1749 | }, 1750 | "lodash.clone": { 1751 | "version": "4.5.0", 1752 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 1753 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" 1754 | }, 1755 | "lodash.has": { 1756 | "version": "4.5.2", 1757 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", 1758 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" 1759 | }, 1760 | "lodash.includes": { 1761 | "version": "4.3.0", 1762 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1763 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1764 | }, 1765 | "lodash.isboolean": { 1766 | "version": "3.0.3", 1767 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1768 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1769 | }, 1770 | "lodash.isinteger": { 1771 | "version": "4.0.4", 1772 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1773 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1774 | }, 1775 | "lodash.isnumber": { 1776 | "version": "3.0.3", 1777 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1778 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1779 | }, 1780 | "lodash.isplainobject": { 1781 | "version": "4.0.6", 1782 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1783 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1784 | }, 1785 | "lodash.isstring": { 1786 | "version": "4.0.1", 1787 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1788 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1789 | }, 1790 | "lodash.merge": { 1791 | "version": "4.6.1", 1792 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", 1793 | "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" 1794 | }, 1795 | "lodash.once": { 1796 | "version": "4.1.1", 1797 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1798 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1799 | }, 1800 | "long": { 1801 | "version": "4.0.0", 1802 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1803 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1804 | }, 1805 | "lru-cache": { 1806 | "version": "5.1.1", 1807 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1808 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1809 | "requires": { 1810 | "yallist": "^3.0.2" 1811 | } 1812 | }, 1813 | "make-dir": { 1814 | "version": "1.3.0", 1815 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1816 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1817 | "optional": true, 1818 | "requires": { 1819 | "pify": "^3.0.0" 1820 | }, 1821 | "dependencies": { 1822 | "pify": { 1823 | "version": "3.0.0", 1824 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1825 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1826 | "optional": true 1827 | } 1828 | } 1829 | }, 1830 | "media-typer": { 1831 | "version": "0.3.0", 1832 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1833 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1834 | }, 1835 | "merge-descriptors": { 1836 | "version": "1.0.1", 1837 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1838 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1839 | }, 1840 | "methods": { 1841 | "version": "1.1.2", 1842 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1843 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1844 | }, 1845 | "mime": { 1846 | "version": "2.4.2", 1847 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", 1848 | "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==" 1849 | }, 1850 | "mime-db": { 1851 | "version": "1.40.0", 1852 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 1853 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 1854 | }, 1855 | "mime-types": { 1856 | "version": "2.1.24", 1857 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 1858 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 1859 | "requires": { 1860 | "mime-db": "1.40.0" 1861 | } 1862 | }, 1863 | "mimic-fn": { 1864 | "version": "2.1.0", 1865 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1866 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1867 | "optional": true 1868 | }, 1869 | "minimatch": { 1870 | "version": "3.0.4", 1871 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1872 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1873 | "requires": { 1874 | "brace-expansion": "^1.1.7" 1875 | } 1876 | }, 1877 | "ms": { 1878 | "version": "2.1.1", 1879 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1880 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1881 | }, 1882 | "nan": { 1883 | "version": "2.13.2", 1884 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", 1885 | "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" 1886 | }, 1887 | "negotiator": { 1888 | "version": "0.6.2", 1889 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1890 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1891 | }, 1892 | "node-fetch": { 1893 | "version": "2.5.0", 1894 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.5.0.tgz", 1895 | "integrity": "sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw==" 1896 | }, 1897 | "node-forge": { 1898 | "version": "0.7.4", 1899 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", 1900 | "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" 1901 | }, 1902 | "number-is-nan": { 1903 | "version": "1.0.1", 1904 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1905 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1906 | }, 1907 | "object-assign": { 1908 | "version": "4.1.1", 1909 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1910 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1911 | }, 1912 | "on-finished": { 1913 | "version": "2.3.0", 1914 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1915 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1916 | "requires": { 1917 | "ee-first": "1.1.1" 1918 | } 1919 | }, 1920 | "once": { 1921 | "version": "1.4.0", 1922 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1923 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1924 | "requires": { 1925 | "wrappy": "1" 1926 | } 1927 | }, 1928 | "onetime": { 1929 | "version": "5.1.0", 1930 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1931 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1932 | "optional": true, 1933 | "requires": { 1934 | "mimic-fn": "^2.1.0" 1935 | } 1936 | }, 1937 | "optjs": { 1938 | "version": "3.2.2", 1939 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 1940 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 1941 | }, 1942 | "os-locale": { 1943 | "version": "1.4.0", 1944 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1945 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1946 | "requires": { 1947 | "lcid": "^1.0.0" 1948 | } 1949 | }, 1950 | "parseurl": { 1951 | "version": "1.3.3", 1952 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1953 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1954 | }, 1955 | "path-is-absolute": { 1956 | "version": "1.0.1", 1957 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1958 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1959 | }, 1960 | "path-to-regexp": { 1961 | "version": "0.1.7", 1962 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1963 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1964 | }, 1965 | "pify": { 1966 | "version": "4.0.1", 1967 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 1968 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 1969 | }, 1970 | "process-nextick-args": { 1971 | "version": "2.0.0", 1972 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1973 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1974 | }, 1975 | "protobufjs": { 1976 | "version": "6.8.8", 1977 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 1978 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 1979 | "requires": { 1980 | "@protobufjs/aspromise": "^1.1.2", 1981 | "@protobufjs/base64": "^1.1.2", 1982 | "@protobufjs/codegen": "^2.0.4", 1983 | "@protobufjs/eventemitter": "^1.1.0", 1984 | "@protobufjs/fetch": "^1.1.0", 1985 | "@protobufjs/float": "^1.0.2", 1986 | "@protobufjs/inquire": "^1.1.0", 1987 | "@protobufjs/path": "^1.1.2", 1988 | "@protobufjs/pool": "^1.1.0", 1989 | "@protobufjs/utf8": "^1.1.0", 1990 | "@types/long": "^4.0.0", 1991 | "@types/node": "^10.1.0", 1992 | "long": "^4.0.0" 1993 | }, 1994 | "dependencies": { 1995 | "@types/node": { 1996 | "version": "10.14.6", 1997 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz", 1998 | "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==" 1999 | } 2000 | } 2001 | }, 2002 | "proxy-addr": { 2003 | "version": "2.0.5", 2004 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 2005 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 2006 | "requires": { 2007 | "forwarded": "~0.1.2", 2008 | "ipaddr.js": "1.9.0" 2009 | } 2010 | }, 2011 | "pump": { 2012 | "version": "2.0.1", 2013 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2014 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2015 | "optional": true, 2016 | "requires": { 2017 | "end-of-stream": "^1.1.0", 2018 | "once": "^1.3.1" 2019 | } 2020 | }, 2021 | "pumpify": { 2022 | "version": "1.5.1", 2023 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 2024 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 2025 | "optional": true, 2026 | "requires": { 2027 | "duplexify": "^3.6.0", 2028 | "inherits": "^2.0.3", 2029 | "pump": "^2.0.0" 2030 | } 2031 | }, 2032 | "qs": { 2033 | "version": "6.5.2", 2034 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2035 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2036 | }, 2037 | "range-parser": { 2038 | "version": "1.2.0", 2039 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2040 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2041 | }, 2042 | "raw-body": { 2043 | "version": "2.3.3", 2044 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2045 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2046 | "requires": { 2047 | "bytes": "3.0.0", 2048 | "http-errors": "1.6.3", 2049 | "iconv-lite": "0.4.23", 2050 | "unpipe": "1.0.0" 2051 | } 2052 | }, 2053 | "readable-stream": { 2054 | "version": "1.0.34", 2055 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2056 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2057 | "optional": true, 2058 | "requires": { 2059 | "core-util-is": "~1.0.0", 2060 | "inherits": "~2.0.1", 2061 | "isarray": "0.0.1", 2062 | "string_decoder": "~0.10.x" 2063 | } 2064 | }, 2065 | "retry-request": { 2066 | "version": "4.0.0", 2067 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz", 2068 | "integrity": "sha512-S4HNLaWcMP6r8E4TMH52Y7/pM8uNayOcTDDQNBwsCccL1uI+Ol2TljxRDPzaNfbhOB30+XWP5NnZkB3LiJxi1w==", 2069 | "requires": { 2070 | "through2": "^2.0.0" 2071 | }, 2072 | "dependencies": { 2073 | "isarray": { 2074 | "version": "1.0.0", 2075 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2076 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2077 | }, 2078 | "readable-stream": { 2079 | "version": "2.3.6", 2080 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2081 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2082 | "requires": { 2083 | "core-util-is": "~1.0.0", 2084 | "inherits": "~2.0.3", 2085 | "isarray": "~1.0.0", 2086 | "process-nextick-args": "~2.0.0", 2087 | "safe-buffer": "~5.1.1", 2088 | "string_decoder": "~1.1.1", 2089 | "util-deprecate": "~1.0.1" 2090 | } 2091 | }, 2092 | "string_decoder": { 2093 | "version": "1.1.1", 2094 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2095 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2096 | "requires": { 2097 | "safe-buffer": "~5.1.0" 2098 | } 2099 | }, 2100 | "through2": { 2101 | "version": "2.0.5", 2102 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2103 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2104 | "requires": { 2105 | "readable-stream": "~2.3.6", 2106 | "xtend": "~4.0.1" 2107 | } 2108 | } 2109 | } 2110 | }, 2111 | "safe-buffer": { 2112 | "version": "5.1.2", 2113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2114 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2115 | }, 2116 | "safer-buffer": { 2117 | "version": "2.1.2", 2118 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2119 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2120 | }, 2121 | "semver": { 2122 | "version": "6.0.0", 2123 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", 2124 | "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" 2125 | }, 2126 | "send": { 2127 | "version": "0.16.2", 2128 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 2129 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 2130 | "requires": { 2131 | "debug": "2.6.9", 2132 | "depd": "~1.1.2", 2133 | "destroy": "~1.0.4", 2134 | "encodeurl": "~1.0.2", 2135 | "escape-html": "~1.0.3", 2136 | "etag": "~1.8.1", 2137 | "fresh": "0.5.2", 2138 | "http-errors": "~1.6.2", 2139 | "mime": "1.4.1", 2140 | "ms": "2.0.0", 2141 | "on-finished": "~2.3.0", 2142 | "range-parser": "~1.2.0", 2143 | "statuses": "~1.4.0" 2144 | }, 2145 | "dependencies": { 2146 | "debug": { 2147 | "version": "2.6.9", 2148 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2149 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2150 | "requires": { 2151 | "ms": "2.0.0" 2152 | } 2153 | }, 2154 | "mime": { 2155 | "version": "1.4.1", 2156 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2157 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 2158 | }, 2159 | "ms": { 2160 | "version": "2.0.0", 2161 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2162 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2163 | } 2164 | } 2165 | }, 2166 | "serve-static": { 2167 | "version": "1.13.2", 2168 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 2169 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 2170 | "requires": { 2171 | "encodeurl": "~1.0.2", 2172 | "escape-html": "~1.0.3", 2173 | "parseurl": "~1.3.2", 2174 | "send": "0.16.2" 2175 | } 2176 | }, 2177 | "setprototypeof": { 2178 | "version": "1.1.0", 2179 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2180 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2181 | }, 2182 | "signal-exit": { 2183 | "version": "3.0.2", 2184 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2185 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2186 | "optional": true 2187 | }, 2188 | "snakeize": { 2189 | "version": "0.1.0", 2190 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 2191 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", 2192 | "optional": true 2193 | }, 2194 | "split-array-stream": { 2195 | "version": "2.0.0", 2196 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 2197 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 2198 | "optional": true, 2199 | "requires": { 2200 | "is-stream-ended": "^0.1.4" 2201 | } 2202 | }, 2203 | "statuses": { 2204 | "version": "1.4.0", 2205 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 2206 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 2207 | }, 2208 | "stream-events": { 2209 | "version": "1.0.5", 2210 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 2211 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 2212 | "optional": true, 2213 | "requires": { 2214 | "stubs": "^3.0.0" 2215 | } 2216 | }, 2217 | "stream-shift": { 2218 | "version": "1.0.0", 2219 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 2220 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 2221 | }, 2222 | "string-width": { 2223 | "version": "1.0.2", 2224 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2225 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2226 | "requires": { 2227 | "code-point-at": "^1.0.0", 2228 | "is-fullwidth-code-point": "^1.0.0", 2229 | "strip-ansi": "^3.0.0" 2230 | } 2231 | }, 2232 | "string_decoder": { 2233 | "version": "0.10.31", 2234 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2235 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2236 | "optional": true 2237 | }, 2238 | "strip-ansi": { 2239 | "version": "3.0.1", 2240 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2241 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2242 | "requires": { 2243 | "ansi-regex": "^2.0.0" 2244 | } 2245 | }, 2246 | "stubs": { 2247 | "version": "3.0.0", 2248 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 2249 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", 2250 | "optional": true 2251 | }, 2252 | "teeny-request": { 2253 | "version": "3.11.3", 2254 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", 2255 | "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", 2256 | "optional": true, 2257 | "requires": { 2258 | "https-proxy-agent": "^2.2.1", 2259 | "node-fetch": "^2.2.0", 2260 | "uuid": "^3.3.2" 2261 | } 2262 | }, 2263 | "through2": { 2264 | "version": "3.0.1", 2265 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", 2266 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", 2267 | "optional": true, 2268 | "requires": { 2269 | "readable-stream": "2 || 3" 2270 | }, 2271 | "dependencies": { 2272 | "readable-stream": { 2273 | "version": "3.3.0", 2274 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", 2275 | "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", 2276 | "optional": true, 2277 | "requires": { 2278 | "inherits": "^2.0.3", 2279 | "string_decoder": "^1.1.1", 2280 | "util-deprecate": "^1.0.1" 2281 | } 2282 | }, 2283 | "string_decoder": { 2284 | "version": "1.2.0", 2285 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 2286 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 2287 | "optional": true, 2288 | "requires": { 2289 | "safe-buffer": "~5.1.0" 2290 | } 2291 | } 2292 | } 2293 | }, 2294 | "tslib": { 2295 | "version": "1.9.3", 2296 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 2297 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 2298 | }, 2299 | "type-is": { 2300 | "version": "1.6.18", 2301 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2302 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2303 | "requires": { 2304 | "media-typer": "0.3.0", 2305 | "mime-types": "~2.1.24" 2306 | } 2307 | }, 2308 | "typedarray": { 2309 | "version": "0.0.6", 2310 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2311 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2312 | "optional": true 2313 | }, 2314 | "typescript": { 2315 | "version": "3.4.5", 2316 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", 2317 | "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", 2318 | "dev": true 2319 | }, 2320 | "unique-string": { 2321 | "version": "1.0.0", 2322 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 2323 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 2324 | "optional": true, 2325 | "requires": { 2326 | "crypto-random-string": "^1.0.0" 2327 | } 2328 | }, 2329 | "unpipe": { 2330 | "version": "1.0.0", 2331 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2332 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2333 | }, 2334 | "util-deprecate": { 2335 | "version": "1.0.2", 2336 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2337 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2338 | }, 2339 | "utils-merge": { 2340 | "version": "1.0.1", 2341 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2342 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2343 | }, 2344 | "uuid": { 2345 | "version": "3.3.2", 2346 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2347 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 2348 | "optional": true 2349 | }, 2350 | "vary": { 2351 | "version": "1.1.2", 2352 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2353 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2354 | }, 2355 | "walkdir": { 2356 | "version": "0.3.2", 2357 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.3.2.tgz", 2358 | "integrity": "sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==" 2359 | }, 2360 | "websocket-driver": { 2361 | "version": "0.7.0", 2362 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", 2363 | "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", 2364 | "requires": { 2365 | "http-parser-js": ">=0.4.0", 2366 | "websocket-extensions": ">=0.1.1" 2367 | } 2368 | }, 2369 | "websocket-extensions": { 2370 | "version": "0.1.3", 2371 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", 2372 | "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" 2373 | }, 2374 | "window-size": { 2375 | "version": "0.1.4", 2376 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 2377 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 2378 | }, 2379 | "wrap-ansi": { 2380 | "version": "2.1.0", 2381 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2382 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2383 | "requires": { 2384 | "string-width": "^1.0.1", 2385 | "strip-ansi": "^3.0.1" 2386 | } 2387 | }, 2388 | "wrappy": { 2389 | "version": "1.0.2", 2390 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2391 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2392 | }, 2393 | "write-file-atomic": { 2394 | "version": "2.4.2", 2395 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", 2396 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", 2397 | "optional": true, 2398 | "requires": { 2399 | "graceful-fs": "^4.1.11", 2400 | "imurmurhash": "^0.1.4", 2401 | "signal-exit": "^3.0.2" 2402 | } 2403 | }, 2404 | "xdg-basedir": { 2405 | "version": "3.0.0", 2406 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2407 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 2408 | "optional": true 2409 | }, 2410 | "xmlhttprequest": { 2411 | "version": "1.8.0", 2412 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 2413 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 2414 | }, 2415 | "xtend": { 2416 | "version": "4.0.1", 2417 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2418 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2419 | }, 2420 | "y18n": { 2421 | "version": "3.2.1", 2422 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2423 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 2424 | }, 2425 | "yallist": { 2426 | "version": "3.0.3", 2427 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 2428 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 2429 | }, 2430 | "yargs": { 2431 | "version": "3.32.0", 2432 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 2433 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 2434 | "requires": { 2435 | "camelcase": "^2.0.1", 2436 | "cliui": "^3.0.3", 2437 | "decamelize": "^1.1.1", 2438 | "os-locale": "^1.4.0", 2439 | "string-width": "^1.0.1", 2440 | "window-size": "^0.1.4", 2441 | "y18n": "^3.2.0" 2442 | } 2443 | } 2444 | } 2445 | } 2446 | --------------------------------------------------------------------------------