summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2017-06-01 19:47:08 -0400
committerJules Laplace <julescarbon@gmail.com>2017-06-01 19:47:08 -0400
commit3e72bfa56c860826429a842f6c128d78d4a930db (patch)
tree3cecd31c92d53fae32e9761b80802c82f3dcb7fa
parentb694bd511ceccd00d4a4c98f36f910d5fc5f79c4 (diff)
react-native-web port of fmf app
-rw-r--r--client/.babelrc3
-rw-r--r--client/.buckconfig6
-rw-r--r--client/.flowconfig47
-rw-r--r--client/.gitattributes1
-rw-r--r--client/.gitignore59
-rw-r--r--client/.watchmanconfig1
-rw-r--r--client/README.md118
-rw-r--r--client/__tests__/app.js12
-rw-r--r--client/app.js22
-rw-r--r--client/app.json4
-rw-r--r--client/index.web.js14
-rw-r--r--client/package.json47
-rw-r--r--client/src/.babelrc3
-rw-r--r--client/src/.buckconfig6
-rw-r--r--client/src/.flowconfig47
-rw-r--r--client/src/.gitattributes1
-rw-r--r--client/src/.gitignore53
-rw-r--r--client/src/.watchmanconfig1
-rw-r--r--client/src/img/afghanistan.pngbin0 -> 91548 bytes
-rw-r--r--client/src/img/aiweiwei.pngbin0 -> 259114 bytes
-rw-r--r--client/src/img/armory.pngbin0 -> 12274 bytes
-rw-r--r--client/src/img/arrow-right.pngbin0 -> 2183 bytes
-rw-r--r--client/src/img/aww.pngbin0 -> 99273 bytes
-rw-r--r--client/src/img/checkbox-off.pngbin0 -> 1539 bytes
-rw-r--r--client/src/img/checkbox-on.pngbin0 -> 2784 bytes
-rw-r--r--client/src/img/close.pngbin0 -> 3812 bytes
-rw-r--r--client/src/img/drone.jpgbin0 -> 72821 bytes
-rw-r--r--client/src/img/herzogDeMeuron.pngbin0 -> 653994 bytes
-rw-r--r--client/src/img/icon/icon.pngbin0 -> 44250 bytes
-rw-r--r--client/src/img/icon/splash.pngbin0 -> 34995 bytes
-rw-r--r--client/src/img/logo.pngbin0 -> 24655 bytes
-rw-r--r--client/src/img/nav/home/contact.pngbin0 -> 4534 bytes
-rw-r--r--client/src/img/nav/home/drones.pngbin0 -> 4324 bytes
-rw-r--r--client/src/img/nav/home/findyourface.pngbin0 -> 2418 bytes
-rw-r--r--client/src/img/nav/home/home.pngbin0 -> 2036 bytes
-rw-r--r--client/src/img/nav/home/information.pngbin0 -> 3516 bytes
-rw-r--r--client/src/img/nav/home/livestream.pngbin0 -> 6797 bytes
-rw-r--r--client/src/img/nav/home/timeline.pngbin0 -> 6654 bytes
-rw-r--r--client/src/img/nav/old/contact.pngbin0 -> 13362 bytes
-rw-r--r--client/src/img/nav/old/drones.pngbin0 -> 56309 bytes
-rw-r--r--client/src/img/nav/old/findyourface.pngbin0 -> 33628 bytes
-rw-r--r--client/src/img/nav/old/home.pngbin0 -> 26920 bytes
-rw-r--r--client/src/img/nav/old/information.pngbin0 -> 29760 bytes
-rw-r--r--client/src/img/nav/old/livestream.pngbin0 -> 90562 bytes
-rw-r--r--client/src/img/nav/old/timeline.pngbin0 -> 85906 bytes
-rw-r--r--client/src/img/nav/original/contact.pngbin0 -> 14674 bytes
-rw-r--r--client/src/img/nav/original/drones.pngbin0 -> 30185 bytes
-rw-r--r--client/src/img/nav/original/findyourface.pngbin0 -> 34446 bytes
-rw-r--r--client/src/img/nav/original/home.pngbin0 -> 31869 bytes
-rw-r--r--client/src/img/nav/original/information.pngbin0 -> 10993 bytes
-rw-r--r--client/src/img/nav/original/livestream.pngbin0 -> 75343 bytes
-rw-r--r--client/src/img/nav/original/timeline.pngbin0 -> 63672 bytes
-rw-r--r--client/src/img/nav/selected/contact.pngbin0 -> 1906 bytes
-rw-r--r--client/src/img/nav/selected/drones.pngbin0 -> 2138 bytes
-rw-r--r--client/src/img/nav/selected/findyourface.pngbin0 -> 1582 bytes
-rw-r--r--client/src/img/nav/selected/home.pngbin0 -> 1366 bytes
-rw-r--r--client/src/img/nav/selected/information.pngbin0 -> 2076 bytes
-rw-r--r--client/src/img/nav/selected/livestream.pngbin0 -> 2820 bytes
-rw-r--r--client/src/img/nav/selected/timeline.pngbin0 -> 3560 bytes
-rw-r--r--client/src/img/nav/sidebar/contact.pngbin0 -> 1906 bytes
-rw-r--r--client/src/img/nav/sidebar/drones.pngbin0 -> 2138 bytes
-rw-r--r--client/src/img/nav/sidebar/findyourface.pngbin0 -> 1526 bytes
-rw-r--r--client/src/img/nav/sidebar/home.pngbin0 -> 1308 bytes
-rw-r--r--client/src/img/nav/sidebar/information.pngbin0 -> 2002 bytes
-rw-r--r--client/src/img/nav/sidebar/livestream.pngbin0 -> 2820 bytes
-rw-r--r--client/src/img/nav/sidebar/timeline.pngbin0 -> 3387 bytes
-rw-r--r--client/src/img/pakistan.pngbin0 -> 85241 bytes
-rwxr-xr-xclient/src/img/resize.sh8
-rw-r--r--client/src/img/show-banner.jpgbin0 -> 178307 bytes
-rw-r--r--client/src/img/somalia.pngbin0 -> 40007 bytes
-rw-r--r--client/src/img/yemen.pngbin0 -> 54048 bytes
-rw-r--r--client/src/lib/app/index.js164
-rw-r--r--client/src/lib/components/button.js55
-rw-r--r--client/src/lib/components/checkbox.js35
-rw-r--r--client/src/lib/components/close.js33
-rw-r--r--client/src/lib/components/container.js50
-rw-r--r--client/src/lib/components/definition.js52
-rw-r--r--client/src/lib/components/footer.js77
-rw-r--r--client/src/lib/components/header.js52
-rw-r--r--client/src/lib/components/heading.js34
-rw-r--r--client/src/lib/components/htmlStyles.js32
-rw-r--r--client/src/lib/components/mapStyle.js287
-rw-r--r--client/src/lib/components/modal.js41
-rw-r--r--client/src/lib/components/pushNotifications.js38
-rw-r--r--client/src/lib/components/scrollableContainer.js51
-rw-r--r--client/src/lib/components/text.js30
-rw-r--r--client/src/lib/components/webViewModal.js56
-rw-r--r--client/src/lib/components/youtube.js91
-rw-r--r--client/src/lib/db/backupDB.js2278
-rw-r--r--client/src/lib/db/hosts.js9
-rw-r--r--client/src/lib/db/index.js85
-rw-r--r--client/src/lib/drone/index.js216
-rw-r--r--client/src/lib/timeline/index.js164
-rw-r--r--client/src/lib/timeline/tickMarks.js192
-rw-r--r--client/src/lib/timeline/timelineEvent.js102
-rw-r--r--client/src/lib/timeline/timelineFilter.js127
-rw-r--r--client/src/lib/timeline/timelineFull.js227
-rw-r--r--client/src/lib/timeline/timelineHeader.js111
-rw-r--r--client/src/lib/views/contact.js307
-rw-r--r--client/src/lib/views/credits.js34
-rw-r--r--client/src/lib/views/home.js98
-rw-r--r--client/src/lib/views/information.js114
-rw-r--r--client/src/lib/views/livestream.js134
-rw-r--r--client/src/lib/views/nav.js119
-rw-r--r--client/src/lib/views/privacy.js33
-rw-r--r--client/src/package.json38
-rw-r--r--client/web/shared.webpack.config.js64
-rw-r--r--client/web/templates/index.ejs31
-rw-r--r--client/web/vendor.webpack.config.js56
-rw-r--r--client/web/webpack.config.js104
-rw-r--r--client/yarn.lock5461
111 files changed, 11735 insertions, 0 deletions
diff --git a/client/.babelrc b/client/.babelrc
new file mode 100644
index 0000000..8df53fe
--- /dev/null
+++ b/client/.babelrc
@@ -0,0 +1,3 @@
+{
+"presets": ["react-native"]
+} \ No newline at end of file
diff --git a/client/.buckconfig b/client/.buckconfig
new file mode 100644
index 0000000..934256c
--- /dev/null
+++ b/client/.buckconfig
@@ -0,0 +1,6 @@
+
+[android]
+ target = Google Inc.:Google APIs:23
+
+[maven_repositories]
+ central = https://repo1.maven.org/maven2
diff --git a/client/.flowconfig b/client/.flowconfig
new file mode 100644
index 0000000..dcd5fd6
--- /dev/null
+++ b/client/.flowconfig
@@ -0,0 +1,47 @@
+[ignore]
+; We fork some components by platform
+.*/*[.]android.js
+
+; Ignore "BUCK" generated dirs
+<PROJECT_ROOT>/\.buckd/
+
+; Ignore unexpected extra "@providesModule"
+.*/node_modules/.*/node_modules/fbjs/.*
+
+; Ignore duplicate module providers
+; For RN Apps installed via npm, "Libraries" folder is inside
+; "node_modules/react-native" but in the source repo it is in the root
+.*/Libraries/react-native/React.js
+.*/Libraries/react-native/ReactNative.js
+
+[include]
+
+[libs]
+node_modules/react-native/Libraries/react-native/react-native-interface.js
+node_modules/react-native/flow
+flow/
+
+[options]
+emoji=true
+
+module.system=haste
+
+experimental.strict_type_args=true
+
+munge_underscores=true
+
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
+
+suppress_type=$FlowIssue
+suppress_type=$FlowFixMe
+suppress_type=$FixMe
+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
+suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
+
+unsafe.enable_getters_and_setters=true
+
+[version]
+^0.40.0
diff --git a/client/.gitattributes b/client/.gitattributes
new file mode 100644
index 0000000..d42ff18
--- /dev/null
+++ b/client/.gitattributes
@@ -0,0 +1 @@
+*.pbxproj -text
diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..a6f3f05
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1,59 @@
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+
+# Android/IntelliJ
+#
+build/
+.idea
+.gradle
+local.properties
+*.iml
+
+# node.js
+#
+node_modules/
+npm-debug.log
+yarn-error.log
+
+# Web
+web/build
+web/vendor
+web/vendor-dev
+jsconfig.json
+
+# BUCK
+buck-out/
+\.buckd/
+*.keystore
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
diff --git a/client/.watchmanconfig b/client/.watchmanconfig
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/client/.watchmanconfig
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/client/README.md b/client/README.md
new file mode 100644
index 0000000..3c5ebf9
--- /dev/null
+++ b/client/README.md
@@ -0,0 +1,118 @@
+# React Native for Web - Example App
+
+This is a boilerplate React Native app with `react-native-web` installed and configured.
+
+## Features
+
+* index.html as an EJS template
+* Code-splitting
+ * Saves time during development, saves bandwidth during updates
+* Offline Plugin
+ * Caches all of your assets so your app works without an internet connection
+
+Coming soon:
+
+* Pre-rendering as static HTML
+* [react-hot-loader](https://github.com/gaearon/react-hot-loader)
+* Script to deploy your build to AWS S3, and optionally clear your CloudFlare cache
+
+
+> Note: This boilerplate project only contains an example webpack configuration for React Native Web.
+> You should merge this into your favorite React Native starter project.
+
+## iOS and Android
+
+Use the default React Native Packager for iOS and Android:
+
+Script | Description
+---|---
+`react-native start` | Starts React Native Packager
+`react-native run-ios` | Runs the iOS app
+`react-native run-android` | Runs the Android app
+
+
+## Web
+
+`react-native-web` does not use the React Native Packager, so you need to use [webpack](https://webpack.github.io/) to compile your app. This example app contains a complete webpack configuration that is optimized for development and production.
+
+Script | Description
+---|---
+`npm run web` | Starts the development server on port `3000`.
+`npm run web:build:vendor-dev` | Builds the `react-native-web` library for development.<br/>(The `web` task will automatically run this if it does not exist.)
+`npm run web:build` | Builds your app for production. <br/>(Runs `web:build:vendor` and `web:build:app`.)
+`npm run web:build:vendor` | Builds the `react-native-web` library for production.
+`npm run web:build:app` | Builds your app, and any implicit vendored libraries.
+`npm run web:serve` | Serves the production build on port `3001`.
+`npm run web:clean` | Deletes all generated files.
+
+> Note: If you haven't changed any libraries in `vendor.webpack.config.js`, you can run `npm run web:build:app` to just compile your app's source code. `npm run web:build` will recompile everything.
+
+
+## index.html
+
+Your index file is generated from a template at [web/templates/index.ejs](/web/templates/index.ejs).
+You can add variables to the [HTMLWebpackPlugin config](web/webpack.config.js#L49-L52) in `web/webpack.config.js`, and use these variables in the template.
+
+
+### Examples:
+
+In `web/webpack.config.js`:
+
+```js
+ new HtmlWebpackPlugin({
+ filename: 'index.html',
+ template: 'web/templates/index.ejs',
+ myVariable: 'foo',
+ }),
+```
+
+In `web/templates/index.ejs`:
+
+```html
+<div><%= htmlWebpackPlugin.options.myVariable %></div>
+```
+
+or:
+
+```html
+<% if (htmlWebpackPlugin.options.myVariable) { %>
+ <div><%= htmlWebpackPlugin.options.myVariable %></div>
+<% } %>
+```
+
+> See the [HtmlWebpackPlugin README](https://github.com/jantimon/html-webpack-plugin#html-webpack-plugin) for more information.
+
+
+## Code Splitting
+
+You can add any `react-*` and `react-native-*` libraries to the `entry` section in `vendor.webpack.config.js`. Webpack will compile these libraries separately, and link them with your app's code. (See the [DllPlugin](https://github.com/webpack/docs/wiki/list-of-plugins#dllplugin)). This saves a lot of time during development, because you don't have to keep recompiling your static libraries. This also saves bandwidth when you release an update, because your users will only need to download the updated app bundle.
+
+You can add multiple entry sections to `vendor.webpack.config.js`. I recommend creating another entry for "core" libraries that don't change very often, but are unrelated to `react` or `react-native-web`. In addition to the explicit vendoring in `vendor.webpack.config.js`, webpack will also create an implicitly vendored bundle, for any libraries in `node_modules/`.
+
+Here is an example of what your build directory will look like:
+
+```
+javascript/
+ vendor/
+ lib-6b8747b211107409.js
+ react-853080ae05a52a66.dll.js
+ app-6b8747b211107409.js
+```
+
+* `lib.*.js` is an implicitly vendored bundle, for all libraries in `node_modules`
+* `react.*.dll.js` contains `react-native-web` and all of it's dependencies
+* `app.*.js` is your app's source code.
+
+
+## Offline Plugin
+
+If you want your app to be available offline, you can change this line at the top of `web/webpack.config.js`:
+
+```js
+const enableOfflinePlugin = false
+```
+
+This will automatically configure a ServiceWorker (or AppCache) to download and cache all of your assets, so people will be able to use your app even if they don't have an internet connection.
+
+> The Offline Plugin will only be enabled in the production build.
+
diff --git a/client/__tests__/app.js b/client/__tests__/app.js
new file mode 100644
index 0000000..5d3f8e3
--- /dev/null
+++ b/client/__tests__/app.js
@@ -0,0 +1,12 @@
+import 'react-native';
+import React from 'react';
+import App from '../app.js';
+
+// Note: test renderer must be required after react-native.
+import renderer from 'react-test-renderer';
+
+it('renders correctly', () => {
+ const tree = renderer.create(
+ <App />
+ );
+});
diff --git a/client/app.js b/client/app.js
new file mode 100644
index 0000000..1be697c
--- /dev/null
+++ b/client/app.js
@@ -0,0 +1,22 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ Text,
+ View,
+ Platform,
+} from 'react-native';
+import { BrowserRouter } from 'react-router-dom'
+import App from './src/lib/app'
+
+const platformText = {ios: 'iOS', android: 'Android', web: 'Web' }
+
+export default class HanselGretelApp extends Component {
+ render() {
+ return (
+ <BrowserRouter>
+ <App />
+ </BrowserRouter>
+ )
+ }
+}
+
diff --git a/client/app.json b/client/app.json
new file mode 100644
index 0000000..83c5798
--- /dev/null
+++ b/client/app.json
@@ -0,0 +1,4 @@
+{
+ "name": "ExampleApp",
+ "displayName": "ExampleApp"
+} \ No newline at end of file
diff --git a/client/index.web.js b/client/index.web.js
new file mode 100644
index 0000000..b48b84b
--- /dev/null
+++ b/client/index.web.js
@@ -0,0 +1,14 @@
+import { AppRegistry } from 'react-native';
+import App from './app'
+
+// Sets up offline caching for all assets (disabled by default)
+// You can enable offline caching by changing
+// `enableOfflinePlugin` at the top of web/webpack.config.js
+if (__OFFLINE__) {
+ require('offline-plugin/runtime').install()
+}
+
+AppRegistry.registerComponent('HanselGretelApp', () => App);
+AppRegistry.runApplication('HanselGretelApp', {
+ rootTag: window.document.getElementById('react-root'),
+});
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 0000000..bec01c0
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "ExampleApp",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "node node_modules/react-native/local-cli/cli.js start",
+ "test": "jest",
+ "web:build:vendor-dev": "rm -rf web/vendor-dev; NODE_ENV=development webpack --config web/vendor.webpack.config.js || rm -rf web/vendor-dev",
+ "web": "[ -d web/vendor-dev ] || npm run web:build:vendor-dev && NODE_ENV=development webpack-dev-server -d --host 0.0.0.0 --port 3000 --config web/webpack.config.js --inline --hot --colors --history-api-fallback",
+ "web:clean": "rm -rf web/vendor web/vendor-dev web/build",
+ "web:build:vendor": "rm -rf web/vendor; NODE_ENV=production webpack --config web/vendor.webpack.config.js",
+ "web:build:app": "rm -rf web/build; NODE_ENV=production webpack --config web/webpack.config.js",
+ "web:build": "npm run web:build:vendor && npm run web:build:app",
+ "web:serve": "http-serve -p 3001 --gzip true ./web/build"
+ },
+ "dependencies": {
+ "react": "16.0.0-alpha.6",
+ "react-native": "0.43.4",
+ "react-native-web": "^0.0.88",
+ "react-router-dom": "^4.1.1"
+ },
+ "devDependencies": {
+ "add-asset-html-webpack-plugin": "^2.0.1",
+ "babel-jest": "19.0.0",
+ "babel-loader": "^7.0.0",
+ "babel-preset-react-native": "1.9.1",
+ "compression-webpack-plugin": "^0.4.0",
+ "copy-webpack-plugin": "^4.0.1",
+ "html-webpack-plugin": "^2.28.0",
+ "http-serve": "^1.0.1",
+ "jest": "19.0.2",
+ "json-loader": "^0.5.4",
+ "offline-plugin": "^4.7.0",
+ "react-dom": "^15.4.2",
+ "react-hot-loader": "^1.3.1",
+ "react-test-renderer": "16.0.0-alpha.6",
+ "url-loader": "^0.5.8",
+ "webpack": "^2.4.1",
+ "webpack-dev-server": "^2.4.2"
+ },
+ "jest": {
+ "preset": "react-native",
+ "moduleNameMapper": {
+ "react-native": "<rootDir>/../"
+ }
+ }
+}
diff --git a/client/src/.babelrc b/client/src/.babelrc
new file mode 100644
index 0000000..a9ce136
--- /dev/null
+++ b/client/src/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["react-native"]
+}
diff --git a/client/src/.buckconfig b/client/src/.buckconfig
new file mode 100644
index 0000000..934256c
--- /dev/null
+++ b/client/src/.buckconfig
@@ -0,0 +1,6 @@
+
+[android]
+ target = Google Inc.:Google APIs:23
+
+[maven_repositories]
+ central = https://repo1.maven.org/maven2
diff --git a/client/src/.flowconfig b/client/src/.flowconfig
new file mode 100644
index 0000000..a76425e
--- /dev/null
+++ b/client/src/.flowconfig
@@ -0,0 +1,47 @@
+[ignore]
+; We fork some components by platform
+.*/*[.]android.js
+
+; Ignore "BUCK" generated dirs
+<PROJECT_ROOT>/\.buckd/
+
+; Ignore unexpected extra "@providesModule"
+.*/node_modules/.*/node_modules/fbjs/.*
+
+; Ignore duplicate module providers
+; For RN Apps installed via npm, "Libraries" folder is inside
+; "node_modules/react-native" but in the source repo it is in the root
+.*/Libraries/react-native/React.js
+.*/Libraries/react-native/ReactNative.js
+
+[include]
+
+[libs]
+node_modules/react-native/Libraries/react-native/react-native-interface.js
+node_modules/react-native/flow
+flow/
+
+[options]
+emoji=true
+
+module.system=haste
+
+experimental.strict_type_args=true
+
+munge_underscores=true
+
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
+
+suppress_type=$FlowIssue
+suppress_type=$FlowFixMe
+suppress_type=$FixMe
+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
+suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
+
+unsafe.enable_getters_and_setters=true
+
+[version]
+^0.42.0
diff --git a/client/src/.gitattributes b/client/src/.gitattributes
new file mode 100644
index 0000000..d42ff18
--- /dev/null
+++ b/client/src/.gitattributes
@@ -0,0 +1 @@
+*.pbxproj -text
diff --git a/client/src/.gitignore b/client/src/.gitignore
new file mode 100644
index 0000000..10be197
--- /dev/null
+++ b/client/src/.gitignore
@@ -0,0 +1,53 @@
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+
+# Android/IntelliJ
+#
+build/
+.idea
+.gradle
+local.properties
+*.iml
+
+# node.js
+#
+node_modules/
+npm-debug.log
+yarn-error.log
+
+# BUCK
+buck-out/
+\.buckd/
+*.keystore
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
diff --git a/client/src/.watchmanconfig b/client/src/.watchmanconfig
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/client/src/.watchmanconfig
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/client/src/img/afghanistan.png b/client/src/img/afghanistan.png
new file mode 100644
index 0000000..0e94a27
--- /dev/null
+++ b/client/src/img/afghanistan.png
Binary files differ
diff --git a/client/src/img/aiweiwei.png b/client/src/img/aiweiwei.png
new file mode 100644
index 0000000..4d6a346
--- /dev/null
+++ b/client/src/img/aiweiwei.png
Binary files differ
diff --git a/client/src/img/armory.png b/client/src/img/armory.png
new file mode 100644
index 0000000..bf881a0
--- /dev/null
+++ b/client/src/img/armory.png
Binary files differ
diff --git a/client/src/img/arrow-right.png b/client/src/img/arrow-right.png
new file mode 100644
index 0000000..0cb2588
--- /dev/null
+++ b/client/src/img/arrow-right.png
Binary files differ
diff --git a/client/src/img/aww.png b/client/src/img/aww.png
new file mode 100644
index 0000000..d24bb47
--- /dev/null
+++ b/client/src/img/aww.png
Binary files differ
diff --git a/client/src/img/checkbox-off.png b/client/src/img/checkbox-off.png
new file mode 100644
index 0000000..a089c3d
--- /dev/null
+++ b/client/src/img/checkbox-off.png
Binary files differ
diff --git a/client/src/img/checkbox-on.png b/client/src/img/checkbox-on.png
new file mode 100644
index 0000000..c5957c5
--- /dev/null
+++ b/client/src/img/checkbox-on.png
Binary files differ
diff --git a/client/src/img/close.png b/client/src/img/close.png
new file mode 100644
index 0000000..2f78485
--- /dev/null
+++ b/client/src/img/close.png
Binary files differ
diff --git a/client/src/img/drone.jpg b/client/src/img/drone.jpg
new file mode 100644
index 0000000..905d9ce
--- /dev/null
+++ b/client/src/img/drone.jpg
Binary files differ
diff --git a/client/src/img/herzogDeMeuron.png b/client/src/img/herzogDeMeuron.png
new file mode 100644
index 0000000..8f7a8a4
--- /dev/null
+++ b/client/src/img/herzogDeMeuron.png
Binary files differ
diff --git a/client/src/img/icon/icon.png b/client/src/img/icon/icon.png
new file mode 100644
index 0000000..83c0bdd
--- /dev/null
+++ b/client/src/img/icon/icon.png
Binary files differ
diff --git a/client/src/img/icon/splash.png b/client/src/img/icon/splash.png
new file mode 100644
index 0000000..8390abe
--- /dev/null
+++ b/client/src/img/icon/splash.png
Binary files differ
diff --git a/client/src/img/logo.png b/client/src/img/logo.png
new file mode 100644
index 0000000..14a9922
--- /dev/null
+++ b/client/src/img/logo.png
Binary files differ
diff --git a/client/src/img/nav/home/contact.png b/client/src/img/nav/home/contact.png
new file mode 100644
index 0000000..b912c22
--- /dev/null
+++ b/client/src/img/nav/home/contact.png
Binary files differ
diff --git a/client/src/img/nav/home/drones.png b/client/src/img/nav/home/drones.png
new file mode 100644
index 0000000..af9b454
--- /dev/null
+++ b/client/src/img/nav/home/drones.png
Binary files differ
diff --git a/client/src/img/nav/home/findyourface.png b/client/src/img/nav/home/findyourface.png
new file mode 100644
index 0000000..870df1c
--- /dev/null
+++ b/client/src/img/nav/home/findyourface.png
Binary files differ
diff --git a/client/src/img/nav/home/home.png b/client/src/img/nav/home/home.png
new file mode 100644
index 0000000..3fb947e
--- /dev/null
+++ b/client/src/img/nav/home/home.png
Binary files differ
diff --git a/client/src/img/nav/home/information.png b/client/src/img/nav/home/information.png
new file mode 100644
index 0000000..e5350b6
--- /dev/null
+++ b/client/src/img/nav/home/information.png
Binary files differ
diff --git a/client/src/img/nav/home/livestream.png b/client/src/img/nav/home/livestream.png
new file mode 100644
index 0000000..8d5f9ae
--- /dev/null
+++ b/client/src/img/nav/home/livestream.png
Binary files differ
diff --git a/client/src/img/nav/home/timeline.png b/client/src/img/nav/home/timeline.png
new file mode 100644
index 0000000..5ad6792
--- /dev/null
+++ b/client/src/img/nav/home/timeline.png
Binary files differ
diff --git a/client/src/img/nav/old/contact.png b/client/src/img/nav/old/contact.png
new file mode 100644
index 0000000..7242391
--- /dev/null
+++ b/client/src/img/nav/old/contact.png
Binary files differ
diff --git a/client/src/img/nav/old/drones.png b/client/src/img/nav/old/drones.png
new file mode 100644
index 0000000..b2f9b28
--- /dev/null
+++ b/client/src/img/nav/old/drones.png
Binary files differ
diff --git a/client/src/img/nav/old/findyourface.png b/client/src/img/nav/old/findyourface.png
new file mode 100644
index 0000000..a4b6be6
--- /dev/null
+++ b/client/src/img/nav/old/findyourface.png
Binary files differ
diff --git a/client/src/img/nav/old/home.png b/client/src/img/nav/old/home.png
new file mode 100644
index 0000000..18c09e5
--- /dev/null
+++ b/client/src/img/nav/old/home.png
Binary files differ
diff --git a/client/src/img/nav/old/information.png b/client/src/img/nav/old/information.png
new file mode 100644
index 0000000..0dcec4f
--- /dev/null
+++ b/client/src/img/nav/old/information.png
Binary files differ
diff --git a/client/src/img/nav/old/livestream.png b/client/src/img/nav/old/livestream.png
new file mode 100644
index 0000000..9c5f20f
--- /dev/null
+++ b/client/src/img/nav/old/livestream.png
Binary files differ
diff --git a/client/src/img/nav/old/timeline.png b/client/src/img/nav/old/timeline.png
new file mode 100644
index 0000000..3fb0ce4
--- /dev/null
+++ b/client/src/img/nav/old/timeline.png
Binary files differ
diff --git a/client/src/img/nav/original/contact.png b/client/src/img/nav/original/contact.png
new file mode 100644
index 0000000..39529aa
--- /dev/null
+++ b/client/src/img/nav/original/contact.png
Binary files differ
diff --git a/client/src/img/nav/original/drones.png b/client/src/img/nav/original/drones.png
new file mode 100644
index 0000000..9a9b489
--- /dev/null
+++ b/client/src/img/nav/original/drones.png
Binary files differ
diff --git a/client/src/img/nav/original/findyourface.png b/client/src/img/nav/original/findyourface.png
new file mode 100644
index 0000000..fcfa493
--- /dev/null
+++ b/client/src/img/nav/original/findyourface.png
Binary files differ
diff --git a/client/src/img/nav/original/home.png b/client/src/img/nav/original/home.png
new file mode 100644
index 0000000..2ca5596
--- /dev/null
+++ b/client/src/img/nav/original/home.png
Binary files differ
diff --git a/client/src/img/nav/original/information.png b/client/src/img/nav/original/information.png
new file mode 100644
index 0000000..d45c43d
--- /dev/null
+++ b/client/src/img/nav/original/information.png
Binary files differ
diff --git a/client/src/img/nav/original/livestream.png b/client/src/img/nav/original/livestream.png
new file mode 100644
index 0000000..742996b
--- /dev/null
+++ b/client/src/img/nav/original/livestream.png
Binary files differ
diff --git a/client/src/img/nav/original/timeline.png b/client/src/img/nav/original/timeline.png
new file mode 100644
index 0000000..49e2d83
--- /dev/null
+++ b/client/src/img/nav/original/timeline.png
Binary files differ
diff --git a/client/src/img/nav/selected/contact.png b/client/src/img/nav/selected/contact.png
new file mode 100644
index 0000000..90f1faf
--- /dev/null
+++ b/client/src/img/nav/selected/contact.png
Binary files differ
diff --git a/client/src/img/nav/selected/drones.png b/client/src/img/nav/selected/drones.png
new file mode 100644
index 0000000..25122a9
--- /dev/null
+++ b/client/src/img/nav/selected/drones.png
Binary files differ
diff --git a/client/src/img/nav/selected/findyourface.png b/client/src/img/nav/selected/findyourface.png
new file mode 100644
index 0000000..8db3405
--- /dev/null
+++ b/client/src/img/nav/selected/findyourface.png
Binary files differ
diff --git a/client/src/img/nav/selected/home.png b/client/src/img/nav/selected/home.png
new file mode 100644
index 0000000..0073474
--- /dev/null
+++ b/client/src/img/nav/selected/home.png
Binary files differ
diff --git a/client/src/img/nav/selected/information.png b/client/src/img/nav/selected/information.png
new file mode 100644
index 0000000..30bd546
--- /dev/null
+++ b/client/src/img/nav/selected/information.png
Binary files differ
diff --git a/client/src/img/nav/selected/livestream.png b/client/src/img/nav/selected/livestream.png
new file mode 100644
index 0000000..c570591
--- /dev/null
+++ b/client/src/img/nav/selected/livestream.png
Binary files differ
diff --git a/client/src/img/nav/selected/timeline.png b/client/src/img/nav/selected/timeline.png
new file mode 100644
index 0000000..7f37591
--- /dev/null
+++ b/client/src/img/nav/selected/timeline.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/contact.png b/client/src/img/nav/sidebar/contact.png
new file mode 100644
index 0000000..01eda6b
--- /dev/null
+++ b/client/src/img/nav/sidebar/contact.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/drones.png b/client/src/img/nav/sidebar/drones.png
new file mode 100644
index 0000000..0c455bc
--- /dev/null
+++ b/client/src/img/nav/sidebar/drones.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/findyourface.png b/client/src/img/nav/sidebar/findyourface.png
new file mode 100644
index 0000000..bfedb5f
--- /dev/null
+++ b/client/src/img/nav/sidebar/findyourface.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/home.png b/client/src/img/nav/sidebar/home.png
new file mode 100644
index 0000000..c0313d6
--- /dev/null
+++ b/client/src/img/nav/sidebar/home.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/information.png b/client/src/img/nav/sidebar/information.png
new file mode 100644
index 0000000..184c8f5
--- /dev/null
+++ b/client/src/img/nav/sidebar/information.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/livestream.png b/client/src/img/nav/sidebar/livestream.png
new file mode 100644
index 0000000..04c75c5
--- /dev/null
+++ b/client/src/img/nav/sidebar/livestream.png
Binary files differ
diff --git a/client/src/img/nav/sidebar/timeline.png b/client/src/img/nav/sidebar/timeline.png
new file mode 100644
index 0000000..a022e9a
--- /dev/null
+++ b/client/src/img/nav/sidebar/timeline.png
Binary files differ
diff --git a/client/src/img/pakistan.png b/client/src/img/pakistan.png
new file mode 100644
index 0000000..fb5a677
--- /dev/null
+++ b/client/src/img/pakistan.png
Binary files differ
diff --git a/client/src/img/resize.sh b/client/src/img/resize.sh
new file mode 100755
index 0000000..caacfa9
--- /dev/null
+++ b/client/src/img/resize.sh
@@ -0,0 +1,8 @@
+for i in nav/original/*
+do
+echo $i
+convert -background black -gravity center $i -resize 140x140 -extent 140x140 ${i/original/home}
+convert -background black -gravity center $i -resize 80x80 -extent 100x100 ${i/original/sidebar}
+convert -background white -negate -gravity center $i -resize 80x80 -extent 100x100 ${i/original/selected}
+done
+
diff --git a/client/src/img/show-banner.jpg b/client/src/img/show-banner.jpg
new file mode 100644
index 0000000..0648dca
--- /dev/null
+++ b/client/src/img/show-banner.jpg
Binary files differ
diff --git a/client/src/img/somalia.png b/client/src/img/somalia.png
new file mode 100644
index 0000000..556ee8f
--- /dev/null
+++ b/client/src/img/somalia.png
Binary files differ
diff --git a/client/src/img/yemen.png b/client/src/img/yemen.png
new file mode 100644
index 0000000..93d7d86
--- /dev/null
+++ b/client/src/img/yemen.png
Binary files differ
diff --git a/client/src/lib/app/index.js b/client/src/lib/app/index.js
new file mode 100644
index 0000000..dc4d9ac
--- /dev/null
+++ b/client/src/lib/app/index.js
@@ -0,0 +1,164 @@
+import React, { Component } from 'react'
+import {
+ AppRegistry,
+ Dimensions,
+ Image,
+ StyleSheet,
+ StatusBar,
+ Text,
+ View
+} from 'react-native'
+import { Route, Link, Redirect, withRouter } from 'react-router-dom'
+
+const window = Dimensions.get('window')
+
+import db from '../db'
+
+import Home from '../views/home'
+import Nav from '../views/nav'
+import Timeline from '../timeline'
+import Drone from '../drone'
+import Livestream from '../views/livestream'
+import Information from '../views/information'
+import Contact from '../views/contact'
+import Credits from '../views/credits'
+import Privacy from '../views/privacy'
+import WebViewModal from '../components/webViewModal'
+import Footer from '../components/footer'
+import Header from '../components/header'
+
+let touchTimeout;
+
+class App extends Component {
+ constructor() {
+ super()
+ this.state = {
+ view: 'home',
+ db: db.backup(),
+ visitedTimeline: false,
+ url: '',
+ }
+
+ // reset to home screen after some period of inactivity
+ this.visitedTimeline = false
+
+ this.onLinkPress = this.onLinkPress.bind(this)
+ this.onCloseWebViewModal = this.onCloseWebViewModal.bind(this)
+ }
+ onLinkPress(url) {
+ if (url.indexOf('/') === 0) {
+ this.props.history.push(url)
+ }
+ else {
+ global.open(url)
+ }
+ }
+ onCloseWebViewModal() {
+ this.setState({ url: '' })
+ }
+ render() {
+ return (
+ <View style={styles.container}>
+ <Route path='/' render={(props) => {
+ return ( <Header location={props.location} /> )
+ }}/>
+ <View style={styles.inner}>
+ <Route exact path='/' render={(props) => (
+ <Home />
+ )}/>
+ <Route path='/timeline' render={(props) => {
+ if (! this.visitedTimeline) {
+ setTimeout(() => {
+ this.visitedTimeline = true
+ }, 600)
+ }
+ else if (this.timelineView) {
+ setImmediate( () => this.timelineView.onFilter('') )
+ }
+ return (
+ <Timeline
+ ref={(ref) => this.timelineView = ref}
+ firstTime={! this.visitedTimeline}
+ content={this.state.db.page['history-of-surveillance']}
+ events={this.state.db.timeline}
+ onLinkPress={this.onLinkPress}
+ {...props}
+ />
+ )
+ }}/>
+ <Route path='/drones' render={(props) => (
+ <Drone
+ content={this.state.db.drone}
+ onLinkPress={this.onLinkPress}
+ {...props}
+ />
+ )}/>
+ <Route path='/livestream' render={(props) => (
+ <Livestream
+ content={this.state.db.stream}
+ {...props}
+ />
+ )}/>
+ <Route path='/information' render={(props) => (
+ <Information
+ content={this.state.db.about}
+ onLinkPress={this.onLinkPress}
+ {...props}
+ />
+ )}/>
+ <Route path='/page/credits' render={(props) => (
+ <Credits
+ content={this.state.db.page['credits']}
+ onLinkPress={this.onLinkPress}
+ {...props}
+ />
+ )}/>
+ <Route path='/page/privacy' render={(props) => (
+ <Privacy
+ content={this.state.db.page['privacy-policy']}
+ onLinkPress={this.onLinkPress}
+ {...props}
+ />
+ )}/>
+ <Route path='/contact' render={(props) => (
+ <Contact
+ content={this.state.db.page['contact']}
+ comments={this.state.db.comments}
+ {...props}
+ />
+ )}/>
+
+ </View>
+ <Footer onLinkPress={this.onLinkPress} />
+ <StatusBar hidden />
+ </View>
+ )
+ }
+}
+
+
+
+
+// <Redirect to="/" />
+
+export default App
+
+const styles = StyleSheet.create({
+ container: {
+ width: '100%',
+ height: '100%',
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#000000',
+ },
+ inner: {
+ flexDirection: 'row',
+ height: window.height - 50 - 50,
+ },
+ logo: {
+ marginTop: 0,
+ height: 50,
+ marginBottom: 10,
+ }
+})
+
diff --git a/client/src/lib/components/button.js b/client/src/lib/components/button.js
new file mode 100644
index 0000000..a5cf8ea
--- /dev/null
+++ b/client/src/lib/components/button.js
@@ -0,0 +1,55 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View
+} from 'react-native';
+import DeviceInfo from 'react-native-device-info'
+
+export default class Button extends Component {
+ render() {
+ let { buttonStyle, textStyle, ...others } = this.props
+ let activeOpacity = 0.5
+ let viewElementStyle = [ styles.button, buttonStyle ]
+ let textElementStyle = [ styles.text, textStyle ]
+ if (this.props.disabled) {
+ viewElementStyle.push( styles.disabledButton )
+ textElementStyle.push( styles.disabledText )
+ activeOpacity = 1.0
+ }
+ return (
+ <TouchableOpacity {...others} onPress={() => { if (! this.props.disabled) { this.props.onPress() }}}>
+ <View style={viewElementStyle}>
+ <Text style={textElementStyle}>
+ {this.props.label}
+ </Text>
+ </View>
+ </TouchableOpacity>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ text: {
+ color: '#000',
+ fontFamily: 'Futura-Medium',
+ textAlign: 'center',
+ padding: 0,
+ },
+ button: {
+ padding: 10,
+ margin: 10,
+ borderRadius: 3,
+ backgroundColor: '#fff',
+ borderBottomColor: '#bbb',
+ borderBottomWidth: 2,
+ },
+ disabledButton: {
+ backgroundColor: '#bbb',
+ borderBottomColor: '#888',
+ },
+ disabledText: {
+ color: '#333',
+ },
+})
diff --git a/client/src/lib/components/checkbox.js b/client/src/lib/components/checkbox.js
new file mode 100644
index 0000000..ea4ab7e
--- /dev/null
+++ b/client/src/lib/components/checkbox.js
@@ -0,0 +1,35 @@
+import React, { Component } from 'react'
+import {
+ View,
+ Image,
+ StyleSheet,
+} from 'react-native'
+
+import ClearText from './text'
+
+export default class CheckBox extends Component {
+ render() {
+ const image = this.props.checked ? (
+ <Image source={require('../../img/checkbox-on.png')} style={styles.image} />
+ ) : (
+ <Image source={require('../../img/checkbox-off.png')} style={styles.image} />
+ )
+ return (
+ <View style={[styles.row, this.props.containerStyle]} onClick={() => this.props.onChange(this.props.checked)}>
+ {image}
+ <ClearText style={this.props.labelStyle}>{this.props.label}</ClearText>
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ row: {
+ flexDirection: 'row',
+ },
+ image: {
+ width: 30,
+ height: 30,
+ marginRight: 5,
+ }
+})
diff --git a/client/src/lib/components/close.js b/client/src/lib/components/close.js
new file mode 100644
index 0000000..12b4a0a
--- /dev/null
+++ b/client/src/lib/components/close.js
@@ -0,0 +1,33 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ TouchableOpacity,
+ Image
+} from 'react-native';
+import DeviceInfo from 'react-native-device-info'
+
+export default class Close extends Component {
+ render() {
+ return (
+ <TouchableOpacity onPress={this.props.onPress} style={styles.close}>
+ <Image key={'image_close'} source={require('../../img/close.png')} style={styles.closeImage} />
+ </TouchableOpacity>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ close: {
+ position: 'absolute',
+ top: 10,
+ right: 10,
+ width: 40,
+ height: 40,
+ padding: 5,
+ backgroundColor: 'black'
+ },
+ closeImage: {
+ width: 30,
+ height: 30,
+ },
+})
diff --git a/client/src/lib/components/container.js b/client/src/lib/components/container.js
new file mode 100644
index 0000000..fe6fd5e
--- /dev/null
+++ b/client/src/lib/components/container.js
@@ -0,0 +1,50 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View
+} from 'react-native';
+
+import Heading from '../components/heading'
+
+export default class Container extends Component {
+ constructor() {
+ super()
+ }
+ render() {
+ const { heading, style, bodyStyle, headingOnPress, ...props } = this.props
+ let headingEl;
+ if (heading) {
+ headingEl = (
+ <Heading style={styles.heading} onPress={headingOnPress}>
+ {heading.toUpperCase()}
+ </Heading>
+ )
+ }
+ else {
+ headingEl = null
+ }
+ return (
+ <View style={[styles.container, style]} {...props}>
+ {headingEl}
+ <View style={[styles.body, bodyStyle]}>
+ {this.props.children}
+ </View>
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ },
+ heading: {
+ },
+ body: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ paddingLeft: 10,
+ }
+})
diff --git a/client/src/lib/components/definition.js b/client/src/lib/components/definition.js
new file mode 100644
index 0000000..b6b78f5
--- /dev/null
+++ b/client/src/lib/components/definition.js
@@ -0,0 +1,52 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View,
+} from 'react-native';
+
+import ClearText from './text'
+
+export default class Definition extends Component {
+ render() {
+ let { labelStyle, contentStyle, label, children, contentIsView, ...others } = this.props
+ let content;
+ if (contentIsView) {
+ content = (
+ <View style={[styles.contentView, contentStyle]}>{children}</View>
+ )
+ }
+ else {
+ content = (
+ <ClearText style={[styles.content, contentStyle]}>{children}</ClearText>
+ )
+ }
+ return (
+ <View style={styles.item} {...others}>
+ <ClearText style={[styles.label, labelStyle]}>{label}</ClearText>
+ {content}
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ item: {
+ justifyContent: 'flex-start',
+ flexDirection: 'row',
+ width: '100%',
+ paddingBottom: 0,
+ },
+ label: {
+ width: 80,
+ minWidth: 80,
+ textAlign: 'left',
+ color: '#bbb',
+ },
+ content: {
+ flex: 1,
+ textAlign: 'left'
+ },
+ contentView: {
+ flex: 1,
+ },
+})
diff --git a/client/src/lib/components/footer.js b/client/src/lib/components/footer.js
new file mode 100644
index 0000000..b389245
--- /dev/null
+++ b/client/src/lib/components/footer.js
@@ -0,0 +1,77 @@
+import React, { Component } from 'react'
+import {
+ Image,
+ StyleSheet,
+ TouchableOpacity,
+ Text,
+ View,
+} from 'react-native'
+import { Link } from 'react-router-dom'
+
+export default class ClearText extends Component {
+ render() {
+ return (
+ <View style={styles.footer}>
+ <Link to='/page/privacy'>
+ <View style={styles.footerItem}>
+ <Text style={styles.footerText}>Privacy</Text>
+ </View>
+ </Link>
+ <View style={styles.footerItem}>
+ <TouchableOpacity onPress={() => this.props.onLinkPress('http://armoryonpark.org/')}>
+ <Image source={require('../../img/armory.png')} resizeMode='contain' style={styles.footerLogo} />
+ </TouchableOpacity>
+ </View>
+ <Link to='/page/credits'>
+ <View style={styles.footerItem}>
+ <Text style={styles.footerText}>Credits</Text>
+ </View>
+ </Link>
+ </View>
+ )
+ }
+}
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const styles = StyleSheet.create({
+ footer: {
+ position: 'fixed',
+ bottom: 0,
+ left: 0,
+ width: '100%',
+ height: isMobile ? 40 : 70,
+ backgroundColor: 'black',
+ paddingTop: isMobile ? 5 : 20,
+ paddingBottom: isMobile ? 5 : 20,
+ flexDirection: 'row',
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ },
+ footerLogo: {
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ maxWidth: 140,
+ maxHeight: 40,
+ width: 260,
+ height: 39,
+ },
+ footerItem: {
+ height: 35,
+ flex: 1,
+ alignItems: 'center',
+ },
+ footerText: {
+ fontFamily: 'Futura-Medium',
+ color: 'white',
+ fontSize: 10,
+ flex: 1,
+ padding: 10,
+ marginTop: 4,
+ }
+})
diff --git a/client/src/lib/components/header.js b/client/src/lib/components/header.js
new file mode 100644
index 0000000..4cd264a
--- /dev/null
+++ b/client/src/lib/components/header.js
@@ -0,0 +1,52 @@
+import React, { Component } from 'react'
+import {
+ Image,
+ StyleSheet,
+ TouchableOpacity,
+ Text,
+ View,
+} from 'react-native'
+import { Link } from 'react-router-dom'
+
+import Nav from '../views/nav'
+
+export default class ClearText extends Component {
+ render() {
+ return (
+ <View style={styles.header}>
+ <Nav location={this.props.location} min={0} max={3} />
+ <Link to='/'>
+ <Image source={require('../../img/logo.png')} resizeMode='contain' style={styles.logo} />
+ </Link>
+ <Nav location={this.props.location} min={3} max={6} />
+ </View>
+ )
+ }
+}
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const styles = StyleSheet.create({
+ header: {
+ flex: 1,
+ width: '100%',
+ backgroundColor: 'black',
+ paddingTop: isMobile ? 5 : 10,
+ paddingBottom: isMobile ? 5 : 10,
+ height: isMobile ? 30 : 70,
+ flexDirection: 'row',
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ },
+
+ logo: {
+ flex: 2,
+ marginTop: 0,
+ height: isMobile ? 30 : 55,
+ marginBottom: isMobile ? 5 : 10,
+ },
+})
diff --git a/client/src/lib/components/heading.js b/client/src/lib/components/heading.js
new file mode 100644
index 0000000..4ec19fb
--- /dev/null
+++ b/client/src/lib/components/heading.js
@@ -0,0 +1,34 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet
+} from 'react-native';
+import DeviceInfo from 'react-native-device-info'
+
+import ClearText from './text'
+
+export default class Heading extends Component {
+ render() {
+ const {style, ...props} = this.props
+ return (
+ <ClearText style={[styles.heading, style]} {...props} />
+ )
+ }
+}
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const styles = StyleSheet.create({
+ heading: {
+ marginLeft: 0,
+ paddingTop: isMobile ? 5 : 10,
+ paddingLeft: 0,
+ paddingRight: 0,
+ paddingBottom: isMobile ? 10 : 30,
+ fontSize: isMobile ? 20 : 25,
+ textAlign: 'center',
+ }
+})
diff --git a/client/src/lib/components/htmlStyles.js b/client/src/lib/components/htmlStyles.js
new file mode 100644
index 0000000..4037f9d
--- /dev/null
+++ b/client/src/lib/components/htmlStyles.js
@@ -0,0 +1,32 @@
+import {
+ StyleSheet,
+} from 'react-native'
+
+export default StyleSheet.create({
+ p: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textAlign: 'justify',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ b: {
+ fontFamily: 'Futura-MediumItalic',
+ color: 'white',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ i: {
+ fontFamily: 'Futura-MediumItalic',
+ color: 'white',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ a: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textDecorationLine: 'underline',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+})
diff --git a/client/src/lib/components/mapStyle.js b/client/src/lib/components/mapStyle.js
new file mode 100644
index 0000000..1b72668
--- /dev/null
+++ b/client/src/lib/components/mapStyle.js
@@ -0,0 +1,287 @@
+export default [
+ {
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#212121"
+ }
+ ]
+ },
+ {
+ "elementType": "labels.icon",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#757575"
+ }
+ ]
+ },
+ {
+ "elementType": "labels.text.stroke",
+ "stylers": [
+ {
+ "color": "#212121"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#757575"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.country",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#9e9e9e"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.land_parcel",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.locality",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.locality",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#bdbdbd"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.neighborhood",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "administrative.province",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "poi",
+ "elementType": "labels.text",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "poi",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#757575"
+ }
+ ]
+ },
+ {
+ "featureType": "poi.business",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "poi.park",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#181818"
+ }
+ ]
+ },
+ {
+ "featureType": "poi.park",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#616161"
+ }
+ ]
+ },
+ {
+ "featureType": "poi.park",
+ "elementType": "labels.text.stroke",
+ "stylers": [
+ {
+ "color": "#1b1b1b"
+ }
+ ]
+ },
+ {
+ "featureType": "road",
+ "elementType": "geometry.fill",
+ "stylers": [
+ {
+ "color": "#2c2c2c"
+ }
+ ]
+ },
+ {
+ "featureType": "road",
+ "elementType": "labels",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "road",
+ "elementType": "labels.icon",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "road",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#8a8a8a"
+ }
+ ]
+ },
+ {
+ "featureType": "road.arterial",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "road.arterial",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#373737"
+ }
+ ]
+ },
+ {
+ "featureType": "road.highway",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#3c3c3c"
+ }
+ ]
+ },
+ {
+ "featureType": "road.highway",
+ "elementType": "labels",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "road.highway.controlled_access",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#4e4e4e"
+ }
+ ]
+ },
+ {
+ "featureType": "road.local",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "road.local",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#616161"
+ }
+ ]
+ },
+ {
+ "featureType": "transit",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "transit",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#757575"
+ }
+ ]
+ },
+ {
+ "featureType": "water",
+ "elementType": "geometry",
+ "stylers": [
+ {
+ "color": "#000000"
+ }
+ ]
+ },
+ {
+ "featureType": "water",
+ "elementType": "labels.text",
+ "stylers": [
+ {
+ "visibility": "off"
+ }
+ ]
+ },
+ {
+ "featureType": "water",
+ "elementType": "labels.text.fill",
+ "stylers": [
+ {
+ "color": "#3d3d3d"
+ }
+ ]
+ }
+] \ No newline at end of file
diff --git a/client/src/lib/components/modal.js b/client/src/lib/components/modal.js
new file mode 100644
index 0000000..38869ce
--- /dev/null
+++ b/client/src/lib/components/modal.js
@@ -0,0 +1,41 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View,
+} from 'react-native';
+
+export default class Modal extends Component {
+ render() {
+ let style = [ styles.modal ]
+ if (this.props.isVisible) {
+ style.push(styles.visible)
+ }
+ style.push( this.props.style )
+ return (
+ <View style={style} className='modal'>
+ {this.props.children}
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ modal: {
+ position: 'fixed',
+ top: '100%',
+ left: 0,
+ width: '100%',
+ height: '100%',
+ zIndex: 2,
+ backgroundColor: 'black',
+ flex: 1,
+ flexDirection: 'column',
+ alignItems: 'center',
+ justifyContent: 'center',
+ opacity: 0,
+ },
+ visible: {
+ top: '0%',
+ opacity: 1,
+ },
+})
diff --git a/client/src/lib/components/pushNotifications.js b/client/src/lib/components/pushNotifications.js
new file mode 100644
index 0000000..832f45b
--- /dev/null
+++ b/client/src/lib/components/pushNotifications.js
@@ -0,0 +1,38 @@
+import PushNotification from 'react-native-push-notification'
+
+function init(cb) {
+ PushNotification.configure({
+ onRegister: (token) => {
+ fetch("https://hanselgretelarmory.com/_services/push/add", {
+ method: "POST",
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ registrationId: token.token,
+ channel: 'feed',
+ platform: token.os,
+ }),
+ }).then(() => {
+ // console.warn('pushed token')
+ }).catch((err) => {
+ // console.warn('got error')
+ })
+ },
+ onNotification: (notification) => {
+ cb(notification)
+ },
+ permissions: {
+ alert: true,
+ badge: false,
+ sound: false
+ },
+ popInitialNotification: true,
+ requestPermissions: true,
+ })
+}
+
+export default {
+ init: init,
+}
diff --git a/client/src/lib/components/scrollableContainer.js b/client/src/lib/components/scrollableContainer.js
new file mode 100644
index 0000000..b0beb63
--- /dev/null
+++ b/client/src/lib/components/scrollableContainer.js
@@ -0,0 +1,51 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View,
+ ScrollView
+} from 'react-native';
+
+import Heading from '../components/heading'
+
+export default class ScrollableContainer extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ const { heading, bodyStyle, headingOnPress, ...props } = this.props
+ let headingEl;
+ if (heading) {
+ headingEl = (
+ <Heading style={styles.heading} onPress={headingOnPress}>
+ {heading.toUpperCase()}
+ </Heading>
+ )
+ }
+ else {
+ headingEl = null
+ }
+ return (
+ <View style={styles.container} {...props}>
+ <ScrollView ref={(ref) => this.scrollView = ref} contentContainerStyle={[styles.body, bodyStyle]}>
+ {headingEl}
+ {this.props.children}
+ <div style={{height: 40}}>footer</div>
+ </ScrollView>
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ width: '100vw',
+ flex: 1,
+ justifyContent: 'flex-start',
+ },
+ heading: {
+ },
+ body: {
+ alignItems: 'center',
+ },
+})
+
diff --git a/client/src/lib/components/text.js b/client/src/lib/components/text.js
new file mode 100644
index 0000000..17e3cb0
--- /dev/null
+++ b/client/src/lib/components/text.js
@@ -0,0 +1,30 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ Text
+} from 'react-native';
+
+export default class ClearText extends Component {
+ render() {
+ let { style, ...others } = this.props
+ if (style) {
+ style = [ styles.text, style ]
+ }
+ else {
+ style = styles.text
+ }
+ return (
+ <Text style={style} children={this.props.children} {...others} />
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ text: {
+ color: '#ffffff',
+ fontFamily: 'Futura-Medium',
+ textAlign: 'center',
+ fontSize: 16,
+ lineHeight: 30,
+ }
+})
diff --git a/client/src/lib/components/webViewModal.js b/client/src/lib/components/webViewModal.js
new file mode 100644
index 0000000..0796470
--- /dev/null
+++ b/client/src/lib/components/webViewModal.js
@@ -0,0 +1,56 @@
+import React, { Component } from 'react'
+import {
+ StyleSheet,
+ WebView,
+ View,
+ ActivityIndicator,
+} from 'react-native'
+import Modal from 'react-native-modal'
+
+import Close from './close'
+
+export default class WebViewModal extends Component {
+ render() {
+ return (
+ <Modal isVisible={!!this.props.url} style={styles.modal}>
+ <WebView
+ source={{uri: this.props.url || 'about:blank'}}
+ style={styles.webview}
+ startInLoadingState={true}
+ renderLoading={() => {
+ return (
+ <View style={styles.loadingContainer}>
+ <ActivityIndicator size="large" color="white" />
+ </View>
+ )
+ }}
+ />
+ <Close onPress={this.props.onClose} />
+ </Modal>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ modal: {
+ marginLeft: 0,
+ marginRight: 0,
+ marginBottom: 0,
+ marginTop: 0,
+ paddingTop: 60,
+ backgroundColor: 'black',
+ },
+ webview: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ },
+ loadingContainer: {
+ backgroundColor: 'black',
+ flex: 1,
+ height: '100%',
+ width: '100%',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+})
diff --git a/client/src/lib/components/youtube.js b/client/src/lib/components/youtube.js
new file mode 100644
index 0000000..ab5f8aa
--- /dev/null
+++ b/client/src/lib/components/youtube.js
@@ -0,0 +1,91 @@
+import React, { Component } from 'react';
+import {
+} from 'react-native';
+
+export default class Youtube extends Component {
+ constructor(props) {
+ super()
+ this.container = null
+ this.buildPlayer = this.buildPlayer.bind(this)
+ }
+ render() {
+ return (
+ <div ref={(ref) => this.container = ref} />
+ )
+ }
+ componentDidMount() {
+ if (YT_READY) {
+ this.buildPlayer()
+ }
+ else {
+ setTimeout(this.buildPlayer, 250)
+ }
+ }
+ buildPlayer() {
+ this.player = new YT.Player(this.container, {
+ videoId: this.props.ytid,
+ width: "100%",
+ height: 400,
+ playerVars: {
+ 'autohide': 1,
+ 'autoplay': 0,
+ 'disablekb': 0,
+ 'cc_load_policy': 3,
+ 'controls': 0,
+ 'enablejsapi': 1,
+ 'fs': 0,
+ 'modestbranding': 1,
+ 'iv_load_policy': 3,
+ 'loop': 0,
+ 'showinfo': 0,
+ 'rel': 0,
+ 'wmode': 'transparent',
+ 'hd': 1
+ },
+ events: {
+ onReady: function(e){
+ e.target.playVideo()
+ },
+ onStateChange: function(e){
+ switch(e.data){
+ case -1:
+ // unstarted
+ break
+ case 0:
+ // finished
+ break
+ case 1:
+ // play
+ break
+ case 2:
+ // pause
+ break
+ case 3:
+ // buffering
+ break
+ case 5:
+ // cued
+ break
+ default:
+ break
+ }
+ }
+ }
+ })
+ }
+ componentDidUpdate(prevProps, prevState) {
+ if (! this.player) {
+ return
+ }
+ else if (prevProps.ytid !== this.props.ytid) {
+ this.player.loadVideoById( this.props.ytid )
+ }
+ }
+}
+
+let YT_READY = false
+
+global.onYouTubeIframeAPIReady = function(){
+ console.log('youtube api loaded')
+ YT_READY = true
+}
diff --git a/client/src/lib/db/backupDB.js b/client/src/lib/db/backupDB.js
new file mode 100644
index 0000000..5e9f6cc
--- /dev/null
+++ b/client/src/lib/db/backupDB.js
@@ -0,0 +1,2278 @@
+export const backupDB = {
+ "timeline": [
+ {
+ "id": "camera-obscura",
+ "date": "Prehistoric, Paleolithic Age to Modernity",
+ "title": "Camera Obscura",
+ "medium": "Natural Phenomenon & Imagery",
+ "category": "Surveillance",
+ "keywords": "#Camera #Verticality #Linearity #Mimicry #Mimesis #Perspective #Reflection #Mirroring #Double #Duplication #Reproduction #Reproductivity #Self-consciousness #Eye #Surveillance #Photography #War #Painting #Police \r\n",
+ "description": "The 'Camera Obscura' is an optical phenomenon that occurs when an image is projected through a small hole on a screen or wall – as a reversed and inverted image on an opposite surface. The term \"camera obscura\" refers to constructions or devices that make use of that principle within a box, tent or room. Allegedly, early occurrences of camera obscura effects inspired paleolithic cave paintings. In the 18th century the technology was first used to convey images of observed subjects in a way that the observer remains invisible to the observed. The Camera Obscura is seen as the forerunner of modern photography and had large influence on Renaissance art. According to the so called Hockney-Falco thesis in art history, advances in realism and accuracy in Western art since the Renaissance period were primarily the result of optical instruments such as the camera obscura.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/d0610190-38d4-11e7-9d48-c59d5d130bc6.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "328"
+ },
+ "links": [
+ {
+ "text": "Wikipedia",
+ "uri": "https://en.wikipedia.org/wiki/Camera_obscura"
+ }
+ ],
+ "disabled": false,
+ "__index": 0,
+ "dateCreated": "Thu, 11 May 2017 11:39:53 GMT",
+ "credit": ""
+ },
+ {
+ "id": "god-s-all-seeing-eye",
+ "date": "ca. 3rd century BCE to today",
+ "title": "God’s All-seeing Eye",
+ "medium": "Religious Idea",
+ "category": "Surveillance",
+ "keywords": "#Eye #God #Providence #Guilt #Order #Control #Ethics #Christianity #Judaism #Islam #Bible #education #Skies #Clouds #Manipulation #Illuminati #Kabbalah #Secrecy #Dialectic #Knowledge #Future #Present #Past #Synthesis\r\n",
+ "description": "The motive of the divine eye was spread throughout Europe in the wake of the Counter-Reformation; its roots lie in the Antiquity, as well as in Jewish and Christian sources. Augustine described the religious idea of God’s all-seeing eye on the psychological level when he wrote: And from Thee, O lord, unto whose eyes the abyss of man’s conscience is naked, what could be hidden in me though I would not confess it? The psychic aspects of fear, control and education are lanced through the Antique iconography and culminated in the idea of God’s Providence. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f2d447f0-38d4-11e7-9d48-c59d5d130bc6.jpg",
+ "caption": "",
+ "width": "265",
+ "height": "300"
+ },
+ "disabled": false,
+ "__index": 1,
+ "dateCreated": "Thu, 11 May 2017 13:12:24 GMT",
+ "links": [],
+ "credit": ""
+ },
+ {
+ "id": "public-health-surveillance",
+ "date": "14th century–today",
+ "title": "Public Health Surveillance",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Epidemiology #Health #Surveillance #Sickness #Control #Plague #Immunity #Sickness #Disease #Plague #BlackDeath #HIV #Biology #Pharma-Industry\r\n",
+ "description": "Following the WHO, Public Health Surveillance is defined as “the continuous, systematic collection, analysis and interpretation of health-related data needed for the planning, implementation, and evaluation of public health practice.” Such surveillance serves several purposes, for example as early warning system for health emergencies and as documentation praxis which informs on the impact of a certain medical intervention. Health surveillance uses mortality data as a base for measuring public health, a praxis that arose ca. 600 years ago in Europe throughout the emergence of scientific thought in the Renaissance. In the example of HIV, surveillance reports were and are still used to collect data about HIV and AIDS – for example, population rates, numbers of people living with HIV and numbers of people who receive medical care. There have been various debates on human rights and civil liberty in the context of health surveillance. In the case of HIV, health surveillance often resulted in discrimination of sexual orientation.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/9c33f610-38d5-11e7-9d48-c59d5d130bc6.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "626"
+ },
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Public_health_surveillance"
+ },
+ {
+ "text": "link text",
+ "uri": "http://www.who.int/topics/public_health_surveillance/en/"
+ }
+ ],
+ "disabled": false,
+ "__index": 2,
+ "dateCreated": "Thu, 11 May 2017 13:22:04 GMT",
+ "credit": ""
+ },
+ {
+ "id": "the-field-has-eyes-the-forest-has-ears",
+ "date": "1546",
+ "title": "The Field has Eyes, the Forest has Ears",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Big Brother #Surveillance #Control #Gaze #Art",
+ "description": "The Dutch on the board above the main figure in the image refers to an old saying which was common in the 15th and 16th century: The Field has Eyes / the Forest has Ears / I want to see, keep silent and hear. It therefore admonishes to be cautious what to say in public. This woodcut represents an early example on the idea of privacy and the awareness of surveillance.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f9a43fd0-38d5-11e7-9d48-c59d5d130bc6.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "410"
+ },
+ "disabled": false,
+ "__index": 3,
+ "dateCreated": "Thu, 11 May 2017 13:51:40 GMT",
+ "links": [],
+ "credit": "Unknown engraver (Netherlandish), The Field has Eyes, the Forest has Ears, 1546, woodcut, coloured © Staatliche Museen zu Berlin, Kupferstichkabinett, SMB, Photo: Jörg Anders"
+ },
+ {
+ "id": "black-chamber",
+ "date": "17th Century",
+ "title": "Black Chamber",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Big Brother #Surveillance #Control #Institution #Interception #Information #Secrets #Deciphering #Espionage #Privacy #Governments #Intelligence #Cryptology\r\n",
+ "description": "“Black Chamber” is the name used for secret decipher bureaus established as early as the postal system. Governmentally operated, the bureau would intercept letters, gather intelligence of political rivals and channel them back into the postal system without further notice. The most well-known cases were the Cabinet Noire in France run under Ludwig XIV, the Geheime Kabinettskanzlei (Secret Chancellery) in Vienna, Austria, the British Room 40 and then Bletchley Park that became home to the greatest codebreakers. After World War One, the US established their first crypto-analytical institute to intercept correspondence of other nations. Operating under a bogus company based in New York City, the US-Black Chamber was a direct predecessor of the National Security Agency (NSA).\r\n",
+ "image": {
+ "uri": "https://upload.wikimedia.org/wikipedia/commons/7/77/Bodleian_Libraries%2C_Le_cabinet_noir_ou-_les_pantins_du_19eme_si%C3%A8cle.jpg",
+ "caption": "",
+ "width": "751",
+ "height": "1000"
+ },
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.nytimes.com/2006/01/13/opinion/back-when-spies-played-by-the-rules.html"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.nsa.gov/about/cryptologic-heritage/center-cryptologic-history/pearl-harbor-review/black-chamber.shtml"
+ }
+ ],
+ "disabled": false,
+ "__index": 4,
+ "dateCreated": "Thu, 11 May 2017 13:54:19 GMT",
+ "credit": "French political cartoon; MS annotations in ink identifying the figures. 1815."
+ },
+ {
+ "id": "panopticon",
+ "date": "1791",
+ "title": "Panopticon",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Big Brother #Surveillance #Control #Bentham #Panopticon #Foucault #Prison #Institution #Totalitarianism #Observation\r\n",
+ "description": "The panopticon, designed by Jeremy Bentham in the late 18th century, is a circular architectural draft for an institution with an observation tower in its centre. It’s surrounded by an outer wall that contains cells for occupants. Residing within light-flooded cells, occupants would be distinguishable to an official or guard. Yet, occupants would be invisible to each other, with concrete walls dividing their cells. Due to the bright lighting, occupants would not be able to tell if and when they are being watched. Although usually associated with prisons, panoptic architecture might be used in similar institutions with surveillance needs, such as schools, factories, or hospitals. \r\n",
+ "image": {
+ "uri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Panopticon.jpg/544px-Panopticon.jpg",
+ "caption": "Jeremy Bentham, plan of the Panopticon / 1791 / in The works of Jeremy Bentham vol. IV, 172-3 / public domain\r\n",
+ "width": "544",
+ "height": "600"
+ },
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://en.wikipedia.org/wiki/Panopticon"
+ }
+ ],
+ "disabled": false,
+ "__index": 5,
+ "dateCreated": "Thu, 11 May 2017 13:56:03 GMT",
+ "credit": ""
+ },
+ {
+ "id": "hot-air-balloon-bombing-",
+ "date": "1849",
+ "title": "Hot Air Balloon Bombing ",
+ "medium": "Image",
+ "category": "Drones",
+ "keywords": "#Drones #UAV #Airstrike #Attack #Military #Warfare #Venice #Austria",
+ "description": "Arguably, this was the first drone strike in history: In August 22nd 1849 Venice was bombarded by unmanned balloons launched by the Austrians who controlled much of Italy at the time. The experimental approach of using hot air balloons, which carried ordnance, was a consequence of the actual topography of Venice – since the city was surrounded by water, the Austrian artillery could not intrude. This incidence is the first known use of aerial bombing. \r\n\r\nThe image below illustrates an artistic interpretation of the bombing from a russian source. \r\n",
+ "image": {
+ "uri": "http://www.ctie.monash.edu/hargrave/images/balloonbombs1848_500.jpg",
+ "caption": "",
+ "width": "500",
+ "height": "752"
+ },
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.ctie.monash.edu/hargrave/rpav_home.html#Beginnings"
+ }
+ ],
+ "disabled": false,
+ "__index": 6,
+ "dateCreated": "Thu, 11 May 2017 13:58:11 GMT",
+ "credit": " Bombing by Balloon, 1848, Source: Prof. Jurij Drushnin, Moscow, Russia"
+ },
+ {
+ "id": "boston-as-the-eagle-and-the-wild-goose-see-it",
+ "date": "1860",
+ "title": "Boston, as the Eagle and the Wild Goose See It",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Aerial-Photography #Verticality #Photography\r\n",
+ "description": "The photographer J.W. Black launched his solo career in 1860 with the production of a series of photographs taken from Samuel King's hot-air balloon the \"Queen of the Air.\" Black's views of Boston were the first aerial photographs taken in the US; two years earlier the Frenchman Nadar had made history with similar views of Paris.\r\n\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/c505b300-3653-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "530",
+ "height": "625"
+ },
+ "credit": "James Wallace Black / 1860 / Public Domain\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.metmuseum.org/art/collection/search/283189"
+ }
+ ],
+ "disabled": false,
+ "__index": 7,
+ "dateCreated": "Thu, 11 May 2017 14:12:33 GMT"
+ },
+ {
+ "id": "angel-copier",
+ "date": "1873",
+ "title": "Angel Copier",
+ "medium": "Image",
+ "category": "Facial Recognition",
+ "keywords": "#Facial Recognition #Prison #Photography #Biometrics #Photography\r\n",
+ "description": "In Victorian times photography was used for the identification of prisoners. It was perceived as a more humane alternative to branding them. Some Victorian police would refer to the camera as ‘angel copier‘. The shown engraving depicts a prisoner resisting being photographed.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/26cab0e0-3654-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "371",
+ "height": "226"
+ },
+ "credit": "Samuel Luke Fildes / The Graphic / 1873 via Jennifer Tucker",
+ "links": [
+ {
+ "text": "link text",
+ "uri": "https://www.bostonglobe.com/ideas/2014/11/23/facial-recognition-technology-goes-way-back/CkWaxzozvFcveQ7kvdLHGI/story.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 8,
+ "dateCreated": "Thu, 11 May 2017 14:15:46 GMT"
+ },
+ {
+ "id": "fingerprints-for-identification",
+ "date": "1880s",
+ "title": "Fingerprints for Identification",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Biometrics #Prison #Information #Control #Identification #Police\r\n",
+ "description": "Fingerprint characteristics were studied as far back as mid-1600s and used as means of identification by British colonialists in India in the mid 19th century. Several people are credited with classifying the fingerprinting system for means of identification in the criminal sector: Sir Francis Galton, a British anthropologist who published a book on the forensic science of fingerprints and claimed the chance of two people having the same fingerprint was about one to 64 million. Henry Fauld, a scottish scientist, and Edward Henry, a British police commissioner who developed the Henry Classification System which served to sort fingerprints by their physiological characteristics was the basis of the modern-day Automated Fingerprint Identification System (AFIS) that was used up until the 1990s. The image indicates the beginnings of fingerprinting, implemented by Sir William James Herschel, Chief Magistrate of the Hooghly district in Jungipoor, India in 1858 in a contract with a local businessman.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/cc92b950-3654-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "331"
+ },
+ "credit": " Sir William James Herschel, “The Origin of Finger Printing\" 1916., (Public Domain)\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.onin.com/fp/fphistory.html"
+ },
+ {
+ "text": "Link text ",
+ "uri": "https://archive.org/details/originoffingerpr00hersrich"
+ }
+ ],
+ "disabled": false,
+ "__index": 9,
+ "dateCreated": "Thu, 11 May 2017 14:19:50 GMT"
+ },
+ {
+ "id": "bertillonage",
+ "date": "1880",
+ "title": "Bertillonage",
+ "medium": "Image",
+ "category": "Facial Recognition",
+ "keywords": "#Facial Recognition #Biometrics #Prison #Information #Photography #Police #Identification #Technology\r\n",
+ "description": "Bertillonage is a system of measuring and categorizing individuals, also known as anthropometry. It was named after the French criminologist and anthropologist Alphonse Bertillon and used from the Parisian police from 1883 to track and identify criminals. In addition of a frontal and profile portrait photograph (the ‘mug shot‘), the body measurements and feature classifications of the individual were collected on a card. The cards were then systematically filed so they could be easily retrieved. The Bertillonage system was later adopted by police forces in Great Britain, Europe and the Americas until it was replaced by using fingerprints for identification in the early 20th century.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/38befc10-3655-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "638"
+ },
+ "credit": "Creative Commons CC0 1.0 Universal Public Domain Dedication\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.nlm.nih.gov/visibleproofs/galleries/biographies/bertillon.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 10,
+ "dateCreated": "Thu, 11 May 2017 14:22:47 GMT"
+ },
+ {
+ "id": "metric-photography",
+ "date": "1908",
+ "title": "Metric Photography",
+ "medium": "Image",
+ "category": "Facial Recognition",
+ "keywords": "#Facial Recognition #Biometrics #Verticality #Photography #All-Seeing Eye\r\n",
+ "description": "In 1903, Alphonse Bertillon, who is known to have standardized identification methods for criminals and credited with the invention of the mug-shot, introduced metric photography to investigate crime scenes. He constructed an about two meters high tripod, with which one could take a vertical perspective photographs of murder victims at the places of their deaths. This way, it was possible to provide with full photographic evidence. He referred to the bird’s-eye perspective as a “God’s-eye view”. Bertillons metric photography was applied at the criminal department of forensic medicine and anthropology in France. The photo depicts a demonstration with a false corpse.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/81cf0e40-3655-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "473"
+ },
+ "credit": "(1) Rodolphe A Reiss, Demonstration of the Bertillon metric photography system, 1925. © RA Reiss, courtesy of Collection of the Institut de Police Scientifique et de Criminologie de l’Université de Lausanne.\r\n(2) A demonstration of the Bertillon metric photography system, 1908 Credit: Archives de la préfecture de Police \r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://archive.org/details/cu31924096442185"
+ }
+ ],
+ "disabled": false,
+ "__index": 11,
+ "dateCreated": "Thu, 11 May 2017 14:24:53 GMT"
+ },
+ {
+ "id": "aelita-queen-of-mars",
+ "date": "1924",
+ "title": "Aelita: Queen of Mars",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Telescope #Television #silent film #totalitarianism #futurism #gaze #observation #radio\r\n",
+ "description": "Decades before cameras were used for surveillance, the Soviet film Aelita: Queen of Mars was one of the first to depict television as an instrument of those in power to oversee the working class. In the film, a mysterious radio message is beamed around the world; among the engineers who receive it are Los, the film’s hero, and his colleague Spiridonov. Los is an individualist dreamer. Aelita is the daughter of Tuskub, the ruler of a totalitarian state on Mars. With a telescope, Aelita is watching Los. As if by telepathy, Los becomes obsessed about being watched by her.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/cf791af0-3655-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "375",
+ "height": "300"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.imdb.com/title/tt0014646/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Aelita"
+ }
+ ],
+ "disabled": false,
+ "__index": 12,
+ "dateCreated": "Thu, 11 May 2017 14:27:00 GMT"
+ },
+ {
+ "id": "the-castle",
+ "date": "1926",
+ "title": "The Castle",
+ "medium": "Novel",
+ "category": "Surveillance",
+ "keywords": "#Castle #paranoia #despotism #All-seeing-Eye\r\n",
+ "description": "Franz Kafka’s The Castle depicts a world dominated by uncertainty: everything is opaque and ambiguous. K., arrives in a village where he might have been summoned to work as a land surveyor. The villagers seem to be expecting and not expecting him at the same time; there seems to be a job – and no job. Governing the village is a castle from which officials give contradicting orders. Even though the castle’s bureaucracy seems arbitrary or incompetent, the inhabitants of the village hold the officials and the castle in the highest esteem, while completely ignoring the reasons behind any of the officials decisions. Though Kafka’s novel does not feature any actual surveillance technology – and it is further unclear if the bureaucracy of the officials is actually efficient – the general atmosphere is one of mistrust, paranoia and despotism that is commonly associated with a surveillance society. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/0fb161e0-3656-11e7-a37a-4579121b15f0.jpg",
+ "caption": "Quote : “I dream of a grave, deep and narrow, where we could clasp each other in our arms as with clamps, and I would hide my face in you and you would hide your face in me, and nobody would ever see us any more” ",
+ "width": "180",
+ "height": "281"
+ },
+ "credit": "",
+ "disabled": false,
+ "__index": 13,
+ "dateCreated": "Thu, 11 May 2017 14:29:05 GMT",
+ "links": []
+ },
+ {
+ "id": "queen-bee-and-drone",
+ "date": "1932",
+ "title": "Queen Bee and Drone",
+ "medium": "Item / Image",
+ "category": "Drones",
+ "keywords": "#Drone #Warfare #Airstrikes #Technology #Airplanes #Attack #UAV #Technology\r\n",
+ "description": "Investing into development of remotely controlled vehicles sped after World War I. Although the DH-82B Queen Bee had many predecessors, it was the first full production, fully-sized, reusable, pilotless aircraft that was used for anti-aircraft gunnery practice. It was designed by engineer Geoffrey Havilland from the British Air Force, who was a passionated amateur entomologist and would call his aircrafts after insects (Tiger Moth, Fox Moth, Mosquito, and Dragonfly). In 1935, a US Navy admiral visited the Royal Air and was demonstrated the Queen Bee. Upon his return to the US, he assigned to develop a similar system for gunnery training and adopted the name drone, as an homage to the Queen Bee. Since then the name drone became a designation for remotely flown aircraft systems.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/60afc9b0-3656-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "432"
+ },
+ "credit": "Imagecourtesy: A demonstration of the Queen Bee, controlled over a panel from the ground. Royal Air Force\r\n",
+ "links": [
+ {
+ "text": "Vintage Wings",
+ "uri": "http://www.vintagewings.ca/VintageNews/Stories/tabid/116/articleType/ArticleView/articleId/484/The-Mother-of-All-Drones.aspx"
+ },
+ {
+ "text": "Defense News",
+ "uri": "http://intercepts.defensenews.com/2013/05/the-origin-of-drone-and-why-it-should-be-ok-to-use/"
+ }
+ ],
+ "disabled": false,
+ "__index": 14,
+ "dateCreated": "Thu, 11 May 2017 14:31:55 GMT"
+ },
+ {
+ "id": "world-without-a-mask-",
+ "date": "1934",
+ "title": "World Without A Mask ",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Television #Surveillance #Misuse #Technology\r\n",
+ "description": "In the German film production World Without a Mask (1934) an engineer accidentally invents a television apparatus which can see through walls. Soon enough, the criminal underworld wants to profit from this technology.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/d076e670-3656-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "436",
+ "height": "640"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "http://www.imdb.com/title/tt0025968/"
+ }
+ ],
+ "disabled": false,
+ "__index": 15,
+ "dateCreated": "Thu, 11 May 2017 14:34:17 GMT"
+ },
+ {
+ "id": "hollerith-punchcards",
+ "date": "World War II Era, ca. 1934",
+ "title": "Hollerith Punchcards",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#All-Seeing Eye #Punchcard #Big-Data #Surveillance #Germany #Fascism #Computing #World War II #Identification",
+ "description": "This poster advertised Hollerith punchcard technology from IBMs German subsidiary DEHOMAG (Deutsche Hollerith Maschinen Gesellschaft). The english translation is, ‘See everything with Hollerith punchcards‘. This early computing system was used by Nazi Germany to track and identify jews and other minorities and ultimately helped facilitate the Holocaust.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/6b9f0dd0-3657-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "455",
+ "height": "619"
+ },
+ "credit": "Edwin Black in IBM and the Holocaust / 2001\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.jewishvirtuallibrary.org/ibm-and-quot-death-s-calculator-quot"
+ },
+ {
+ "text": "Link text ",
+ "uri": "http://www.nytimes.com/books/first/b/black-ibm.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 16,
+ "dateCreated": "Thu, 11 May 2017 14:38:32 GMT"
+ },
+ {
+ "id": "u-s-one-dollar-bill",
+ "date": "1935",
+ "title": "U.S. One-Dollar Bill",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#USA #All-Seeing Eye #Governments\r\n",
+ "description": "The all seeing-eye of God famously appears on the reverse of the US one dollar bill. Atop a unfinished thirteen steps pyramid and surrounded by rays of light, it is part of the symbolism of the Great Seal of the United States. The usage of the eye in the seal dates back as far as 1782. The all-seeing Eye or the Eye of Providence is often interpreted as representing the eye of God keeping a watch over humankind. Often utilized by the Freemasons, the design of the one-dollar bill was subject to several conspiracy theories.\r\nSurrounding the eye and pyramid are the latin phrases “Annuit Cœptis\", meaning \"He approves (or has approved) our undertakings“ and \"Novus Ordo Seclorum,\" meaning \"New Order of the Ages“. In 1957 the phrase „In God We Trust“ was added, which makes the design that is still in use today.\r\nThe image depicts former President Franklin D. Roosevelt approving the design with the condition that the order of the seal should be reversed so the phrase \"of the United States\" would be under the obverse side of the Seal.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/305885b0-38c5-11e7-9d48-c59d5d130bc6.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "413"
+ },
+ "credit": "public domain, 1935\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://www.uscurrency.gov/content/history-american-currency"
+ }
+ ],
+ "disabled": false,
+ "__index": 17,
+ "dateCreated": "Thu, 11 May 2017 14:44:14 GMT"
+ },
+ {
+ "id": "the-turing-machine-",
+ "date": "1936",
+ "title": "The Turing Machine ",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Turing-Machine #Computing #Encryption #Computer-Science #Warfare #Espionage #Codebreaking #Intelligence #Enigma \r\n",
+ "description": "A Turing machine is a hypothetical machine thought of by the mathematician Alan Turing in 1936. Despite its simplicity, it can simulate any algorithm. The Turing machine is considered as the first mathematical model of computation and therefore also the blueprint for the modern computer. Its prior usage in the time of its development was to break a supposedly unbreakable encryption system called “Enigma”, which the Nazis depevolpped and applied during World War II.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/95eeb300-3658-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "92"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.newyorker.com/magazine/2006/02/06/code-breaker"
+ },
+ {
+ "text": "Link text",
+ "uri": " https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 18,
+ "dateCreated": "Thu, 11 May 2017 14:46:58 GMT"
+ },
+ {
+ "id": "spy-in-the-sky-",
+ "date": "1936",
+ "title": "Spy in the Sky ",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Animal Kingdom #Spy #World War II #All-Seeing Eye #Aerial Surveillance #Photography #Warfare #Technology\r\n",
+ "description": "Originated with Julius Neubronners camera fitted pigeons that became early aerial photography in 1907, the pigeon based espionage was commonly used in World War II by Great Britain, Germany and the US. Later, the CIA used pigeons for top secret reconnaissance missions.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/1edb3b10-365a-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "427",
+ "height": "640"
+ },
+ "credit": "AR/BNPS\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.audubon.org/news/eyes-sky-short-history-bird-spies"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.rpra.org/pigeon-history/pigeons-in-war/"
+ }
+ ],
+ "disabled": false,
+ "__index": 19,
+ "dateCreated": "Thu, 11 May 2017 14:58:04 GMT"
+ },
+ {
+ "id": "five-eyes",
+ "date": "1946",
+ "title": "Five Eyes",
+ "medium": "Political Agreement",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Control #Governments #FiveEyes #Big Brother #Espionage #Intelligence #Information #NSA #Politics #Pentagon #Secrets #Secret Service #Signals\r\n",
+ "description": "The Five Eyes alliance is a secret surveillance arrangement comprising Australia, Canada, New Zealand, United Kingdom and the United States of America. It originated as early as 1946 with a series of bilateral agreements that became known as the UKUSA agreement with the purpose to share intelligence, primarily signal intelligence (aka SIGINT) between the members. Since the cold war the alliance has been building a global surveillance infrastructure to spy on the world’s communication with an emphasis placed on monitoring the World Wide Web since the US have called out a war on terror in 2001.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/6d6176f0-365a-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "424",
+ "height": "599"
+ },
+ "credit": "Cover of the UKUSA Agreement 1946, Public Domain\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://www.privacyinternational.org/node/51"
+ }
+ ],
+ "disabled": false,
+ "__index": 20,
+ "dateCreated": "Thu, 11 May 2017 14:59:45 GMT"
+ },
+ {
+ "id": "moonbounce",
+ "date": "1946",
+ "title": "Moonbounce",
+ "medium": "Program",
+ "category": "Surveillance",
+ "keywords": "#Moon #Surveillance #Interception #Signal #Covered Operations #Cold-War #Conspiracy #Espionage #Governments #Information #Radar #Antenna #Technology\r\n",
+ "description": "Moonbounce describes the phenomenon that signals emanating the earth would bounce back from the moon to be detected from other locations. The radar-reflective characteristics of the lunar surface were already successfully tested in 1946. One time in surveillance history this came to use was in the US-Air Force led project named FLOWER GARDEN in the early 1960s to monitor and intercept radar signals from the Soviet Union. Several antennas around the US where used for moonbounce – also operated by the CIA and the NSA.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/b0a50210-365a-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "637",
+ "height": "640"
+ },
+ "credit": "NASA, 1969\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "http://nsarchive.gwu.edu/NSAEBB/NSAEBB479/"
+ }
+ ],
+ "disabled": false,
+ "__index": 21,
+ "dateCreated": "Thu, 11 May 2017 15:01:35 GMT"
+ },
+ {
+ "id": "george-orwell-1984-",
+ "date": "1949",
+ "title": "George Orwell, “1984”",
+ "medium": "Book",
+ "category": "Surveillance",
+ "keywords": "#Dystopia #Big Brother #All-Seeing Eye #Literature #Control\r\n",
+ "description": "George Orwell’s Nineteen Eighty-Four is the most well-known cultural expression of fear of surveillance and a powerful metaphor for the totalitarian potentials of any bureaucratic state. Evocations of a menacing “Big Brother” have become commonplace in discussions about surveillance and control, and so have debates about whether or not Orwell was “right” in his predictions as portrayed in the book.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/1127e300-365b-11e7-a37a-4579121b15f0.jpg",
+ "caption": "Quotes: \r\n– “Who controls the past controls the future. Who controls the present controls the past.”\r\n– “The best books... are those that tell you what you know already”\r\n\r\n",
+ "width": "430",
+ "height": "640"
+ },
+ "credit": "First Edition, published 1949, Secker & Warburg \r\n",
+ "disabled": false,
+ "__index": 22,
+ "dateCreated": "Thu, 11 May 2017 15:05:14 GMT",
+ "links": []
+ },
+ {
+ "id": "fake-beard-seminars",
+ "date": "1950–1989",
+ "title": "Fake Beard Seminars",
+ "medium": "Photographs",
+ "category": "Surveillance",
+ "keywords": "#Photography #Germany #Spy #Ethics #Information #Covered Operation #Secrets #Privacy #Police #Camouflage\r\n",
+ "description": "The personnel of the Ministry for State Security of East Germany, commonly known as Stasi, one of the most effective surveillance apparatuses ever, was trained on how to disguise to move unsuspicious in society. The photo shows an instruction seminar on affixing fake facial hair properly – a Stasi’s standard repertoire. Other seminars would train the agents on how to wear wigs or dress as a western tourist. Such seminars were documented for training purposes and made into manuals.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/8b6538c0-365b-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "427"
+ },
+ "credit": "© Simon Menner and BStU 2017",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://simonmenner.com/_sites/SurveillanceComplex/StasiImages/_StasiImagesMenue.html#"
+ }
+ ],
+ "disabled": false,
+ "__index": 23,
+ "dateCreated": "Thu, 11 May 2017 15:08:41 GMT"
+ },
+ {
+ "id": "calibration-targets-for-spy-satellites",
+ "date": "1950–60",
+ "title": "Calibration Targets for Spy Satellites",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Reconnaissance #All-Seeing Eye #Aerial Surveillance #Spy Satellite #Top-Secret #Cold-War #Verticality #Aerial-Photography #NASA #Photography #Geography #Technology\r\n",
+ "description": "In the development of early aerial photography and aircraft in the 1950s and 1960s, several large-scale photo calibration targets were installed across the USA. Made of concrete or asphalt covered with black and white paint, they functioned as eye charts for the cameras of spy satellites. Mainly located on non-public, military ground, they are physical artefacts of early aerial surveillance, today to be found virtually on Google Maps.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/790be2d0-365d-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "440"
+ },
+ "credit": "Calibration target from the photo resolution range, Edwards Air Force Base; Google Maps\r\n",
+ "disabled": false,
+ "__index": 24,
+ "dateCreated": "Thu, 11 May 2017 15:21:39 GMT",
+ "links": []
+ },
+ {
+ "id": "rear-window",
+ "date": "1954",
+ "title": "Rear Window",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Film #Watching #Investigation #Surveillance #Camera #Architecture #Evidence #Photography #Public #Private\r\n",
+ "description": "Alfred Hitchcock‘s ‘Rear Window’ tells the story of a car race photographer who is confined to his New York City apartment after suffering an injury. While observing the daily life of his neighbours through the rear window, he suspects a man across the courtyard committed murder to his wife. Bound to his wheelchair, he enlists the help of his fashionable high-society girlfriend and his visiting nurse to investigate.\r\nThe movie addresses issues of the private and public in a tense, urban architecture. While the neighbours are visible to the protagonist, he is not being seen by them until the moment he draws attention to the suspected murderer who then attempts to kill him.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f54cd0c0-365d-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "456",
+ "height": "456"
+ },
+ "credit": "screenshot\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.academia.edu/305175/Surveillance_and_Ethics_In_Film_Rear_Window_and_The_Conversation"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/film/filmblog/2012/jul/25/my-favourite-hitchcock-rear-window"
+ }
+ ],
+ "disabled": false,
+ "__index": 25,
+ "dateCreated": "Thu, 11 May 2017 15:25:23 GMT"
+ },
+ {
+ "id": "acoustic-kitty",
+ "date": "1960s",
+ "title": "Acoustic Kitty",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Animal Kingdom #Cold-War #Espionage #CIA #Bug #Intelligence #Technology #Device\r\n",
+ "description": "In the 1960’s the CIA experimented with living cats as eavesdropping devices to spy on America’s cold war rivals. In the operation known as “Acoustic Kitty”, a cat was surgical accommodated with electronic spying equipment: a microphone in the cat’s ear canal, a radio transmitter and an antenna wire along its spine and tail. It was even possible to direct it with ultrasonic sound. The first test to spy on a conversation of two people on a park bench was a failure, as the cat was run over by a taxi almost immediately after released out of the CIA researchers van. The project took 5 years in development and costed $15 million.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/493c6510-365e-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "447"
+ },
+ "credit": "unknown\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://www.theguardian.com/world/2001/sep/11/worlddispatch"
+ },
+ {
+ "text": "Link text ",
+ "uri": "https://nsarchive.wordpress.com/2010/03/05/document-friday-acoustic-kitty/"
+ },
+ {
+ "text": "Link text ",
+ "uri": "http://nsarchive.gwu.edu/NSAEBB/NSAEBB54/st27.pdf"
+ }
+ ],
+ "disabled": false,
+ "__index": 26,
+ "dateCreated": "Thu, 11 May 2017 15:27:58 GMT"
+ },
+ {
+ "id": "corona-first-reconnaissance-satellite-image",
+ "date": "1960",
+ "title": "Corona first Reconnaissance Satellite Image",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Reconnaissance #All-Seeing Eye #Aerial Surveillance #Spy Satellite #Top-Secret #Cold-War #Photography\r\n",
+ "description": "Corona was the codeword of the first successful reconnaissance satellites program led by the CIA from 1959 to 1972. It mission was to gather photographic intelligence, mainly of the Soviet Union. The first photo taken on August 8, 1960 was a grainy image of a Soviet Airfield. Originally classified as top secret, it was declassified in 1995 under an Executive Order signed by President Bill Clinton.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/bdd3a780-365e-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "499",
+ "height": "640"
+ },
+ "credit": "Courtesy: NRO / Public Domain",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.nro.gov/history/csnr/corona/factsheet.html"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Corona_(satellite)#Declassification"
+ }
+ ],
+ "disabled": false,
+ "__index": 27,
+ "dateCreated": "Thu, 11 May 2017 15:31:46 GMT"
+ },
+ {
+ "id": "first-cia-facial-recognition-proposal",
+ "date": "1963",
+ "title": "First CIA facial recognition proposal",
+ "medium": "Document",
+ "category": "Facial Recognition",
+ "keywords": "#CIA #Facial Recognition #Biometrics #Classified Information #Computing #Technology\r\n",
+ "description": "In 1963 Dr. Woodrow Wilson Bledsoe, a pioneer in artificial intelligence, submitted a facial recognition report to the King-Hurley Research group – a front organization of the CIA – that included systems noting key facial features to identify a faces, for example the width of the mouth or between the eyes. The report constitutes the first known attempt of semi-automated computerized facial recognition.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/1a6e18c0-3661-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "441",
+ "height": "517"
+ },
+ "credit": "public domain / screenshot from document (link below)\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://archive.org/details/firstfacialrecognitionresearch"
+ }
+ ],
+ "disabled": false,
+ "__index": 28,
+ "dateCreated": "Thu, 11 May 2017 15:47:33 GMT"
+ },
+ {
+ "id": "teufelsberg-devil-s-mountain-berlin",
+ "date": "1963",
+ "title": "Teufelsberg (“Devil’s Mountain”), Berlin",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#NSA #Surveillance #Covered Operations #Cold-War #Espionage #Fascism #Germany #Governments #Interception #Intelligence #Signal #Information #War #Geography #Architecture #Radome #Radar #Antenna #Technology\r\n",
+ "description": "Teufelsberg (literal, english “devil’s hill”) is a man-made hill in Berlin. Built on top of a unfinished Nazi military-technical college, it was created in the 20 years following Second World War by moving debris from the destroyed City of Berlin. In 1963 the NSA build a permanent listening station atop the mountain to spy on the eastern Allies. The Field Station had four radomes containing large satellite antennas. With the most sophisticated spying equipment for that time, they enabled the US and British intelligence to intercept satellite signals, radio waves, microwave links and other transmissions. The unique history made Teufelsberg a tourist attraction.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/617c4070-3661-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "632",
+ "height": "508"
+ },
+ "credit": "US Army Intelligence & Security Command\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.dw.com/en/teufelsberg-mirrors-berlins-dramatic-history/a-17074597"
+ }
+ ],
+ "disabled": false,
+ "__index": 29,
+ "dateCreated": "Thu, 11 May 2017 15:49:16 GMT"
+ },
+ {
+ "id": "blow-up",
+ "date": "1966",
+ "title": "Blow Up",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Espionage #Camera #Film #Evidence #Photography #Arts #Surveillance #Watching #Conspiracy\r\n",
+ "description": "In the legendary 1960s movie „Blow Up“ a London fashion photographer unwittingly captures a crime in a park. In the scene the title is taken from, he blows up the photograph that becomes blurry evidence of the murder. While he starts investigating, the camera becomes a leading role in the narration while addressing issues of reality, illusion and conspiracy.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/9ab4b070-3661-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "600",
+ "height": "411"
+ },
+ "credit": "unknown\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/film/2017/mar/10/antonioni-blow-up-50-years-movie-photographer-murder"
+ }
+ ],
+ "disabled": false,
+ "__index": 30,
+ "dateCreated": "Thu, 11 May 2017 15:50:52 GMT"
+ },
+ {
+ "id": "echelon",
+ "date": "1966",
+ "title": "ECHELON",
+ "medium": "Program",
+ "category": "Surveillance",
+ "keywords": "#Espionage #Surveillance #Spy Satellite #Top-Secret #Cold-War #Big Brother #Governments #Intelligence #NSA #FiveEyes #Privacy #Snowden #Whistleblowing #Police State #Civil Rights #Interception #Radome #Technology\r\n",
+ "description": "ECHELON is the codename given to a secret international electronic eavesdropping network run by the Five Eyes alliance. Created in 1966 its aim was to spy on diplomatic and military communication during the Cold War by intercepting satellites. By the end of the 20th century civil right groups and privacy advocates believe it was the first-ever automated, global, mass surveillance program, spanning much further than intercepting satellites, but literally listening to everybody. It would capture all communication traffic and run it through a content-sensitive dictionaries of keywords or anything intelligence services deem to be “suspicious.”\r\nAlthought the NSA and the GCHQ denied the existence of ECHELON and the European Parliament launched an investigation in 1999, internal reports, disclosed by Edward Snowden confirmed ECHELONS existence.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/d9a13d80-3661-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "343"
+ },
+ "credit": "First ECHELON station intercepting Intelsat Atlantic and Indian Ocean area satellites: Bude, Cornwal.",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://firstlook.org/wp-uploads/sites/1/2015/07/rexusa_2569089a-1024x428.jpg"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://theintercept.com/2015/08/03/life-unmasking-british-eavesdroppers/"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.europarl.europa.eu/sides/getDoc.do?type=REPORT&reference=A5-2001-0264&format=XML&language=EN"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.spiegel.de/international/world/snowden-documents-show-gchq-targeted-european-and-german-politicians-a-940135-2.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 31,
+ "dateCreated": "Thu, 11 May 2017 15:52:41 GMT"
+ },
+ {
+ "id": "the-internet",
+ "date": "1969",
+ "title": "The Internet",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Internet #Network #Big Data #Computing #Digital Rights #Metadata #Net Politics\r\n",
+ "description": "The origins of the Internet date back to the 1960s when the US-federal government commissioned research to built robust communication via computer networks. It is an interconnected network that consists of private, public, academic, business, and government networks of local to global scope, linked by a broad array of electronic, wireless, and optical networking technologies. The Internet carries an extensive range of information resources and services. The vast majority of today’s computer surveillance involves the monitoring of data and traffic on the Internet.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/464a9f80-3662-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "360"
+ },
+ "credit": "The Opte Project, Internet Map 2003, (This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License) © 2014 by LyonLabs, LLC and Barrett Lyon\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.internetsociety.org/internet/what-internet/history-internet/brief-history-internet#"
+ }
+ ],
+ "disabled": false,
+ "__index": 32,
+ "dateCreated": "Thu, 11 May 2017 15:55:43 GMT"
+ },
+ {
+ "id": "insectothopter",
+ "date": "1970s",
+ "title": "Insectothopter",
+ "medium": "Item",
+ "category": "Drones",
+ "keywords": "#CIA #Animal Kingdom #Drone #Bug #Espionage #Robot #UAV #Intelligence #Technology #Device\r\n",
+ "description": "In the 1970s the CIA build a prototype for miniaturized UAVs (Unmanned Aerial Vehicles) for collecting intelligence in the form of a dragonfly. The insectothopter, as they called it, was a robotic dragonfly that functioned as a audio bug. It was powered by a motor, propelled by a small amount of gas and guided by a laser beam in the rear of the dragonfly-drone. A watchmaker adapted the UAV to the actual scale size of a real dragonfly. After the insectothopter proved too unstable in crosswinds, the project wasn’t further developed.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/8d80c190-3662-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "426"
+ },
+ "credit": "CIA\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.cia.gov/library/video-center/video-transcripts/insectothopter-the-bug-carrying-bug.html"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.atlasobscura.com/articles/object-of-intrigue-the-cia-s-dragonfly-drone"
+ }
+ ],
+ "disabled": false,
+ "__index": 33,
+ "dateCreated": "Thu, 11 May 2017 15:57:41 GMT"
+ },
+ {
+ "id": "thx-1138",
+ "date": "1971",
+ "title": "THX 1138",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Camera #Drugs #Emotions #Android #Police #Computers #Film\r\n",
+ "description": "With the spread of surveillance camera technology in the public space, as well as the rising significance of computers and databases in the late 1960s, more films became concerned with the prospect of living in a world of pervasive surveillance. THX 1138, George Lucas’ remake of his own short “Electronic Labyrinth: THX 1138 4EB” (1967), is one of those early reactions to an increasingly surveilled society. It shows a dystopian future in which total control over society is exercised by computers, surveillance cameras and android police officers. Conformity and homogeneity are basic rule. THX 1138, a factory worker who produces android police officers, is given a glimpse into the other side through his computer matched and thus appointed female roommate, LUH 3417 and her surveillance colleague. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e0127390-3662-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "287"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.youtube.com/watch?v=ihpU1RE_AhA"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/THX_1138"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.imdb.com/title/tt0066434/"
+ }
+ ],
+ "disabled": false,
+ "__index": 34,
+ "dateCreated": "Thu, 11 May 2017 16:00:10 GMT"
+ },
+ {
+ "id": "stevie-wonder-big-brother",
+ "date": "1972",
+ "title": "Stevie Wonder – Big Brother",
+ "medium": "Song",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #All-Seeing Eye #Big Brother #Control #Dystopia #Privacy #Totalitarianism #Music\r\n",
+ "description": "Stevie Wonders studio album Talking Book, which was released in 1972 includes the song „Big Brother“. The song is a serene composed electro-folk ballad in protest against the Nixon presidency and its surveillance culture. It features the songlines: Your name is big brother / You say that you're watching me on the tele / Seeing me go nowhere / Your name is big brother / You say that you're tired of me protesting / Children dying everyday / My name is nobody / But I can't wait to see your face inside my door ooh\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/75d62da0-36e9-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "640"
+ },
+ "credit": "Motown Records (needs recheck)",
+ "disabled": false,
+ "__index": 35,
+ "dateCreated": "Fri, 12 May 2017 08:05:15 GMT",
+ "links": []
+ },
+ {
+ "id": "blue-marble",
+ "date": "1972",
+ "title": "Blue Marble",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Verticality #NASA #Photography\r\n",
+ "description": "The famous photo taken from the Apollo 17 crew on December 7th, 1972 on their way to the moon is the first image to show the full earth disc. It was taken from a distance of 28,000 miles (45,000 km), and changed the way we look at our planet. It marks the shift of perspective – from horizontal to vertical and entirely – similar to the gods perspective.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e772f4c0-36e9-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "639",
+ "height": "640"
+ },
+ "credit": "NASA / Public Domain, 1972\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://earthobservatory.nasa.gov/Features/BlueMarble/BlueMarble_history.php"
+ }
+ ],
+ "disabled": false,
+ "__index": 36,
+ "dateCreated": "Fri, 12 May 2017 08:07:05 GMT"
+ },
+ {
+ "id": "the-conversation",
+ "date": "1973",
+ "title": "The Conversation",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Wire Tapping #Surveillance #Deception #Bugs \r\n",
+ "description": "The Conversation assigns its central character a remarkable role. Even though Harry Caul is portrayed as a leading audio surveillance expert, he fails to understand the meaning of his secret recordings and ends up trapped in a net of deception. In the last scene of the film, Caul destroys his apartment in a frustrated and unsuccessful attempt to locate the bug that was planted in his home.\r\nImage:\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/42680550-36ea-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "182",
+ "height": "268"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/The_Conversation"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.imdb.com/title/tt0071360/"
+ }
+ ],
+ "disabled": false,
+ "__index": 37,
+ "dateCreated": "Fri, 12 May 2017 08:09:25 GMT"
+ },
+ {
+ "id": "judas-priest-electric-eye",
+ "date": "1982",
+ "title": "Judas Priest – Electric Eye",
+ "medium": "Song",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Spy-Satellite #All-Seeing Eye #Big Brother #Control #Dystopia #Privacy #Totalitarianism #Verticality #Music\r\n",
+ "description": "In 1982 the heavy metal band Judas Priest released their album Screaming for Vengeance which features the song “Electric Eyes”. It is seen as an allusion to George Orwells mass surveillance themed 1984 of the all-seeing eye of a government one can not escape. It particular, the song refers to spy-satellites. An excerpt of the lyrics reads: Up here in space / I'm looking down on you / My lasers trace / Everything you do / You think you've private lives / Think nothing of the kind / There is no true escape / I'm watching all the time.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/b3dc9910-36ec-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "438",
+ "height": "640"
+ },
+ "credit": "Copyright 2000-2008 Judas Priest Music Ltd\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://genius.com/Judas-priest-electric-eye-lyrics"
+ }
+ ],
+ "disabled": false,
+ "__index": 39,
+ "dateCreated": "Fri, 12 May 2017 08:26:35 GMT"
+ },
+ {
+ "id": "olfactory-surveillance-",
+ "date": "1985",
+ "title": "Olfactory Surveillance ",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Germany #Scent #Stasi #GDR #Identification",
+ "description": "The Stasi (Former GDR Ministry of State Security) applied a whole range of methods and means to try to track down suspects within or critics of the East German communist regime. Collecting scent samples was used to try to identify those, for example, who had distributed flyers or who critical graffiti. The samples were stored in an olfactory database\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e5779290-36ec-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "384",
+ "height": "255"
+ },
+ "credit": "Stasi-Museum, Berlin, ASTAK, eV Photo: John Steer\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://blog.nationalarchives.gov.uk/blog/looking-back-25-years-berlin-wall-fell/"
+ }
+ ],
+ "disabled": false,
+ "__index": 40,
+ "dateCreated": "Fri, 12 May 2017 08:28:22 GMT"
+ },
+ {
+ "id": "eigenfaces",
+ "date": "1987",
+ "title": "Eigenfaces",
+ "medium": "Program",
+ "category": "Facial Recognition",
+ "keywords": "#Facial Recognition #Biometrics #Algorithm #Computing #Identification\r\n",
+ "description": "Eigenfaces is an automated face recognition system that is based on studies by mathematicians Michael Kirby and Lawrence Sirovich at Brown University and computer scientists Matthew Turk and Alex Pentland at MIT. It utilizes a photographic database to calculate the face’s average proportions. Rather than using specific features (for example the space between the eyes), the linear algebra based system recognizes a new face by its deviation from the average.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/43b27f50-36ed-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "357",
+ "height": "426"
+ },
+ "credit": "AT&T Laboratories Cambridge\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Eigenface"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.cs.ucsb.edu/~mturk/Papers/mturk-CVPR91.pdf"
+ }
+ ],
+ "disabled": false,
+ "__index": 41,
+ "dateCreated": "Fri, 12 May 2017 08:30:37 GMT"
+ },
+ {
+ "id": "charlie",
+ "date": "1990s",
+ "title": "Charlie",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#CIA #Animal Kingdom #Espionage #Robot #Intelligence #Technology\r\n",
+ "description": "In the 1990s the CIA’s Directorate of Science and Technology developed a remote spying robot catfish named Charlie. The UUV (Unmanned Underwater Vehicle) fish contained a “pressure hull, ballast system, and communications system in the body and a propulsion system in the tail.“ It was used to collect intelligence and supposedly water samples near suspected chemical and nuclear plants. A problem the CIA was facing with the aquatic robot was its resemblance to a real catfish – “predators would stalk and dine of the spy gadget.“ \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/9ca35b70-36ed-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "427"
+ },
+ "credit": "CIA\r\n",
+ "links": [
+ {
+ "text": "CIA",
+ "uri": "https://www.cia.gov/library/video-center/video-transcripts/charlie-cias-robotic-fish.html"
+ },
+ {
+ "text": "SOFREP News",
+ "uri": "https://sofrep.com/54444/cias-robotic-fish/"
+ }
+ ],
+ "disabled": false,
+ "__index": 42,
+ "dateCreated": "Fri, 12 May 2017 08:33:08 GMT"
+ },
+ {
+ "id": "haarp",
+ "date": "1990",
+ "title": "HAARP",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Radio Waves #Weather #Ionosphere #Surveillance #US Air-Force #Radio communications #Conspiracy\r\n",
+ "description": "HAARP (High Frequency Active Auroral Research Program) is a former US-military program that focuses on ionospheric research. Its official purpose was to analyze the ionosphere and investigate potentials for developing ionospheric enhancement technology for radio communications and surveillance. HAARP has repeatedly been target of conspiracy theorists, who claim that it was capable of \"weaponizing\" weather, thus triggering natural catastrophes like floods, hurricanes, droughts or earthquakes.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e357f170-36ed-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "400",
+ "height": "266"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://en.wikipedia.org/wiki/High_Frequency_Active_Auroral_Research_Program"
+ }
+ ],
+ "disabled": false,
+ "__index": 43,
+ "dateCreated": "Fri, 12 May 2017 08:35:18 GMT"
+ },
+ {
+ "id": "mummified-monk",
+ "date": "1996",
+ "title": "Mummified Monk",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Evidence #Technology #Secrets #Transparency #Disclosure #X-Ray\r\n",
+ "description": "In 1996 the human remains of a 1000 year old monk were found inside a Buddha statue when a private collector brought it to restoration in the Netherlands. The monk who lived in the Song Dynasty practised self-mummification to prepare for life after death. His mummy was exhibited and worshipped in a monastery for the first 200 years until being placed inside the statue. It was not until 2015 it underwent a 3-D X-Ray scan to reveal the full skeleton of the monk which organs have been removed and replaced with ancient wads of paper printed with Chinese characters. It is yet unclear how the statue made its way to Europe.\r\n\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f0641030-36f0-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "620",
+ "height": "387"
+ },
+ "credit": "Drents Museum\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://edition.cnn.com/2015/02/27/asia/mummified-monk-statue/"
+ }
+ ],
+ "disabled": false,
+ "__index": 44,
+ "dateCreated": "Fri, 12 May 2017 08:57:08 GMT"
+ },
+ {
+ "id": "the-great-firewall-of-china",
+ "date": "1997",
+ "title": "The Great Firewall of China",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#The Internet #Cencorship #Control #Governments #Algorithm #Digital Rights #Net Politics #Freedom #Information #Access \r\n",
+ "description": "",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/82490050-36f1-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "500",
+ "height": "333"
+ },
+ "credit": "unknown\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://cs.stanford.edu/people/eroberts/cs201/projects/2010-11/FreedomOfInformationChina/category/great-firewall-of-china/index.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 45,
+ "dateCreated": "Fri, 12 May 2017 09:01:04 GMT"
+ },
+ {
+ "id": "big-brother-",
+ "date": "1999–present",
+ "title": "Big Brother ",
+ "medium": "TV Show",
+ "category": "Surveillance",
+ "keywords": "#Big Brother #surveillance #CCTV #entertainment #observation \r\n",
+ "description": "Big Brother is a reality TV show franchise created by John de Mol. As of 11 November 2016, there have been 387 seasons of Big Brother in over 54 franchise countries and regions. In the show, contestants called \"housemates\" live in a specially-constructed house, isolated from the outside world. Housemates are voted out until only one remains and wins the cash prize. During their stay in the house, contestants are put under permanent observation – they’re continuously monitored by live CCTV cameras as well as personal audio microphones. Taking its name from George Orwell’s Nineteen Eighty-Four, Big Brother evokes surveillance as its central theme while ironically denying the dystopian undertones. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/b4db0400-36f1-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "238",
+ "height": "86"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Big_Brother_(franchise)"
+ }
+ ],
+ "disabled": false,
+ "__index": 46,
+ "dateCreated": "Fri, 12 May 2017 09:02:52 GMT"
+ },
+ {
+ "id": "9-11-",
+ "date": "2001",
+ "title": "9/11 ",
+ "medium": "Historic Event",
+ "category": "Surveillance",
+ "keywords": "#9/11 #War on Terror #Airplane #CCTV #Attack #War #Morality #Politics #Pentagon #Terrorism\r\n",
+ "description": "The CCTV image shows terrorist ringleader Mohamed Atta and Abdulaziz al-Omari passing through security checkpoint at Portland, Maine before flying to Boston, where they hijacked American Airlines Flight 11th that crashed into the North Tower of the World Trade Center on the morning of September 11th 2001.\r\nFollowing the attacks, former US-President George W. Bush declared a „war on terror“ on September 20th 2001 in a speech to the US Congress. Since then, the term is used to describe the international military campaign that was started after the historic attacks.\r\nThe events of 9/11 changed the landscape of surveillance technology significantly.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/67aa2980-36f2-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "634",
+ "height": "501"
+ },
+ "credit": "AP\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.aclu.org/timelines/post-911-surveillance"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/world/2001/sep/21/september11.usa13"
+ }
+ ],
+ "disabled": false,
+ "__index": 47,
+ "dateCreated": "Fri, 12 May 2017 09:07:26 GMT"
+ },
+ {
+ "id": "first-drone-strike-in-war",
+ "date": "2001",
+ "title": "First Drone Strike in War",
+ "medium": "Image",
+ "category": "Surveillance",
+ "keywords": "#Drone #UAV #Airstrike #US-Army #War on Terror #Weapons #Classified #Airplanes\r\n",
+ "description": "On 7th of October 2001, the first day of the US-led war in Afghanistan, an armed, CIA-controlled predator drone was following the Taliban leader Mullah Omar in Kandahar. Due to communication problems, the drone, remotely controlled from the agency‘s headquarters in Langley, Virginia, fired a hellfire missile on a truck outside the building with Omar, allegedly killing two of his bodyguards. The Taliban leader escaped during the chaos following the airstrike. This event marks the first time a modern drone had killed a human being.\r\nThe General Atomics Aeronautical MQ-1L Predator No. 3034 which executed the mission is on display at the Smithsonian National Air and Space Museum in D.C. Washington.\r\n",
+ "image": {
+ "uri": "",
+ "caption": "",
+ "width": "",
+ "height": ""
+ },
+ "credit": "Smithsonian Institution, National Air and Space Museum, D.C. Washington (“Do not reproduce without permission”) \r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theatlantic.com/international/archive/2015/05/america-first-drone-strike-afghanistan/394463/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://airandspace.si.edu/collection-objects/general-atomics-aeronautical-systems-inc-mq-1l-predator"
+ }
+ ],
+ "disabled": false,
+ "__index": 48,
+ "dateCreated": "Fri, 12 May 2017 09:13:12 GMT"
+ },
+ {
+ "id": "war-rugs-",
+ "date": "2001",
+ "title": "War Rugs ",
+ "medium": "Item",
+ "category": "Drones",
+ "keywords": "#Drone #UAV #Airstrike #US-Army #War on Terror #Weapons #Afghanistan #Arts #Attack #Airplanes #Evidence #US-Army\r\n",
+ "description": "Afghanistan has suffered through long decades of war. From conflict with the Soviet Union in the 1980s and civil war to 16 years of US-led NATO combat missions. While war has political, economic and social impacts it is also present in art. In case of Afghan art, in the ancient way of woven rugs that illustrate daily life. While it was Kalashnikovs, tanks and grenades during the Soviet Union conflict, it is drones today that occasionally appear on the rugs since the US started operating them in 2001. The world of ancient art and modern warfare colliding on the so called ‘war rugs’, but thus they also reflect the violent conditions of life under war.\r\n",
+ "image": {
+ "uri": "http://media.npr.org/assets/img/2015/02/07/warrug1-16c4e0185e8d3183ed29d1b8b3e982dcd9f937ef-s1000-c85.jpg",
+ "caption": "",
+ "width": "1000",
+ "height": "604"
+ },
+ "credit": "Courtesy of Kevin Sudeith\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theatlantic.com/technology/archive/2015/01/drones-are-appearing-on-afghan-rugs/385025/"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.messynessychic.com/2015/01/29/war-rugs-the-obscure-collectors-market-for-afghan-kitsch/"
+ }
+ ],
+ "disabled": false,
+ "__index": 49,
+ "dateCreated": "Fri, 12 May 2017 09:29:37 GMT"
+ },
+ {
+ "id": "tor",
+ "date": "2002",
+ "title": "Tor",
+ "medium": "Program",
+ "category": "Surveillance",
+ "keywords": "#Privacy #Security #TheInternet #Anonymous #Activism #Encryption #Computing #Data #Protection #Digital Rights #Freedom #Net Politics #Technology #Censorship\r\n",
+ "description": "Tor (The Onion Routing) is a anonymizing network. Referring to the structure of an onion it is build up in layers: requests don’t go directly to the destination address but travel through a chain of proxy servers. That way the original IP-address and identity is not traceable additional to the fact that all data is encrypted. Tor conceals users information from anyone conducting network surveillance or traffic analyses.\r\nActivist, whistleblowers and journalist around the world depend on Tor for secure, anonymous communication and to circumvent censorship.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f7e90360-36f5-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "302"
+ },
+ "credit": "unknown\r\n",
+ "disabled": false,
+ "__index": 50,
+ "dateCreated": "Fri, 12 May 2017 09:32:55 GMT",
+ "links": []
+ },
+ {
+ "id": "forensic-architecture-drone-strikes",
+ "date": "2002",
+ "title": "Forensic Architecture: Drone Strikes",
+ "medium": "Item",
+ "category": "Drones",
+ "keywords": "#Drone #UAV #Airstrike #US-Army #War on Terror #Weapons #Classified #Airplanes #Arts #Afghanistan #Architecture #Attack #HumanRights #Morality #Pakistan #Violence #Warfare\r\n",
+ "description": "The first known targeted drone assassination outside a war zone by the US took place in Yemen on November 3rd, 2002. Areas most affected by drone warfare are generally outside of effective state control. Therefore non-residents, like journalists are prevented to investigate events and access evidence while media coverage is uneven. The image depicts a visual investigation on the strike path of a drone in Miranshah, north Waziristan on March 2012 by Forensic Architecture. Aiming on focussing on the spatial dimension of drone strikes, they analysed video testimony that was smuggled out of the area, in order to reconstruct the space of the strike and interrogate the event. The white dotted lines show the potential places where people died.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/60a9e090-36f6-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "353"
+ },
+ "credit": "Forensic Architecture\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.forensic-architecture.org/case/drone-strikes/"
+ }
+ ],
+ "disabled": false,
+ "__index": 51,
+ "dateCreated": "Fri, 12 May 2017 09:36:16 GMT"
+ },
+ {
+ "id": "social-network-surveillance-participatory-surveillance",
+ "date": "2004",
+ "title": "Social Network Surveillance / Participatory Surveillance",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Facebook #Twitter #Yahoo #Privacy #Protection \r\n",
+ "description": "Social Network Surveillance means the praxis to create maps based on data from social networking sites such as Facebook and Twitter. These \"maps\" are mined to extract information such as interests, friendships, affiliations, beliefs and activities. US government agencies like the NSA are investing heavily in research involving social network analysis. Some people haved claimed that the use of social networking sites is in itself a form of ‘participatory surveillance’ where users essentially perform surveillance on themselves and others, putting and using personal information on public websites.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/c1714490-36f6-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "460",
+ "height": "276"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://firstmonday.org/article/view/2142/1949"
+ }
+ ],
+ "disabled": false,
+ "__index": 52,
+ "dateCreated": "Fri, 12 May 2017 09:38:37 GMT"
+ },
+ {
+ "id": "wikileaks",
+ "date": "2006",
+ "title": "WikiLeaks",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#WikiLeaks #Whistleblower #Classified Information #Covered Operations #Transparency #Evidence #Governments #Secrets #Human Rights #Intelligence #Information #Politics #Scandals #Digital Rights #Disclosure #Freedom \r\n",
+ "description": "WikiLeaks is an international, non-profit media organisation that publishes classified information and news-leaks from anonymous sources. It was founded in Iceland in 2006 and uses the slogan “We open governments.” Julian Assange is described to be the director and spokesperson to the organisation devoted to transparent governments, accessibility to information and protecting whistleblowers. Over the past years WikiLeaks draw a lot of global attention to itself by publishing leaked classified information, for instance on the US-Military and the war in Afghanistan and Iraq (2010), the US State Department diplomatic cables (2010) and the Podesta Emails during the US presidential election campaign in 2016. \r\n\r\nEcuador granted Assange political asylum in 2012, since then he is a resident in the Ecuadorian Embassy in London, afraid to leave as he fears an extradition to the US by Sweden, where he is accused of sexual assaults. In the US he could face several penalties, including the death sentence, for his work with WikiLeaks. ",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/fec0c370-36f6-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "237",
+ "height": "547"
+ },
+ "credit": "WikiLeaks\r\n",
+ "links": [
+ {
+ "text": "Wikileaks",
+ "uri": "http://www.wikileaks.org"
+ },
+ {
+ "text": "Telegraph",
+ "uri": "http://www.telegraph.co.uk/news/worldnews/wikileaks/11681502/Why-is-Julian-Assange-still-inside-the-embassy-of-Ecuador.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 53,
+ "dateCreated": "Fri, 12 May 2017 09:40:35 GMT"
+ },
+ {
+ "id": "the-other-night-sky",
+ "date": "2007",
+ "title": "The Other Night Sky",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Satellite #Photography #Secrets #Arts #Reconnaissance\r\n",
+ "description": "Since the beginning of man, humans have looked into the sky to make sense of the world. Living in an modern age of total surveillance, the artist Trevor Paglen explores the night sky to reveal what is invisible and deliberately obscure – like secret US-military surveillance satellites. In the experimental photography series Another Night Sky he makes use of data gathered by amateur satellite observers to investigate the moment a surveillance satellite enters the realm of visibility. Paglen then captures it with long exposure time. What appears in the photograph is a fine line in a vast sky which gives evidence to the satellites existence.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/3f642840-36f7-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "506",
+ "height": "640"
+ },
+ "credit": "KEYHOLE 12-3/IMPROVED CRYSTAL Optical Reconnaissance Satellite Near Scorpio (USA 129), Trevor Paglen, 2007\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://median.newmediacaucus.org/art-infrastructures-hardware/i-see-the-moon-the-moon-sees-me-trevor-paglens-satellite-images/"
+ }
+ ],
+ "disabled": false,
+ "__index": 54,
+ "dateCreated": "Fri, 12 May 2017 09:42:38 GMT"
+ },
+ {
+ "id": "targeted-killing",
+ "date": "2010",
+ "title": "Targeted Killing",
+ "medium": "Photographs",
+ "category": "Surveillance",
+ "keywords": "#Israel #Drones #UAV #Palestine #Simulation #IDF #Suspect \r\n",
+ "description": "Miki Kratsman’s Targeted Killing examines the term “focused foiling” coined by the IDF (Israel Defense Forces). For this series, Kratsman uses a special lens, which is commonly used by UAV’s. The outcome is an image that appears to be shot seconds before a targeted killing. The photographed characters in this work are Palestinian civilians going about their daily lives. The way they are being photographed echoes the imagery of threatening “suspects”.\r\n",
+ "image": {
+ "uri": "",
+ "caption": "",
+ "width": "",
+ "height": ""
+ },
+ "credit": "Miki Kratsman\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.chelouchegallery.com/artistWorks.php?the_group=357&id=49"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.haaretz.com/israel-news/taking-a-stand-1.387195"
+ }
+ ],
+ "disabled": false,
+ "__index": 55,
+ "dateCreated": "Fri, 12 May 2017 10:15:01 GMT"
+ },
+ {
+ "id": "chelsea-manning-case",
+ "date": "2010",
+ "title": "Chelsea Manning Case",
+ "medium": "Case",
+ "category": "Surveillance",
+ "keywords": "#Whistleblower #Governments #Disclosure #WikiLeaks #Leaks #Iraq #Intelligence #Ethics #Prison #Classified Information #Espionage #Politics\r\n",
+ "description": "The former US Army intelligence analyst Chelsea Manning was convicted of violations of the Espionage Act and other offenses after supposedly leaking 700,000 classified US documents and diplomatic cables to WikiLeaks in 2010. She was sentenced to 35 years in prison, partly in solitary confinement. The outgoing US President Barack Obama commuted her sentence in early 2017.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/457196a0-36fc-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "476"
+ },
+ "credit": " unknown\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Chelsea_Manning"
+ },
+ {
+ "text": "Image link",
+ "uri": "https://static01.nyt.com/images/2017/01/18/us/18manning/18manning-superJumbo.jpg"
+ }
+ ],
+ "disabled": false,
+ "__index": 56,
+ "dateCreated": "Fri, 12 May 2017 10:18:28 GMT"
+ },
+ {
+ "id": "collateral-murder",
+ "date": "2010",
+ "title": "Collateral Murder",
+ "medium": "Video",
+ "category": "Surveillance",
+ "keywords": "#Iraq #Attack #Leak #Wikileaks #Disclosure #Ethics #US-Army #Airstrike #Violence #Morality #Warfare\r\n",
+ "description": "On July 12th 2007 the US Army conducted a series of airstrikes in New Baghdad, Iraq, killing over a dozen civilians, including two war correspondents working for Reuters. The classified video footage of the helicopter gunship was released by WikiLeaks on 5th April 2010 and caused a global discussion on the legality and morality of the attacks.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/9a0aff80-36fc-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "454"
+ },
+ "credit": "Screenshot / WikiLeaks Website\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://collateralmurder.wikileaks.org/"
+ }
+ ],
+ "disabled": false,
+ "__index": 57,
+ "dateCreated": "Fri, 12 May 2017 10:20:26 GMT"
+ },
+ {
+ "id": "5000-feet-is-the-best",
+ "date": "2011",
+ "title": "5000 Feet is The Best",
+ "medium": "Film",
+ "category": "Drones",
+ "keywords": "#Surveillance #Drone #UAV #Technology #Camera #Verticality #Control #All-Seeing Eye #Military #Reconnaissance #Remote Sensing #Warfare #Information #Sensor #US-Air Force #Afghanistan #Airstrike #Attack #Morality #Ethics \r\n",
+ "description": "Omar Fast’s film ‘5000 Feet is The Best’, addresses politics of visuality and how reality of warfare is perceived when the world is made of fake images and special effects. The title is taken from a former drone operator who is interviewed. He reveals why 5000 feet is the best height for a combat drone to fly, as it means he can make out someones shoes and facial hair.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/d388dcf0-36fc-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "359"
+ },
+ "credit": "Omar Fast, Still from ‘5,000 Feet is the Best’\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.independent.co.uk/arts-entertainment/art/reviews/visual-art-review-5000-feet-is-the-best-how-truth-and-fiction-became-blurred-8783611.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 58,
+ "dateCreated": "Fri, 12 May 2017 10:22:04 GMT"
+ },
+ {
+ "id": "the-gorgon-stare",
+ "date": "2011",
+ "title": "The Gorgon Stare",
+ "medium": "Technology",
+ "category": "Drones",
+ "keywords": "#Surveillance #Drone #UAV #Technology #Camera #Verticality #Control #All-Seeing Eye #Military #Panopticon #Reconnaissance #Remote Sensing #Warfare #Data #Information #Sensor #US-Air Force\r\n",
+ "description": "Gorgon Stare is a revolutionary airborne surveillance system made that is mounted on the underside of a drone. It’s electro-optical and infrared sensors system includes nine video cameras which are able to transmit live video images of physical movement across an entire town. While the system can see everything, the adversary on the ground does not know what or who is being looked at.\r\n\r\nIn greek mythology, the Gordon was a creature which unblinking eyes turned it’s beholder into stone.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/205dbf50-36fd-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "430",
+ "height": "616"
+ },
+ "credit": "unknown\r\n",
+ "links": [
+ {
+ "text": "Washington Post",
+ "uri": "http://www.washingtonpost.com/wp-dyn/content/article/2011/01/01/AR2011010102690.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 59,
+ "dateCreated": "Fri, 12 May 2017 10:24:13 GMT"
+ },
+ {
+ "id": "the-left-to-die-boat",
+ "date": "2011",
+ "title": "The Left-to-Die Boat",
+ "medium": "Art",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Counter-Surveillance #Refugee-Crisis #Europe #Horn of Africa #Mediterranean #Boat #Satellite #NATO #Libya #Navy #Arts\r\n",
+ "description": "The Oceanography project supported a coalition of NGOs demanding accountability for the deaths of migrants in the central Mediterranean Sea, a region that was tightly monitored through satellites by the NATO-led coalition intervening in Libya. The project’s efforts were focused on what is now known as the “left-to-die boat” case, where 63 migrants lost their lives drifting for 14 days within the NATO maritime surveillance area. The project team managed to reconstruct precisely how events unfolded and demonstrated how different actors operating in the Mediterranean used complex overlapping jurisdictions at sea to evade their responsibility for rescuing people in distress.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/747bddb0-36fd-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "486"
+ },
+ "credit": "Forensic Architecture Research Agency\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.forensic-architecture.org/case/left-die-boat/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/2011_military_intervention_in_Libya"
+ }
+ ],
+ "disabled": false,
+ "__index": 60,
+ "dateCreated": "Fri, 12 May 2017 10:27:13 GMT"
+ },
+ {
+ "id": "afraid-of-blue-skies",
+ "date": "2012",
+ "title": "Afraid of Blue Skies",
+ "medium": "Image",
+ "category": "Drones",
+ "keywords": "#Drones #Airstrike #Attack #Violence #Ethics #Morality #CIA #USA #Pakistan\r\n",
+ "description": "On 24th of October 2012 two missiles of a US-Drone hit a village in North Waziristan, Pakistan, and killed a 67-year-old midwife, who was gathering okra with her two grandchildren in a garden. The children were injured and rushed to the hospital. Media reports of that day claimed that militants had been killed, although Rafiq ur Rehman, a Pakistani primary school teacher and father to the family claimed otherwise. He and his children, Zubair, 13, and Nabila, 9 were the first victims of an alleged US-Drone strike to give testimony at the US-Congress. When Zubair plead to the lawmakers, he described the situation in his home: “Now I prefer cloudy days when the drones don’t fly. When the sky brightens and becomes blue, the drones return and so does the fear.“\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f3ea3dd0-36fd-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "424"
+ },
+ "credit": "George Hodan, Public Domain\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/world/2013/oct/29/pakistan-family-drone-victim-testimony-congress"
+ }
+ ],
+ "disabled": false,
+ "__index": 61,
+ "dateCreated": "Fri, 12 May 2017 10:29:02 GMT"
+ },
+ {
+ "id": "conflicted-phonemes",
+ "date": "2012",
+ "title": "Conflicted Phonemes",
+ "medium": "Multimedia Art Project",
+ "category": "Surveillance",
+ "keywords": "#Accent #Refugees #Migration #Security #Language #Asylum #Deportation #Detention #Arts",
+ "description": "In his 2012 work “Conflicted Phonemes”, Lawrence Abu Hamdan deals with controversial usage of language analysis. He held a meeting with a group of 12 Somali refugees who had been subjected to accent analysis by the Dutch immigration authorities and later had their asylum requests rejected. Hamdan aims to show how those tests seek to determine the asylum seekers origins in relatively safe regions in the north of the country. Together with refugees and researchers he developed maps which explore the hybrid nature of accent.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/17ac7cf0-36ff-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "447",
+ "height": "640"
+ },
+ "credit": "Lawrence Abu-Hamdan\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://lawrenceabuhamdan.com/conflicted-phonemes/"
+ }
+ ],
+ "disabled": false,
+ "__index": 62,
+ "dateCreated": "Fri, 12 May 2017 10:38:19 GMT"
+ },
+ {
+ "id": "street-ghosts",
+ "date": "2012",
+ "title": "Street Ghosts",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Google #Googlemaps #Surveillance #Privacy #Streetart ",
+ "description": "The work Street Ghosts is a series of photographs taken from Google Street View and printed at life-size scale. The artist Paolo Cirio later posted the portraits as street art inventions at the same locations where they had been taken. The artwork re-contextualizes readymade online material and documents shifting social norms and policies concerning privacy. Cirio explains how he aimed to expose the specters of Google’s misappropriated data: the bodies of people captured by Google’s Street View cameras, whose ghostly, virtual presence was marked in a Street Art fashion at the spot where they were photographed. The images don’t offer details, but unveil the depicted people’s uncanny presence.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/5ac882e0-36ff-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "399"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.huffingtonpost.com/2012/10/09/street-ghosts-artist-paolo-cirio_n_1936158.html"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://streetghosts.net/"
+ }
+ ],
+ "disabled": false,
+ "__index": 63,
+ "dateCreated": "Fri, 12 May 2017 10:40:08 GMT"
+ },
+ {
+ "id": "drone-survival-guide",
+ "date": "2012",
+ "title": "Drone Survival Guide",
+ "medium": "Artwork",
+ "category": "Drones",
+ "keywords": "#Drone #Verticality #Arts #Morality #War #Governments #Airstrike #Airplanes #Attack #Camouflage #Counter Surveillance #Control #Ethics #Protection #Reconnaissance #Weapons #Warfare #US-Army #UAV #Survival\r\n",
+ "description": "The Drone Survival Guide contains the silhouettes of the most common drone species used today and in the near future. Each indicating nationality and whether they are used as a surveillance platform or for deadly force. All drones are drawn in scale for size indication. From the smallest consumer drones measuring less than 1 meter, up to the Global Hawk measuring 39,9 meter in length. The guide is printed on reflective paper, referring to the possibility to hide from a drone camera by using reflective material or a space blanket, when an infrared camera is in use, as it camouflages the heat signature.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/f267aa90-36ff-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "447"
+ },
+ "credit": "CC, project by Ruben Pater\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://untold-stories.net/?p=Drone-Survival-Guide"
+ },
+ {
+ "text": "Link text",
+ "uri": "www.dronesurvivalguide.org"
+ }
+ ],
+ "disabled": false,
+ "__index": 64,
+ "dateCreated": "Fri, 12 May 2017 10:44:51 GMT"
+ },
+ {
+ "id": "dronestagram",
+ "date": "2012 - 2015",
+ "title": "Dronestagram",
+ "medium": "Artwork",
+ "category": "Drones",
+ "keywords": "#Drone #Verticality #Arts #Morality #War #Governments #All-Seeing Eye #Airstrikes #Attack #Violence #Social Media #The Arts #Photography\r\n",
+ "description": "Dronestagram posts satellite images of location that have been a target of a drone strike along a short summary to Instagram, Tumblr and Twitter. The far, for many of us foreign places that are affected, are targets of a largely invisible technology – remotely controlled, unmanned, aerial vehicles, loaded with weapons. Using social media to report the strikes, shifts them into more visibility. In James Bridle's words, who is the artist behind the project: “These are just images of foreign landscapes, still; yet we have got better at immediacy and intimacy online: perhaps we can be better at empathy too.” The records of the strikes are mostly drawn from the Bureau of Investigative Journalism, which compiles reports from Pakistan, Yemen and Somalia.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/4fb725e0-3700-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "377"
+ },
+ "credit": "James Bridle",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://booktwo.org/notebook/dronestagram-drones-eye-view/"
+ }
+ ],
+ "disabled": false,
+ "__index": 65,
+ "dateCreated": "Fri, 12 May 2017 10:53:48 GMT"
+ },
+ {
+ "id": "snowden-case",
+ "date": "2013",
+ "title": "Snowden Case",
+ "medium": "Case ",
+ "category": "Surveillance",
+ "keywords": "#NSA #Wikileaks #Snowden #Social Media #PRISM #phones #Surveillance #Counter-Surveillance #Privacy #Internet #Encryption #Hacking Computing #Five Eyes\r\n",
+ "description": "Snowden’s leaks have shed light on the implications of several secret treaties signed by members of the UKUSA community in their efforts to implement global surveillance. They mostly emanated from a cache of top secret documents leaked by ex-NSA contractor Edward Snowden. In addition to a trove of US federal documents, Snowden's cache contains thousands of Australian, British and Canadian intelligence files. In June 2013, the first of Snowden's documents were published simultaneously by The Washington Post and The Guardian, attracting considerable public attention. The Snowden case lastingly influenced the public awareness and discourse on surveillance today\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/ab337260-3701-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "360"
+ },
+ "credit": "",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/world/interactive/2013/nov/01/snowden-nsa-files-surveillance-revelations-decoded#section/1"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://en.wikipedia.org/wiki/Global_surveillance_disclosures_(2013%E2%80%93present)"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://mashable.com/2014/06/05/edward-snowden-revelations/#kcn4n1Qx7Pqf"
+ }
+ ],
+ "disabled": false,
+ "__index": 66,
+ "dateCreated": "Fri, 12 May 2017 10:56:59 GMT"
+ },
+ {
+ "id": "prism",
+ "date": "2013",
+ "title": "PRISM",
+ "medium": "Program",
+ "category": "Surveillance",
+ "keywords": "#NSA #Five Eyes #Snowden #Internet #Social Media #PRISM #Surveillance #Privacy #Encryption #Big Brother #Interception #Covered Operations #Computing #Data #Network #Wiretapping \r\n",
+ "description": "PRISM is a highly-classified program that intend is to grant direct access to internet servers for the NSA to wiretap. Since 2007, it would collect material including individual search history, the content of emails, file transfers and live chats from internet giants like Google, Apple or Facebook. Being part of the Snowden archive, it was the first leak to be published, simultaneously by the Guardian and the Washington Post on June the 7th, 2013 which marked the begin of the Snowden-affair.\r\nThe leaked 41 pages power-point document intended for internal use only, demonstrates information on the extensive surveillance program. Among others it includes the facts that most of the world’s electronic communication passes through the US, which makes monitoring from intelligence analysts possible. The logo chosen represents the mission’s purpose: the prism refracting invisible noise into visible information.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/0de8eac0-3702-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "460",
+ "height": "346"
+ },
+ "credit": "public domain",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/world/2013/jun/06/us-tech-giants-nsa-data"
+ }
+ ],
+ "disabled": false,
+ "__index": 67,
+ "dateCreated": "Fri, 12 May 2017 10:59:32 GMT"
+ },
+ {
+ "id": "undersea-network-surveillance",
+ "date": "2013",
+ "title": "Undersea Network Surveillance",
+ "medium": "Program",
+ "category": "Surveillance",
+ "keywords": "#GCHQ #NSA #Five Eyes #Snowden #Internet #Social Media #Surveillance #Privacy #Encryption #Big Brother #Interception #Covered Operations #Computing #Data #Network #Wiretapping \r\n",
+ "description": "The Snowden revelation also contained evidence of the US and the UK spy agencies tapping submarine network structures. These fibre optic cables are part of the physical backbone of the internet and essential to worldwide data flows. All communication flows through them, in favour of „Mastering the Internet“ – a project by GCHQ. The subsidiary of that project codenamed TEMPORA stores huge volumes of data drawn from fibre-optic cables for up to 30 days. The data then can be sifted through an analysed.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/4b9d7790-3703-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "340"
+ },
+ "credit": "Submarine internet cables connecting the world, TeleGeography",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.theatlantic.com/international/archive/2013/07/the-creepy-long-standing-practice-of-undersea-cable-tapping/277855/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.theguardian.com/uk/2013/jun/21/gchq-cables-secret-world-communications-nsa "
+ },
+ {
+ "text": "Link text",
+ "uri": "http://apps.washingtonpost.com/g/page/business/a-connected-world/305/"
+ }
+ ],
+ "disabled": false,
+ "__index": 68,
+ "dateCreated": "Fri, 12 May 2017 11:08:21 GMT"
+ },
+ {
+ "id": "weiweicam",
+ "date": "2012",
+ "title": "WeiWeiCam",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Verticality #Arts #Surveillance #Transparency #Activism #Architecture #All-Seeing Eye #CCTV #Public #Privacy #Police State #Internet #Watching\r\n",
+ "description": "In 2012, one year after Ai Weiwei was arrested and detained for 81 days for „inciting subversion of state power“ – an ambiguous charge often leveled against citizens who criticize Communist Party rule – he launched weiweicam.com. At the time, Ai was under house arrest and continually surveilled by the Chinese government. In a defiant parody, Ai set up cameras in his house and studio and live broadcast footage of his every move on the internet to „aid“ the government in keeping an eye on him. This selfimposed scrutiny attested to the cencorship and repression being inflicted on the artist yet the revelation was short-lived. The government shut down weiweicam.com after only forty-six hours, but not before over 5.2 million viewers visited the site.",
+ "image": {
+ "uri": "https://d32dm0rphc51dk.cloudfront.net/6OuzSVQP_rGqIh7FeCJ10g/larger.jpg",
+ "caption": "",
+ "width": "1024",
+ "height": "819"
+ },
+ "credit": "Weiweicam, 2012, Single Channel. Videostill / Ai Weiwei\r\n",
+ "links": [
+ {
+ "text": "chinedigitaltimes",
+ "uri": "http://chinadigitaltimes.net/2012/04/ais-weiweicam-forced-offline-after-46-hours/"
+ }
+ ],
+ "disabled": false,
+ "__index": 69,
+ "dateCreated": "Fri, 12 May 2017 11:11:18 GMT"
+ },
+ {
+ "id": "drone-shadow",
+ "date": "2013",
+ "title": "Drone Shadow",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Drone #Verticality #Arts #Morality #War #Governments\r\n",
+ "description": "Drone Shadows is a series of public installation of artist, writer and technologist James Bridle. The 1:1 scale representation of a drone is supposed to shift the invisible drone warfare closer to our reality. The image depicts the shadow of a The General Atomics MQ-9 Reaper drone. It is used as a surveillance and weapons platform and operated by the US, UK, Australia, France, and NASA.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/fc519c90-3985-11e7-a9cd-015e907df360.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "426"
+ },
+ "credit": "Courtesy Roberta Mataityte / Lighthouse. Photo by James Bridle\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://booktwo.org/notebook/drone-shadows/"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://booktwo.org/notebook/drone-shadows-dispositions/"
+ }
+ ],
+ "disabled": false,
+ "__index": 70,
+ "dateCreated": "Fri, 12 May 2017 11:13:25 GMT",
+ "shortDescription": ""
+ },
+ {
+ "id": "nothing-is-beyond-our-reach",
+ "date": "2013",
+ "title": "Nothing is Beyond Our Reach",
+ "medium": "Item",
+ "category": "Surveillance",
+ "keywords": "#Animal Kingdom #Governments #Spy Satellite #Espionage #Surveillance #Secrets #NRO #Freedom of Information Act #Reconnaissance #Verticality #USA\r\n",
+ "description": "When the US National Reconnaissance Office (NRO) launched the classified satellite NROL-39 into space on 6th of December 2013, the logo of the mission received more attention than the mission itself. It depicts an octopus wrapping its arms around the globe accompanied by the slogan: Nothing is beyond our reach. After filing a request about the emblems origin under the Freedom of Information Act, it came to light that the NRO choose the octopus to visually represent the mission, as it is a highly intelligent, versatile creature which arms can reach even the most intricate corners of the world and therefore leaves no space for enemies of the US to hide.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/23af5950-3713-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "600",
+ "height": "600"
+ },
+ "credit": "National Reconnaissance Office, US Government / Public Domain, 2013\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://www.forbes.com/sites/kashmirhill/2013/12/05/u-s-spy-rocket-launching-today-has-octopus-themed-nothing-is-beyond-our-reach-logo-seriously/#4377cb4d6869"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.nasaspaceflight.com/2013/12/atlas-v-launch-nrol-39-vandenberg/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://leaksource.files.wordpress.com/2013/12/how-the-nrol-39-octopus-logo-was-created.pdf"
+ }
+ ],
+ "disabled": false,
+ "__index": 71,
+ "dateCreated": "Fri, 12 May 2017 13:01:58 GMT"
+ },
+ {
+ "id": "stealth-wear",
+ "date": "2013",
+ "title": "Stealth Wear",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#counter-surveillance #collection #commerce #burqa #stealth-wear #pop-up-store #surveillance-market #privacy #data #activism\r\n",
+ "description": "Stealth Wear is a commercially distributed collection of garments developed by the counter-surveillance artist Adam Harvey that shield against thermal imaging, a surveillance technology used widely by military drones to target people. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/b6a74aa0-3714-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "512",
+ "height": "640"
+ },
+ "credit": "Adam Harvey / https://privacygiftshop.com/\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://privacygiftshop.com/"
+ },
+ {
+ "text": "Link text",
+ "uri": "https://www.timeout.com/newyork/shopping/the-privacy-gift-shop"
+ }
+ ],
+ "disabled": false,
+ "__index": 72,
+ "dateCreated": "Fri, 12 May 2017 13:13:11 GMT"
+ },
+ {
+ "id": "citizenfour",
+ "date": "2014",
+ "title": "Citizenfour",
+ "medium": "Film",
+ "category": "Surveillance",
+ "keywords": "#Governments #Whistleblowing #WikiLeaks #Activism #Wiretapping #Classified Information #Disclosure #NSA #Encryption #Surveillance #Hacking #Ethics #Morality #Electronic Warfare #Intelligence #Information #Secrets #Transparency\r\n",
+ "description": "Citizenfour is a documentary film directed by Laura Poitras on the NSA spying scandal that Edward Snowden disclosed. In early 2013, Poitras was contacted by Citizenfour – the alias used by Snowden. Poitras herself became a protagonist of the affair, using her camera to document the unfolding events. She processed her experience in the documentary named after Snowdens pseudonym, which won several awards including the Academy Award for Best Documentary Feature at the 2015 Oscars.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/38b16440-3715-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "436",
+ "height": "640"
+ },
+ "credit": " praxis films, NYC (recheck)\r\n",
+ "links": [
+ {
+ "text": "Link Text",
+ "uri": "https://citizenfourfilm.com/"
+ },
+ {
+ "text": "Link text ",
+ "uri": "https://en.wikipedia.org/wiki/Citizenfour"
+ }
+ ],
+ "disabled": false,
+ "__index": 73,
+ "dateCreated": "Fri, 12 May 2017 13:18:54 GMT"
+ },
+ {
+ "id": "surveillance-camera-with-plinth",
+ "date": "2015",
+ "title": "Surveillance Camera with Plinth",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Arts #Activism #Surveillance #Location #Counter-Surveillance #Information #CCTV #All-Seeing Eye #Control #Privacy #Espionage #Ethics #Police\r\n",
+ "description": "In 2011, Ai Weiwei disappeared for 81 days. Detained by Chinese authorities in a secret prison, the artist was eventually released on bail without explanation. He, his family and his studio are under constant surveillance – something he is addressing frequently in his artworks. Memorializing the CCTV cameras constructed by authorities outside is Bejing studio to record every move, he replicates them in marble. Using marble, a medium of monuments and gravestones, he ironically elevates historically-loaded material into the contemporary discourse of privacy and surveillance. Taking the form of the electronic eye, as the symbol of modern surveillance, he evokes themes of paranoia, voyeurism and the omnipresent of authoritarian policing forces.\r\nAi’s personal respond to constant surveillance is to live his life as an open book, endlessly documenting his everyday encounters via social media. If everything is transparent there is nothing to spy on.\r\n",
+ "image": {
+ "uri": "http://cfileonline.org/wp-content/uploads/2016/05/7a-surveillance-camera-ai-weiwei-overrated-contemporary-ceramic-art-cfile.jpg",
+ "caption": "",
+ "width": "1200",
+ "height": "1793"
+ },
+ "credit": "Marble, 120 x 52 x 52 cm, Haines Gallery, Ai Weiwei, 2015\r\n",
+ "links": [
+ {
+ "text": "Link ",
+ "uri": "https://creators.vice.com/en_au/article/ai-weiwei-reminds-us-that-surveillance-is-an-international-concern"
+ }
+ ],
+ "disabled": true,
+ "__index": 74,
+ "dateCreated": "Fri, 12 May 2017 13:31:32 GMT"
+ },
+ {
+ "id": "suitcase-boy",
+ "date": "2015",
+ "title": "Suitcase Boy",
+ "medium": "Event",
+ "category": "Surveillance",
+ "keywords": "#Migration #X-Ray #Airport #Border Control #Evidence #Transparency\r\n",
+ "description": "In 2015 an eight-year-old boy from the Ivory Coast was found in a suitcase by authorities in an attempt to smuggle him into Europe. Ceute, the spanish enclave on the African continent the boy was found, proved to be a popular areas for migrants to try to cross into Europe from Africa.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/7c197c70-3717-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "360"
+ },
+ "credit": "on the image\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "http://www.bbc.co.uk/news/world-africa-32660135"
+ }
+ ],
+ "disabled": false,
+ "__index": 75,
+ "dateCreated": "Fri, 12 May 2017 13:33:18 GMT"
+ },
+ {
+ "id": "deep-sweep-",
+ "date": "2015",
+ "title": "Deep Sweep ",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Arts #Activism #Signal #Surveillance #Location #Counter-Surveillance #Information #Military #Device #Interception\r\n",
+ "description": "The Deep Sweep is an aerospace probe scanning the otherwise out-of-reach signal space between land and stratosphere, with special interest placed in UAV/drone to satellite communication, operating in super-high-frequency in a range of 10GHz to 12GHz. Taking the form of a high-altitude weather balloon, it carries a small computer and radio frequency equipment to study the vast and often secretive world of signals in our skies. Deep Sweep was developed by the Critical Engineering Working Group as a signal-intelligence platform, to be deployed by the public.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e769c1a0-3718-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "480",
+ "height": "640"
+ },
+ "credit": "The Critical Engineering Working Group, 2015",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://criticalengineering.org/projects/deep-sweep/"
+ }
+ ],
+ "disabled": false,
+ "__index": 76,
+ "dateCreated": "Fri, 12 May 2017 13:43:04 GMT"
+ },
+ {
+ "id": "anarchist",
+ "date": "2016",
+ "title": "Anarchist",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Surveillance #Interception #Art #Snowden #Activism #Drone #Signal #GCHQ #Israel #Whistleblowing\r\n",
+ "description": "Anarchist was the codename given to a classified program intercepting Israeli drone feeds and fighter jets. Ordered by the U.K.’s Government Communications Headquarters (GCHQ) and the National Security Agency (NSA) it was done from an intercepting station on a mountaintop in Cyprus. Snapshots of the live signals were found in the Snowden archive by the investigative journalist and filmmaker Laura Poitras, who was involved in publishing them. She printed the colorful images in bigger scale for them to become abstract artworks with a unique aura, carrying evidence and revelations about drone warfare.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/9ac43730-3719-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "446"
+ },
+ "credit": "Laura Poitras (b. 1964), ANARCHIST: Power Spectrum Display of Doppler Tracks from a Satellite (Intercepted May 27, 2009), 2016. Archival pigment print on aluminum, 45 1/4 × 65 in. Courtesy the artist\r\n",
+ "links": [
+ {
+ "text": "Link text ",
+ "uri": "https://frieze.com/article/laura-poitras"
+ },
+ {
+ "text": "Link text ",
+ "uri": "https://theintercept.com/2016/01/28/israeli-drone-feeds-hacked-by-british-and-american-intelligence/"
+ }
+ ],
+ "disabled": false,
+ "__index": 77,
+ "dateCreated": "Fri, 12 May 2017 13:48:12 GMT"
+ },
+ {
+ "id": "skylift-low-cost-geo-location-decoy",
+ "date": "2016",
+ "title": "Skylift: Low-Cost Geo-Location Decoy",
+ "medium": "Artwork",
+ "category": "Surveillance",
+ "keywords": "#Google #Location #Counter-Surveillance #Relocation #Wifi #Device\r\n",
+ "description": "SkyLift is small device designed by the countersurveillance artist Adam Harvey that exploits the longstanding vulnerability in geo-location positioning using WiFi and unique MAC addresses. Companies like Google and Apple that rely on the use of WiFi packets from home routers to return the estimated smartphone users position. Until now, this method has required the use of multiple routers and a complicated, expensive setup. SkyLift reintroduces the concept to a new audience using a low-cost, Arduino-compatible WiFi transceiver to relocate the user to almost any location in the world.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/e2a6ecf0-3719-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "415"
+ },
+ "credit": "Adam Harvey \r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://ahprojects.com/projects/skylift/"
+ }
+ ],
+ "disabled": false,
+ "__index": 78,
+ "dateCreated": "Fri, 12 May 2017 13:50:01 GMT"
+ },
+ {
+ "id": "national-bird-",
+ "date": "2016",
+ "title": "National Bird ",
+ "medium": "Documentary Film",
+ "category": "Drones",
+ "keywords": "#drones #warfare #PTSD #ethics #testimony #silence #whistleblowing #trigger",
+ "description": "National Bird gives rare insight into the US drone war program by depicting the life and testimony of three whistleblowers who – plagued by guilt over participating in the killing of faceless people in foreign countries – decide to break the silence around that program and their involvement. The film illustrates how drones wreak devastation and redistribute the ethical status quo of modern warfare. It demonstrates that the nature of drone warfare makes some drone operatives trigger-happy, while others end up dehumanised and traumatized.\r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/b07d2b80-371a-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "384"
+ },
+ "credit": "https://www.theguardian.com/film/2016/apr/17/national-bird-review-us-drones-program-tribeca-film-festival\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "ttp://nationalbirdfilm.com/ "
+ },
+ {
+ "text": "Link text ",
+ "uri": "https://www.nytimes.com/2016/11/11/movies/national-bird-review.html?_r=0"
+ }
+ ],
+ "disabled": false,
+ "__index": 79,
+ "dateCreated": "Fri, 12 May 2017 13:56:53 GMT"
+ },
+ {
+ "id": "angst-ii",
+ "date": "2016",
+ "title": "Angst II",
+ "medium": "Artwork",
+ "category": "Drones",
+ "keywords": "#Drones #Fear #Depression #Opera #Uncanniness #Technology #Grace #Generation #Art",
+ "description": "Angst (German: “Fear”) is an opera in three acts by the German artist Anne Imhof. Angst II forms the climax and turning point. The work consists of music, text, sculptural elements, actors, animals and controlled drones that fly ominously above the crowd and thus create an overall uncanny atmosphere. Somewhat suspended in time and space, the ‘characters’ of Angst seem kept in a state between boredom and dreaminess. Whether the drones’ function is to surveil the works participants or serve as aesthetic surplus is not revealed. \r\n",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/1a884680-371c-11e7-a37a-4579121b15f0.jpg",
+ "caption": "",
+ "width": "640",
+ "height": "427"
+ },
+ "credit": "http://www.artnau.com/2016/11/anne-imhof-angst-ii/\r\n",
+ "links": [
+ {
+ "text": "Link text",
+ "uri": "https://frieze.com/media/angst-ii"
+ },
+ {
+ "text": "Link text",
+ "uri": "http://www.smb.museum/en/museums-institutions/hamburger-bahnhof/exhibitions/detail/anne-imhof-angst-ii.html"
+ }
+ ],
+ "disabled": false,
+ "__index": 80,
+ "dateCreated": "Fri, 12 May 2017 14:05:55 GMT"
+ },
+ {
+ "id": "covertaction-information-bulletin",
+ "date": "1978",
+ "title": "CovertAction Information Bulletin",
+ "medium": "Publication",
+ "category": "Surveillance",
+ "keywords": "#Whistleblowing #Dissent #CIA #Control #Privacy #Surveillance #Information #Secret Service #Activism #Civil Rights #Classified Information #Covered Operation #Disclosure #Espionage #Intelligence #Secrets #USA",
+ "description": "CovertAction Information Bulletin was a leading progressive publication focusing and being critical of US foreign policy, the CIA, NSA, FBI, corporate crime and repression in the US and abroad. It was co-founded in 1978 by former CIA case officer Philip Agee, who became a leading opponent of CIA practices after he left the agency in 1968. The publication which was renamed to CovertAction Quarterly in 1992; it regularly published names of undercover agents and was targeted by Congress who passed the Intelligence Identities Protection Act in 1982, which made the practice of revealing names of agents illegal under US law.\r\nCovertAction Quarterly ceased publishing in 2005, having released a total number of 78 issues.",
+ "image": {
+ "uri": "https://marsupial.s3.amazonaws.com/armory/dc3c9230-3add-11e7-824a-e3c31e607a7a.jpg",
+ "caption": "",
+ "width": "408",
+ "height": "527"
+ },
+ "credit": "Cover from issue 24, published 1985",
+ "disabled": false,
+ "__index": 38,
+ "dateCreated": "Wed, 17 May 2017 08:50:49 GMT",
+ "links": []
+ }
+ ],
+ "page": [
+ {
+ "id": "credits",
+ "title": "Credits",
+ "body": "CREDITS GO HERE",
+ "disabled": false,
+ "__index": 2,
+ "dateCreated": "Sat, 13 May 2017 19:49:53 GMT"
+ },
+ {
+ "id": "privacy-policy",
+ "title": "Privacy Policy",
+ "body": "The <i>Terms of Service</i> of a website is a legal document describing a relationship between a software vendor and the end user. Typically this document is designed to indemnify the company who made the software from what you do with it. It also describes your rights in using the software - and what rights you give up.\r\n\r\nThe website <a href=\"https://tosdr.org/\">TOS;DR</a> was created to keep track of what's hidden in the small print of these legal agreements. For instance, on Youtube, \"Deleted videos are not really deleted.\" Facebook and Google admit to tracking your behavior, even on other websites. Instagram and Netflix waive your right to participating in a class action lawsuit. You cannot delete your Skype account.\r\n\r\nA website is required by law to publish a <i>Privacy Policy</i> if it collects <i>personally identifiable information</i> (PII) which can be used to trace an individual's identity. This information can include your name, email address, telephone number, social security number, date of birth, mother's maiden name, etc. The Privacy Policy should indicate what information is tracked and how it is stored.\r\n\r\nA website's Privacy Policy is intimately tied to its <a href=\"/page/terms\">Terms and Conditions</a>. For more information on how these two documents differ, read the article, <a href=\"https://termsfeed.com/blog/privacy-policies-vs-terms-conditions/\">Privacy Policy vs Terms and Conditions</a>.",
+ "disabled": false,
+ "__index": 3,
+ "dateCreated": "Sat, 13 May 2017 19:50:06 GMT"
+ },
+ {
+ "id": "contact",
+ "title": "Contact",
+ "body": "Please send us your comments/questions about the installation, and also any suggestions for additions to our virtual timeline on the History of Surveillance.",
+ "disabled": false,
+ "__index": 5,
+ "dateCreated": "Mon, 15 May 2017 09:43:18 GMT"
+ },
+ {
+ "id": "history-of-surveillance",
+ "title": "History of Surveillance",
+ "body": "The history of surveillance cannot be understood as an isolated subject; it is tightly bound to concepts of privacy and identity, and speaks volumes on the influence, limits, and evolution of technology, cryptography, warfare, and power. Practices of surveillance also reach far back in history – from evidence of a “secret service” in ancient Egypt to Biblical stories of secrecy, envy, treason and lust. \r\n\r\nResearch into the subject of surveillance often reveals surreal, even comical cases - like those of people deploying pigeons for espionage purposes. The examples chosen here eventually leads up to the present-day omnipresence of the internet and – within this context – various examples of so-called counter-surveillance.\r\n\r\nThe following timeline collects items that refer to both historical events and technological novelties, as well as cultural and artistic responses to surveillance culture, with emphasis on three main categories: History of Surveillance, Facial Recognition Technology, and Military Drones.\r\n\r\nThis attempt to showcase an overview of surveillance history is regarded as an open platform – entry suggestions can be sent and considered via the <a href=\"/contact\">CONTACT US</a> icon on the homepage.",
+ "disabled": false,
+ "__index": 6,
+ "dateCreated": "Thu, 18 May 2017 00:16:34 GMT"
+ },
+ {
+ "id": "find-your-face",
+ "title": "Find Your Face",
+ "body": "Description of face recognition pipeline coming SOON!",
+ "disabled": false,
+ "__index": 7,
+ "dateCreated": "Sat, 20 May 2017 21:50:17 GMT"
+ },
+ {
+ "id": "print",
+ "title": "Print",
+ "body": "Please visit the cashier and request your printed photo.\r\nEach print costs $5.00",
+ "disabled": false,
+ "__index": 8,
+ "dateCreated": "Mon, 22 May 2017 09:54:07 GMT"
+ }
+ ],
+ "stream": [
+ {
+ "id": "livestream",
+ "title": "Livestream",
+ "streams": [
+ {
+ "text": "CNN",
+ "uri": "https://www.youtube.com/watch?v=RoD5WWNMsdg"
+ },
+ {
+ "text": "NASA",
+ "uri": "https://www.youtube.com/watch?v=qzMQza8xZCc"
+ },
+ {
+ "text": "Radio",
+ "uri": "https://www.youtube.com/watch?v=xrbrQhpvn8E"
+ }
+ ],
+ "disabled": false,
+ "__index": 0,
+ "dateCreated": "Thu, 18 May 2017 17:05:09 GMT",
+ "body": "As part of the installation we have set up several kinds of surveillance cameras in the Drill Hall of the Park Avenue Armory. Here you can see live streams which feature infrared captures from drones flying overhead inside the Drill Hall to hidden cameras watching visitors enter and exit the installation."
+ }
+ ],
+ "drone": [
+ {
+ "id": "drone-statistics",
+ "title": "Drone Statistics",
+ "intro": "An unmanned aerial vehicle (UAV), commonly known as a drone, is an aircraft without a human pilot aboard. UAVs are a component of an unmanned aircraft system (UAS); which include a UAV, a ground-based controller, and a system of communications between the two. The flight of UAVs may operate with various degrees of autonomy: either under remote control by a human operator or autonomously by onboard computers.\r\n\r\nCompared to manned aircraft, UAVs were originally used for missions too \"dull, dirty or dangerous\" for humans. While they originated mostly in military applications, their use is rapidly expanding to commercial, scientific, recreational, agricultural, and other applications, such as policing, peacekeeping, and surveillance, product deliveries, aerial photography, agriculture, smuggling, and drone racing. Civilian drones now vastly outnumber military drones, with estimates of over a million sold by 2015, so they can be seen as an early commercial application of Autonomous Things, to be followed by the autonomous car and home robots.",
+ "strikes": "2,274",
+ "totalKilled": "6,336-9,178",
+ "civiliansKilled": "734-1,397",
+ "childrenKilled": "240-307",
+ "__index": 0,
+ "dateCreated": "Thu, 18 May 2017 20:42:04 GMT",
+ "links": [
+ {
+ "text": "How Drones Work (BBC)",
+ "uri": "http://www.bbc.com/news/world-south-asia-10713898"
+ },
+ {
+ "text": "Unmanned Aircraft Systems (US Department of Defense)",
+ "uri": "https://www.defense.gov/UAS/"
+ }
+ ],
+ "statisticsByline": "Data collected by the Bureau of Investigative Journalism. The totals represent minimum and maximum casualty levels, based on available reports. The lower bounds tend to represent statistics provided by the US Government, though the Bureau's investigation found these to underestimate the scale of drone warfare.\r\n\r\nSince 2010, the Bureau has made an extensive study of reports of US covert activities in Afghanistan, Pakistan, Yemen and Somalia. For more detailed information on drone use in these countries, investigate the countries below:",
+ "moreInfo": "More information can be found at the following links:"
+ }
+ ],
+ "about": [
+ {
+ "id": "about",
+ "title": "About",
+ "show": "In a new commission that is both object and environment, Pritzker Prize-winning architects Jacques Herzog and Pierre de Meuron with artist/activist Ai Weiwei explore the meaning of public space in our surveillance-laden world, referencing the story of Hansel and Gretel in which the children lose their way and feel a sense of menace in a space they know and trust. The artists take advantage of the vast openness of the Drill Hall, creating a 21st century public place in which the environment is disconcerting, the entrance is unexpected, and every movement is tracked and surveyed by drones and communicated to an unknown public.\r\n\r\nThe work builds on the artists’ shared practice as designers of form and investigation (the Beijing Olympic Stadium and “quite simply the best summer Serpentine Pavilion ever” according to Time Out London) and their deep interest in the public realm whether through activism or architecture. Ai Weiwei has described their collaborations as follows: “My experience of working with Jacques and Pierre is that we never think separately. It’s like three soldiers in the war—and that’s a good feeling: we have a constant understanding.”\r\n\r\nCurated by Tom Eccles and Hans Ulrich Obrist",
+ "herzogBio": "Jacques Herzog established Herzog & de Meuron with Pierre de Meuron in Basel in 1978. He studied architecture at the Swiss Federal Institute of Technology Zurich (ETHZ) from 1970 to 1975 with Aldo Rossi and Dolf Schnebli. He was a visiting tutor at Cornell University, USA in 1983. With Pierre de Meuron, he is visiting professor at Harvard University, USA (1989 and since 1994), professor at ETH Zürich since 1999, and co-founder of ETH Studio Basel - Contemporary City Institute since 2002. In 2001, he was awarded the Pritzker Architecture Prize together with Pierre de Meuron.",
+ "deMeuronBio": "Pierre de Meuron established Herzog & de Meuron with Jacques Herzog in Basel in 1978. Pierre studied architecture at the Swiss Federal Institute of Technology Zurich (ETHZ) from 1970 to 1975 with Aldo Rossi and Dolf Schnebli. With Jacques Herzog, he is visiting professor at Harvard University, USA (1989 and since 1994), professor at ETH Zürich since 1999, and co-founder of ETH Studio Basel - Contemporary City Institute since 2002. In 2001, he was awarded the Pritzker Architecture Prize together with Jacques Herzog.",
+ "aiWeiWeiBio": "Ai Weiwei (b. Beijing, 1957) is an artist and activist who currently resides and works in both Berlin and Beijing. From architecture to installations, social media to documentaries, Ai uses a wide range of mediums as expressions to set up new possibilities and conditions for his audience to examine society and its values. Recent exhibitions include Law of the Journey at the National Gallery in Prague, Ai Weiwei. Libero at Palazzo Strozzi in Florence, #SafePassage at Foam in Amsterdam, translocation - transformation at 21er Haus Museum of Contemporary Art in Vienna, Andy Warhol | Ai Weiwei at the National Gallery of Victoria in Melbourne, and Ai Weiwei at the Royal Academy of Arts in London.\r\n\r\nAi is the recipient of the Václav Havel Prize for Creative Dissent in 2012 and the Amnesty International Ambassador of Conscience Award in 2015.",
+ "video": {
+ "url": "https://www.youtube.com/watch?v=elpAKTauZUw",
+ "type": "youtube",
+ "token": "elpAKTauZUw",
+ "width": "640",
+ "height": "360",
+ "title": "Cats Morph into Croissants",
+ "thumb": "http://i.ytimg.com/vi/elpAKTauZUw/hqdefault.jpg"
+ },
+ "__index": 0,
+ "dateCreated": "Thu, 18 May 2017 20:41:15 GMT"
+ }
+ ]
+} \ No newline at end of file
diff --git a/client/src/lib/db/hosts.js b/client/src/lib/db/hosts.js
new file mode 100644
index 0000000..878f39b
--- /dev/null
+++ b/client/src/lib/db/hosts.js
@@ -0,0 +1,9 @@
+const faceDetector = 'http://192.168.1.100:8082/upload'
+
+const db = 'https://hanselgretelarmory.com/db.json'
+const email = 'https://hanselgretelarmory.com/_services/awmail/send'
+const print = 'https://hanselgretelarmory.com/_services/awmail/print'
+const feedback = 'https://hanselgretelarmory.com/_services/awmail/feedback'
+const comments = 'https://hanselgretelarmory.com/_services/awfeedback/index'
+
+export default { db, faceDetector, email, print, feedback, comments }
diff --git a/client/src/lib/db/index.js b/client/src/lib/db/index.js
new file mode 100644
index 0000000..3fc6397
--- /dev/null
+++ b/client/src/lib/db/index.js
@@ -0,0 +1,85 @@
+import hosts from './hosts'
+import { backupDB } from './backupDB';
+
+function fetchDB(cb) {
+ let raw_db;
+ fetch(hosts.db, {
+ method: 'GET'
+ }).then(res => {
+ return res.json()
+ }).then(json => {
+ raw_db = parse(json)
+ return fetch(hosts.comments, {
+ method: 'GET',
+ })
+ }).then(res => {
+ return res.json()
+ }).then(json => {
+ raw_db.comments = json.reverse()
+ cb(raw_db)
+ }).catch((err) => {
+ console.warn(err)
+ })
+}
+
+function backup() {
+ return parse(backupDB)
+}
+
+function parse(db) {
+ let { page, ...parsed } = db
+ parsed.page = {}
+ parsed.timeline = parsed.timeline
+ .filter((el) => ! el.disabled)
+ .sort((a,b) => a.__index<b.__index?-1:a.__index===b.__index?0:1)
+ Object.values(page).forEach((el) => {
+ parsed.page[el.id] = el
+ })
+ parseKeywords(parsed)
+ parsed.comments = []
+ return parsed
+}
+
+function parseKeywords(db){
+ const counts = {}
+ db.about = db.about[0]
+ db.drone = db.drone[0]
+ db.stream = db.stream[0]
+ db.timeline.forEach((event) => {
+ const dedupe = {}
+ event.keywords = event.keywords.replace(/\n/, ' ').split('#')
+ .map((t) => (t || '').trim().toLowerCase())
+ .filter((t) => !!t.length)
+ .map((t) => {
+ if (t in dedupe) return
+ dedupe[t] = 1
+ const caps = capitalize(t)
+ counts[caps] = counts[caps] || 0
+ counts[caps] += 1
+ return caps
+ })
+ })
+ db.timeline.forEach((event) => {
+ event.keywords = event.keywords.filter( (t) => counts[t] > 1 )
+ })
+}
+
+const shortWords = makeLookup('of and to')
+
+const allcaps = makeLookup('usa us cia fbi nsa ii nasa uav cctv gchq')
+
+function makeLookup(s) {
+ const lookup = {}
+ s.split(' ').forEach( (t) => lookup[t] = true )
+ return lookup
+}
+function capitalize(s) {
+ return s.replace(/-/,' ').split(' ').map(capitalizeWord).join(' ')
+}
+function capitalizeWord(s) {
+ if (allcaps[s]) return s.toUpperCase()
+ if (shortWords[s]) return s
+ return s.charAt(0).toUpperCase() + s.slice(1)
+}
+
+export default { fetch: fetchDB, backup, hosts }
diff --git a/client/src/lib/drone/index.js b/client/src/lib/drone/index.js
new file mode 100644
index 0000000..19e7843
--- /dev/null
+++ b/client/src/lib/drone/index.js
@@ -0,0 +1,216 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ Image,
+ View,
+ TouchableOpacity,
+} from 'react-native';
+
+import ScrollableContainer from '../components/scrollableContainer'
+import ClearText from '../components/text'
+import Heading from '../components/heading'
+
+const countryLinks = {
+ pakistan: 'https://www.thebureauinvestigates.com/projects/drone-war/charts?show_casualties=1&show_injuries=1&show_strikes=1&location=pakistan&from=2004-1-1&to=now',
+ yemen: 'https://www.thebureauinvestigates.com/projects/drone-war/charts?show_casualties=1&show_injuries=1&show_strikes=1&location=yemen&from=2002-1-1&to=now',
+ somalia: 'https://www.thebureauinvestigates.com/projects/drone-war/charts?show_casualties=1&show_injuries=1&show_strikes=1&location=somalia&from=2007-1-1&to=now',
+ afghanistan: 'https://www.thebureauinvestigates.com/projects/drone-war/charts?show_casualties=1&show_injuries=1&show_strikes=1&location=afghanistan&from=2015-1-1&to=now',
+}
+
+export default class Drone extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ const content = this.props.content
+ const links = content.links.map((link,i) => {
+ const url = link.uri
+ const name = link.text
+ return (
+ <TouchableOpacity key={'link_' + i} onPress={() => this.props.onLinkPress(url)}>
+ <ClearText style={styles.link}>{name}</ClearText>
+ </TouchableOpacity>
+ )
+ })
+ return (
+ <ScrollableContainer heading='Military Drone Statistics' bodyStyle={styles.scrollContainer}>
+
+ <ClearText style={styles.body}>
+ {content.intro}
+ </ClearText>
+
+ <Heading style={styles.subheading}>STATISTICS</Heading>
+
+ <View style={styles.statistics}>
+ <View style={styles.statistic}>
+ <ClearText style={styles.statisticNumber}>{content.strikes}</ClearText>
+ <ClearText style={styles.statisticLabel}>MINIMUM CONFIRMED STRIKES</ClearText>
+ </View>
+
+ <View style={styles.statistic}>
+ <ClearText style={styles.statisticNumber}>{content.totalKilled}</ClearText>
+ <ClearText style={styles.statisticLabel}>TOTAL KILLED</ClearText>
+ </View>
+ </View>
+
+ <View style={styles.statistics}>
+ <View style={styles.statistic}>
+ <ClearText style={styles.statisticNumber}>{content.civiliansKilled}</ClearText>
+ <ClearText style={styles.statisticLabel}>CIVILIANS KILLED</ClearText>
+ </View>
+
+ <View style={styles.statistic}>
+ <ClearText style={styles.statisticNumber}>{content.childrenKilled}</ClearText>
+ <ClearText style={styles.statisticLabel}>CHILDREN KILLED</ClearText>
+ </View>
+ </View>
+
+ <ClearText style={styles.body}>
+ {content.statisticsByline}
+ </ClearText>
+
+ <View style={styles.countries}>
+ <View style={styles.country}>
+ <TouchableOpacity onPress={() => this.props.onLinkPress(countryLinks.afghanistan)}>
+ <Image source={require('../../img/afghanistan.png')} resizeMode='cover' style={styles.countryImage} />
+ <ClearText>AFGHANISTAN</ClearText>
+ </TouchableOpacity>
+ </View>
+
+ <View style={styles.country}>
+ <TouchableOpacity onPress={() => this.props.onLinkPress(countryLinks.pakistan)}>
+ <Image source={require('../../img/pakistan.png')} resizeMode='cover' style={styles.countryImage} />
+ <ClearText>PAKISTAN</ClearText>
+ </TouchableOpacity>
+ </View>
+ </View>
+
+ <View style={styles.countries}>
+ <View style={styles.country}>
+ <TouchableOpacity onPress={() => this.props.onLinkPress(countryLinks.yemen)}>
+ <Image source={require('../../img/yemen.png')} resizeMode='cover' style={styles.countryImage} />
+ <ClearText>YEMEN</ClearText>
+ </TouchableOpacity>
+ </View>
+
+ <View style={styles.country}>
+ <TouchableOpacity onPress={() => this.props.onLinkPress(countryLinks.somalia)}>
+ <Image source={require('../../img/somalia.png')} resizeMode='cover' style={styles.countryImage} />
+ <ClearText>SOMALIA</ClearText>
+ </TouchableOpacity>
+ </View>
+ </View>
+
+ <ClearText style={styles.body}>
+ {content.moreInfo}
+ </ClearText>
+
+ <View style={styles.links}>
+ {links}
+ </View>
+
+ </ScrollableContainer>
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ width: '100%',
+ },
+ scrollContainer: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ width: '100%',
+ },
+ body: {
+ textAlign: 'left',
+ padding: 10,
+ width: '90%',
+ maxWidth: '600px',
+ paddingBottom: 20,
+ paddingLeft: 20,
+ },
+ hero: {
+ width: '100%',
+ height: 400,
+ },
+ subheading: {
+ textAlign: 'center',
+ width: '100%',
+ },
+ statistics: {
+ width: '90%',
+ maxWidth: '650px',
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ marginLeft: 20,
+ },
+ statistic: {
+ flex: 1,
+ flexBasis: '50%',
+ backgroundColor: 'white',
+ padding: 10,
+ margin: 10,
+ },
+ statisticNumber: {
+ fontSize: 36,
+ lineHeight: 48,
+ fontWeight: 'bold',
+ color: 'black',
+ textAlign: 'left',
+ },
+ statisticLabel: {
+ textAlign: 'left',
+ color: 'black',
+ fontSize: 13,
+ },
+ countries: {
+ width: '90%',
+ maxWidth: '650px',
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ paddingRight: 20,
+ marginLeft: 30,
+ },
+ country: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ flex: 1,
+ flexBasis: '50%',
+ padding: 10,
+ margin: 5,
+ aspectRatio: 1,
+ },
+ countryImage: {
+ flex: 1,
+ aspectRatio: 1,
+ borderWidth: 1,
+ borderColor: 'white',
+ marginBottom: 5,
+ width: '35vw',
+ height: '35vw',
+ maxWidth: '300px',
+ maxHeight: '300px',
+ },
+ links: {
+ maxWidth: '650px',
+ width: '75%',
+ alignItems: 'flex-start',
+ marginBottom: 80,
+ marginLeft: 75,
+ },
+ link: {
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ textDecorationLine: 'underline',
+ padding: 5,
+ },
+})
diff --git a/client/src/lib/timeline/index.js b/client/src/lib/timeline/index.js
new file mode 100644
index 0000000..3fde6df
--- /dev/null
+++ b/client/src/lib/timeline/index.js
@@ -0,0 +1,164 @@
+import React, { Component } from 'react';
+import {
+ FlatList,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View,
+ ScrollView,
+} from 'react-native';
+
+import ScrollableContainer from '../components/scrollableContainer'
+import Modal from '../components/modal'
+import Container from '../components/container'
+import ClearText from '../components/text'
+import TimelineEvent from './timelineEvent'
+import TimelineFull from './timelineFull'
+import TimelineHeader from './timelineHeader'
+import TimelineFilter from './timelineFilter'
+import TickMarks from './tickMarks'
+
+export default class Timeline extends Component {
+ constructor(props) {
+ super()
+ this.state = {
+ events: props.events,
+ tag: props.tag,
+ introVisible: props.firstTime,
+ modalVisible: false,
+ filterVisible: false,
+ item: null,
+
+ introVisible: false,
+// modalVisible: true,
+// item: props.events[2],
+ }
+ this.onPress = this.onPress.bind(this)
+ this.onFilter = this.onFilter.bind(this)
+ this.scrollToIndex = this.scrollToIndex.bind(this)
+ this.items = []
+ }
+ onPress(item) {
+ this.setState({
+ modalVisible: true,
+ item: item,
+ })
+ }
+ onFilter(tag) {
+ let events;
+ if (!! tag && tag !== this.state.tag) {
+ events = this.props.events.filter((e) => e && e.keywords.includes(tag))
+ }
+ else {
+ events = this.props.events
+ }
+ this.setState({ events, tag, modalVisible: false, filterVisible: false })
+ }
+ scrollToIndex(index) {
+ // this.flatList._listRef.scrollToIndex(index)
+ // this.scrollable.scrollToIndex({index: index})
+ const offset = this.items[index].ref.parentNode.offsetTop
+ this.scrollable.scrollView.scrollTo({
+ y: offset,
+ x: 0,
+ animated: true,
+ })
+ }
+ render() {
+ const heading = this.state.tag || 'History of Surveillance'
+ const items = this.state.events.map((item, i) => (
+ <TimelineEvent ref={(ref) => this.items[i] = ref} key={item.id} onPress={this.onPress} item={item} />
+ ))
+
+ return (
+ <View>
+ <ScrollableContainer ref={(ref) => this.scrollable = ref} heading={heading} headingOnPress={() => this.onFilter("")}>
+ {items}
+ </ScrollableContainer>
+ <TickMarks events={this.state.events} scrollToIndex={this.scrollToIndex} />
+ <Modal isVisible={this.state.introVisible} style={[styles.modal, styles.headerModal]}>
+ <TimelineHeader
+ content={this.props.content}
+ onLinkPress={this.props.onLinkPress}
+ onClose={() => this.setState({ introVisible: false })}
+ />
+ </Modal>
+ <Modal isVisible={this.state.modalVisible} style={styles.modal}>
+ <TimelineFull
+ item={this.state.item}
+ onLinkPress={this.props.onLinkPress}
+ onFilter={this.onFilter}
+ onClose={() => this.setState({ modalVisible: false })}
+ />
+ </Modal>
+ </View>
+ )
+ }
+}
+
+
+
+// <View style={styles.body}>
+// <View style={styles.sidebar}>
+// <TouchableOpacity onPress={() => this.setState({ filterVisible: true })}>
+// <ClearText style={[styles.filterText, !! this.state.tag ? styles.filterActive : styles.filterInactive ]}>
+// { !! this.state.tag ? 'FILTER' : '' }
+// </ClearText>
+// </TouchableOpacity>
+// </View>
+// </View>
+
+// <Modal isVisible={this.state.filterVisible} style={styles.modal}>
+// <TimelineFilter
+// events={this.props.events}
+// tag={this.state.tag}
+// onFilter={this.onFilter}
+// onClose={() => this.setState({ filterVisible: false })}
+// />
+// </Modal>
+
+const styles = StyleSheet.create({
+ wrapper: {
+ },
+ modal: {
+ margin: 0,
+ padding: 0,
+ },
+ headerModal: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ backgroundColor: 'rgb(0,0,0)',
+ margin: 0,
+ padding: 0,
+ },
+ body: {
+ flexDirection: 'row',
+ height: 840,
+ },
+ flatList: {
+ },
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ },
+ sidebar: {
+ flex: 0,
+ },
+ filterText: {
+ color: '#bbb',
+ textAlign: 'left',
+ fontSize: 12,
+ marginLeft: 4,
+ },
+ filterActive: {
+ color: '#fff',
+ textDecorationLine: 'underline',
+ },
+ filterInactive: {
+ color: '#bbb',
+ },
+ tickMarks: {
+ flex: 0,
+ },
+})
diff --git a/client/src/lib/timeline/tickMarks.js b/client/src/lib/timeline/tickMarks.js
new file mode 100644
index 0000000..c8bda29
--- /dev/null
+++ b/client/src/lib/timeline/tickMarks.js
@@ -0,0 +1,192 @@
+import React, { Component } from 'react'
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+function getFirstTouch(f) {
+ return (e) => f(e.touches[0])
+}
+
+export default class TickMarks extends Component {
+ constructor(props) {
+ super()
+
+ this.width = 45
+ this.height = window.innerHeight - 160
+ this.tag = ""
+
+ this.onTouchStart = this.onTouchStart.bind(this)
+ this.onTouchMove = this.onTouchMove.bind(this)
+ this.onTouchEnd = this.onTouchEnd.bind(this)
+ }
+
+ buildMarkers() {
+ this.yearTicks = []
+ this.years = []
+
+ const height = this.height
+ const width = this.width
+
+ const yPadding = fontStyle.fontSize
+ const heightRange = height - yPadding * 2
+
+ const startYear = 1800
+ const endYear = 2018
+ const yearStep = 10
+ const yearMarkerStep = 50
+ const yearDiff = endYear - startYear
+
+ for (let year = startYear; year <= endYear; year += yearStep) {
+ let y = (year - startYear) / yearDiff * heightRange + yPadding
+ let isMarker = (year % yearMarkerStep) == 0
+ let style = isMarker ? tickStyles.marker : tickStyles.year
+ this.yearTicks.push(
+ <line
+ key={'tick_' + year}
+ x1={width}
+ y1={y}
+ x2={width - style.width}
+ y2={y}
+ stroke={style.stroke}
+ strokeWidth={style.strokeWidth}
+ />
+ )
+ if (isMarker) {
+ this.years.push(
+ <text
+ key={'label_' + year}
+ fontFamily="Futura-Medium"
+ fill={fontStyle.fill}
+ fontSize={fontStyle.fontSize}
+ x={1}
+ y={y - fontStyle.yOffset}
+ textAnchor="start"
+ >{year}</text>
+ )
+ }
+ }
+ this.yearsByOffset = []
+ this.eventTicks = this.props.events.map((event, index) => {
+ if (event.date.match(/\D/)) {
+ return null
+ }
+ const year = parseInt(event.date)
+ const y = (year - startYear) / yearDiff * heightRange + yPadding
+ const style = tickStyles.event
+ if (year > 1800) {
+ this.yearsByOffset.push([y, Math.max(index-1, 0)])
+ }
+ return (
+ <line
+ key={'event_' + event.id.replace(/-/, '_')}
+ x1={width}
+ y1={y+1}
+ x2={width - style.width}
+ y2={y+1}
+ stroke={style.stroke}
+ strokeWidth={style.strokeWidth}
+ />
+ )
+ }).filter(e => !!e)
+ }
+
+ scrollToYPosition(y) {
+ let index;
+ y -= this.svg.getBoundingClientRect().top
+ var foundOffset = this.yearsByOffset.some((pair) => {
+ if (y < pair[0]) {
+ index = pair[1]
+ return true
+ }
+ return false
+ })
+ if (foundOffset) {
+ this.props.scrollToIndex(index)
+ }
+ }
+
+ render() {
+ this.buildMarkers()
+ this.tag = this.props.tag
+ return (
+ <svg
+ style={styles.svg}
+ height={this.height}
+ width={this.width}
+ ref={(ref) => this.svg = ref}
+ >
+ {this.eventTicks}
+ {this.yearTicks}
+ {this.years}
+ </svg>
+ )
+ }
+
+ componentDidMount() {
+ if (isMobile) {
+ this.svg.addEventListener("touchstart", getFirstTouch(this.onTouchStart))
+ this.svg.addEventListener("touchmove", getFirstTouch(this.onTouchMove))
+ window.addEventListener("touchend", getFirstTouch(this.onTouchEnd))
+ }
+ else {
+ this.svg.addEventListener("mousedown", this.onTouchStart)
+ this.svg.addEventListener("mousemove", this.onTouchMove)
+ window.addEventListener("mouseup", this.onTouchEnd)
+ }
+ }
+
+ onTouchStart(e) {
+ this.dragging = true
+ this.scrollToYPosition(e.pageY)
+ }
+ onTouchMove(e) {
+ if (this.dragging || isMobile) {
+ this.scrollToYPosition(e.pageY)
+ }
+ }
+ onTouchEnd(e) {
+ this.dragging = false
+ }
+
+}
+
+
+const styles = {
+ svg: {
+ position: 'fixed',
+ top: 105,
+ left: '2%',
+ zIndex: 2,
+ },
+}
+
+const tickStyles = {
+ year: {
+ width: 4,
+ stroke: '#bbb',
+ strokeWidth: 1,
+ },
+ marker: {
+ width: 10,
+ stroke: '#888',
+ strokeWidth: 1
+ },
+ event: {
+ width: 10,
+ stroke: 'white',
+ strokeWidth: 2
+ },
+}
+const eventColors = {
+ 'Surveillance': 'rgb(0,64,255)',
+ 'Drones': 'rgb(255,0,0)',
+ 'Facial Recognition': 'rgb(0,255,0)',
+}
+const fontStyle = {
+ fontSize: 12,
+ yOffset: -3,
+ fill: '#bbb',
+}
diff --git a/client/src/lib/timeline/timelineEvent.js b/client/src/lib/timeline/timelineEvent.js
new file mode 100644
index 0000000..903ceed
--- /dev/null
+++ b/client/src/lib/timeline/timelineEvent.js
@@ -0,0 +1,102 @@
+import React, { Component } from 'react';
+import {
+ TouchableOpacity,
+ StyleSheet,
+ Image,
+ View
+} from 'react-native';
+
+import ClearText from '../components/text'
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const imageHeight = isMobile ? 70 : 100
+const imageWidth = isMobile ? 100 : 150
+
+export default class TimelineEvent extends Component {
+ constructor() {
+ super()
+ }
+ render() {
+ const item = this.props.item
+ let image;
+ if (item.image && item.image.uri) {
+ const originalWidth = Number(item.image.width)
+ const originalHeight = Number(item.image.height)
+ let height = originalHeight > imageHeight ? imageHeight : originalHeight
+ let width = originalWidth * height / originalHeight
+ if (width > imageWidth) {
+ width = imageWidth
+ height = originalHeight * imageWidth / originalWidth
+ }
+ if (isNaN(width) || isNaN(height)) {
+ console.log(width, height, item.image.uri)
+ }
+ image = <img
+ src={item.image.uri}
+ style={{
+ width: width,
+ height: height,
+ }} />
+ } else {
+ image = <View></View>
+ }
+ return (
+ <TouchableOpacity style={styles.item} activeOpacity={0.8} onPress={() => this.props.onPress(this.props.item) }>
+ <div ref={(ref) => this.ref = ref} style={{flex: 0}}></div>
+ <View style={styles.item}>
+ <View style={styles.dateContainer}>
+ <ClearText style={styles.date}>{item.date}</ClearText>
+ </View>
+ <View style={styles.imageContainer}>{image}</View>
+ <View style={styles.titleContainer}>
+ <ClearText style={styles.title}>{item.title}</ClearText>
+ </View>
+ </View>
+ </TouchableOpacity>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ item: {
+ flex: 1,
+ width: '80%',
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ flexDirection: 'row',
+ padding: 10,
+ marginBottom: 10,
+ minHeight: 100,
+ },
+ dateContainer: {
+ width: '30%',
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ paddingRight: 10,
+ paddingLeft: 30,
+ },
+ imageContainer: {
+ width: '40%',
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ marginRight: 10,
+ },
+ titleContainer: {
+ width: '30%',
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ paddingLeft: 10,
+ },
+ title: {
+ textAlign: 'center',
+ fontWeight: 'bold',
+ },
+ date: {
+ textAlign: 'center',
+ },
+})
diff --git a/client/src/lib/timeline/timelineFilter.js b/client/src/lib/timeline/timelineFilter.js
new file mode 100644
index 0000000..c6da98a
--- /dev/null
+++ b/client/src/lib/timeline/timelineFilter.js
@@ -0,0 +1,127 @@
+import React, { Component } from 'react';
+import {
+ ScrollView,
+ StyleSheet,
+ TouchableOpacity,
+ Image,
+ View,
+ Text,
+ RefreshControl,
+} from 'react-native';
+
+import ClearText from '../components/text'
+import Heading from '../components/heading'
+import Definition from '../components/definition'
+import Close from '../components/close'
+
+export default class TimelineFilter extends Component {
+ constructor(props) {
+ super()
+ this.onRefresh = this.onRefresh.bind(this)
+ this.buildCounts(props.events)
+ }
+ buildCounts(events){
+ const lookup = {}
+ events.forEach((event) => {
+ event.keywords.forEach((t) => {
+ lookup[t] = lookup[t] || 0
+ lookup[t] += 1
+ })
+ })
+
+ this.tags = Object.keys(lookup)
+ .map((t) => [t, lookup[t]])
+ .sort((a,b) => a[1]<b[1]?-1:a[1]==b[1]?0:1)
+ .filter((t) => t[1] > 1)
+ .reverse()
+ }
+ buildTagItems() {
+ const maxFontSize = 22
+ const minFontSize = 12
+ const fontSizeDiff = maxFontSize - minFontSize
+ const maxCount = this.tags[2][1]
+ const selectedTag = this.props.tag
+
+ return this.tags.map((pair, i) => {
+ const tag = pair[0]
+ const count = pair[1]
+ const fontSize = Math.min(maxCount, count) / maxCount * (fontSizeDiff) + minFontSize
+ const textDecorationLine = tag === selectedTag ? 'underline' : 'none'
+ const color = (!! selectedTag && tag !== selectedTag) ? '#bbb' : '#fff'
+
+ return (
+ <ClearText
+ key={'tag_' + i}
+ style={[styles.link, {fontSize, padding: 10, textDecorationLine, color}]}
+ onPress={() => this.props.onFilter(tag)}
+ >
+ {tag}
+ </ClearText>
+ )
+ })
+
+ }
+ onRefresh() {
+ this.props.onClose()
+ }
+ render() {
+ const tagItems = this.buildTagItems()
+ const refreshControl = (
+ <RefreshControl
+ refreshing={false}
+ onRefresh={this.onRefresh}
+ tintColor={'rgba(0,0,0,0)'}
+ />
+ )
+
+ return (
+ <View style={styles.container}>
+ <ScrollView
+ style={styles.scrollView}
+ contentContainerStyle={styles.body}
+ horizontal={false}
+ showsHorizontalScrollIndicator={false}
+ refreshControl={refreshControl}
+ >
+ <Heading style={styles.heading}>CATEGORIES</Heading>
+ <View style={styles.tagItems}>{tagItems}</View>
+ </ScrollView>
+ <Close onPress={this.props.onClose} />
+ </View>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ },
+ heading: {
+ marginLeft: 0,
+ },
+ scrollView: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ },
+ body: {
+ backgroundColor: 'black',
+ height: '100%',
+ },
+ tagItems: {
+ flexWrap: 'wrap',
+ justifyContent: 'center',
+ alignItems: 'center',
+ flexDirection: 'row',
+ padding: 5,
+ },
+ link: {
+ marginHorizontal: 2,
+ marginVertical: 2,
+ lineHeight: 16,
+ },
+})
diff --git a/client/src/lib/timeline/timelineFull.js b/client/src/lib/timeline/timelineFull.js
new file mode 100644
index 0000000..a004987
--- /dev/null
+++ b/client/src/lib/timeline/timelineFull.js
@@ -0,0 +1,227 @@
+import React, { Component } from 'react';
+import {
+ ScrollView,
+ StyleSheet,
+ TouchableOpacity,
+ Image,
+ View,
+ RefreshControl,
+} from 'react-native';
+
+import HTMLView from 'react-native-htmlview'
+import htmlStyles from '../components/htmlStyles'
+
+import ClearText from '../components/text'
+import Heading from '../components/heading'
+import Definition from '../components/definition'
+import Close from '../components/close'
+
+export default class TimelineFull extends Component {
+ constructor() {
+ super()
+ this.onRefresh = this.onRefresh.bind(this)
+ this.onPickTag = this.onPickTag.bind(this)
+ }
+ onRefresh() {
+ this.props.onClose()
+ }
+ onPickTag(tag) {
+ this.props.onFilter(tag)
+ }
+ render() {
+ const item = this.props.item
+ let image, links;
+ if (! item) {
+ return ( <View></View> )
+ }
+
+ if (item.image) {
+ const caption = item.credit ? (
+ <ClearText style={styles.caption}>{item.credit}</ClearText>
+ ) : (
+ <View></View>
+ )
+ const originalWidth = Number(item.image.width)
+ const originalHeight = Number(item.image.height)
+ const height = originalHeight > 450 ? 450 : originalHeight
+ const width = originalWidth * height / originalHeight
+ image = (
+ <View style={styles.imageContainer}>
+ <View style={styles.imageWrapper}>
+ <img src={item.image.uri}
+ style={[styles.image, {
+ width: width,
+ height: height,
+ }]} />
+ </View>
+ {caption}
+ </View>
+ )
+ } else {
+ image = ( <View></View> )
+ }
+
+ if (item.links.length) {
+ const linkItems = item.links.map((link, i) => {
+ const url = link.uri
+ let name = link.text
+ if (! name || name.match(/Link Text/i)) {
+ name = linkTextFromUrl(url)
+ }
+ return (
+ <TouchableOpacity key={'link_' + i} onPress={() => this.props.onLinkPress(url)}>
+ <ClearText style={styles.link}>{name}</ClearText>
+ </TouchableOpacity>
+ )
+ })
+ links = (
+ <Definition label='Links' contentIsView={true}>{linkItems}</Definition>
+ )
+ }
+
+ const tags = item.keywords.map((tag, i) => {
+ return `<a href='${tag}'>${tag}</a>`
+ }).join(', ')
+
+ const description = '<p>' + item.description + '</p>'
+
+ return (
+ <View style={styles.container}>
+ <ScrollView
+ contentContainerStyle={styles.item}
+ horizontal={false}
+ showsHorizontalScrollIndicator={false}
+ >
+ {image}
+ <Heading style={styles.title}>{item.title}</Heading>
+ <View style={styles.contentContainer}>
+ <View style={styles.bodyContainer}>
+ <HTMLView value={description} style={styles.description} stylesheet={htmlStyles} onLinkPress={this.props.onLinkPress} />
+ </View>
+ <View style={styles.metadataContainer}>
+ <Definition label='Date'>{item.date}</Definition>
+ <Definition label='Medium'>{item.medium}</Definition>
+ <Definition label='Category' contentIsView={true}>
+ <TouchableOpacity onPress={() => this.onPickTag(item.category)}>
+ <ClearText style={styles.link}>{item.category}</ClearText>
+ </TouchableOpacity>
+ </Definition>
+ <Definition label='Tags' contentIsView={true}>
+ <HTMLView value={'<p>' + tags + '</p>'} stylesheet={tagHTMLStyles} onLinkPress={this.onPickTag} />
+ </Definition>
+ {links}
+ </View>
+ </View>
+ </ScrollView>
+ <Close onPress={this.props.onClose} />
+ </View>
+ )
+ }
+}
+
+
+function linkTextFromUrl (url) {
+ const url_parts = url.split('/')
+ const domain = url_parts[2]
+ const terms = domain.split('.')
+ const len = terms.length
+ let term = (len > 2 && terms[len-1].length == 2) ? terms[len-3] : terms[len-2]
+ if (term == 'wikipedia') {
+ term += url_parts[4].replace(/\#.*/,'').replace('_', ' ')
+ }
+ return capitalize(term)
+}
+function capitalize (s){
+ return s.charAt(0).toUpperCase() + s.slice(1)
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ scrollView: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ backgroundColor: 'black',
+ },
+ item: {
+ maxWidth: 1000,
+ padding: 40,
+ },
+ imageContainer: {
+ width: '100%',
+ marginBottom: 10,
+ alignItems: 'center',
+ },
+ imageWrapper: {
+ width: '100%',
+ marginBottom: 5,
+ alignItems: 'center',
+ },
+ caption: {
+ fontSize: 12,
+ },
+
+ bodyContainer: {
+ left: '0%',
+ width: '60%',
+ paddingRight: 50,
+ },
+ metadataContainer: {
+ position: 'absolute',
+ left: '60%',
+ width: '40%',
+ },
+ title: {
+ textAlign: 'left',
+ fontWeight: 'bold',
+ fontSize: 18,
+ },
+ date: {
+ textAlign: 'left',
+ },
+ description: {
+ flex: 1,
+ flexDirection: 'column',
+ },
+ link: {
+ textDecorationLine: 'underline',
+ textAlign: 'left',
+ },
+ tag: {
+ marginRight: 5,
+ },
+})
+
+const tagHTMLStyles = StyleSheet.create({
+ p: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textAlign: 'justify',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ b: {
+ fontFamily: 'Futura-MediumItalic',
+ color: 'white',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ i: {
+ fontFamily: 'Futura-MediumItalic',
+ color: 'white',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ a: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textDecorationLine: 'underline',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+})
+
diff --git a/client/src/lib/timeline/timelineHeader.js b/client/src/lib/timeline/timelineHeader.js
new file mode 100644
index 0000000..559ace9
--- /dev/null
+++ b/client/src/lib/timeline/timelineHeader.js
@@ -0,0 +1,111 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ TouchableOpacity,
+ Text,
+ View,
+ ScrollView,
+} from 'react-native';
+import HTMLView from 'react-native-htmlview'
+
+import htmlStyles from '../components/htmlStyles'
+import Heading from '../components/heading'
+import ClearText from '../components/text'
+import Button from '../components/button'
+import Close from '../components/close'
+
+export default class TimelineHeader extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ if (!! this.props.tag) {
+ return (
+ <View style={styles.tagContainer}></View>
+ )
+ }
+ else {
+ const body = '<p>' + this.props.content.body + '</p>'
+ return (
+ <ScrollView contentContainerStyle={styles.container}>
+ <View style={styles.body}>
+ <Heading>HISTORY OF SURVEILLANCE</Heading>
+ <HTMLView value={body} stylesheet={timelineHTMLStyles} onLinkPress={this.props.onLinkPress} />
+ <Button buttonStyle={styles.buttonStyle} onPress={this.props.onClose} label={'VIEW THE TIMELINE'} />
+ </View>
+ </ScrollView>
+ )
+ }
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ },
+ body: {
+ marginTop: 20,
+ maxWidth: 650,
+ marginBottom: 10,
+ backgroundColor: 'black',
+ padding: 40,
+ },
+ buttonStyle: {
+ marginTop: 40,
+ marginLeft: 0,
+ marginRight: 0,
+ marginBottom: 0,
+ },
+})
+
+const timelineHTMLStyles = StyleSheet.create({
+ p: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textAlign: 'justify',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ b: {
+ fontFamily: 'Futura-MediumItalic',
+ color: 'white',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ i: {
+ color: 'white',
+ fontFamily: 'Futura-MediumItalic',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ a: {
+ color: 'white',
+ fontFamily: 'Futura-Medium',
+ textDecorationLine: 'underline',
+ fontSize: 16,
+ lineHeight: 30,
+ },
+ red: {
+ color: '#f00',
+ fontWeight: 'bold',
+ fontFamily: 'Futura-MediumItalic',
+ fontSize: 16,
+ lineHeight: 24,
+ },
+ green: {
+ color: '#0f0',
+ fontWeight: 'bold',
+ fontFamily: 'Futura-MediumItalic',
+ fontSize: 16,
+ lineHeight: 24,
+ },
+ blue: {
+ color: '#08f',
+ fontWeight: 'bold',
+ fontFamily: 'Futura-MediumItalic',
+ fontSize: 16,
+ lineHeight: 24,
+ },
+})
+
diff --git a/client/src/lib/views/contact.js b/client/src/lib/views/contact.js
new file mode 100644
index 0000000..74f79b5
--- /dev/null
+++ b/client/src/lib/views/contact.js
@@ -0,0 +1,307 @@
+import React, { Component } from 'react';
+import {
+ ActivityIndicator,
+ KeyboardAvoidingView,
+ TouchableHighlight,
+ TouchableWithoutFeedback,
+ StyleSheet,
+ TextInput,
+ Keyboard,
+ Text,
+ View
+} from 'react-native';
+
+import hosts from '../db/hosts'
+
+const validator = require("email-validator")
+
+import ScrollableContainer from '../components/scrollableContainer'
+import ClearText from '../components/text'
+import Heading from '../components/heading'
+import Button from '../components/button'
+import CheckBox from '../components/checkbox'
+import Modal from '../components/modal'
+
+export default class Contact extends Component {
+ constructor() {
+ super()
+ this.state = {
+ name: '',
+ email: '',
+ message: '',
+ track: false,
+ publish: false,
+ sending: false,
+ done: false,
+ }
+ this.setName = this.setName.bind(this)
+ this.setEmail = this.setEmail.bind(this)
+ this.setTrack = this.setTrack.bind(this)
+ this.setPublish = this.setPublish.bind(this)
+ this.setMessage = this.setMessage.bind(this)
+ this.send = this.send.bind(this)
+ this.reset = this.reset.bind(this)
+ }
+ setName(name) {
+ this.setState({ name, error: false })
+ }
+ setEmail(email) {
+ this.setState({ email, error: false })
+ }
+ setTrack(track) {
+ this.setState({ track: ! track })
+ }
+ setPublish(publish) {
+ this.setState({ publish: ! publish })
+ }
+ setMessage(message) {
+ this.setState({ message: message })
+ }
+ send() {
+ var isValidEmail = validator.validate(this.state.email)
+ if (! isValidEmail) {
+ // return this.setState({ error: true })
+ this.setState({ sending: true, track: false })
+ }
+ else {
+ this.setState({ sending: true })
+ }
+// fetch('POST', hosts.feedback, {
+// 'Content-Type' : 'multipart/form-data',
+// }, [
+// { name: 'name', data: this.state.name },
+// { name: 'email', data: this.state.email },
+// { name: 'message', data: this.state.message },
+// { name: 'track', data: this.state.track },
+// { name: 'publish', data: this.state.publish },
+// { name: 'secret', data: 'iNr51NbvUDqbBzyray7gdZZjigDtlJj9' },
+// ]).then(() => {
+// this.setState({ done: true })
+// }).catch((e) => {
+// console.warn(e)
+// this.setState({ done: true })
+// })
+ }
+ reset() {
+ this.setState({
+ name: '',
+ email: '',
+ message: '',
+ track: false,
+ publish: false,
+ sending: false,
+ done: false,
+ })
+ }
+ render() {
+ return (
+ <ScrollableContainer heading='Contact' style={styles.container} bodyStyle={styles.body}>
+ <View style={styles.innerContainer}>
+ <ClearText style={styles.bodyText}>
+ {this.props.content.body}
+ </ClearText>
+
+ {this.renderForm()}
+ {this.renderComments()}
+ </View>
+
+ <Modal visible={this.state.sending}>
+ {this.renderActivity()}
+ </Modal>
+ </ScrollableContainer>
+ )
+ }
+ renderForm() {
+ let error = this.state.error ? (
+ <ClearText>Please enter a valid email address</ClearText>
+ ) : (
+ <View></View>
+ )
+ return (
+ <View style={styles.keyboardAvoidingViewInner}>
+ <TextInput
+ value={this.state.name}
+ placeholder="Name"
+ autoCorrect={false}
+ onChangeText={this.setName}
+ style={styles.textInput} />
+ <TextInput
+ value={this.state.email}
+ placeholder="Email"
+ autoCapitalize='none'
+ autoCorrect={false}
+ keyboardType='email-address'
+ onChangeText={this.setEmail}
+ style={styles.textInput} />
+ {error}
+ <TextInput
+ multiline={true}
+ placeholder="Enter your message"
+ value={this.state.message}
+ onChangeText={this.setMessage}
+ style={[styles.textInput, styles.textArea]} />
+ <View style={styles.checkboxes}>
+ <CheckBox
+ label='Sign me up for emails from the Armory'
+ containerStyle={styles.checkboxContainerStyle}
+ labelStyle={styles.checkboxLabelStyle}
+ checked={this.state.track}
+ onChange={this.setTrack} />
+ <CheckBox
+ label='Publish my comment for others to read'
+ containerStyle={styles.checkboxContainerStyle}
+ labelStyle={styles.checkboxLabelStyle}
+ checked={this.state.publish}
+ onChange={this.setPublish} />
+ </View>
+ <Button label='SEND' onPress={this.send} />
+ </View>
+ )
+ }
+ renderActivity() {
+ let activity;
+ if (! this.state.done) {
+ activity = (
+ <View style={styles.message}>
+ <ActivityIndicator animating={true} color='#fff' />
+ <Heading>Sending your message...</Heading>
+ </View>
+ )
+ }
+ else {
+ activity = (
+ <View style={styles.message}>
+ <Heading>Thanks!</Heading>
+ <ClearText>Your message has been delivered.</ClearText>
+ <ClearText style={styles.lastMessage}>Thank you for your feedback.</ClearText>
+ <Button onPress={this.reset} label='OK' />
+ </View>
+ )
+ }
+ return (
+ <View style={styles.modal}>
+ {activity}
+ </View>
+ )
+ }
+ renderComments() {
+ const comments = this.props.comments.map( (comment, i) => {
+ const date = comment[0].replace(/:\d\d$/,'')
+ return (
+ <View style={styles.comment} key={'comment_' + i}>
+ <View style={styles.commentRow}>
+ <ClearText style={styles.commentName}>{comment[1]}</ClearText>
+ <ClearText style={styles.commentDate}>{date}</ClearText>
+ </View>
+ <ClearText style={styles.commentBody}>{comment[2]}</ClearText>
+ </View>
+ )
+ })
+ return (
+ <TouchableWithoutFeedback>
+ <View style={styles.comments}>
+ {comments}
+ </View>
+ </TouchableWithoutFeedback>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ flex: 1,
+ },
+ body: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ },
+ innerContainer: {
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ },
+ bodyText: {
+ width: 400,
+ marginBottom: 20,
+ },
+ message: {
+ backgroundColor: 'rgb(0,0,0)',
+ borderRadius: 20,
+ padding: 20,
+ },
+ modal: {
+ backgroundColor: 'rgba(0,0,0,0.9)',
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ textInput: {
+ width: 350,
+ height: 40,
+ padding: 5,
+ fontSize: 15,
+ fontFamily: 'Futura-Medium',
+ backgroundColor: 'white',
+ borderColor: 'gray',
+ borderWidth: 1,
+ marginTop: 10,
+ marginLeft: 5,
+ marginBottom: 5,
+ marginRight: 5,
+ },
+ textArea: {
+ width: 350,
+ height: 200,
+ },
+ checkboxes: {
+ alignItems: 'flex-start',
+ marginLeft: 5,
+ },
+ checkboxContainerStyle: {
+ marginTop: 10,
+ },
+ checkboxLabelStyle: {
+ color: '#ddd',
+ fontFamily: 'Futura-Medium',
+ },
+ keyboardAvoidingViewInner: {
+ alignItems: 'center',
+ },
+ lastMessage: {
+ marginBottom: 10,
+ },
+
+ comments: {
+ marginTop: 20,
+ paddingBottom: 100,
+ width: 400,
+ },
+ comment: {
+ borderWidth: 1,
+ borderColor: 'rgb(128,128,128)',
+ padding: 10,
+ margin: 10,
+ },
+ commentRow: {
+ flexDirection: 'row',
+ },
+ commentName: {
+ flex: 1,
+ fontSize: 13,
+ textAlign: 'left',
+ },
+ commentDate: {
+ flex: 1,
+ fontSize: 13,
+ textAlign: 'right',
+ },
+ commentBody: {
+ marginTop: 10,
+ fontSize: 13,
+ borderTopWidth: 1,
+ borderTopColor: 'rgb(64,64,64)',
+ textAlign: 'left',
+ },
+})
+
diff --git a/client/src/lib/views/credits.js b/client/src/lib/views/credits.js
new file mode 100644
index 0000000..dbe516b
--- /dev/null
+++ b/client/src/lib/views/credits.js
@@ -0,0 +1,34 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View,
+} from 'react-native';
+import HTMLView from 'react-native-htmlview'
+
+import htmlStyles from '../components/htmlStyles'
+import ScrollableContainer from '../components/scrollableContainer'
+import ClearText from '../components/text'
+
+export default class Credits extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ let body = '<p>' + this.props.content.body + '</p>'
+ return (
+ <ScrollableContainer heading='Credits'>
+ <View style={styles.body}>
+ <View style={styles.inner}>
+ <HTMLView value={body} stylesheet={htmlStyles} onLinkPress={this.props.onLinkPress} />
+ </View>
+ </View>
+ </ScrollableContainer>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ body: {
+ maxWidth: '650px',
+ },
+})
diff --git a/client/src/lib/views/home.js b/client/src/lib/views/home.js
new file mode 100644
index 0000000..618ce64
--- /dev/null
+++ b/client/src/lib/views/home.js
@@ -0,0 +1,98 @@
+import React, { Component } from 'react';
+import {
+ Image,
+ StyleSheet,
+ TouchableOpacity,
+ View,
+ Platform
+} from 'react-native';
+import { Link } from 'react-router-dom'
+import ClearText from '../components/text'
+import FadeInView from 'react-native-fade-in-view'
+
+const sections = [
+ '/timeline',
+ '/drones',
+ '/livestream',
+ '/information',
+ '/contact'
+]
+const labels = [
+ 'SURVEILLANCE',
+ 'MILITARY DRONE STATISTICS',
+ 'LIVESTREAM',
+ 'ABOUT THIS WORK',
+ 'CONTACT',
+]
+const images = [
+ require('../../img/nav/home/timeline.png'),
+ require('../../img/nav/home/drones.png'),
+ require('../../img/nav/home/livestream.png'),
+ require('../../img/nav/home/information.png'),
+ require('../../img/nav/home/contact.png'),
+]
+
+export default class Home extends Component {
+ constructor() {
+ super()
+ }
+ render() {
+ const links = sections.map((path, i) => {
+ const image = images[i]
+ const label = labels[i]
+ return view(path, image, label)
+ })
+ return (
+ <FadeInView duration={500} style={styles.container}>
+ {links}
+ </FadeInView>
+ )
+ }
+}
+
+function view (path, image, label, isSelected) {
+ let key = ('home_' + path).replace('/','')
+ let imageKey = 'image_' + key + String(isSelected)
+ return (
+ <Link to={path} key={key}>
+ <View style={styles.navItem}>
+ <Image key={imageKey} style={styles.image} source={image} />
+ <ClearText style={styles.text}>{label}</ClearText>
+ </View>
+ </Link>
+ )
+}
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const shortHeight = isIphone || window.innerHeight < 700
+
+const buttonSide = shortHeight ? 50 : 70
+const buttonMargin = shortHeight ? 5 : 10
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginTop: -80
+ },
+ navItem: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ minHeight: shortHeight ? '10vh' : '13vh',
+ },
+ text: {
+ lineHeight: 16,
+ marginBottom: shortHeight ? 5 : 10,
+ },
+ image: {
+ width: buttonSide,
+ height: buttonSide,
+ margin: buttonMargin,
+ }
+})
diff --git a/client/src/lib/views/information.js b/client/src/lib/views/information.js
new file mode 100644
index 0000000..c48eb7f
--- /dev/null
+++ b/client/src/lib/views/information.js
@@ -0,0 +1,114 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ Image,
+} from 'react-native';
+
+import ScrollableContainer from '../components/scrollableContainer'
+import ClearText from '../components/text'
+
+export default class Information extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ const content = this.props.content
+ return (
+ <ScrollableContainer heading="ABOUT THIS WORK" bodyStyle={styles.bodyStyle}>
+ <ClearText style={styles.body}>
+ {this.props.content.show}
+ </ClearText>
+
+ <Image source={require('../../img/aiweiwei.png')} resizeMode='cover' style={styles.face} />
+ <ClearText style={styles.body}>
+ {this.props.content.aiWeiWeiBio}
+ </ClearText>
+ <Image source={require('../../img/herzogDeMeuron.png')} resizeMode='cover' style={styles.face} />
+ <ClearText style={styles.body}>
+ {this.props.content.herzogBio}
+ </ClearText>
+ <ClearText style={styles.body}>
+ {this.props.content.deMeuronBio}
+ </ClearText>
+ <ClearText style={styles.footer}>
+ </ClearText>
+ </ScrollableContainer>
+ );
+ }
+}
+
+/*
+ <YouTube
+ ref={(ref) => this.youtubePlayer = ref}
+ videoId={content.video.token}
+ play={false}
+ hidden={false}
+ fullscreen={false}
+ loop={true}
+ controls={1}
+ showFullscreenButton={true}
+ showinfo={false}
+ modestbranding={true}
+ rel={false}
+ iv_load_policy={3}
+
+ onReady={(e)=>{this.setState({isReady: true})}}
+ onChangeState={(e)=>{
+ if (e.state == 'playing') {
+ this.props.onVideoPlay()
+ }
+ else {
+ this.props.onVideoPause()
+ }
+ }}
+ onChangeFullscreen={(e)=>{
+ if (e.isFullscreen) {
+ this.props.onVideoPlay()
+ }
+ else {
+ this.props.onVideoPause()
+ }
+ }}
+ onError={(e)=>{this.setState({error: e.error})}}
+ onProgress={(e)=>{this.setState({currentTime: e.currentTime, duration: Math.round(e.duration)})}}
+
+ style={styles.video}
+ />
+*/
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'flex-start',
+ },
+ bodyStyle: {
+ marginRight: 10,
+ },
+ video: {
+ alignSelf: 'stretch',
+ height: 400,
+ width: '100%',
+ backgroundColor: 'black',
+ marginVertical: 10
+ },
+ body: {
+ textAlign: 'left',
+ paddingRight: 10,
+ width: '90%',
+ marginBottom: 20,
+ maxWidth: 600,
+ },
+ hero: {
+ width: '90%',
+ height: 300,
+ },
+ face: {
+ width: '90vw',
+ height: 400,
+ marginBottom: 20,
+ },
+ footer: {
+ marginBottom: 80,
+ },
+})
diff --git a/client/src/lib/views/livestream.js b/client/src/lib/views/livestream.js
new file mode 100644
index 0000000..d3df460
--- /dev/null
+++ b/client/src/lib/views/livestream.js
@@ -0,0 +1,134 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View
+} from 'react-native';
+
+import Container from '../components/container'
+import ClearText from '../components/text'
+import Button from '../components/button'
+import Youtube from '../components/youtube'
+
+export default class Livestream extends Component {
+ constructor(props) {
+ super()
+ this.state = {
+ ytid: getYTID(choice(props.content.streams).uri),
+ isReady: false,
+ currentTime: 0,
+ duration: 0,
+ quality: 0,
+ status: 'unloaded',
+ error: null,
+ }
+ }
+ render() {
+ const buttons = this.props.content.streams.map( (stream, i) => {
+ const ytid = getYTID(stream.uri || "")
+ if (! ytid) return null
+ let buttonStyle, textStyle
+ if (ytid === this.state.ytid) {
+ buttonStyle = styles.activeButton
+ textStyle = styles.activeButtonText
+ }
+ return (
+ <Button
+ key={'button_' + i}
+ buttonStyle={buttonStyle}
+ textStyle={textStyle}
+ label={stream.text}
+ onPress={() => {
+ this.setState({ ytid })
+ }}
+ />
+ )
+ }).filter(button => !!button)
+
+ return (
+ <Container heading='Livestream' bodyStyle={styles.bodyStyle}>
+ <View style={styles.videoContainer} className='videoContainer'>
+ <Youtube ytid={this.state.ytid} />
+ <View style={styles.overlay}></View>
+ </View>
+ <View style={styles.buttons}>
+ {buttons}
+ </View>
+ <View style={styles.contentContainer}>
+ <ClearText style={styles.body}>{this.props.content.body}</ClearText>
+ </View>
+ </Container>
+ )
+ }
+}
+
+function randint(n){ return Math.floor(Math.random() * n) }
+function choice(a){ return a[randint(a.length)] }
+function getYTID(url) {
+ return (
+ url.match(/v=([-_a-zA-Z0-9]{11})/i)
+ || url.match(/youtu.be\/([-_a-zA-Z0-9]{11})/i)
+ || url.match(/embed\/([-_a-zA-Z0-9]{11})/i)
+ )[1].split('&')[0];
+
+}
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ },
+ bodyStyle: {
+ flex: 1,
+ },
+ body: {
+ textAlign: 'left',
+ marginTop: 40,
+ width: '75%',
+ },
+ contentContainer: {
+ flex: 1,
+ justifyContent: 'flex-start',
+ alignItems: 'center',
+ width: '100%',
+ },
+ videoContainer: {
+ justifyContent: 'flex-start',
+ height: 400,
+ width: '100%',
+ padding: 10,
+ },
+ video: {
+ alignSelf: 'stretch',
+ height: 400,
+ width: '100%',
+ backgroundColor: 'black',
+ marginVertical: 10
+ },
+ overlay: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ width: '100%',
+ height: '100%',
+ backgroundColor: 'rgba(0,0,0,0)'
+ },
+ buttons: {
+ width: '100%',
+ paddingTop: 20,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ button: {
+ margin: 20,
+ },
+ activeButtonText: {
+ color: 'red',
+ },
+ activeButton: {
+ backgroundColor: '#bbb',
+ borderBottomColor: '#888',
+ },
+})
diff --git a/client/src/lib/views/nav.js b/client/src/lib/views/nav.js
new file mode 100644
index 0000000..83f9aa4
--- /dev/null
+++ b/client/src/lib/views/nav.js
@@ -0,0 +1,119 @@
+import React, { Component } from 'react';
+import {
+ Image,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ Platform,
+ View
+} from 'react-native';
+import { Link } from 'react-router-dom'
+import FadeInView from 'react-native-fade-in-view'
+
+const sections = [
+ '/',
+ '/timeline',
+ '/drones',
+ '/livestream',
+ '/information',
+ '/contact'
+]
+const images = [
+ require('../../img/nav/sidebar/home.png'),
+ require('../../img/nav/sidebar/timeline.png'),
+ require('../../img/nav/sidebar/drones.png'),
+ require('../../img/nav/sidebar/livestream.png'),
+ require('../../img/nav/sidebar/information.png'),
+ require('../../img/nav/sidebar/contact.png'),
+]
+
+export default class Nav extends Component {
+ constructor() {
+ super()
+ }
+ render() {
+ let opacity = 1
+ if (this.props.location.pathname === '/' || this.props.location.pathname === '/home') {
+ opacity = 0
+ }
+ const min = this.props.min || 0
+ const max = this.props.max || 6
+ const align = this.props.min == 0 ? styles.flexEnd : styles.flexStart
+ const links = sections.map((path, i) => {
+ const isSelected = this.props.location.pathname === path
+ const image = images[i]
+ return view(path, image, isSelected, align)
+ }).filter( (a,i) => { return min <= i && i < max })
+ return (
+ <View style={[styles.nav, align, {opacity: opacity}]}>
+ {links}
+ </View>
+ )
+ }
+}
+
+function view (path, image, isSelected, align) {
+ const key = 'link_' + (path.replace('/','') || 'home')
+ const style = [styles.image]
+ if (! isSelected) {
+ style.push(styles.unselectedNavItem)
+ }
+ else {
+ style.push(styles.selectedNavItem)
+ }
+ return (
+ <View style={[styles.item, align]} key={key}>
+ <Link to={path}>
+ <View style={[styles.item, align]}>
+ <Image key={'image_' + key} style={style} source={image} />
+ </View>
+ </Link>
+ </View>
+ )
+}
+
+const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+const isIpad = (navigator.userAgent.match(/iPad/i))
+const isAndroid = (navigator.userAgent.match(/Android/i))
+const isMobile = isIphone || isIpad || isAndroid
+const isDesktop = ! isMobile
+
+const styles = StyleSheet.create({
+ nav: {
+ width: '100%',
+ height: 35,
+ flex: 10,
+ flexGrow: 2,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'flex-end',
+ },
+ flexEnd: {
+ alignItems: 'flex-end',
+ paddingRight: isMobile ? 5 : 10,
+ },
+ flexStart: {
+ alignItems: 'flex-start',
+ paddingLeft: isMobile ? 5 : 10,
+ },
+ unselectedNavItem: {
+ opacity: 0.5,
+ },
+ selectedNavItem: {
+ opacity: 1.0,
+ },
+ item: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'flex-end',
+ },
+ image: {
+ margin: "0 auto",
+ justifyContent: 'center',
+ alignItems: 'flex-end',
+ width: 35,
+ height: 35,
+ },
+})
+
+
diff --git a/client/src/lib/views/privacy.js b/client/src/lib/views/privacy.js
new file mode 100644
index 0000000..c2d0596
--- /dev/null
+++ b/client/src/lib/views/privacy.js
@@ -0,0 +1,33 @@
+import React, { Component } from 'react';
+import {
+ StyleSheet,
+ View,
+} from 'react-native';
+import HTMLView from 'react-native-htmlview'
+
+import htmlStyles from '../components/htmlStyles'
+import ScrollableContainer from '../components/scrollableContainer'
+import ClearText from '../components/text'
+
+export default class Privacy extends Component {
+ constructor(props) {
+ super()
+ }
+ render() {
+ let body = '<p>' + this.props.content.body + '</p>'
+ return (
+ <ScrollableContainer heading='Privacy Policy'>
+ <View style={styles.body}>
+ <HTMLView value={body} stylesheet={htmlStyles} onLinkPress={this.props.onLinkPress} />
+ </View>
+ </ScrollableContainer>
+ )
+ }
+}
+
+const styles = StyleSheet.create({
+ body: {
+ width: '90%',
+ maxWidth: '650px',
+ },
+}) \ No newline at end of file
diff --git a/client/src/package.json b/client/src/package.json
new file mode 100644
index 0000000..4b5314b
--- /dev/null
+++ b/client/src/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "HanselAndGretel",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "node node_modules/react-native/local-cli/cli.js start",
+ "test": "jest"
+ },
+ "dependencies": {
+ "email-validator": "^1.0.7",
+ "events": "^1.1.1",
+ "history": "^4.6.1",
+ "react": "16.0.0-alpha.6",
+ "react-native": "^0.44.0",
+ "react-native-camera": "git+https://github.com/lwansbrough/react-native-camera.git",
+ "react-native-checkbox": "^1.1.0",
+ "react-native-device-info": "^0.10.2",
+ "react-native-fade-in-view": "^1.0.4",
+ "react-native-fetch-blob": "^0.10.5",
+ "react-native-fs": "^2.3.2",
+ "react-native-htmlview": "^0.9.0",
+ "react-native-modal": "^2.3.2",
+ "react-native-pathjs-charts": "0.0.28",
+ "react-native-push-notification": "^3.0.0",
+ "react-native-svg": "^5.1.8",
+ "react-native-youtube": "^1.0.0-alpha.3",
+ "react-router-native": "^4.1.1"
+ },
+ "devDependencies": {
+ "babel-jest": "20.0.0",
+ "babel-preset-react-native": "1.9.1",
+ "jest": "20.0.0",
+ "react-test-renderer": "16.0.0-alpha.6"
+ },
+ "jest": {
+ "preset": "react-native"
+ }
+}
diff --git a/client/web/shared.webpack.config.js b/client/web/shared.webpack.config.js
new file mode 100644
index 0000000..81f7a6a
--- /dev/null
+++ b/client/web/shared.webpack.config.js
@@ -0,0 +1,64 @@
+// @flow
+/* eslint-disable import/no-extraneous-dependencies */
+const path = require('path')
+const webpack = require('webpack')
+const CompressionPlugin = require('compression-webpack-plugin')
+
+module.exports = {
+ productionPlugins: [
+ new webpack.optimize.AggressiveMergingPlugin(),
+ new webpack.optimize.UglifyJsPlugin({
+ mangle: true,
+ compress: {
+ warnings: false, // Suppress uglification warnings
+ pure_getters: true,
+ unsafe: true,
+ unsafe_comps: true,
+ screw_ie8: true,
+ },
+ output: {
+ comments: false,
+ },
+ sourceMap: false,
+ exclude: [/\.min\.js$/gi], // skip pre-minified libs
+ }),
+ new CompressionPlugin({
+ asset: '[path].gz[query]',
+ algorithm: 'zopfli',
+ test: /\.js$|\.css$|\.html$/,
+ threshold: 10240,
+ minRatio: 0.8,
+ }),
+ ],
+
+ loaders: [
+ {
+ test: /\.ttf$/,
+ loader: 'url-loader',
+ include: path.resolve(__dirname, '../node_modules/react-native-vector-icons'),
+ },
+ {
+ test: /\.json$/,
+ loader: 'json-loader',
+ },
+ {
+ // Many react-native libraries do not compile their ES6 JS.
+ test: /\.js$/,
+ include: /node_modules\/react-native-/,
+ // react-native-web is already compiled.
+ exclude: /node_modules\/react-native-web\//,
+ loader: 'babel-loader',
+ query: { cacheDirectory: true },
+ },
+ {
+ test: /\.(gif|jpe?g|png|svg)$/,
+ loader: 'url-loader',
+ query: { name: 'images/[name]-[hash:16].[ext]' },
+ },
+ {
+ test: /\.(mp3|wav)$/,
+ loader: 'file-loader',
+ query: { name: 'sounds/[name]-[hash:16].[ext]' },
+ },
+ ],
+}
diff --git a/client/web/templates/index.ejs b/client/web/templates/index.ejs
new file mode 100644
index 0000000..ec11dda
--- /dev/null
+++ b/client/web/templates/index.ejs
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html<% if (__OFFLINE__) { %> manifest="appcache/manifest.appcache"<% } %>>
+ <head>
+ <meta charset="utf-8">
+ <title>Hansel and Gretel</title>
+ <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
+ <meta name="viewport" content="width=device-width, initial-scale=0.9">
+<style>
+a {
+ width: 100%;
+ color: transparent;
+}
+body,html{
+ overflow: hidden;
+}
+.modal {
+ transition: all 400ms;
+}
+svg {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+</style>
+ </head>
+ <body>
+ <div id="react-root"></div>
+ </body>
+ <script src="http://www.youtube.com/iframe_api"></script>
+
+</html>
diff --git a/client/web/vendor.webpack.config.js b/client/web/vendor.webpack.config.js
new file mode 100644
index 0000000..d9cd190
--- /dev/null
+++ b/client/web/vendor.webpack.config.js
@@ -0,0 +1,56 @@
+// @flow
+/* eslint-disable import/no-extraneous-dependencies, global-require, import/no-dynamic-require */
+/* eslint-disable no-underscore-dangle */
+const __DEV__ = process.env.NODE_ENV === 'development'
+
+const path = require('path')
+const webpack = require('webpack')
+const config = require('./shared.webpack.config.js')
+
+// We need a separate build for dev, which is unminified and includes PropTypes.
+const outputPath = path.join(__dirname, __DEV__ ? 'vendor-dev' : 'vendor')
+const outputFilename = __DEV__ ? '[name].dll.js' : '[name]-[hash:16].dll.js'
+
+const plugins = [
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
+ __DEV__,
+ }),
+
+ ...(__DEV__ ? [] : config.productionPlugins),
+
+ new webpack.DllPlugin({
+ name: '[name]',
+ path: path.join(outputPath, '[name]-manifest.json'),
+ }),
+]
+
+module.exports = {
+ entry: {
+ // Put react-native-web / react dependencies in here.
+ 'react': [
+ 'react-native-web',
+ ],
+ // Put any other other core libs in here. (immutable, redux, localforage, etc.)
+ // 'core': [
+ // ],
+ },
+ output: {
+ filename: outputFilename,
+ path: outputPath,
+ library: '[name]',
+ },
+
+ module: {
+ noParse: /localforage\/dist\/localforage.js/,
+ loaders: config.loaders,
+ },
+
+ plugins,
+ resolve: {
+ alias: {
+ 'react-native': 'react-native-web',
+ },
+ extensions: ['.web.js', '.js', '.json'],
+ },
+}
diff --git a/client/web/webpack.config.js b/client/web/webpack.config.js
new file mode 100644
index 0000000..d9425c1
--- /dev/null
+++ b/client/web/webpack.config.js
@@ -0,0 +1,104 @@
+/* eslint-disable */
+const enableOfflinePlugin = false
+
+const __DEV__ = process.env.NODE_ENV === 'development'
+const __OFFLINE__ = enableOfflinePlugin && !__DEV__
+
+const path = require('path')
+const glob = require('glob')
+const webpack = require('webpack')
+const config = require('./shared.webpack.config.js')
+
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')
+
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const OfflinePlugin = require('offline-plugin')
+
+const vendorConfig = require('./vendor.webpack.config.js')
+const outputPath = path.join(__dirname, '/build/')
+
+
+const addAssetHtmlFiles = Object.keys(vendorConfig.entry).map((name) => {
+ const fileGlob = `${name}*.dll.js`
+ const paths = glob.sync(path.join(vendorConfig.output.path, fileGlob))
+ if (paths.length === 0) throw new Error(`Could not find ${fileGlob}!`)
+ if (paths.length > 1) throw new Error(`Too many files for ${fileGlob}! You should clean and rebuild.`)
+ return {
+ filepath: require.resolve(paths[0]),
+ includeSourcemap: false,
+ outputPath: 'javascript/vendor',
+ publicPath: '/javascript/vendor',
+ }
+})
+
+const plugins = [
+ ...Object.keys(vendorConfig.entry).map(name =>
+ new webpack.DllReferencePlugin({
+ context: process.cwd(),
+ manifest: require(path.join(vendorConfig.output.path, `${name}-manifest.json`)),
+ })),
+
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
+ __DEV__,
+ __OFFLINE__,
+ }),
+ new HtmlWebpackPlugin({
+ filename: 'index.html',
+ template: 'web/templates/index.ejs',
+ }),
+ new AddAssetHtmlPlugin(addAssetHtmlFiles),
+
+ new CopyWebpackPlugin([
+ // Workaround for AddAssetHtmlPlugin not copying compressed .gz files
+ { context: 'web/vendor/', from: '*.js.gz', to: 'javascript/vendor/' },
+ ]),
+
+ // Split out any remaining node modules
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'vendor/lib',
+ minChunks: module => module.context && module.context.indexOf('node_modules/') !== -1,
+ }),
+
+ ...(__DEV__ ? [] : [
+ ...config.productionPlugins,
+
+ // Add any app-specific production plugins here.
+ ])
+]
+
+// If offline plugin is enabled, it has to come last.
+if (__OFFLINE__) plugins.push(new OfflinePlugin())
+
+module.exports = {
+ devServer: {
+ contentBase: outputPath,
+ },
+ entry: {
+ app: path.join(__dirname, '../index.web.js')
+ },
+ module: {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ // TODO: Set up react-hot-loader during development.
+ loaders: [ 'babel-loader?cacheDirectory=true' ],
+ },
+ ...config.loaders,
+ ]
+ },
+ output: {
+ path: outputPath,
+ filename: 'javascript/[name]-[hash:16].js',
+ publicPath: '/'
+ },
+ plugins: plugins,
+ resolve: {
+ alias: {
+ 'react-native': 'react-native-web'
+ },
+ extensions: [".web.js", ".js", ".json"]
+ }
+};
diff --git a/client/yarn.lock b/client/yarn.lock
new file mode 100644
index 0000000..776eb5f
--- /dev/null
+++ b/client/yarn.lock
@@ -0,0 +1,5461 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abab@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+absolute-path@^0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7"
+
+accepts@~1.2.12, accepts@~1.2.13:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea"
+ dependencies:
+ mime-types "~2.1.6"
+ negotiator "0.5.3"
+
+accepts@~1.3.0, accepts@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn-globals@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+ dependencies:
+ acorn "^4.0.4"
+
+acorn@^4.0.3, acorn@^4.0.4:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
+
+acorn@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
+add-asset-html-webpack-plugin@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/add-asset-html-webpack-plugin/-/add-asset-html-webpack-plugin-2.0.1.tgz#105f9ff726751e93f01d38846f27e891f022037b"
+ dependencies:
+ bluebird "^3.4.6"
+ minimatch "^3.0.3"
+
+ajv-keywords@^1.1.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0, ajv@^4.9.1:
+ version "4.11.7"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+animated@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/animated/-/animated-0.2.0.tgz#1a0e96f097b3fbc5b64d7eddc723bcc0a6f97633"
+ dependencies:
+ invariant "^2.2.0"
+ normalize-css-color "^1.0.1"
+
+ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1"
+ dependencies:
+ color-convert "^1.0.0"
+
+ansi@^0.3.0, ansi@~0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-differ@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-uniq@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.0, arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+art@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/art/-/art-0.10.1.tgz#38541883e399225c5e193ff246e8f157cf7b2146"
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1.js@^4.0.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@0.2.x:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+async@0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7"
+
+async@^1.4.0, async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.1, async@^2.1.2, async@^2.1.4:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9"
+ dependencies:
+ lodash "^4.14.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1, babel-core@^6.7.2:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.24.1"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-generator@^6.18.0, babel-generator@^6.21.0, babel-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-remap-async-to-generator@^6.16.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-jest@19.0.0, babel-jest@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-plugin-istanbul "^4.0.0"
+ babel-preset-jest "^19.0.0"
+
+babel-loader@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.0.0.tgz#2e43a66bee1fff4470533d0402c8a4532fafbaf7"
+ dependencies:
+ find-cache-dir "^0.1.1"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.5.0, babel-plugin-check-es2015-constants@^6.7.2, babel-plugin-check-es2015-constants@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-external-helpers@^6.18.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.1.tgz#c12de0fc6fe42adfb16be56f1ad11e4a9782eca9"
+ dependencies:
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.6.2"
+ test-exclude "^4.0.3"
+
+babel-plugin-jest-hoist@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea"
+
+babel-plugin-react-transform@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz#515bbfa996893981142d90b1f9b1635de2995109"
+ dependencies:
+ lodash "^4.6.1"
+
+babel-plugin-syntax-async-functions@^6.5.0, babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-properties@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-object-rest-spread@^6.5.0, babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.20.0, babel-plugin-syntax-trailing-function-commas@^6.5.0, babel-plugin-syntax-trailing-function-commas@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@6.16.0:
+ version "6.16.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.16.0"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.0.0"
+
+babel-plugin-transform-class-properties@^6.5.0, babel-plugin-transform-class-properties@^6.6.0, babel-plugin-transform-class-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.5.0, babel-plugin-transform-es2015-arrow-functions@^6.5.2, babel-plugin-transform-es2015-arrow-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.6.5, babel-plugin-transform-es2015-block-scoped-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.5.0, babel-plugin-transform-es2015-block-scoping@^6.7.1, babel-plugin-transform-es2015-block-scoping@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.5.0, babel-plugin-transform-es2015-classes@^6.6.5, babel-plugin-transform-es2015-classes@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform-es2015-computed-properties@^6.6.5, babel-plugin-transform-es2015-computed-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@6.x, babel-plugin-transform-es2015-destructuring@^6.5.0, babel-plugin-transform-es2015-destructuring@^6.6.5, babel-plugin-transform-es2015-destructuring@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-for-of@^6.5.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@6.x, babel-plugin-transform-es2015-function-name@^6.5.0, babel-plugin-transform-es2015-function-name@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.5.0, babel-plugin-transform-es2015-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-commonjs@6.x, babel-plugin-transform-es2015-modules-commonjs@^6.5.0, babel-plugin-transform-es2015-modules-commonjs@^6.7.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.6.5, babel-plugin-transform-es2015-object-super@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@6.x, babel-plugin-transform-es2015-parameters@^6.5.0, babel-plugin-transform-es2015-parameters@^6.7.0, babel-plugin-transform-es2015-parameters@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@6.x, babel-plugin-transform-es2015-shorthand-properties@^6.5.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@6.x, babel-plugin-transform-es2015-spread@^6.5.0, babel-plugin-transform-es2015-spread@^6.6.5, babel-plugin-transform-es2015-spread@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@6.x:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.5.0, babel-plugin-transform-es2015-template-literals@^6.6.5, babel-plugin-transform-es2015-template-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@6.x:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-es3-member-expression-literals@^6.5.0, babel-plugin-transform-es3-member-expression-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es3-property-literals@^6.5.0, babel-plugin-transform-es3-property-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.21.0, babel-plugin-transform-flow-strip-types@^6.5.0, babel-plugin-transform-flow-strip-types@^6.7.0, babel-plugin-transform-flow-strip-types@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-assign@^6.5.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.20.2, babel-plugin-transform-object-rest-spread@^6.5.0, babel-plugin-transform-object-rest-spread@^6.6.5, babel-plugin-transform-object-rest-spread@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.5.0, babel-plugin-transform-react-display-name@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.5.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.5.0, babel-plugin-transform-react-jsx@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.5.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+ dependencies:
+ regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@^6.20.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-preset-es2015-node@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz#60b23157024b0cfebf3a63554cb05ee035b4e55f"
+ dependencies:
+ babel-plugin-transform-es2015-destructuring "6.x"
+ babel-plugin-transform-es2015-function-name "6.x"
+ babel-plugin-transform-es2015-modules-commonjs "6.x"
+ babel-plugin-transform-es2015-parameters "6.x"
+ babel-plugin-transform-es2015-shorthand-properties "6.x"
+ babel-plugin-transform-es2015-spread "6.x"
+ babel-plugin-transform-es2015-sticky-regex "6.x"
+ babel-plugin-transform-es2015-unicode-regex "6.x"
+ semver "5.x"
+
+babel-preset-fbjs@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-1.0.0.tgz#c972e5c9b301d4ec9e7971f4aec3e14ac017a8b0"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.7.2"
+ babel-plugin-syntax-flow "^6.5.0"
+ babel-plugin-syntax-object-rest-spread "^6.5.0"
+ babel-plugin-syntax-trailing-function-commas "^6.5.0"
+ babel-plugin-transform-class-properties "^6.6.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.5.2"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.6.5"
+ babel-plugin-transform-es2015-block-scoping "^6.7.1"
+ babel-plugin-transform-es2015-classes "^6.6.5"
+ babel-plugin-transform-es2015-computed-properties "^6.6.5"
+ babel-plugin-transform-es2015-destructuring "^6.6.5"
+ babel-plugin-transform-es2015-for-of "^6.6.0"
+ babel-plugin-transform-es2015-literals "^6.5.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.7.0"
+ babel-plugin-transform-es2015-object-super "^6.6.5"
+ babel-plugin-transform-es2015-parameters "^6.7.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.5.0"
+ babel-plugin-transform-es2015-spread "^6.6.5"
+ babel-plugin-transform-es2015-template-literals "^6.6.5"
+ babel-plugin-transform-es3-member-expression-literals "^6.5.0"
+ babel-plugin-transform-es3-property-literals "^6.5.0"
+ babel-plugin-transform-flow-strip-types "^6.7.0"
+ babel-plugin-transform-object-rest-spread "^6.6.5"
+ object-assign "^4.0.1"
+
+babel-preset-fbjs@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.0.tgz#1a8d4cacbac7c5a9194ce3b8475ffab33ed524fb"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.8.0"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-plugin-syntax-flow "^6.8.0"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-plugin-syntax-trailing-function-commas "^6.8.0"
+ babel-plugin-transform-class-properties "^6.8.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoping "^6.8.0"
+ babel-plugin-transform-es2015-classes "^6.8.0"
+ babel-plugin-transform-es2015-computed-properties "^6.8.0"
+ babel-plugin-transform-es2015-destructuring "^6.8.0"
+ babel-plugin-transform-es2015-for-of "^6.8.0"
+ babel-plugin-transform-es2015-function-name "^6.8.0"
+ babel-plugin-transform-es2015-literals "^6.8.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.8.0"
+ babel-plugin-transform-es2015-object-super "^6.8.0"
+ babel-plugin-transform-es2015-parameters "^6.8.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.8.0"
+ babel-plugin-transform-es2015-spread "^6.8.0"
+ babel-plugin-transform-es2015-template-literals "^6.8.0"
+ babel-plugin-transform-es3-member-expression-literals "^6.8.0"
+ babel-plugin-transform-es3-property-literals "^6.8.0"
+ babel-plugin-transform-flow-strip-types "^6.8.0"
+ babel-plugin-transform-object-rest-spread "^6.8.0"
+ babel-plugin-transform-react-display-name "^6.8.0"
+ babel-plugin-transform-react-jsx "^6.8.0"
+
+babel-preset-jest@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396"
+ dependencies:
+ babel-plugin-jest-hoist "^19.0.0"
+
+babel-preset-react-native@1.9.1, babel-preset-react-native@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-1.9.1.tgz#ec8e378274410d78f550fa9f8edd70353f3bb2fe"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.5.0"
+ babel-plugin-react-transform "2.0.2"
+ babel-plugin-syntax-async-functions "^6.5.0"
+ babel-plugin-syntax-class-properties "^6.5.0"
+ babel-plugin-syntax-flow "^6.5.0"
+ babel-plugin-syntax-jsx "^6.5.0"
+ babel-plugin-syntax-trailing-function-commas "^6.5.0"
+ babel-plugin-transform-class-properties "^6.5.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.5.0"
+ babel-plugin-transform-es2015-block-scoping "^6.5.0"
+ babel-plugin-transform-es2015-classes "^6.5.0"
+ babel-plugin-transform-es2015-computed-properties "^6.5.0"
+ babel-plugin-transform-es2015-destructuring "^6.5.0"
+ babel-plugin-transform-es2015-for-of "^6.5.0"
+ babel-plugin-transform-es2015-function-name "^6.5.0"
+ babel-plugin-transform-es2015-literals "^6.5.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.5.0"
+ babel-plugin-transform-es2015-parameters "^6.5.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.5.0"
+ babel-plugin-transform-es2015-spread "^6.5.0"
+ babel-plugin-transform-es2015-template-literals "^6.5.0"
+ babel-plugin-transform-flow-strip-types "^6.5.0"
+ babel-plugin-transform-object-assign "^6.5.0"
+ babel-plugin-transform-object-rest-spread "^6.5.0"
+ babel-plugin-transform-react-display-name "^6.5.0"
+ babel-plugin-transform-react-jsx "^6.5.0"
+ babel-plugin-transform-react-jsx-source "^6.5.0"
+ babel-plugin-transform-regenerator "^6.5.0"
+ react-transform-hmr "^1.0.4"
+
+babel-register@^6.18.0, babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+ dependencies:
+ babel-core "^6.24.1"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
+babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-traverse@^6.18.0, babel-traverse@^6.21.0, babel-traverse@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babylon@^6.11.0, babylon@^6.13.0, babylon@^6.14.1, babylon@^6.15.0:
+ version "6.17.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932"
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-js@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
+
+base64-js@^1.0.2, base64-js@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64-url@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78"
+
+basic-auth-connect@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
+
+basic-auth@~1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290"
+
+batch@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+beeper@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
+big.js@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird@^2.10.2:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
+
+bluebird@^3.4.6, bluebird@^3.4.7:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@~1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97"
+ dependencies:
+ bytes "2.1.0"
+ content-type "~1.0.1"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ http-errors "~1.3.1"
+ iconv-lite "0.4.11"
+ on-finished "~2.3.0"
+ qs "4.0.0"
+ raw-body "~2.1.2"
+ type-is "~1.6.6"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+bowser@^1.6.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.6.1.tgz#9157e9498f456e937173a2918f3b2161e5353eb3"
+
+bplist-creator@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.4.tgz#4ac0496782e127a85c1d2026a4f5eb22a7aff991"
+ dependencies:
+ stream-buffers "~0.2.3"
+
+bplist-parser@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.0.6.tgz#38da3471817df9d44ab3892e27707bbbd75a11b9"
+
+brace-expansion@^1.0.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-resolve@^1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+ dependencies:
+ buffer-xor "^1.0.2"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ dependencies:
+ pako "~0.2.0"
+
+bser@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
+ dependencies:
+ node-int64 "^0.4.0"
+
+bser@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.3.tgz#d63da19ee17330a0e260d2a34422b21a89520317"
+ dependencies:
+ node-int64 "^0.4.0"
+
+bser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-shims@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-xor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4"
+
+bytes@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
+
+bytes@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chokidar@^1.4.3, chokidar@^1.6.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+ci-info@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+ dependencies:
+ inherits "^2.0.1"
+
+clean-css@4.0.x:
+ version "4.0.12"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.12.tgz#a02e61707f1840bd3338f54dbc9acbda4e772fa3"
+ dependencies:
+ source-map "0.5.x"
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+clone-stats@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone@^1.0.0, clone@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.0.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+ dependencies:
+ color-name "^1.1.1"
+
+color-name@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+colors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.9.x, commander@^2.8.1, commander@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+compressible@~2.0.5, compressible@~2.0.8:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd"
+ dependencies:
+ mime-db ">= 1.27.0 < 2"
+
+compression-webpack-plugin@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.4.0.tgz#811de04215f811ea6a12d4d8aed8457d758f13ac"
+ dependencies:
+ async "0.2.x"
+ webpack-sources "^0.1.0"
+ optionalDependencies:
+ node-zopfli "^2.0.0"
+
+compression@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3"
+ dependencies:
+ accepts "~1.3.3"
+ bytes "2.3.0"
+ compressible "~2.0.8"
+ debug "~2.2.0"
+ on-headers "~1.0.1"
+ vary "~1.1.0"
+
+compression@~1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395"
+ dependencies:
+ accepts "~1.2.12"
+ bytes "2.1.0"
+ compressible "~2.0.5"
+ debug "~2.2.0"
+ on-headers "~1.0.0"
+ vary "~1.0.1"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+connect-history-api-fallback@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
+
+connect-timeout@~1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e"
+ dependencies:
+ debug "~2.2.0"
+ http-errors "~1.3.1"
+ ms "0.7.1"
+ on-headers "~1.0.0"
+
+connect@^2.8.3:
+ version "2.30.2"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609"
+ dependencies:
+ basic-auth-connect "1.0.0"
+ body-parser "~1.13.3"
+ bytes "2.1.0"
+ compression "~1.5.2"
+ connect-timeout "~1.6.2"
+ content-type "~1.0.1"
+ cookie "0.1.3"
+ cookie-parser "~1.3.5"
+ cookie-signature "1.0.6"
+ csurf "~1.8.3"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ errorhandler "~1.4.2"
+ express-session "~1.11.3"
+ finalhandler "0.4.0"
+ fresh "0.3.0"
+ http-errors "~1.3.1"
+ method-override "~2.3.5"
+ morgan "~1.6.1"
+ multiparty "3.3.2"
+ on-headers "~1.0.0"
+ parseurl "~1.3.0"
+ pause "0.1.0"
+ qs "4.0.0"
+ response-time "~2.3.1"
+ serve-favicon "~2.3.0"
+ serve-index "~1.7.2"
+ serve-static "~1.10.0"
+ type-is "~1.6.6"
+ utils-merge "1.0.0"
+ vhost "~3.0.1"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type-parser@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94"
+
+content-type@~1.0.1, content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.1.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-parser@~1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+copy-webpack-plugin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200"
+ dependencies:
+ bluebird "^2.10.2"
+ fs-extra "^0.26.4"
+ glob "^6.0.4"
+ is-glob "^3.1.0"
+ loader-utils "^0.2.15"
+ lodash "^4.3.0"
+ minimatch "^3.0.0"
+ node-dir "^0.1.10"
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.2.2, core-js@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+corser@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
+
+crc@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba"
+
+create-ecdh@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ ripemd160 "^1.0.0"
+ sha.js "^2.3.6"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170"
+ dependencies:
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+
+create-react-class@^15.5.2:
+ version "15.5.2"
+ resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.5.2.tgz#6a8758348df660b88326a0e764d569f274aad681"
+ dependencies:
+ fbjs "^0.8.9"
+ object-assign "^4.1.1"
+
+cross-env@^3.1.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.2.4.tgz#9e0585f277864ed421ce756f81a980ff0d698aba"
+ dependencies:
+ cross-spawn "^5.1.0"
+ is-windows "^1.0.0"
+
+cross-spawn@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-browserify@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+
+csrf@~3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.6.tgz#b61120ddceeafc91e76ed5313bb5c0b2667b710a"
+ dependencies:
+ rndm "1.2.0"
+ tsscmp "1.0.5"
+ uid-safe "2.1.4"
+
+css-in-js-utils@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-1.0.3.tgz#9ac7e02f763cf85d94017666565ed68a5b5f3215"
+ dependencies:
+ hyphenate-style-name "^1.0.2"
+
+css-select@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-what@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ dependencies:
+ cssom "0.3.x"
+
+csurf@~1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+ csrf "~3.0.0"
+ http-errors "~1.3.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+dateformat@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
+
+debounce@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.0.2.tgz#503cc674d8d7f737099664fb75ddbd36b9626dc6"
+
+debug@2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.3:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.4, debug@^2.1.1, debug@^2.2.0:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
+ dependencies:
+ ms "0.7.3"
+
+debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-assign@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572"
+ dependencies:
+ is-obj "^1.0.0"
+
+deep-extend@^0.4.0, deep-extend@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+defaults@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ dependencies:
+ clone "^1.0.2"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+denodeify@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+
+depd@1.1.0, depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+depd@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+diff@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+
+diffie-hellman@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-converter@~0.1:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+ dependencies:
+ utila "~0.3"
+
+dom-serializer@0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+dom-walk@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+
+domain-browser@^1.1.1:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+duplexer2@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ dependencies:
+ readable-stream "~1.1.9"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+ecstatic@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.1.0.tgz#477a4a6b25cecb112f697dbd2c7fa354154ea6be"
+ dependencies:
+ he "^0.5.0"
+ mime "^1.2.11"
+ minimist "^1.1.0"
+ url-join "^1.0.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@^2.3.4:
+ version "2.5.6"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+encoding@^0.1.11:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ dependencies:
+ iconv-lite "~0.4.13"
+
+enhanced-resolve@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.5"
+
+entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+"errno@>=0.1.1 <0.2.0-0", errno@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+ dependencies:
+ prr "~0.0.0"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+errorhandler@~1.4.2:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f"
+ dependencies:
+ accepts "~1.3.0"
+ escape-html "~1.0.3"
+
+escape-html@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.6.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+ dependencies:
+ esprima "^2.7.1"
+ estraverse "^1.9.1"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.2.0"
+
+esprima@^2.7.1:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+estraverse@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
+esutils@^2.0.0, esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
+
+etag@~1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+event-target-shim@^1.0.5:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491"
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+eventsource@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+ dependencies:
+ original ">=0.0.5"
+
+evp_bytestokey@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+ dependencies:
+ create-hash "^1.1.1"
+
+exec-sh@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10"
+ dependencies:
+ merge "^1.1.3"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+express-session@~1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+ crc "3.3.0"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ on-headers "~1.0.0"
+ parseurl "~1.3.0"
+ uid-safe "~2.0.0"
+ utils-merge "1.0.0"
+
+express@^4.13.3:
+ version "4.15.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35"
+ dependencies:
+ accepts "~1.3.3"
+ array-flatten "1.1.1"
+ content-disposition "0.5.2"
+ content-type "~1.0.2"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "2.6.1"
+ depd "~1.1.0"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ finalhandler "~1.0.0"
+ fresh "0.5.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ path-to-regexp "0.1.7"
+ proxy-addr "~1.1.3"
+ qs "6.4.0"
+ range-parser "~1.2.0"
+ send "0.15.1"
+ serve-static "1.12.1"
+ setprototypeof "1.0.3"
+ statuses "~1.3.1"
+ type-is "~1.6.14"
+ utils-merge "1.0.0"
+ vary "~1.1.0"
+
+extend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extsprintf@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fancy-log@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
+ dependencies:
+ chalk "^1.1.1"
+ time-stamp "^1.0.0"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+faye-websocket@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fb-watchman@^1.8.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
+ dependencies:
+ bser "1.0.2"
+
+fb-watchman@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+ dependencies:
+ bser "^2.0.0"
+
+fbjs-scripts@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-0.7.1.tgz#4f115e218e243e3addbf0eddaac1e3c62f703fac"
+ dependencies:
+ babel-core "^6.7.2"
+ babel-preset-fbjs "^1.0.0"
+ core-js "^1.0.0"
+ cross-spawn "^3.0.1"
+ gulp-util "^3.0.4"
+ object-assign "^4.0.1"
+ semver "^5.1.0"
+ through2 "^2.0.0"
+
+fbjs@^0.8.8, fbjs@^0.8.9, fbjs@~0.8.9:
+ version "0.8.12"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.9"
+
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+filename-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+finalhandler@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b"
+ dependencies:
+ debug "~2.2.0"
+ escape-html "1.0.2"
+ on-finished "~2.3.0"
+ unpipe "~1.0.0"
+
+finalhandler@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.2.tgz#d0e36f9dbc557f2de14423df6261889e9d60c93a"
+ dependencies:
+ debug "2.6.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+ dependencies:
+ commondir "^1.0.1"
+ mkdirp "^0.5.1"
+ pkg-dir "^1.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@^2.1.1, form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+forwarded@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+fresh@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
+
+fresh@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
+fs-extra@^0.26.2, fs-extra@^0.26.4:
+ version "0.26.7"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+gauge@~1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93"
+ dependencies:
+ ansi "^0.3.0"
+ has-unicode "^2.0.0"
+ lodash.pad "^4.1.0"
+ lodash.padend "^4.1.0"
+ lodash.padstart "^4.1.0"
+
+gauge@~2.7.1:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+getpass@^0.1.1:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@^5.0.15:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.5:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+ dependencies:
+ min-document "^2.19.0"
+ process "~0.5.1"
+
+globals@^9.0.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+
+glogg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
+ dependencies:
+ sparkles "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+gulp-util@^3.0.4:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+ dependencies:
+ array-differ "^1.0.0"
+ array-uniq "^1.0.2"
+ beeper "^1.0.0"
+ chalk "^1.0.0"
+ dateformat "^2.0.0"
+ fancy-log "^1.1.0"
+ gulplog "^1.0.0"
+ has-gulplog "^0.1.0"
+ lodash._reescape "^3.0.0"
+ lodash._reevaluate "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.template "^3.0.0"
+ minimist "^1.1.0"
+ multipipe "^0.1.2"
+ object-assign "^3.0.0"
+ replace-ext "0.0.1"
+ through2 "^2.0.0"
+ vinyl "^0.5.0"
+
+gulplog@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+ dependencies:
+ glogg "^1.0.0"
+
+handle-thing@^1.2.4:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+handlebars@^4.0.3:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-gulplog@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+ dependencies:
+ sparkles "^1.0.0"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+ dependencies:
+ inherits "^2.0.1"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+he@1.1.x:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+he@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-encoding-sniffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da"
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+html-entities@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@^3.2.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.4.3.tgz#eb3a7297c804611f470454eeebe0aacc427e424a"
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.0.x"
+ commander "2.9.x"
+ he "1.1.x"
+ ncname "1.0.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "~2.8.22"
+
+html-webpack-plugin@^2.28.0:
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009"
+ dependencies:
+ bluebird "^3.4.7"
+ html-minifier "^3.2.3"
+ loader-utils "^0.2.16"
+ lodash "^4.17.3"
+ pretty-error "^2.0.2"
+ toposort "^1.0.0"
+
+htmlparser2@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+ dependencies:
+ domelementtype "1"
+ domhandler "2.1"
+ domutils "1.1"
+ readable-stream "1.0"
+
+http-deceiver@^1.2.4:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
+ dependencies:
+ inherits "~2.0.1"
+ statuses "1"
+
+http-errors@~1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
+ dependencies:
+ inherits "2.0.3"
+ setprototypeof "1.0.2"
+ statuses ">= 1.3.1 < 2"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy-middleware@~0.17.4:
+ version "0.17.4"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+ dependencies:
+ http-proxy "^1.16.2"
+ is-glob "^3.1.0"
+ lodash "^4.17.2"
+ micromatch "^2.3.11"
+
+http-proxy@^1.16.2, http-proxy@^1.8.1:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-serve@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/http-serve/-/http-serve-1.0.1.tgz#bb824bf8fed2092e9195837b0bf7b3b6fa3ca2f8"
+ dependencies:
+ colors "1.0.3"
+ corser "~2.0.0"
+ ecstatic "^2.0.0"
+ http-proxy "^1.8.1"
+ opener "~1.4.0"
+ optimist "0.6.x"
+ portfinder "0.4.x"
+ union "~0.4.3"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+hyphenate-style-name@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
+
+iconv-lite@0.4.11:
+ version "0.4.11"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade"
+
+iconv-lite@0.4.13:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+
+iconv-lite@~0.4.13:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.16.tgz#65de3beeb39e2960d67f049f1634ffcbcde9014b"
+
+ieee754@^1.1.4:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+image-size@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.3.5.tgz#83240eab2fb5b00b04aab8c74b0471e9cba7ad8c"
+
+immutable@~3.7.6:
+ version "3.7.6"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inline-style-prefixer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.2.tgz#989865e0c5de7a946acbea71e16e02741efe0dd7"
+ dependencies:
+ bowser "^1.6.0"
+ css-in-js-utils "^1.0.3"
+
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+interpret@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+invariant@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ipaddr.js@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.0.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-ci@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
+ dependencies:
+ ci-info "^1.0.0"
+
+is-dotfile@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.0.tgz#c61d61020c3ebe99261b781bd3d1622395f547f8"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isemail@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.0-alpha.1:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae"
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.0.2"
+ istanbul-lib-hook "^1.0.5"
+ istanbul-lib-instrument "^1.7.0"
+ istanbul-lib-report "^1.0.0"
+ istanbul-lib-source-maps "^1.1.1"
+ istanbul-reports "^1.0.2"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1"
+
+istanbul-lib-hook@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.6.2, istanbul-lib-instrument@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.13.0"
+ istanbul-lib-coverage "^1.0.2"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb"
+ dependencies:
+ istanbul-lib-coverage "^1.0.2"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c"
+ dependencies:
+ istanbul-lib-coverage "^1.0.2"
+ mkdirp "^0.5.1"
+ rimraf "^2.4.4"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa"
+ dependencies:
+ handlebars "^4.0.3"
+
+jest-changed-files@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.2.tgz#16c54c84c3270be408e06d2e8af3f3e37a885824"
+
+jest-cli@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.2.tgz#cc3620b62acac5f2d93a548cb6ef697d4ec85443"
+ dependencies:
+ ansi-escapes "^1.4.0"
+ callsites "^2.0.0"
+ chalk "^1.1.1"
+ graceful-fs "^4.1.6"
+ is-ci "^1.0.9"
+ istanbul-api "^1.1.0-alpha.1"
+ istanbul-lib-coverage "^1.0.0"
+ istanbul-lib-instrument "^1.1.1"
+ jest-changed-files "^19.0.2"
+ jest-config "^19.0.2"
+ jest-environment-jsdom "^19.0.2"
+ jest-haste-map "^19.0.0"
+ jest-jasmine2 "^19.0.2"
+ jest-message-util "^19.0.0"
+ jest-regex-util "^19.0.0"
+ jest-resolve-dependencies "^19.0.0"
+ jest-runtime "^19.0.2"
+ jest-snapshot "^19.0.2"
+ jest-util "^19.0.2"
+ micromatch "^2.3.11"
+ node-notifier "^5.0.1"
+ slash "^1.0.0"
+ string-length "^1.0.1"
+ throat "^3.0.0"
+ which "^1.1.1"
+ worker-farm "^1.3.1"
+ yargs "^6.3.0"
+
+jest-config@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.2.tgz#1b9bd2db0ddd16df61c2b10a54009e1768da6411"
+ dependencies:
+ chalk "^1.1.1"
+ jest-environment-jsdom "^19.0.2"
+ jest-environment-node "^19.0.2"
+ jest-jasmine2 "^19.0.2"
+ jest-regex-util "^19.0.0"
+ jest-resolve "^19.0.2"
+ jest-validate "^19.0.2"
+ pretty-format "^19.0.0"
+
+jest-diff@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c"
+ dependencies:
+ chalk "^1.1.3"
+ diff "^3.0.0"
+ jest-matcher-utils "^19.0.0"
+ pretty-format "^19.0.0"
+
+jest-environment-jsdom@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.2.tgz#ceda859c4a4b94ab35e4de7dab54b926f293e4a3"
+ dependencies:
+ jest-mock "^19.0.0"
+ jest-util "^19.0.2"
+ jsdom "^9.11.0"
+
+jest-environment-node@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.2.tgz#6e84079db87ed21d0c05e1f9669f207b116fe99b"
+ dependencies:
+ jest-mock "^19.0.0"
+ jest-util "^19.0.2"
+
+jest-file-exists@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8"
+
+jest-haste-map@19.0.0, jest-haste-map@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.0.tgz#adde00b62b1fe04432a104b3254fc5004514b55e"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.6"
+ micromatch "^2.3.11"
+ sane "~1.5.0"
+ worker-farm "^1.3.1"
+
+jest-jasmine2@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.2.tgz#167991ac825981fb1a800af126e83afcca832c73"
+ dependencies:
+ graceful-fs "^4.1.6"
+ jest-matcher-utils "^19.0.0"
+ jest-matchers "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-snapshot "^19.0.2"
+
+jest-matcher-utils@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d"
+ dependencies:
+ chalk "^1.1.3"
+ pretty-format "^19.0.0"
+
+jest-matchers@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754"
+ dependencies:
+ jest-diff "^19.0.0"
+ jest-matcher-utils "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-regex-util "^19.0.0"
+
+jest-message-util@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416"
+ dependencies:
+ chalk "^1.1.1"
+ micromatch "^2.3.11"
+
+jest-mock@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01"
+
+jest-regex-util@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691"
+
+jest-resolve-dependencies@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee"
+ dependencies:
+ jest-file-exists "^19.0.0"
+
+jest-resolve@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.2.tgz#5793575de4f07aec32f7d7ff0c6c181963eefb3c"
+ dependencies:
+ browser-resolve "^1.11.2"
+ jest-haste-map "^19.0.0"
+ resolve "^1.2.0"
+
+jest-runtime@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.2.tgz#d9a43e72de416d27d196fd9c7940d98fe6685407"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^19.0.0"
+ babel-plugin-istanbul "^4.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.6"
+ jest-config "^19.0.2"
+ jest-file-exists "^19.0.0"
+ jest-haste-map "^19.0.0"
+ jest-regex-util "^19.0.0"
+ jest-resolve "^19.0.2"
+ jest-util "^19.0.2"
+ json-stable-stringify "^1.0.1"
+ micromatch "^2.3.11"
+ strip-bom "3.0.0"
+ yargs "^6.3.0"
+
+jest-snapshot@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.2.tgz#9c1b216214f7187c38bfd5c70b1efab16b0ff50b"
+ dependencies:
+ chalk "^1.1.3"
+ jest-diff "^19.0.0"
+ jest-file-exists "^19.0.0"
+ jest-matcher-utils "^19.0.0"
+ jest-util "^19.0.2"
+ natural-compare "^1.4.0"
+ pretty-format "^19.0.0"
+
+jest-util@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.2.tgz#e0a0232a2ab9e6b2b53668bdb3534c2b5977ed41"
+ dependencies:
+ chalk "^1.1.1"
+ graceful-fs "^4.1.6"
+ jest-file-exists "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-mock "^19.0.0"
+ jest-validate "^19.0.2"
+ leven "^2.0.0"
+ mkdirp "^0.5.1"
+
+jest-validate@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.2.tgz#dc534df5f1278d5b63df32b14241d4dbf7244c0c"
+ dependencies:
+ chalk "^1.1.1"
+ jest-matcher-utils "^19.0.0"
+ leven "^2.0.0"
+ pretty-format "^19.0.0"
+
+jest@19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.2.tgz#b794faaf8ff461e7388f28beef559a54f20b2c10"
+ dependencies:
+ jest-cli "^19.0.2"
+
+jodid25519@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
+ dependencies:
+ jsbn "~0.1.0"
+
+joi@^6.6.1:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06"
+ dependencies:
+ hoek "2.x.x"
+ isemail "1.x.x"
+ moment "2.x.x"
+ topo "1.x.x"
+
+js-tokens@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+
+js-yaml@^3.7.0:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^3.1.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^9.11.0:
+ version "9.12.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+ dependencies:
+ abab "^1.0.3"
+ acorn "^4.0.4"
+ acorn-globals "^3.1.0"
+ array-equal "^1.0.0"
+ content-type-parser "^1.0.1"
+ cssom ">= 0.3.2 < 0.4.0"
+ cssstyle ">= 0.2.37 < 0.3.0"
+ escodegen "^1.6.1"
+ html-encoding-sniffer "^1.0.1"
+ nwmatcher ">= 1.3.9 < 2.0.0"
+ parse5 "^1.5.1"
+ request "^2.79.0"
+ sax "^1.2.1"
+ symbol-tree "^3.2.1"
+ tough-cookie "^2.3.2"
+ webidl-conversions "^4.0.0"
+ whatwg-encoding "^1.0.1"
+ whatwg-url "^4.3.0"
+ xml-name-validator "^2.0.1"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+kind-of@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
+ dependencies:
+ is-buffer "^1.0.2"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+left-pad@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.1.3.tgz#612f61c033f3a9e08e939f1caebeea41b6f3199a"
+
+leven@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@0.2.x, loader-utils@^0.2.15, loader-utils@^0.2.16:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basetostring@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.escape@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+ dependencies:
+ lodash._root "^3.0.0"
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.pad@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70"
+
+lodash.padend@^4.1.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e"
+
+lodash.padstart@^4.1.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b"
+
+lodash.restparam@^3.0.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.template@^3.0.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash._basetostring "^3.0.0"
+ lodash._basevalues "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+ lodash.keys "^3.0.0"
+ lodash.restparam "^3.0.0"
+ lodash.templatesettings "^3.0.0"
+
+lodash.templatesettings@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+
+lodash@^3.5.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.0.0"
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+
+lru-cache@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e"
+ dependencies:
+ pseudomap "^1.0.1"
+ yallist "^2.0.0"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ dependencies:
+ tmpl "1.0.x"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge@^1.1.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+method-override@~2.3.5:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.8.tgz#178234bf4bab869f89df9444b06fc6147b44828c"
+ dependencies:
+ debug "2.6.3"
+ methods "~1.1.2"
+ parseurl "~1.3.1"
+ vary "~1.1.0"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-db@~1.23.0:
+ version "1.23.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659"
+
+mime-types@2.1.11:
+ version "2.1.11"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
+ dependencies:
+ mime-db "~1.23.0"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9:
+ version "2.1.15"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+ dependencies:
+ mime-db "~1.27.0"
+
+mime@1.3.4, mime@1.3.x, mime@^1.2.11, mime@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimist@0.0.8, minimist@~0.0.1:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+moment@2.x.x:
+ version "2.18.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
+
+morgan@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2"
+ dependencies:
+ basic-auth "~1.0.3"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ on-finished "~2.3.0"
+ on-headers "~1.0.0"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
+ms@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
+
+multiparty@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f"
+ dependencies:
+ readable-stream "~1.1.9"
+ stream-counter "~0.2.0"
+
+multipipe@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+ dependencies:
+ duplexer2 "0.0.2"
+
+mute-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
+nan@^2.0.0, nan@^2.3.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+ncname@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c"
+ dependencies:
+ xml-char-classes "^1.0.0"
+
+negotiator@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+no-case@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081"
+ dependencies:
+ lower-case "^1.1.1"
+
+node-dir@^0.1.10:
+ version "0.1.16"
+ resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.16.tgz#d2ef583aa50b90d93db8cdd26fcea58353957fe4"
+ dependencies:
+ minimatch "^3.0.2"
+
+node-fetch@^1.0.1, node-fetch@^1.3.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-libs-browser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.1.4"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "0.0.1"
+ os-browserify "^0.2.0"
+ path-browserify "0.0.0"
+ process "^0.11.0"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.0.5"
+ stream-browserify "^2.0.1"
+ stream-http "^2.3.1"
+ string_decoder "^0.10.25"
+ timers-browserify "^2.0.2"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-notifier@^5.0.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
+ dependencies:
+ growly "^1.3.0"
+ semver "^5.3.0"
+ shellwords "^0.1.0"
+ which "^1.2.12"
+
+node-pre-gyp@^0.6.29, node-pre-gyp@^0.6.4:
+ version "0.6.34"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
+ dependencies:
+ mkdirp "^0.5.1"
+ nopt "^4.0.1"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ request "^2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^2.2.1"
+ tar-pack "^3.4.0"
+
+node-uuid@1.4.7:
+ version "1.4.7"
+ resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
+
+node-zopfli@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-zopfli/-/node-zopfli-2.0.2.tgz#a7a473ae92aaea85d4c68d45bbf2c944c46116b8"
+ dependencies:
+ commander "^2.8.1"
+ defaults "^1.0.2"
+ nan "^2.0.0"
+ node-pre-gyp "^0.6.4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-css-color@^1.0.1, normalize-css-color@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/normalize-css-color/-/normalize-css-color-1.0.2.tgz#02991e97cccec6623fe573afbbf0de6a1f3e9f8d"
+
+normalize-package-data@^2.3.2:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npmlog@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
+ dependencies:
+ ansi "~0.3.1"
+ are-we-there-yet "~1.1.2"
+ gauge "~1.2.5"
+
+npmlog@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.1"
+ set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+ dependencies:
+ boolbase "~1.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+"nwmatcher@>= 1.3.9 < 2.0.0":
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a"
+
+oauth-sign@~0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+obuf@^1.0.0, obuf@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
+
+offline-plugin@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/offline-plugin/-/offline-plugin-4.7.0.tgz#4c2fca6cd46c6dd7f29fc94ade21e5f82a62c4df"
+ dependencies:
+ deep-extend "^0.4.0"
+ ejs "^2.3.4"
+ loader-utils "0.2.x"
+ minimatch "^3.0.3"
+ slash "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.0, on-headers@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@^1.3.0, once@^1.3.3, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+opener@~1.4.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+
+opn@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+opn@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a"
+ dependencies:
+ object-assign "^4.0.1"
+
+optimist@0.6.x, optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+original@>=0.0.5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
+ dependencies:
+ url-parse "1.0.x"
+
+os-browserify@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+param-case@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ dependencies:
+ no-case "^2.2.0"
+
+parse-asn1@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parse5@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+
+parseurl@~1.3.0, parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pause@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74"
+
+pbkdf2@^3.0.3:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693"
+ dependencies:
+ create-hmac "^1.1.2"
+
+pegjs@0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.9.0.tgz#f6aefa2e3ce56169208e52179dfe41f89141a369"
+
+performance-now@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+ dependencies:
+ find-up "^1.0.0"
+
+plist@1.2.0, plist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593"
+ dependencies:
+ base64-js "0.0.8"
+ util-deprecate "1.0.2"
+ xmlbuilder "4.0.0"
+ xmldom "0.1.x"
+
+portfinder@0.4.x:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-0.4.0.tgz#a3ffadffafe4fb98e0601a85eda27c27ce84ca1e"
+ dependencies:
+ async "0.9.0"
+ mkdirp "0.5.x"
+
+portfinder@^1.0.9:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
+ dependencies:
+ async "^1.5.2"
+ debug "^2.2.0"
+ mkdirp "0.5.x"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-error@^2.0.2:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.0.tgz#87f4e9d706a24c87d6cbee9fabec001fcf8c75d8"
+ dependencies:
+ renderkid "^2.0.1"
+ utila "~0.4"
+
+pretty-format@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84"
+ dependencies:
+ ansi-styles "^3.0.0"
+
+private@^0.1.6:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.0:
+ version "0.11.9"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1"
+
+process@~0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+
+promise@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.8, prop-types@~15.5.7:
+ version "15.5.8"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394"
+ dependencies:
+ fbjs "^0.8.9"
+
+proxy-addr@~1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3"
+ dependencies:
+ forwarded "~0.1.0"
+ ipaddr.js "1.3.0"
+
+prr@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+qs@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607"
+
+qs@6.4.0, qs@~6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+querystringify@0.0.x:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
+
+random-bytes@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec"
+
+range-parser@^1.0.3, range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+range-parser@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175"
+
+raw-body@~2.1.2:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.13"
+ unpipe "1.0.0"
+
+rc@^1.1.7:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-clone-referenced-element@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682"
+
+react-deep-force-update@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7"
+
+react-devtools-core@^2.0.8:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-2.0.12.tgz#853830e871fc95dede1e49ad265beac8863a8923"
+ dependencies:
+ cross-env "^3.1.4"
+ ws "^2.0.3"
+
+react-dom@^15.4.2:
+ version "15.5.4"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+ prop-types "~15.5.7"
+
+react-hot-api@^0.4.5:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/react-hot-api/-/react-hot-api-0.4.7.tgz#a7e22a56d252e11abd9366b61264cf4492c58171"
+
+react-hot-loader@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-1.3.1.tgz#c95647ae78b73dfceff6ec71ffcb04182ff6daf9"
+ dependencies:
+ react-hot-api "^0.4.5"
+ source-map "^0.4.4"
+
+react-native-web@^0.0.88:
+ version "0.0.88"
+ resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.0.88.tgz#fee24ec44e4170f93babc94b4b26473323abb0c4"
+ dependencies:
+ animated "^0.2.0"
+ array-find-index "^1.0.2"
+ babel-runtime "^6.23.0"
+ create-react-class "^15.5.2"
+ debounce "^1.0.0"
+ deep-assign "^2.0.0"
+ fbjs "^0.8.8"
+ hyphenate-style-name "^1.0.2"
+ inline-style-prefixer "^3.0.2"
+ normalize-css-color "^1.0.2"
+ prop-types "^15.5.8"
+ react-timer-mixin "^0.13.3"
+
+react-native@0.43.4:
+ version "0.43.4"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.43.4.tgz#92fb6937ab415b2e5612835a93a61845de98eb4d"
+ dependencies:
+ absolute-path "^0.0.0"
+ art "^0.10.0"
+ async "^2.0.1"
+ babel-core "^6.21.0"
+ babel-generator "^6.21.0"
+ babel-plugin-external-helpers "^6.18.0"
+ babel-plugin-syntax-trailing-function-commas "^6.20.0"
+ babel-plugin-transform-async-to-generator "6.16.0"
+ babel-plugin-transform-flow-strip-types "^6.21.0"
+ babel-plugin-transform-object-rest-spread "^6.20.2"
+ babel-polyfill "^6.20.0"
+ babel-preset-es2015-node "^6.1.1"
+ babel-preset-fbjs "^2.1.0"
+ babel-preset-react-native "^1.9.1"
+ babel-register "^6.18.0"
+ babel-runtime "^6.20.0"
+ babel-traverse "^6.21.0"
+ babel-types "^6.21.0"
+ babylon "^6.14.1"
+ base64-js "^1.1.2"
+ bser "^1.0.2"
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ concat-stream "^1.6.0"
+ connect "^2.8.3"
+ core-js "^2.2.2"
+ debug "^2.2.0"
+ denodeify "^1.2.1"
+ event-target-shim "^1.0.5"
+ fbjs "~0.8.9"
+ fbjs-scripts "^0.7.0"
+ form-data "^2.1.1"
+ fs-extra "^0.26.2"
+ glob "^5.0.15"
+ graceful-fs "^4.1.3"
+ image-size "^0.3.5"
+ immutable "~3.7.6"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ jest-haste-map "19.0.0"
+ joi "^6.6.1"
+ json-stable-stringify "^1.0.1"
+ json5 "^0.4.0"
+ left-pad "^1.1.3"
+ lodash "^4.16.6"
+ mime "^1.3.4"
+ mime-types "2.1.11"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ node-fetch "^1.3.3"
+ npmlog "^2.0.4"
+ opn "^3.0.2"
+ optimist "^0.6.1"
+ plist "^1.2.0"
+ promise "^7.1.1"
+ react-clone-referenced-element "^1.0.1"
+ react-devtools-core "^2.0.8"
+ react-timer-mixin "^0.13.2"
+ react-transform-hmr "^1.0.4"
+ rebound "^0.0.13"
+ regenerator-runtime "^0.9.5"
+ request "^2.79.0"
+ rimraf "^2.5.4"
+ sane "~1.4.1"
+ semver "^5.0.3"
+ shell-quote "1.6.1"
+ source-map "^0.5.6"
+ stacktrace-parser "^0.1.3"
+ temp "0.8.3"
+ throat "^3.0.0"
+ uglify-js "^2.6.2"
+ whatwg-fetch "^1.0.0"
+ wordwrap "^1.0.0"
+ worker-farm "^1.3.1"
+ write-file-atomic "^1.2.0"
+ ws "^1.1.0"
+ xcode "^0.8.9"
+ xmldoc "^0.4.0"
+ xpipe "^1.0.5"
+ yargs "^6.4.0"
+
+react-proxy@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a"
+ dependencies:
+ lodash "^4.6.1"
+ react-deep-force-update "^1.0.0"
+
+react-test-renderer@16.0.0-alpha.6:
+ version "16.0.0-alpha.6"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.0.0-alpha.6.tgz#c032def0dc8319cee39caa4e4373a60019cb3786"
+ dependencies:
+ fbjs "^0.8.9"
+ object-assign "^4.1.0"
+
+react-timer-mixin@^0.13.2, react-timer-mixin@^0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.3.tgz#0da8b9f807ec07dc3e854d082c737c65605b3d22"
+
+react-transform-hmr@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb"
+ dependencies:
+ global "^4.3.0"
+ react-proxy "^1.1.7"
+
+react@16.0.0-alpha.6:
+ version "16.0.0-alpha.6"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.0.0-alpha.6.tgz#2ccb1afb4425ccc12f78a123a666f2e4c141adb9"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@1.0:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
+ dependencies:
+ buffer-shims "~1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.1.8, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+rebound@^0.0.13:
+ version "0.0.13"
+ resolved "https://registry.yarnpkg.com/rebound/-/rebound-0.0.13.tgz#4a225254caf7da756797b19c5817bf7a7941fac1"
+
+regenerate@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
+
+regenerator-runtime@^0.9.5:
+ version "0.9.6"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029"
+
+regenerator-transform@0.9.11:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@0.2.x:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+
+remove-trailing-separator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4"
+
+renderkid@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319"
+ dependencies:
+ css-select "^1.1.0"
+ dom-converter "~0.1"
+ htmlparser2 "~3.3.0"
+ strip-ansi "^3.0.0"
+ utila "~0.3"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+request@^2.79.0, request@^2.81.0:
+ version "2.81.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~4.2.1"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ performance-now "^0.2.0"
+ qs "~6.4.0"
+ safe-buffer "^5.0.1"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+requires-port@1.0.x, requires-port@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve@1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.2.0:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+ dependencies:
+ path-parse "^1.0.5"
+
+response-time@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a"
+ dependencies:
+ depd "~1.1.0"
+ on-headers "~1.0.1"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.6:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e"
+
+rndm@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c"
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ dependencies:
+ once "^1.3.0"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
+safe-buffer@^5.0.1, safe-buffer@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+sane@~1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715"
+ dependencies:
+ exec-sh "^0.2.0"
+ fb-watchman "^1.8.0"
+ minimatch "^3.0.2"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.10.0"
+
+sane@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3"
+ dependencies:
+ anymatch "^1.3.0"
+ exec-sh "^0.2.0"
+ fb-watchman "^1.8.0"
+ minimatch "^3.0.2"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.10.0"
+
+sax@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
+
+sax@~1.1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+
+"semver@2 || 3 || 4 || 5", semver@5.x, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+send@0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
+ dependencies:
+ debug "~2.2.0"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ escape-html "~1.0.3"
+ etag "~1.7.0"
+ fresh "0.3.0"
+ http-errors "~1.3.1"
+ mime "1.3.4"
+ ms "0.7.1"
+ on-finished "~2.3.0"
+ range-parser "~1.0.3"
+ statuses "~1.2.1"
+
+send@0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f"
+ dependencies:
+ debug "2.6.1"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ fresh "0.5.0"
+ http-errors "~1.6.1"
+ mime "1.3.4"
+ ms "0.7.2"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.3.1"
+
+serve-favicon@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f"
+ dependencies:
+ etag "~1.7.0"
+ fresh "0.3.0"
+ ms "0.7.2"
+ parseurl "~1.3.1"
+
+serve-index@^1.7.2:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b"
+ dependencies:
+ accepts "~1.3.3"
+ batch "0.5.3"
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ http-errors "~1.5.0"
+ mime-types "~2.1.11"
+ parseurl "~1.3.1"
+
+serve-index@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2"
+ dependencies:
+ accepts "~1.2.13"
+ batch "0.5.3"
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ http-errors "~1.3.1"
+ mime-types "~2.1.9"
+ parseurl "~1.3.1"
+
+serve-static@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039"
+ dependencies:
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.15.1"
+
+serve-static@~1.10.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535"
+ dependencies:
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.13.2"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08"
+
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.3.6:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f"
+ dependencies:
+ inherits "^2.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shellwords@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+simple-plist@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.1.4.tgz#10eb51b47e33c556eb8ec46d5ee64d64e717db5d"
+ dependencies:
+ bplist-creator "0.0.4"
+ bplist-parser "0.0.6"
+ plist "1.2.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slide@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+sntp@1.x.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
+sockjs-client@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.2.tgz#f0212a8550e4c9468c8cceaeefd2e3493c033ad5"
+ dependencies:
+ debug "^2.2.0"
+ eventsource "0.1.6"
+ faye-websocket "~0.11.0"
+ inherits "^2.0.1"
+ json3 "^3.3.2"
+ url-parse "^1.1.1"
+
+sockjs@0.3.18:
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207"
+ dependencies:
+ faye-websocket "^0.10.0"
+ uuid "^2.0.2"
+
+source-list-map@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.1.tgz#1a33ac210ca144d1e561f906ebccab5669ff4cb4"
+
+source-list-map@~0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
+source-map-support@^0.4.2:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+source-map@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+ dependencies:
+ amdefine ">=0.0.4"
+
+sparkles@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+spdy-transport@^2.0.15:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.18.tgz#43fc9c56be2cccc12bb3e2754aa971154e836ea6"
+ dependencies:
+ debug "^2.2.0"
+ hpack.js "^2.1.6"
+ obuf "^1.1.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.4.0"
+
+spdy@^3.4.1:
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.4.tgz#e0406407ca90ff01b553eb013505442649f5a819"
+ dependencies:
+ debug "^2.2.0"
+ handle-thing "^1.2.4"
+ http-deceiver "^1.2.4"
+ select-hose "^2.0.0"
+ spdy-transport "^2.0.15"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jodid25519 "^1.0.0"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stacktrace-parser@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e"
+
+statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+statuses@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-buffers@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-0.2.6.tgz#181c08d5bb3690045f69401b9ae6a7a0cf3313fc"
+
+stream-counter@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de"
+ dependencies:
+ readable-stream "~1.1.8"
+
+stream-http@^2.3.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.0.tgz#cec1f4e3b494bc4a81b451808970f8b20b4ed5f6"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.2.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+ dependencies:
+ strip-ansi "^3.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
+ dependencies:
+ buffer-shims "~1.0.0"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-bom@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.1.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+symbol-tree@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+tapable@^0.2.5, tapable@~0.2.5:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d"
+
+tar-pack@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+ dependencies:
+ debug "^2.2.0"
+ fstream "^1.0.10"
+ fstream-ignore "^1.0.5"
+ once "^1.3.3"
+ readable-stream "^2.1.4"
+ rimraf "^2.5.1"
+ tar "^2.2.1"
+ uid-number "^0.0.6"
+
+tar@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.2"
+ inherits "2"
+
+temp@0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+ dependencies:
+ os-tmpdir "^1.0.0"
+ rimraf "~2.2.6"
+
+test-exclude@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.3.tgz#86a13ce3effcc60e6c90403cf31a27a60ac6c4e7"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+throat@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+time-stamp@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151"
+
+timers-browserify@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86"
+ dependencies:
+ setimmediate "^1.0.4"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
+
+topo@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5"
+ dependencies:
+ hoek "2.x.x"
+
+toposort@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c"
+
+tough-cookie@^2.3.2, tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+ dependencies:
+ punycode "^1.4.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tsscmp@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@~1.6.14, type-is@~1.6.6:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+ua-parser-js@^0.7.9:
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+
+uglify-js@^2.6, uglify-js@^2.6.2, uglify-js@^2.8.5, uglify-js@~2.8.22:
+ version "2.8.22"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uid-number@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+uid-safe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.4.tgz#3ad6f38368c6d4c8c75ec17623fb79aa1d071d81"
+ dependencies:
+ random-bytes "~1.0.0"
+
+uid-safe@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137"
+ dependencies:
+ base64-url "1.2.1"
+
+ultron@1.0.x:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+ultron@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864"
+
+union@~0.4.3:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0"
+ dependencies:
+ qs "~2.3.3"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+
+url-join@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
+
+url-loader@^0.5.8:
+ version "0.5.8"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.8.tgz#b9183b1801e0f847718673673040bc9dc1c715c5"
+ dependencies:
+ loader-utils "^1.0.2"
+ mime "1.3.x"
+
+url-parse@1.0.x:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
+ dependencies:
+ querystringify "0.0.x"
+ requires-port "1.0.x"
+
+url-parse@^1.1.1:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.8.tgz#7a65b3a8d57a1e86af6b4e2276e34774167c0156"
+ dependencies:
+ querystringify "0.0.x"
+ requires-port "1.0.x"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+util-deprecate@1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@^0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+utila@~0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+
+utils-merge@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+uuid@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
+vary@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
+
+vary@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
+
+verror@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+ dependencies:
+ extsprintf "1.0.2"
+
+vhost@~3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5"
+
+vinyl@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ dependencies:
+ makeerror "1.0.x"
+
+watch@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
+
+watchpack@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87"
+ dependencies:
+ async "^2.1.2"
+ chokidar "^1.4.3"
+ graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.4.0:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+
+webidl-conversions@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0"
+
+webpack-dev-middleware@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1"
+ dependencies:
+ memory-fs "~0.4.1"
+ mime "^1.3.4"
+ path-is-absolute "^1.0.0"
+ range-parser "^1.0.3"
+
+webpack-dev-server@^2.4.2:
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.4.4.tgz#1adb41640970421ec7b866e82384e8cebeed85de"
+ dependencies:
+ ansi-html "0.0.7"
+ chokidar "^1.6.0"
+ compression "^1.5.2"
+ connect-history-api-fallback "^1.3.0"
+ express "^4.13.3"
+ html-entities "^1.2.0"
+ http-proxy-middleware "~0.17.4"
+ opn "4.0.2"
+ portfinder "^1.0.9"
+ serve-index "^1.7.2"
+ sockjs "0.3.18"
+ sockjs-client "1.1.2"
+ spdy "^3.4.1"
+ strip-ansi "^3.0.0"
+ supports-color "^3.1.1"
+ webpack-dev-middleware "^1.10.2"
+ yargs "^6.0.0"
+
+webpack-sources@^0.1.0:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750"
+ dependencies:
+ source-list-map "~0.1.7"
+ source-map "~0.5.3"
+
+webpack-sources@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"
+ dependencies:
+ source-list-map "^1.1.1"
+ source-map "~0.5.3"
+
+webpack@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.4.1.tgz#15a91dbe34966d8a4b99c7d656efd92a2e5a6f6a"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^4.7.0"
+ ajv-keywords "^1.1.1"
+ async "^2.1.2"
+ enhanced-resolve "^3.0.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^0.2.16"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^3.1.0"
+ tapable "~0.2.5"
+ uglify-js "^2.8.5"
+ watchpack "^1.3.1"
+ webpack-sources "^0.2.3"
+ yargs "^6.0.0"
+
+websocket-driver@>=0.5.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36"
+ dependencies:
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7"
+
+whatwg-encoding@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4"
+ dependencies:
+ iconv-lite "0.4.13"
+
+whatwg-fetch@>=0.10.0, whatwg-fetch@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319"
+
+whatwg-url@^4.3.0:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.1.tgz#df4dc2e3f25a63b1fa5b32ed6d6c139577d690de"
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which@^1.1.1, which@^1.2.12, which@^1.2.9:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
+ dependencies:
+ string-width "^1.0.1"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@^1.0.0, wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+worker-farm@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff"
+ dependencies:
+ errno ">=0.1.1 <0.2.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^1.2.0:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.3.tgz#831dd22d491bdc135180bb996a0eb3f8bf587791"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ slide "^1.1.5"
+
+ws@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
+ws@^2.0.3:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80"
+ dependencies:
+ safe-buffer "~5.0.1"
+ ultron "~1.1.0"
+
+xcode@^0.8.9:
+ version "0.8.9"
+ resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.9.tgz#ec6765f70e9dccccc9f6e9a5b9b4e7e814b4cf35"
+ dependencies:
+ node-uuid "1.4.7"
+ pegjs "0.9.0"
+ simple-plist "0.1.4"
+
+xml-char-classes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
+
+xml-name-validator@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+
+xmlbuilder@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3"
+ dependencies:
+ lodash "^3.5.0"
+
+xmldoc@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888"
+ dependencies:
+ sax "~1.1.1"
+
+xmldom@0.1.x:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xpipe@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^6.0.0, yargs@^6.3.0, yargs@^6.4.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.2.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"