diff --git a/.gitignore b/.gitignore index db25cd02cb..465a03dfc9 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,13 @@ debug/ release/ testresults/ +# Cordova +cordova/www/ +cordova/platforms/ +cordova/plugins/ +cordova/resources/ +cordova/package-lock.json + # OSX .DS_store diff --git a/README.md b/README.md index 68d4e46379..f34791f488 100644 --- a/README.md +++ b/README.md @@ -48,14 +48,15 @@ Unstable testing versions of the lates builds of the configurator for most platf **Be aware that these versions are intended for testing / feedback only, and may be buggy or broken, and can cause flight controller settings to be corrupted. Caution is advised when using these versions.** -## Native app build via NW.js +## Native app build via NW.js (windows/linux/macos) or Cordova (android) ### Development 1. Install node.js (version 10 required) 2. Install yarn: `npm install yarn -g` -3. Change to project folder and run `yarn install`. -4. Run `yarn start`. +3. (For Android platform only) Install Java JDK 8, Gradle and Android Studio (Android SDK at least level 19) +4. Change to project folder and run `yarn install`. +5. Run `yarn start`. ### Running tests @@ -69,12 +70,14 @@ yarn gulp [[platform] [platform] ...] ``` List of possible values of ``: -* **dist** copies all the JS and CSS files in the `./dist` folder. +* **dist** copies all the JS and CSS files in the `./dist` folder [2]. * **apps** builds the apps in the `./apps` folder [1]. -* **debug** builds debug version of the apps in the `./debug` folder [1]. +* **debug** builds debug version of the apps in the `./debug` folder [1][3]. * **release** zips up the apps into individual archives in the `./release` folder [1]. [1] Running this task on macOS or Linux requires Wine, since it's needed to set the icon for the Windows app (build for specific platform to avoid errors). +[2] For Android platform, **dist** task will generate the `./cordova` folder +[3] For Android platform, you need to configure an emulator or to plug an Android device with USB debugging enabled #### Build or release app for one specific platform To build or release only for one specific platform you can append the plaform after the `task-name`. @@ -84,6 +87,7 @@ If no platform is provided, all the platforms will be done in sequence. * **Linux** use `yarn gulp --linux64` * **Windows** use `yarn gulp --win32` * **ChromeOS** use `yarn gulp --chromeos` +* **Android** use `yarn gulp --android` You can also use multiple platforms e.g. `yarn gulp --osx64 --linux64`. diff --git a/assets/android/icon/drawable-hdpi-icon.png b/assets/android/icon/drawable-hdpi-icon.png new file mode 100644 index 0000000000..9eb516af7f Binary files /dev/null and b/assets/android/icon/drawable-hdpi-icon.png differ diff --git a/assets/android/icon/drawable-ldpi-icon.png b/assets/android/icon/drawable-ldpi-icon.png new file mode 100644 index 0000000000..7b423d3d10 Binary files /dev/null and b/assets/android/icon/drawable-ldpi-icon.png differ diff --git a/assets/android/icon/drawable-mdpi-icon.png b/assets/android/icon/drawable-mdpi-icon.png new file mode 100644 index 0000000000..543965c785 Binary files /dev/null and b/assets/android/icon/drawable-mdpi-icon.png differ diff --git a/assets/android/icon/drawable-xhdpi-icon.png b/assets/android/icon/drawable-xhdpi-icon.png new file mode 100644 index 0000000000..66c748a362 Binary files /dev/null and b/assets/android/icon/drawable-xhdpi-icon.png differ diff --git a/assets/android/icon/drawable-xxhdpi-icon.png b/assets/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 0000000000..49cc80f0fa Binary files /dev/null and b/assets/android/icon/drawable-xxhdpi-icon.png differ diff --git a/assets/android/icon/drawable-xxxhdpi-icon.png b/assets/android/icon/drawable-xxxhdpi-icon.png new file mode 100644 index 0000000000..85172fe71b Binary files /dev/null and b/assets/android/icon/drawable-xxxhdpi-icon.png differ diff --git a/assets/android/splash/drawable-land-hdpi-screen.png b/assets/android/splash/drawable-land-hdpi-screen.png new file mode 100644 index 0000000000..40f67fc83d Binary files /dev/null and b/assets/android/splash/drawable-land-hdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-ldpi-screen.png b/assets/android/splash/drawable-land-ldpi-screen.png new file mode 100644 index 0000000000..e10c58a948 Binary files /dev/null and b/assets/android/splash/drawable-land-ldpi-screen.png differ diff --git a/assets/android/splash/drawable-land-mdpi-screen.png b/assets/android/splash/drawable-land-mdpi-screen.png new file mode 100644 index 0000000000..be1737c7ea Binary files /dev/null and b/assets/android/splash/drawable-land-mdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xhdpi-screen.png b/assets/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 0000000000..b10dee42b3 Binary files /dev/null and b/assets/android/splash/drawable-land-xhdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xxhdpi-screen.png b/assets/android/splash/drawable-land-xxhdpi-screen.png new file mode 100644 index 0000000000..572a9f3f1c Binary files /dev/null and b/assets/android/splash/drawable-land-xxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xxxhdpi-screen.png b/assets/android/splash/drawable-land-xxxhdpi-screen.png new file mode 100644 index 0000000000..faa76cbaab Binary files /dev/null and b/assets/android/splash/drawable-land-xxxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-hdpi-screen.png b/assets/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 0000000000..1124928a17 Binary files /dev/null and b/assets/android/splash/drawable-port-hdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-ldpi-screen.png b/assets/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 0000000000..d2860952dd Binary files /dev/null and b/assets/android/splash/drawable-port-ldpi-screen.png differ diff --git a/assets/android/splash/drawable-port-mdpi-screen.png b/assets/android/splash/drawable-port-mdpi-screen.png new file mode 100644 index 0000000000..bba48415cd Binary files /dev/null and b/assets/android/splash/drawable-port-mdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xhdpi-screen.png b/assets/android/splash/drawable-port-xhdpi-screen.png new file mode 100644 index 0000000000..0e5c7b230a Binary files /dev/null and b/assets/android/splash/drawable-port-xhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xxhdpi-screen.png b/assets/android/splash/drawable-port-xxhdpi-screen.png new file mode 100644 index 0000000000..eb238383a5 Binary files /dev/null and b/assets/android/splash/drawable-port-xxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xxxhdpi-screen.png b/assets/android/splash/drawable-port-xxxhdpi-screen.png new file mode 100644 index 0000000000..640a18c403 Binary files /dev/null and b/assets/android/splash/drawable-port-xxxhdpi-screen.png differ diff --git a/cordova/build.json b/cordova/build.json new file mode 100644 index 0000000000..fe4b603bbe --- /dev/null +++ b/cordova/build.json @@ -0,0 +1,10 @@ +{ + "android": { + "release": { + "keystore": "release.keystore", + "storePassword": "betaflight", + "alias": "betaflight", + "password" : "betaflight" + } + } +} diff --git a/cordova/config.xml b/cordova/config.xml new file mode 100644 index 0000000000..ce97d906a3 --- /dev/null +++ b/cordova/config.xml @@ -0,0 +1,52 @@ + + + [INJECTED_BY_GULPFILE] + [INJECTED_BY_GULPFILE] + [INJECTED_BY_GULPFILE] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova/package.json b/cordova/package.json new file mode 100644 index 0000000000..e4f5a576c2 --- /dev/null +++ b/cordova/package.json @@ -0,0 +1,54 @@ +{ + "name": "[INJECTED_BY_GULPFILE]", + "displayName": "Betaflight Configurator", + "version": "[INJECTED_BY_GULPFILE]", + "description": "[INJECTED_BY_GULPFILE]", + "main": "index.js", + "scripts": {}, + "author": "[INJECTED_BY_GULPFILE]", + "license": "[INJECTED_BY_GULPFILE]", + "dependencies": { + "cordova": "^9.0.0", + "cordova-android": "^8.1.0", + "cordova-clipboard": "^1.3.0", + "bf-cordova-open-native-settings": "^2.0.4", + "bf-cordova-plugin-appavailability": "^1.0.3", + "cordova-plugin-chrome-apps-common": "^1.0.7", + "cordova-plugin-chrome-apps-runtime": "^2.0.0", + "cordova-plugin-chrome-apps-storage": "^1.0.4", + "bf-cordova-plugin-chrome-apps-usb": "^2.0.1", + "cordova-plugin-dialogs": "^2.0.2", + "cordova-plugin-file": "^6.0.2", + "cordova-plugin-filechooser": "^1.2.0", + "cordova-plugin-market": "^1.2.0", + "cordova-plugin-permission": "^0.1.0", + "cordova-plugin-splashscreen": "^5.0.3", + "cordova-plugin-usb-event": "^1.0.2", + "cordova-plugin-whitelist": "^1.3.4", + "bf-cordovarduino": "^1.0.0" + }, + "cordova": { + "platforms": [ + "android" + ], + "plugins": { + "cordova-plugin-chrome-apps-common": {}, + "cordova-plugin-chrome-apps-runtime": {}, + "cordova-plugin-chrome-apps-storage": {}, + "cordova-plugin-whitelist": {}, + "cordova-plugin-splashscreen": {}, + "cordova-plugin-permission": {}, + "cordova-plugin-usb-event": {}, + "cordova-plugin-dialogs": {}, + "bf-cordovarduino": {}, + "cordova-plugin-file": {}, + "cordova-plugin-filechooser": {}, + "bf-cordova-plugin-chrome-apps-usb": {}, + "cordova-clipboard": {}, + "cordova-plugin-screen-orientation": {}, + "cordova-plugin-market": {}, + "bf-cordova-open-native-settings": {}, + "bf-cordova-plugin-appavailability": {} + } + } +} diff --git a/cordova/release.keystore b/cordova/release.keystore new file mode 100644 index 0000000000..8d155515a4 Binary files /dev/null and b/cordova/release.keystore differ diff --git a/cordova/usb_device_filter.xml b/cordova/usb_device_filter.xml new file mode 100644 index 0000000000..f14a3b86be --- /dev/null +++ b/cordova/usb_device_filter.xml @@ -0,0 +1,4 @@ + + + + diff --git a/cordova/yarn.lock b/cordova/yarn.lock new file mode 100644 index 0000000000..f630f2fd80 --- /dev/null +++ b/cordova/yarn.lock @@ -0,0 +1,2989 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +android-versions@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/android-versions/-/android-versions-1.5.0.tgz#7790bc74e0812aafd69fb1ad0cb4db4474a525d6" + integrity sha512-/GWUAqa2OJNlDF5VGSe3SR1QMHEPXxx54Ur56r0qQC0H9FlBr7kyBF2SgVEhzFCPbrW4UcYgVuWrq/2Ty3QvXg== + dependencies: + semver "^5.4.1" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +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" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.2.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bf-cordova-open-native-settings@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/bf-cordova-open-native-settings/-/bf-cordova-open-native-settings-2.0.4.tgz#312db37a8e2028c351586077697e6fbdee527d28" + integrity sha512-rGiegnoQIOfPZ6lKhQaszxCUczi5Cg4UwmV40cJSF3WcZRDyNiQlUrAs5dhScT4ZttkHE/IPqUmpBXmTuIVTTQ== + +bf-cordova-plugin-appavailability@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bf-cordova-plugin-appavailability/-/bf-cordova-plugin-appavailability-1.0.3.tgz#3f31fb623af06823170f9b32b8e9991d4a83cf09" + integrity sha512-fNGs+CHG+LhKnWg86W2V+B2Yu2mCr9etMVJ8jt/HpQZdclbFbimfaE00CWjt2veJPN9ZTZijqLPKO3i31wva7A== + +bf-cordova-plugin-chrome-apps-usb@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bf-cordova-plugin-chrome-apps-usb/-/bf-cordova-plugin-chrome-apps-usb-2.0.1.tgz#004a402fda7e67cfae99e3e8fac270add09b54e2" + integrity sha512-LQGtpVKN5vebuoRMsiG3wbuveA0rAKMwvvgVZFS3nxmUpgHFH4Ms013fu3phe/JaA0h1WUB46RVpIxNaDnJLZQ== + +bf-cordovarduino@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bf-cordovarduino/-/bf-cordovarduino-1.0.0.tgz#d4a50415608a3990d3fdfe6eef10c3a8712a44be" + integrity sha512-WH3FSrWeZ2Mkkzybw0MNN7o4w401zGiYZxMFVc+uhYalPkKBWk+rSjQnNij7XOWbN6eFM4tMUrO6Ggm5ibT+YQ== + +big-integer@^1.6.7: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +bplist-parser@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" + integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= + dependencies: + big-integer "^1.6.7" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +compare-func@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.6.0: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +conf@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-1.4.0.tgz#1ea66c9d7a9b601674a5bb9d2b8dc3c726625e67" + integrity sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg== + dependencies: + dot-prop "^4.1.0" + env-paths "^1.0.0" + make-dir "^1.0.0" + pkg-up "^2.0.0" + write-file-atomic "^2.3.0" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +cordova-android@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cordova-android/-/cordova-android-8.1.0.tgz#d9aea62bbe4a4c8d22fdf21616869439cd1c95a0" + integrity sha512-eAY6g9q3raJ4P03wNdSWC5MOW1EfxoomWNXsPhi7T6Q9yAqmxqn0sLEUjLL1Ib0LCH3nKQWBXdxapQ5LgbHu+g== + dependencies: + android-versions "^1.4.0" + compare-func "^1.3.2" + cordova-common "^3.2.0" + nopt "^4.0.1" + properties-parser "^0.3.1" + q "^1.5.1" + shelljs "^0.5.3" + +cordova-app-hello-world@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cordova-app-hello-world/-/cordova-app-hello-world-4.0.0.tgz#a30e896b210787332337069c50845e1802dabcff" + integrity sha512-hTNYHUJT5YyMa1cQQE1naGyU6Eh5D5Jl33sMnCh3+q15ZwWTL/TOy3k8+mUvjTp8bwhO5eECGKULYoVO+fp9ZA== + +cordova-clipboard@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz#0911da4cbdea5df2e3a769f5b3aab00e0be0e679" + integrity sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw== + +cordova-common@^3.1.0, cordova-common@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-3.2.1.tgz#f4fdbeb40d9049fe28a09fa901756ed66d246661" + integrity sha512-xg0EnjnA6EipxXG8cupdlYQYeDA6+ghbN+Pjq88xN1LInwP6Bo7IyGBdSV5QnfjOvzShF9BBwSxBAv0FOO0C2Q== + dependencies: + ansi "^0.3.1" + bplist-parser "^0.1.0" + cross-spawn "^6.0.5" + elementtree "0.1.7" + endent "^1.1.1" + fs-extra "^8.0.0" + glob "^7.1.2" + minimatch "^3.0.0" + plist "^3.0.1" + q "^1.4.1" + strip-bom "^3.0.0" + underscore "^1.8.3" + which "^1.3.0" + +cordova-create@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cordova-create/-/cordova-create-2.0.0.tgz#4195cf01cbbdacfe8abebd7eaf4764f69c53f28b" + integrity sha512-72CaGg/7x+tiZlzeXKQXLTc8Jh4tbwLdu4Ib97kJ6+R3bcew/Yv/l2cVA2E0CaCuOCtouTqwi+YLcA2I4dPFTQ== + dependencies: + cordova-app-hello-world "^4.0.0" + cordova-common "^3.1.0" + cordova-fetch "^2.0.0" + fs-extra "^7.0.1" + import-fresh "^3.0.0" + is-url "^1.2.4" + isobject "^3.0.1" + path-is-inside "^1.0.2" + tmp "0.0.33" + valid-identifier "0.0.2" + +cordova-fetch@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cordova-fetch/-/cordova-fetch-2.0.1.tgz#5c04b7cc6f9bf8e1ffeed233dcefb64cde108cc3" + integrity sha512-q21PeobERzE3Drli5htcl5X9Mtfvodih5VkqIwdRUsjDBCPv+I6ZonRjYGbNnXhYrYx7dm0m0j/7/Smf6Av3hg== + dependencies: + cordova-common "^3.1.0" + fs-extra "^7.0.1" + npm-package-arg "^6.1.0" + pify "^4.0.1" + resolve "^1.10.0" + semver "^5.6.0" + which "^1.3.1" + +cordova-lib@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cordova-lib/-/cordova-lib-9.0.1.tgz#7a6853b6a58538ad414ceae2380dda78ea74301a" + integrity sha512-P9nQhq91gLOyKZkamvKNzzK89gLDpq8rKue/Vu7NUSgNzhPkiWW0w+6VRTbj/9QGVM9w2uDVhB9c9f6rrTXzCw== + dependencies: + cordova-common "^3.1.0" + cordova-create "^2.0.0" + cordova-fetch "^2.0.0" + cordova-serve "^3.0.0" + dep-graph "1.1.0" + detect-indent "^5.0.0" + elementtree "^0.1.7" + fs-extra "^7.0.1" + globby "^9.1.0" + indent-string "^3.2.0" + init-package-json "^1.10.3" + md5-file "^4.0.0" + read-chunk "^3.1.0" + semver "^5.6.0" + shebang-command "^1.2.0" + underscore "^1.9.1" + +cordova-plugin-chrome-apps-common@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-common/-/cordova-plugin-chrome-apps-common-1.0.7.tgz#300319b59c79dc552293f83a2332cf283b10908a" + integrity sha1-MAMZtZx53FUik/g6IzLPKDsQkIo= + +cordova-plugin-chrome-apps-runtime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-runtime/-/cordova-plugin-chrome-apps-runtime-2.0.0.tgz#1159931ed7e9960b6114da4685ebdddc47302986" + integrity sha1-EVmTHtfplgthFNpGhevd3EcwKYY= + +cordova-plugin-chrome-apps-storage@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-storage/-/cordova-plugin-chrome-apps-storage-1.0.4.tgz#f83b1e16e54b774ba375f6ff5378fda829b161fd" + integrity sha1-+DseFuVLd0ujdfb/U3j9qCmxYf0= + +cordova-plugin-dialogs@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-dialogs/-/cordova-plugin-dialogs-2.0.2.tgz#ac3ce8b73bc885ff847078d5b533e7a4ed418a2f" + integrity sha512-FUHI6eEVeoz2VkxbF0P56QlUQLGzXcvw3i4xuXyM9gEct6Y+FA3Xzgl2pJTZcTg5wRqLWzN08kgNoHPkom15pw== + +cordova-plugin-file@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz#f3911479f8357e9aacb5576674f8d95b31a1fb20" + integrity sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA== + +cordova-plugin-filechooser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-filechooser/-/cordova-plugin-filechooser-1.2.0.tgz#3a3a3d9c5bef733076f1f6b59e465f60a0d96577" + integrity sha512-ycL9ML3wlRQ8wfK7vCG8gobv1f3VIdO52m0LA9mPSzLblbu0AXJs89yCRxZB87+08/V96qBxrmkxMsMmVYu5wA== + +cordova-plugin-market@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-market/-/cordova-plugin-market-1.2.0.tgz#61e36428147e95402c64eaf86e317378ffdb274f" + integrity sha1-YeNkKBR+lUAsZOr4bjFzeP/bJ08= + +cordova-plugin-permission@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-permission/-/cordova-plugin-permission-0.1.0.tgz#bb9ba0e71c4c6b2498158ce39ab46d63ed1f4547" + integrity sha1-u5ug5xxMaySYFYzjmrRtY+0fRUc= + +cordova-plugin-splashscreen@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.3.tgz#02820472771c3e10b43ceedd54b0a1e4674efa6d" + integrity sha512-rnoDXMDfzoeHDBvsnu6JmzDE/pV5YJCAfc5hYX/Mb2BIXGgSjFJheByt0tU6kp3Wl40tSyFX4pYfBwFblBGyRg== + +cordova-plugin-usb-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-usb-event/-/cordova-plugin-usb-event-1.0.2.tgz#68182ae8d56d42236524753a1dbb711ce285e03a" + integrity sha512-4Y1P6pqwK/co+22dYZ6o1lLknmxaA6vThNntx8fuhQfGnG1R+9FpxNnFkUdjI9VnltHb3IhKwDo6q2LtxMY5Cw== + +cordova-plugin-whitelist@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.4.tgz#31938545c7c3e7de35c20ab08c2c3afa06e8a3f9" + integrity sha512-EYC5eQFVkoYXq39l7tYKE6lEjHJ04mvTmKXxGL7quHLdFPfJMNzru/UYpn92AOfpl3PQaZmou78C7EgmFOwFQQ== + +cordova-serve@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cordova-serve/-/cordova-serve-3.0.0.tgz#974d695f75a9f2b3e487604be6f539a39dba8390" + integrity sha512-h479g/5a0PXn//yiFuMrD5MDEbB+mtihNkWcE6uD/aCh/6z0FRZ9sWH3NfZbHDB+Bp1yGLYsjbH8LZBL8KOQ0w== + dependencies: + chalk "^2.4.1" + compression "^1.6.0" + express "^4.13.3" + opn "^5.3.0" + which "^1.3.0" + +cordova@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cordova/-/cordova-9.0.0.tgz#2bba968d9e3339f9c8dace443a77f4d37ed1fe46" + integrity sha512-zWEPo9uGj9KNcEhU2Lpo3r4HYK21tL+at496N2LLnuCWuWVndv6QWed8+EYl/08rrcNshrEtfzXj9Ux6vQm2PQ== + dependencies: + configstore "^4.0.0" + cordova-common "^3.1.0" + cordova-lib "^9.0.0" + editor "^1.0.0" + insight "^0.10.1" + loud-rejection "^2.0.0" + nopt "^4.0.1" + update-notifier "^2.5.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +dep-graph@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dep-graph/-/dep-graph-1.1.0.tgz#fade86a92799a813e9b42511cdf3dfa6cc8dbefe" + integrity sha1-+t6GqSeZqBPptCURzfPfpsyNvv4= + dependencies: + underscore "1.2.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +elementtree@0.1.7, elementtree@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/elementtree/-/elementtree-0.1.7.tgz#9ac91be6e52fb6e6244c4e54a4ac3ed8ae8e29c0" + integrity sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA= + dependencies: + sax "1.1.4" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +endent@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/endent/-/endent-1.4.1.tgz#c58cc13dfc432d0b2c7faf74c13ffdca60b2d1c8" + integrity sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ== + dependencies: + dedent "^0.7.0" + fast-json-parse "^1.0.3" + objectorarray "^1.0.4" + +env-paths@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.13.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-parse@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globby@^9.1.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^6.3.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +insight@^0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/insight/-/insight-0.10.3.tgz#e7fa6593fd11323d227154cc8ce5f8bff638bf02" + integrity sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw== + dependencies: + async "^2.6.2" + chalk "^2.4.2" + conf "^1.4.0" + inquirer "^6.3.1" + lodash.debounce "^4.0.8" + os-name "^3.1.0" + request "^2.88.0" + tough-cookie "^3.0.1" + uuid "^3.3.2" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + 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" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +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" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.12, lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loud-rejection@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c" + integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.2" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584" + integrity sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^3.0.0, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-normalize-package-bin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +objectorarray@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.4.tgz#d69b2f0ff7dc2701903d308bb85882f4ddb49483" + integrity sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opn@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-name@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +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" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-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" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + +properties-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.3.1.tgz#1316e9539ffbfd93845e369b211022abd478771a" + integrity sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo= + dependencies: + string.prototype.codepointat "^0.2.0" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.4.1, q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-chunk@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca" + integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== + dependencies: + pify "^4.0.1" + with-open-file "^0.1.6" + +"read-package-json@1 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" + integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +run-async@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.4.tgz#74b6d33c9ae1e001510f179a91168588f1aedaa9" + integrity sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk= + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + 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" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shelljs@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" + integrity sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" + integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + 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" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +underscore@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.2.1.tgz#fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4" + integrity sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q= + +underscore@^1.8.3, underscore@^1.9.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +valid-identifier@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/valid-identifier/-/valid-identifier-0.0.2.tgz#4814dff0c1b7d5ef3d7f4b678aeb26841b5b0e69" + integrity sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +windows-release@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0" + integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ== + dependencies: + execa "^1.0.0" + +with-open-file@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729" + integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA== + dependencies: + p-finally "^1.0.0" + p-try "^2.1.0" + pify "^4.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= diff --git a/gulpfile.js b/gulpfile.js index 71b081d62f..604857239d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,15 +23,21 @@ const gulp = require('gulp'); const concat = require('gulp-concat'); const yarn = require("gulp-yarn"); const rename = require('gulp-rename'); +const replace = require('gulp-replace'); +const jeditor = require("gulp-json-editor"); +const xmlTransformer = require("gulp-xml-transformer"); const os = require('os'); const git = require('gulp-git'); const source = require('vinyl-source-stream'); const stream = require('stream'); +const cordova = require("cordova-lib").cordova; + const DIST_DIR = './dist/'; const APPS_DIR = './apps/'; const DEBUG_DIR = './debug/'; const RELEASE_DIR = './release/'; +const CORDOVA_DIR = './cordova/'; const LINUX_INSTALL_DIR = '/opt/betaflight'; @@ -49,6 +55,8 @@ var nwBuilderOptions = { var nwArmVersion = '0.27.6'; +let cordovaDependencies = true; + //----------------- //Pre tasks operations //----------------- @@ -70,16 +78,18 @@ gulp.task('clean-release', clean_release); gulp.task('clean-cache', clean_cache); +gulp.task('clean-cordova', cordova_clean); + // Function definitions are processed before function calls. const getChangesetId = gulp.series(getHash, writeChangesetId); gulp.task('get-changeset-id', getChangesetId); // dist_yarn MUST be done after dist_src -const distBuild = gulp.series(dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, getChangesetId); +const distBuild = gulp.series(dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, getChangesetId, gulp.series(cordova_dist())); const distRebuild = gulp.series(clean_dist, distBuild); gulp.task('dist', distRebuild); -const appsBuild = gulp.series(gulp.parallel(clean_apps, distRebuild), apps, gulp.parallel(listPostBuildTasks(APPS_DIR))); +const appsBuild = gulp.series(gulp.parallel(clean_apps, distRebuild), apps, gulp.series(cordova_apps()), gulp.parallel(listPostBuildTasks(APPS_DIR))); gulp.task('apps', appsBuild); const debugAppsBuild = gulp.series(gulp.parallel(clean_debug, distRebuild), debug, gulp.parallel(listPostBuildTasks(DEBUG_DIR))); @@ -101,10 +111,10 @@ gulp.task('default', debugBuild); // Get platform from commandline args // # -// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, or --chromeos) +// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, --chromeos or --android) // # function getInputPlatforms() { - var supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32','win64', 'chromeos']; + const supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32','win64', 'chromeos', 'android']; var platforms = []; var regEx = /--(\w+)/; console.log(process.argv); @@ -112,9 +122,12 @@ function getInputPlatforms() { var arg = process.argv[i].match(regEx)[1]; if (supportedPlatforms.indexOf(arg) > -1) { platforms.push(arg); - } else if (arg == 'nowinicon') { - console.log('ignoring winIco') + } else if (arg === 'nowinicon') { + console.log('ignoring winIco'); delete nwBuilderOptions['winIco']; + } else if (arg === 'skipdep') { + console.log('ignoring cordova dependencies'); + cordovaDependencies = false; } else { console.log('Unknown platform: ' + arg); process.exit(); @@ -282,6 +295,7 @@ function dist_resources() { function apps(done) { var platforms = getPlatforms(); removeItem(platforms, 'chromeos'); + removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'normal', APPS_DIR, done); } @@ -341,6 +355,7 @@ function post_build(arch, folder, done) { function debug(done) { var platforms = getPlatforms(); removeItem(platforms, 'chromeos'); + removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'sdk', DEBUG_DIR, done); } @@ -498,9 +513,13 @@ function start_debug(done) { var exec = require('child_process').exec; if (platforms.length === 1) { - var run = getRunDebugAppCommand(platforms[0]); - console.log('Starting debug app (' + run + ')...'); - exec(run); + if (platforms[0] === 'android') { + cordova_debug(); + } else { + var run = getRunDebugAppCommand(platforms[0]); + console.log('Starting debug app (' + run + ')...'); + exec(run); + } } else { console.log('More than one platform specified, not starting debug app'); } @@ -762,5 +781,136 @@ function listReleaseTasks(appDirectory) { }); } + if (platforms.indexOf('android') !== -1) { + releaseTasks.push(function release_android() { + return cordova_release(); + }); + } + return releaseTasks; } + +// Cordova +function cordova_dist() { + const distTasks = []; + const platforms = getPlatforms(); + if (platforms.indexOf('android') !== -1) { + distTasks.push(cordova_clean); + distTasks.push(cordova_copy_www); + distTasks.push(cordova_locales_www); + distTasks.push(cordova_resources); + distTasks.push(cordova_include_www); + distTasks.push(cordova_packagejson); + distTasks.push(cordova_configxml); + distTasks.push(cordova_depedencies); + if (cordovaDependencies) { + distTasks.push(cordova_platforms); + } + } else { + distTasks.push(function cordova_dist_none(done) { + done(); + }); + } + return distTasks; +} +function cordova_apps() { + const appsTasks = []; + const platforms = getPlatforms(); + if (platforms.indexOf('android') !== -1) { + appsTasks.push(cordova_build); + } else { + appsTasks.push(function cordova_dist_none(done) { + done(); + }); + } + return appsTasks; +} + + +function cordova_clean() { + const patterns = ['./cordova/www/**', './cordova/resources/**']; + if (cordovaDependencies) { + patterns.push('./cordova/plugins/**'); + patterns.push('./cordova/platforms/**'); + } + return del(patterns, { force: true }); +} +function cordova_copy_www() { + return gulp.src(`${DIST_DIR}**`, { base: DIST_DIR }) + .pipe(gulp.dest(`${CORDOVA_DIR}www/`)); +} +function cordova_locales_www(cb) { + fs.renameSync(`${CORDOVA_DIR}www/_locales`, `${CORDOVA_DIR}www/i18n`); + gulp.src(`${CORDOVA_DIR}www/js/localization.js`) + .pipe(replace('/_locales', './i18n')) + .pipe(gulp.dest(`${CORDOVA_DIR}www/js`)); + cb(); +} +function cordova_resources() { + return gulp.src('assets/android/**') + .pipe(gulp.dest(`${CORDOVA_DIR}resources/android/`)); +} +function cordova_include_www() { + return gulp.src(`${CORDOVA_DIR}www/main.html`) + .pipe(replace('', '')) + .pipe(replace('', '')) + .pipe(replace('', '')) + .pipe(gulp.dest(`${CORDOVA_DIR}www`)); +} +function cordova_packagejson() { + return gulp.src(`${CORDOVA_DIR}package.json`) + .pipe(jeditor({ + 'name': pkg.name, + 'description': pkg.description, + 'version': pkg.version, + 'author': pkg.author, + 'license': pkg.license, + })) + .pipe(gulp.dest(CORDOVA_DIR)); +} +function cordova_configxml() { + return gulp.src([`${CORDOVA_DIR}config.xml`]) + .pipe(xmlTransformer([ + { path: '//xmlns:name', text: pkg.productName }, + { path: '//xmlns:description', text: pkg.description }, + { path: '//xmlns:author', text: pkg.author }, + ], 'http://www.w3.org/ns/widgets')) + .pipe(xmlTransformer([ + { path: '.', attr: { 'version': pkg.version } }, + ])) + .pipe(gulp.dest(CORDOVA_DIR)); +} +function cordova_depedencies() { + process.chdir('cordova'); + return gulp.src(['./package.json', './yarn.lock']) + .pipe(gulp.dest('./')) + .pipe(yarn({ + production: true, + })); +} +function cordova_platforms() { + return cordova.platform('add', ['android']); +} +function cordova_debug() { + cordova.run(); +} +function cordova_build(cb) { + cordova.build({ + 'platforms': ['android'], + 'options': { + release: true, + buildConfig: 'build.json', + }, + }).then(function() { + process.chdir('../'); + cb(); + }); + console.log('APK will be generated at cordova/platforms/android/app/build/outputs/apk/release/app-release.apk'); +} +async function cordova_release() { + const filename = await getReleaseFilename('android', 'apk'); + console.log(`Release APK : release/${filename}`); + return gulp.src(`${CORDOVA_DIR}platforms/android/app/build/outputs/apk/release/app-release.apk`) + .pipe(rename(filename)) + .pipe(gulp.dest(RELEASE_DIR)); +} diff --git a/locales/en/messages.json b/locales/en/messages.json index ae156dc2bf..7e34bf847a 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -92,6 +92,9 @@ "analyticsOptOut": { "message": "Opt out of the anonymised collection of statistics data" }, + "cordovaForceComputerUI": { + "message": "Use computers interface instead of phones interface" + }, "language_changed": { "message": "Language change saved" }, @@ -298,6 +301,9 @@ "tabHelp": { "message": "Documentation & Support" }, + "tabOptions": { + "message": "Options" + }, "tabSetup": { "message": "Setup" @@ -5746,5 +5752,68 @@ "gpsSbasNone": { "message": "None", "description": "One of the options selectable for the GPS SBAS system" + }, + "dialogFileNameTitle": { + "message": "File name" + }, + "dialogFileNameDescription": { + "message": "The file will be saved in the '{{folder}}' folder in your internal storage." + }, + "dialogFileAlreadyExistsTitle": { + "message": "This file already exists!" + }, + "dialogFileAlreadyExistsDescription": { + "message": "Overwrite ?" + }, + "cordovaCheckingWebview": { + "message": "Checking webview applications ..." + }, + "cordovaIncompatibleWebview": { + "message": "Incompatible webview" + }, + "cordovaWebviewTroubleshootingMsg": { + "message": "You must update your device's webview in order to use the configurator." + }, + "cordovaWebviewTroubleshootingMsg2": { + "message": "The tool below is intended to help you to install a new webview or to update an already installed webview." + }, + "cordovaAvailableWebviews": { + "message": "Available webview applications on your device" + }, + "cordovaWebviewInstall": { + "message": "Installing the {{app}} app can resolve this compatibility issue." + }, + "cordovaWebviewInstallBtn": { + "message": "Install from the Google Play Store" + }, + "cordovaWebviewUninstall": { + "message": "Uninstalling the {{app}} app can resolve this compatibility issue. If you are not able to uninstall it, try to disable it from the settings app." + }, + "cordovaWebviewUninstallBtn1": { + "message": "Uninstall from the Google Play Store" + }, + "cordovaWebviewUninstallBtn2": { + "message": "Uninstall / disable from the settings" + }, + "cordovaWebviewUpdate": { + "message": "Updating the {{app}} app can resolve this compatibility issue." + }, + "cordovaWebviewUpdateBtn": { + "message": "Update from the Google Play Store" + }, + "cordovaWebviewEnable": { + "message": "Go into the tab of informations about your device in the settings and tap 10 times on the build version number to enable 'Developper options'. After that, search and go in the developper options and select {{app}} as webview provider." + }, + "cordovaWebviewEnableBtn": { + "message": "Open settings" + }, + "cordovaWebviewIncompatible": { + "message": "Your device seems to be not compatible. Try to search other ways to update your webview" + }, + "cordovaNoWebview": { + "message": "No webview application installed / enabled" + }, + "cordovaWebviewUsed": { + "message": "used" } } diff --git a/package.json b/package.json index ef779a2761..3d81646e46 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "betaflight-configurator", + "productName": "Betaflight Configurator", "description": "Crossplatform configuration tool for Betaflight flight control system.", "version": "10.8.0", "main": "main.html", @@ -42,6 +43,7 @@ "node": "10.x" }, "dependencies": { + "@fortawesome/fontawesome-free": "^5.13.0", "bluebird": "^3.7.2", "djv": "^2.1.3-alpha.0", "i18next": "^18.0.1", @@ -50,6 +52,7 @@ "jbox": "1.0.8", "jquery": "3.5.0", "jquery-textcomplete": "^1.8.5", + "jquery-touchswipe": "^1.6.19", "jquery-ui-npm": "1.12.0", "lru_map": "^0.3.3", "marked": "^0.8.0", @@ -62,6 +65,7 @@ "devDependencies": { "chai": "^4.2.0", "command-exists": "^1.2.8", + "cordova-lib": "^9.0.1", "del": "^5.0.0", "follow-redirects": "^1.10.0", "fs-extra": "^8.1.0", @@ -69,7 +73,10 @@ "gulp-concat": "~2.6.1", "gulp-debian": "~0.1.8", "gulp-git": "^2.10.0", + "gulp-json-editor": "^2.5.4", "gulp-rename": "^2.0.0", + "gulp-replace": "^1.0.0", + "gulp-xml-transformer": "^3.0.0", "gulp-yarn": "^2.0.0", "gulp-zip": "^5.0.0", "karma": "^4.0.1", diff --git a/src/css/dark-theme.css b/src/css/dark-theme.css index 6bb0d6990c..62fb504f48 100644 --- a/src/css/dark-theme.css +++ b/src/css/dark-theme.css @@ -298,15 +298,15 @@ button { } .tab-failsafe .pro1 { - background-image: url(../../images/icons/cf_failsafe_procedure1-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure1-dark.svg); } .tab-failsafe .pro2 { - background-image: url(../../images/icons/cf_failsafe_procedure2-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure2-dark.svg); } .tab-failsafe .pro4 { - background-image: url(../../images/icons/cf_failsafe_procedure4-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure4-dark.svg); } @@ -381,7 +381,7 @@ progress[value]::-webkit-progress-bar { } .tab-landing .logowrapper img { - content:url(/images/cf_logo_black.svg); + content:url(../images/cf_logo_black.svg); } .tab-landing .content_mid .text3 .wrap2 { @@ -494,7 +494,7 @@ progress[value]::-webkit-progress-bar { } .tab-osd .preview { - background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url(../../images/osd-bg-1.jpg); + background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url(../images/osd-bg-1.jpg); background-size: cover; } @@ -523,7 +523,7 @@ progress[value]::-webkit-progress-bar { .tab-pid_tuning .profile .helpicon, .tab-pid_tuning .rate_profile .helpicon, .tab-pid_tuning .pid_titlebar .helpicon { - background-image: url(../../images/icons/cf_icon_info_grey.svg); + background-image: url(../images/icons/cf_icon_info_grey.svg); opacity: 0.4; } .tab-pid_tuning .profile .helpicon:hover, diff --git a/src/css/main.css b/src/css/main.css index 1813d09cb1..b969c48e7b 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -35,8 +35,8 @@ body { font-size: 12px; color: #303030; background-color: #3d3f3e; - margin: 0px; - padding: 0px; + margin: 0; + padding: 0; overflow: hidden; } @@ -94,7 +94,7 @@ a.disabled { font-weight: bold; font-size: 10px; line-height: 17px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); text-transform: uppercase; letter-spacing: 0.03em; display: block; @@ -123,11 +123,6 @@ input[type="number"]::-webkit-inner-spin-button { float: right; } -#main-wrapper { - padding: 0px 0px 0 0px; /* padding: 5px 5px 0 5px; */ - height: calc(100% - 7px); -} - .margin-top { margin-top: 20px; } @@ -145,45 +140,94 @@ input[type="number"]::-webkit-inner-spin-button { font-weight: bold !important; } + + +/** Main wrapper **/ +#main-wrapper { + padding: 0; + height: 100%; +} + + + +/** Background **/ +#background { + background: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 1500; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: none; +} +#side_menu_swipe { + display: none; + position: fixed; + top: 0; + left: 0; + width: 15px; + height: 100%; + z-index: 1999; +} +@media all and (max-width: 575px) { + #side_menu_swipe { + display: block; + } +} + + + +/** Header **/ .headerbar { - height:115px; - width:100%; + height: 115px; background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15)); + display: flex; + align-items: center; + padding: 0 15px; +} + +#menu_btn, #reveal_btn { + display: none; + width: 24px; + height: 24px; + font-size: 20px; + color: #ffffff; + line-height: 24px; + text-align: center; +} + +#menu_btn { + margin-right: 15px; } +#reveal_btn { + margin-left: 15px; +} #logo { - position: relative; - float: left; height: 70px; - z-index: 0; + width: 240px; background-image: url(../images/light-wide-2.svg); background-repeat: no-repeat; - width: 240px; background-position: left center; background-size: contain; - margin-left: 15px; - margin-top: 14px; + position: relative; + margin-top: -25px; } .logo_text { position: absolute; - height: 20px; - width: 300px; left: 80px; - top: 50px; + top: 49px; color: #949494; opacity: 0.5; font-size: 10px; -} - -.logo_text .version { - float: right; + min-width: 210px; } @media all and (min-width: 1125px) { #logo { - margin-top: 9px; width: 340px; } @@ -193,67 +237,147 @@ input[type="number"]::-webkit-inner-spin-button { } #port-picker { - position: relative; - width: 100%; + display: flex; + align-items: center; + margin-left: auto; } #portsinput { - float: right; - margin-top: 20px; - margin-right: 20px; - /*width:180px;*/ + width: 180px; + margin-right: 15px; } #portsinput .dropdown { margin-bottom: 5px; } +#port-picker .auto_connect, .gray { + color: var(--subtleAccent); +} + +#port-override-option { + height: 76px; + margin-top: 7px; + margin-right: 15px; +} + +#port-override-option label { + background-color: #2b2b2b; + border-radius: 3px; + padding: 3px; + color: var(--subtleAccent); +} #port-override { background-color: rgba(0, 0, 0, 0.1); color: #888888; width: 140px; margin-left: 2px; - margin-top: 0px; padding: 1px; border-radius: 3px; height: 15px; - float: right; font-size: 12px; } -#port-override-option label { - background-color: #2b2b2b; - border-radius: 3px; - padding: 3px; - margin-bottom: 5px; - color: var(--subtleAccent); - position: absolute; - margin-top: -59px; - margin-left: -187px; +#header_btns { + display: flex; + align-items: center; } -#port-override input { - width: 136px; +.open_firmware_flasher, .connect_controls { + position: relative; + width: 80px; + text-align: center; + height: 84px; } -#port-picker .auto_connect, .gray { - color: var(--subtleAccent); +.firmware_b, .connect_b { + width: 52px; + margin: 0 14px; + height: 52px; } -#header_dataflash { - display: none; +@media all and (min-width: 1125px) { + .open_firmware_flasher, .connect_controls { + width: 100px; + } + + .firmware_b, .connect_b { + margin: 0 24px; + } +} + +.firmware_b a.flash, .connect_b a.connect { + background-color: var(--accent); + border: 1px solid #dba718; + background-repeat: no-repeat; + height: 50px; + width: 50px; + border-radius: 100px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + float: left; + transition: none; +} + +.firmware_b a.flash { + background-image: url(../images/icons/cf_icon_flasher_white.svg); + background-size: 30px; + background-position: center 10px; +} + +.connect_b a.connect { + background-image: url(../images/icons/cf_icon_usb2_white.svg); + background-size: 44px; + background-position: center 6px; +} + +.firmware_b a.flash.disabled, .connect_b a.connect.disabled { + background-color: #808080; + pointer-events: none; + cursor: default; +} + +.firmware_b a.flash:hover, .connect_b a.connect:hover { + background-color: #ffcc3f; +} + +.firmware_b a.flash.active, .connect_b a.connect.active { + background-color: #e60000; + border: 1px solid #fe0000; + transition: none; +} + +.firmware_b a.flash.active { + background-image: url(../images/icons/cf_icon_flasher_white.svg); +} + +.connect_b a.connect.active { + background-image: url(../images/icons/cf_icon_usb1_white.svg); +} + +.firmware_b a.flash.active:hover, .connect_b a.connect.active:hover { + background-color: #f21212; +} + +.flash_state, .connect_state { + color: #fff; + font-size: 12px; + font-weight: normal; + text-shadow: 0 1px rgba(0, 0, 0, 0.25); + padding: 0 10px; +} + +.header-wrapper { + display: flex; } #sensor-status { - margin-top: 20px; - float: right; margin-right: 10px; line-height: 2px; height: 67px; border-radius: 5px; border: 1px solid #272727; - box-shadow: 0px 2px 0px rgba(92, 92, 92, 0.5); + box-shadow: 0 2px 0 rgba(92, 92, 92, 0.5); background-color: #434343; background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); } @@ -278,13 +402,10 @@ input[type="number"]::-webkit-inner-spin-button { background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); padding-left: 5px; padding-right: 5px; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); + text-shadow: 0 1px rgba(0, 0, 0, 1.0); } -.gyroicon { - background-image: url(../images/icons/sensor_gyro_off.png); - background-size: 43px; - background-position: top; +.gyroicon, .accicon, .magicon, .gpsicon, .baroicon, .sonaricon { background-repeat: no-repeat; height: 30px; margin-top: 3px; @@ -294,109 +415,78 @@ input[type="number"]::-webkit-inner-spin-button { text-align: center; } +.gyroicon.active, .accicon.active, .magicon.active, .gpsicon.active, .baroicon.active, .sonaricon.active { + color: #818181; +} + +.gyroicon { + background-image: url(../images/icons/sensor_gyro_off.png); + background-size: 43px; + background-position: top; +} + .gyroicon.active { background-image: url(../images/icons/sensor_gyro_on.png); - color: #818181; } .accicon { background-image: url(../images/icons/sensor_acc_off.png); background-size: 40px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .accicon.active { background-image: url(../images/icons/sensor_acc_on.png); - color: #818181; } .magicon { background-image: url(../images/icons/sensor_mag_off.png); background-size: 42px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .magicon.active { background-image: url(../images/icons/sensor_mag_on.png); - color: #818181; } .gpsicon { background-image: url(../images/icons/sensor_sat_off.png); background-size: 42px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .gpsicon.active { background-image: url(../images/icons/sensor_sat_on.png); - color: #818181; } .baroicon { background-image: url(../images/icons/sensor_baro_off.png); background-size: 40px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .baroicon.active { background-image: url(../images/icons/sensor_baro_on.png); - color: #818181; } .sonaricon { background-image: url(../images/icons/sensor_sonar_off.png); background-size: 41px; background-position: -4px 1px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .sonaricon.active { background-image: url(../images/icons/sensor_sonar_on.png); - color: #818181; } #sensor-status li:last-child { - border-right: 0px solid #c0c0c0; + border-right: 0 solid #c0c0c0; border-top-right-radius: 5px; border-bottom-right-radius: 5px; } #sensor-status li:first-child { - border-left: 0px solid #c0c0c0; + border-left: 0 solid #c0c0c0; border-top-left-radius: 5px; border-bottom-left-radius: 5px; } @@ -406,83 +496,349 @@ input[type="number"]::-webkit-inner-spin-button { background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); } -#options { - float: right; - width: 20px; - height: 20px; - margin-top: 10px; - margin-right: 10px; - background-image: url(../images/CF_settings_white.svg); - background-position: -1px -1px; - background-repeat: no-repeat; - opacity: 0.4; -} - -#options:hover { - opacity: 0.65; -} +/* Dataflash element styling*/ -#options.active { - opacity: 0.65; -} +#dataflash_wrapper_global { + color:white; + font-size:10px; + width:125px; + margin-right: 5px; + line-height: 12px; + height: 33px; + border-radius: 5px; + border: 1px solid #272727; + box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); + background-color: #434343; + background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); + padding-top:5px; + display:none; + text-shadow: 0 1px rgba(0, 0, 0, 1.0); -#options.active:hover { - opacity: 0.75; } -#options-window { - display: none; - position: fixed; - right: 35px; - top: 25px; - padding: 5px; - line-height: 20px; - border: 1px solid var(--subtleAccent); - background-color: white; - border-radius: 5px; - z-index: 10000; +@media all and (min-width: 1125px) { + #dataflash_wrapper_global { + margin-right: 10px; + } } -#options-window input { - float: left; - margin-top: 4px; +.dataflash-contents_global { + margin-top: 18px; + border: 1px solid #4A4A4A; + background-color: #4A4A4A; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + border-radius: 3px; + margin-left: 5px; margin-right: 5px; } -#options-window .separator { - padding-bottom: 10px; - margin-bottom: 10px; - border-bottom: 2px solid var(--subtleAccent); + +.dataflash-free_global { + background-color: var(--accent); + border-radius: 4px; } -#options-window .dropdown { - float: left; - width: auto; - margin-right: 5px; + +.dataflash-contents_global .notsupported_global { + display: none; } -#options-window select { - margin-right: 2px; - background: var(--boxBackground); - color: var(--defaultText); - border: 1px solid var(--subtleAccent); - border-radius: 3px; +.dataflash-contents_global li { + height: 5px; + position: relative; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); + border-radius: 2px; + +} + +.dataflash-contents_global li div { + position: absolute; + top: -18px; + margin-top: 0; + left: 0; + right: 0; + width:120px; + text-align: left; + color:silver; +} + +.dataflash-contents_global progress::-webkit-progress-bar { + height: 8px; + background-color: #eee; +} + +.dataflash-contents progress::-webkit-progress-value { + background-color: #bcf; +} + +.noflash_global { + display:none; + color: #868686; + text-align: center; + text-shadow: 0 1px rgba(0, 0, 0, 1.0); + margin-top:2px; +} + +#expertMode { + color: var(--subtleAccent); + margin-top: 27px; + width:125px; + float: right; + margin-right: 0; + line-height: 12px; +} + +/* Battery element styling*/ + +#quad-status_wrapper { + display:none; + color: white; + font-size: 10px; + min-width: 90px; + margin-right: 10px; + line-height: 12px; + height: 67px; + border-radius: 5px; + border: 1px solid #272727; + box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); + background-color: #434343; + background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); + text-shadow: 0 1px rgba(0, 0, 0, 1.0); +} + +@media all and (min-width: 1125px) { + #quad-status_wrapper { + margin-right: 20px; + } +} + +.quad-status-contents { + display: none; + margin-top: 10px; + margin-left: 14px; + height: 10px; + width: 31px; +} + + +.battery-legend { + display: inline; + position: relative; + top: -2px; + margin-top: 0; + left: 0; + right: 0; + width: 40px; + text-align: left; + color: silver; + margin-left: -8px; + padding-right: 4px +} + +.quad-status-contents progress::-webkit-progress-bar { + height: 12px; + background-color: #eee; +} + +.quad-status-contents progress::-webkit-progress-value { + background-color: #bcf; +} + +.battery-status { + height: 11px; +} + +.battery-status.state-ok { + background-color: #59AA29; +} +.battery-status.state-warning { + background-color: var(--error); +} + +.battery-status.state-empty { + animation: error-blinker 1s linear infinite; +} + +@keyframes error-blinker { + 0% { + background-color: transparent; + } + 50% { + background-color: var(--error); + } +} + +.battery-icon { + background-image: url(../images/icons/cf_icon_bat_grey.svg); + background-size: contain; + background-position: center; + display: inline-block; + height: 30px; + width: 60px; + transition: none; + margin-top: 4px; + margin-left: -4px; + background-repeat: no-repeat; +} + + +.armedicon, +.failsafeicon, +.linkicon { + margin-left: 8px; + margin-right: 8px; + margin-top: 6px; + height: 18px; + width: 18px; + opacity: 0.8; + background-size: contain; + background-position: center; + transition: none; +} + +.armedicon { + background-image: url(../images/icons/cf_icon_armed_grey.svg); +} +.armedicon.active { + background-image: url(../images/icons/cf_icon_armed_active.svg); +} + +.failsafeicon { + background-image: url(../images/icons/cf_icon_failsafe_grey.svg); +} +.failsafeicon.active { + background-image: url(../images/icons/cf_icon_failsafe_active.svg); } -#options-window span { - vertical-align: text-bottom; +.linkicon { + background-image: url(../images/icons/cf_icon_link_grey.svg); +} +.linkicon.active { + background-image: url(../images/icons/cf_icon_link_active.svg); +} + +/** Header (phones) **/ +@media all and (max-width: 575px) { + .headerbar { + height: 56px; + background: rgba(0, 0, 0, 0.15); + flex-wrap: wrap; + align-content: flex-start; + padding-top: 12px; + box-sizing: border-box; + transition: all 0.2s; + } + + .headerbar.expand { + height: 154px; + } + + .headerbar.expand2 { + height: 118px; + } + + #menu_btn, #reveal_btn { + display: block; + } + + #menu_btn { + order: 1; + } + + #logo { + height: 24px; + width: 150px; + background-image: url(../images/light-wide-2-compact.svg); + background-position: left center; + order: 2; + margin-top: 0; + } + + #header_btns { + margin-left: auto; + order: 3; + } + + .open_firmware_flasher, .connect_controls { + width: 31px; + height: 31px; + margin-left: 15px; + } + + .firmware_b, .connect_b { + margin: 0; + zoom: 0.6; + } + + .logo_text, #port-picker, .header-wrapper, .flash_state, .connect_state { + display: none !important; + } + + #reveal_btn { + order: 4; + } + + #port-picker { + order: 5; + justify-content: space-between; + margin-top: 15px; + transition: all 0.2s; + } + + #port-picker.reveal { + display: flex !important; + width: 100%; + margin-left: 0; + } + + #port-override-option, #portsinput { + flex-grow: 1; + } + + #portsinput { + margin-right: 0; + } + + #port-override { + width: calc(100% - 40px); + } + + .header-wrapper { + order: 5; + zoom: 62%; + justify-content: space-around; + } + + .header-wrapper.reveal { + display: flex !important; + width: 100%; + margin-top: 24px; + } + + #dataflash_wrapper_global, #sensor-status, #quad-status_wrapper { + margin-right: 0; + } } -/* Log setup*/ + + +/** Log **/ #log { - margin-bottom: 0px; - border: 0px solid silver; /* was 1px*/ background-color: #242424; - color: #ccc; color: rgba(255, 255, 255, 0.60); line-height: 21px; - height: 27px; /* was 65*/ - overflow-y: hidden; /* scroll*/ + height: 27px; + overflow-y: hidden; + transition: all 0.2s; +} + +#log.active { + overflow-y: auto; + box-shadow: inset 0 0 15px #000000; + height: 111px; } #scrollicon { @@ -491,36 +847,24 @@ input[type="number"]::-webkit-inner-spin-button { top: 113px; height: 27px; width: 27px; - background-image: url(../images/icons/scroll.svg); background-repeat: no-repeat; - background-size: 100%; + background-image: url(../images/icons/scroll.svg); opacity: 0.0; - transition: all ease 0.3s; + transition: all ease 0.2s; } #scrollicon.active { - height: 110px; - margin-top: 10px; + height: 88px; + margin-top: 13px; margin-right: 20px; - width: 110px; + width: 88px; opacity: 0.15; - background-size: 80%; - box-shadow: inset 0 0 5px #000000; - transition: all ease 0.3s; -} - -#log.active { - overflow-y: auto; - box-shadow: inset 0 0 15px #000000; } #log .wrapper { - padding: 5px; /* was 5*/ - padding-left: 10px; - padding-bottom: 4px; - -webkit-user-select: text; + padding: 5px 5px 4px 10px; position: relative; - bottom: 0px; + bottom: 0; } #log a { @@ -532,71 +876,130 @@ input[type="number"]::-webkit-inner-spin-button { text-decoration: underline; } -/* Log switch */ .logswitch { position: absolute; right: 20px; - margin-top: -1px; - float: right; padding: 2px; z-index: 10; } .logswitch a { color: #656565 !important; - transition: all 0.3s; + transition: all 0.2s; } .logswitch a:hover { color: #959595 !important; text-decoration: none !important; - transition: all 0.3s; } -.tab_container { - float: left; - height: calc(100% - 150px); - width: 200px; - border-right: 4px solid var(--accent); - background-color: #2e2e2e; - transition: all 0.2s; - +/** Log (phones) **/ +@media all and (max-width: 575px) { + #log.active { + box-shadow: none; + } + .logswitch { + background-color: #242424; + } + #scrollicon { + display: none; + } } -.tab_container.logopen { - height: calc(100% - 235px); - overflow-x: hidden; - overflow-y: auto; - transition: all 0.5s; -} -#tabs { - font-size: 13px; +/** Tabs & content container **/ +#tab-content-container { + display: flex; + height: calc(100% - 162px); + align-items: stretch; } -.header-wrapper .mode-connected { - display: none; +#tab-content-container.logopen { + height: calc(100% - 247px); } -#tabs ul.mode-connected { - display: none; +#tab-content-container, .tab_container, #content { + transition: all 0.2s; } -#tabs ul.mode-connected-cli { - display: none; +.tab_container.logopen, #content { + overflow-x: hidden; + overflow-y: auto; } -#tabs li { +/** Tabs & content container (phones) **/ +@media all and (max-width: 575px) { + #tab-content-container { + height: calc(100% - 83px); + } + #tab-content-container.logopen { + height: calc(100% - 167px); + } + #tab-content-container.header_expanded { + height: calc(100% - 181px); + } + #tab-content-container.header_expanded2 { + height: calc(100% - 145px); + } + #tab-content-container.logopen.header_expanded { + height: calc(100% - 265px); + } + #tab-content-container.logopen.header_expanded2 { + height: calc(100% - 229px); + } +} + + +/** Tabs **/ +.tab_container { + width: 200px; + border-right: 4px solid var(--accent); + background-color: #2e2e2e; +} + +#tab_logoversion { + display: none; + background-image: url(../images/light-wide-2.svg); + background-repeat: no-repeat; + background-position: center 20px; + background-size: 80%; + height: 120px; + position: relative; + border-bottom: 1px solid rgba(0, 0, 0, 0.30); +} +#tab_logoversion .logo_text { + display: block !important; + left: 100px; + top: 62px; +} + +#tabs { + font-size: 13px; +} + +.header-wrapper .mode-connected { + display: none; +} + +#tabs ul.mode-connected { + display: none; +} + +#tabs ul.mode-connected-cli { + display: none; +} + +#tabs li { border-bottom: 1px solid rgba(0, 0, 0, 0.30); } #tabs li:first-child { - border-top: 0px; + border-top: 0; } #tabs li:last-child { - border-bottom: 0px; + border-bottom: 0; } #tabs li a { @@ -608,7 +1011,7 @@ input[type="number"]::-webkit-inner-spin-button { color: #999999; height: 23px; display: block; - text-shadow: 0px 1px rgba(0, 0, 0, 0.45); + text-shadow: 0 1px rgba(0, 0, 0, 0.45); transition: none; border-top: solid 1px rgba(255, 255, 255, 0.05); /* following is just for a graceful degradation */ @@ -633,7 +1036,7 @@ input[type="number"]::-webkit-inner-spin-button { background-color: var(--accent); color: #000; transition: none; - text-shadow: 0px 1px rgba(255, 255, 255, 0.45); + text-shadow: 0 1px rgba(255, 255, 255, 0.45); } @@ -648,6 +1051,53 @@ input[type="number"]::-webkit-inner-spin-button { background-position: 13px 7px; } +@media only screen and (max-height: 750px) , only screen and (max-device-height: 750px) { + .tab_container { + overflow-x: hidden; + overflow-y: auto; + } +} + +@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { + #tabs li a { + font-weight: normal; + font-size: 12px; + padding-left: 60px; + padding-top: 6px; + padding-bottom: 2px; + content: ""; + text-shadow: none; + transition: none; + /* following is just for a graceful degradation */ + text-overflow: clip; + white-space: nowrap; + overflow: hidden; + } + + .tab_container { + width: 42px; + } +} + +/** Tabs (phones) **/ +@media all and (max-width: 575px) { + .tab_container { + position: fixed; + z-index: 2000; + top: 0; + left: -304px; + bottom: 0; + width: 300px; + transition: all 0.3s; + } + .tab_container.reveal { + left: 0; + } + #tab_logoversion { + display: block; + } +} + /* Tab-Icons */ .ic_setup { background-image: url(../images/icons/cf_icon_setup_grey.svg); @@ -964,35 +1414,34 @@ li.active .ic_mission { background-image: url(../images/icons/cf_icon_mission_white.svg); } + + +/** Content **/ #content { - margin-top: 0px; - padding: 0px; - height: calc(100% - 156px); - /* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/ background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0px solid #848484; -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.3s; + width: calc(100% - 202px); } -#content.logopen { - margin-top: 0px; - padding: 0px; - height: calc(100% - 240px); /* (port picker, log OPEN, status bar: 20px + padding) - was: calc(100% - 171px)*/ - background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0px solid #848484; - -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.5s; - /* Cause the height to shrink to contain its floated contents while log is open */ +@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { + #content { + width: calc(100% - 42px); + } +} + +/** Content (phones) **/ +@media all and (max-width: 575px) { + #content { + width: 100%; + } } + + +/** Status bar **/ #status-bar { position: fixed; - bottom: 0px; + bottom: 0; width: calc(100% - 20px); height: 20px; line-height: 20px; @@ -1015,6 +1464,15 @@ li.active .ic_mission { border: 0; } +/** Status bar (phones) **/ +@media all and (max-width: 575px) { + #status-bar { + display: none; + } +} + + + #cache { display: none; } @@ -1047,8 +1505,8 @@ dialog { dialog .dialog_toolbar .btn a { /* common styles for content toolbar buttons */ - margin-top: 0px; - margin-bottom: 0px; + margin-top: 0; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1057,13 +1515,11 @@ dialog .dialog_toolbar .btn a { float: left; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1075,7 +1531,7 @@ dialog .dialog_toolbar .btn a:hover { dialog .dialog_toolbar .btn a:active { background-color: var(--accent); transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } dialog .dialog_toolbar .btn a.disabled { @@ -1087,6 +1543,18 @@ dialog .dialog_toolbar .btn a.disabled { text-shadow: none; opacity: 0.5; } + +@media all and (max-width: 575px) { + dialog { + position: fixed; + width: calc(100% - 2em); + bottom: 0; + top: 56px; + border-radius: unset; + border: none; + overflow: auto; + } +} /* Border of the Tab */ /* Tab Title */ @@ -1104,7 +1572,7 @@ dialog .dialog_toolbar .btn a.disabled { background-color: #fff7cd; border: 1px solid #ffe55f; margin-bottom: 10px; - margin-top: 0px; + margin-top: 0; border-radius: 3px; font-size: 11px; font-weight: normal; @@ -1116,7 +1584,7 @@ dialog .dialog_toolbar .btn a.disabled { } .content_wrapper { - padding: 20px; + padding: 20px 20px 20px 19px; position: relative; } @@ -1133,8 +1601,8 @@ dialog .dialog_toolbar .btn a.disabled { .content_toolbar .btn a { /* common styles for content toolbar buttons */ - margin-top: 0px; - margin-bottom: 0px; + margin-top: 0; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1143,13 +1611,11 @@ dialog .dialog_toolbar .btn a.disabled { float: right; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1161,7 +1627,7 @@ dialog .dialog_toolbar .btn a.disabled { .content_toolbar .btn a:active { background-color: var(--accent); transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .content_toolbar .btn a.disabled { @@ -1193,6 +1659,7 @@ dialog .dialog_toolbar .btn a.disabled { .toolbar_fixed_bottom .content_toolbar { display: flex; + flex-wrap: wrap; position: absolute; bottom: 0; left: 0; @@ -1203,6 +1670,50 @@ dialog .dialog_toolbar .btn a.disabled { margin-left: auto; } +.toolbar_fixed_bottom .content_toolbar.xs-compressed { + flex-direction: row-reverse; +} + +.toolbar_fixed_bottom .content_toolbar.xs-compressed div:first-child { + margin-left: 0; +} + +.toolbar_fixed_bottom .content_toolbar.xs-compressed div:last-child { + margin-left: auto; +} + +.toolbar_expand_btn { + display: none; + position: absolute; + bottom: 15px; + left: 15px; + width: 20px; + height: 20px; + font-size: 20px; + line-height: 20px; + text-align: center; + z-index: 2000; +} + +@media all and (max-width: 575px) { + .toolbar_fixed_bottom .content_toolbar.xs-compressed { + padding-left: 60px; + box-sizing: border-box; + height: 50px; + } + .toolbar_fixed_bottom .content_toolbar.xs-compressed.expanded { + padding-left: 15px; + padding-bottom: 0; + height: auto; + } + .toolbar_fixed_bottom .content_toolbar.xs-compressed div { + margin-bottom: 10px; + } + .toolbar_expand_btn { + display: block; + } +} + /** Hack to change the "display: none" by a "visibility:hidden", to apply the margin-left: auto needed by the first element to align to the right the buttons */ .toolbar_fixed_bottom .content_toolbar div[style='display: none;']:first-child { @@ -1213,7 +1724,7 @@ dialog .dialog_toolbar .btn a.disabled { /* Colums START> */ .cf_column { min-height: 20px; - margin-bottom: 0px; + margin-bottom: 0; } .full { @@ -1331,11 +1842,11 @@ dialog .dialog_toolbar .btn a.disabled { .gui_box_titlebar { background-color: var(--quietHeader); color: var(--quietText); - border-radius: 3px 3px 0px 0px; + border-radius: 3px 3px 0 0; font-size: 13px; width: 100%; height: 27px; - padding-bottom: 0px; + padding-bottom: 0; float: left; margin-bottom: 7px; font-weight: 600; @@ -1343,11 +1854,11 @@ dialog .dialog_toolbar .btn a.disabled { .gui_box_bottombar { background-color: #e4e4e4; - border-radius: 0px 0px 3px 3px; + border-radius: 0 0 3px 3px; font-size: 13px; width: 100%; height: 27px; - padding-top: 0px; + padding-top: 0; float: left; font-weight: 600; } @@ -1361,7 +1872,7 @@ dialog .dialog_toolbar .btn a.disabled { padding-left: 10px; padding-right: 10px; padding-top: 4px; - margin-bottom: 0px; + margin-bottom: 0; float: left; } @@ -1373,13 +1884,13 @@ dialog .dialog_toolbar .btn a.disabled { width: calc(100% + 40px); margin-left: -20px; box-shadow: rgba(0, 0, 0, 0.00) 0 -3px 8px; - bottom: 0px; - margin-bottom: 0px; + bottom: 0; + margin-bottom: 0; } .fixed_band .save_btn a { margin-top: 9px; - margin-bottom: 0px; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1388,13 +1899,11 @@ dialog .dialog_toolbar .btn a.disabled { float: right; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 1px rgba(0, 0, 0, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1408,12 +1917,12 @@ dialog .dialog_toolbar .btn a.disabled { width: 100%; position: relative; margin-bottom: 10px; - margin-top: 0px; + margin-top: 0; float: left; } .default_btn a { - padding: 5px 0px 5px 0px; + padding: 5px 0 5px 0; text-align: center; background-color: var(--accent); border-radius: 4px; @@ -1437,7 +1946,7 @@ dialog .dialog_toolbar .btn a.disabled { .default_btn a:hover { background-color: #ffcc3f; color: #000; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); transition: all ease 0.2s; text-decoration:none; @@ -1446,7 +1955,7 @@ dialog .dialog_toolbar .btn a.disabled { .default_btn a:active { background-color: #ffcc3f; transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .margin-top5 { @@ -1463,13 +1972,11 @@ dialog .dialog_toolbar .btn a.disabled { color: #000; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: inline-block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1477,7 +1984,7 @@ dialog .dialog_toolbar .btn a.disabled { width: auto; position: relative; margin-bottom: 7px; - margin-top: 0px; + margin-top: 0; margin-right: 5px; float: left; } @@ -1485,7 +1992,7 @@ dialog .dialog_toolbar .btn a.disabled { .small a { padding: 3px 4px 4px 4px; text-align: center; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 1px rgba(0, 0, 0, 0.25); background-color: #acacac; border-radius: 3px; border: 1px solid #949494; @@ -1500,509 +2007,123 @@ dialog .dialog_toolbar .btn a.disabled { .small a:hover { background-color: var(--accent); color: #000; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); border: 1px solid var(--accent); transition: all ease 0.2s; } -.small a:active { - background-color: #878787; - transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); -} - -.green a { - background-color: var(--accent); - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); - color: #000; - border: 1px solid #dba718; - transition: all ease 0.2s; -} - -.green a:hover { - background-color: #ffcc3f; - border: 1px solid #dba718; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); - color: #000; - transition: all ease 0.2s; -} - -/* Table styling */ -.cf_table { - margin-bottom: 5px; - float: left; - margin-top: -5px; - font-size: 11px; - width: 100%; -} - -.cf_table td { - border: 0px; - padding-top: 2px; - padding-bottom: 5px; -} - -.cf_table tr:not(:last-child) td { - border-bottom: solid 1px var(--subtleAccent); - border-style: dotted; -} - -.third { - width: 33%; -} - -.noboarder td { - border: none; -} - -.cf_table td:last-child { - text-align: right; -} - -.gps_false { - background-color: #FF0004; - padding: 1px 7px 2px 7px; - border-radius: 3px; - color: #FFFFFF; - font-size: 11px; - margin-left: 3px; -} - -.gps_true { - background-color: var(--accent); - padding: 1px 7px 2px 7px; - border-radius: 3px; - color: #FFFFFF; - font-size: 11px; - margin-left: 3px; -} - -/* connect button */ -.connect_controls { - position: relative; - float: right; - left: 0px; - top: 19px; - height: 70px; - width: 60px; - margin-right: 20px; - margin-left: 20px; -} - -@media all and (min-width: 1125px) { - .connect_controls { - margin-left: 10px; - margin-right: 15px; - } -} - -/* firmware update button */ -.open_firmware_flasher { - position: relative; - float: right; - left: 0px; - top: 19px; - height: 70px; - width: 60px; - margin-right: 10px; - margin-left: 10px; -} - -@media all and (min-width: 1125px) { - .open_firmware_flasher { - margin-right: 20px; - margin-left: 20px; - } -} - -.connect_b { - float: left; -} - -.connect_b a { - height: 50px; - width: 50px; - border-radius: 100px; - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); - float: left; - margin-left: 5px; - margin-bottom: 7px; - transition: none; -} - -.connect_b a.connect.disabled { - background-color: #808080; - pointer-events: none; - cursor: default; - } - -.connect_b a.connect { - background-color: var(--accent); - border: 1px solid #dba718; - background-image: url(../images/icons/cf_icon_usb2_white.svg); - background-repeat: no-repeat; - background-size: 44px; - background-position: center 6px; - transition: none; -} - -.connect_b a.connect:hover { - background-color: #ffcc3f; -} - -.connect_b a.connect.active { - background-color: #e60000; - border: 1px solid #fe0000; - background-image: url(../images/icons/cf_icon_usb1_white.svg); - transition: none; -} - -.connect_b a.connect.active:hover { - background-color: #f21212; -} - -.firmware_b { - float: left; -} - -.firmware_b a { - height: 50px; - width: 50px; - border-radius: 100px; - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); - float: left; - margin-left: 5px; - margin-bottom: 7px; - transition: none; -} - -.firmware_b a.flash.disabled { - background-color: #808080; - pointer-events: none; - cursor: default; - } - -.firmware_b a.flash { - background-color: var(--accent); - border: 1px solid #dba718; - background-image: url(../images/icons/cf_icon_flasher_white.svg); - background-repeat: no-repeat; - background-size: 30px; - background-position: center 10px; - transition: none; -} - -.firmware_b a.flash:hover { - background-color: #ffcc3f; -} - -.firmware_b a.flash.active { - background-color: #e60000; - border: 1px solid #fe0000; - background-image: url(../images/icons/cf_icon_flasher_white.svg); - transition: none; -} - -.firmware_b a.flash.active:hover { - background-color: #f21212; -} - -.connect_state { - float: left; - height: 20px; - width: 100%; - text-align: center; - color: #fff; - font-size: 12px; - font-weight: normal; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); - margin-top: -1px; -} - -.flash_state { - float: left; - height: 20px; - width: 100%; - text-align: center; - color: #fff; - font-size: 12px; - font-weight: normal; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); - margin-top: -1px; -} - -/* fixing padding for all Tabs*/ -.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-firmware_flasher, - .tab-gps, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning, .tab-ports, .tab-receiver, - .tab-sensors, .tab-servos, .tab-osd, .tab-power { - height: 100%; - position: relative; -} - -/* fixing logging tab*/ -.properties { - width: 800px; -} - -.properties dl { - width: 200px; -} - -.properties dd { - width: 400px; - height: auto; -} - -/* GPS Fix styling*/ -.fixtrue { - background-color: #56ac1d; - padding: 2px; - padding-left: 5px; - padding-right: 5px; - border-radius: 3px; - color: #fff; - font-size: 10px; -} - -.fixfalse { - background-color: #e60000; - padding: 2px; - padding-left: 5px; - padding-right: 5px; - border-radius: 3px; - color: #fff; - font-size: 10px; -} -/* Dataflash element styling*/ - -#dataflash_wrapper_global { - color:white; - font-size:10px; - margin-top: 20px; - width:125px; - float: right; - margin-right: 5px; - line-height: 12px; - height: 33px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0px 1px 0px rgba(92, 92, 92, 0.5); - background-color: #434343; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - padding-top:5px; - display:none; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); - -} - -@media all and (min-width: 1125px) { - #dataflash_wrapper_global { - margin-right: 10px; - } -} - -.dataflash-contents_global { - margin-top: 18px; - border: 1px solid #4A4A4A; - background-color: #4A4A4A; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: flex-start; - border-radius: 3px; - margin-left: 5px; - margin-right: 5px; -} - - -.dataflash-free_global { - background-color: var(--accent); - border-radius: 4px; -} - - -.dataflash-contents_global .notsupported_global { - display: none; -} - -.dataflash-contents_global li { - height: 5px; - position: relative; - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); - border-radius: 2px; - -} - -.dataflash-contents_global li div { - position: absolute; - top: -18px; - margin-top: 0px; - left: 0; - right: 0; - width:120px; - text-align: left; - color:silver; -} - -.dataflash-contents_global progress::-webkit-progress-bar { - height: 8px; - background-color: #eee; -} - -.dataflash-contents progress::-webkit-progress-value { - background-color: #bcf; -} - -.noflash_global { - display:none; - color: #868686; - text-align: center; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); - margin-top:2px; -} - -.cf_tooltiptext { - display:none; +.small a:active { + background-color: #878787; + transition: all ease 0.0s; + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } -#expertMode { - color: var(--subtleAccent); - margin-top: 27px; - width:125px; - float: right; - margin-right: 0px; - line-height: 12px; +.green a { + background-color: var(--accent); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); + color: #000; + border: 1px solid #dba718; + transition: all ease 0.2s; } -/* Battery element styling*/ - -#quad-status_wrapper { - display:none; - color: white; - font-size: 10px; - margin-top: 20px; - min-width: 90px; - float: right; - margin-right: 10px; - line-height: 12px; - height: 67px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0px 1px 0px rgba(92, 92, 92, 0.5); - background-color: #434343; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); +.green a:hover { + background-color: #ffcc3f; + border: 1px solid #dba718; + text-shadow: 0 1px rgba(255, 255, 255, 0.25); + color: #000; + transition: all ease 0.2s; } -@media all and (min-width: 1125px) { - #quad-status_wrapper { - margin-right: 20px; - } +/* Table styling */ +.cf_table { + margin-bottom: 5px; + float: left; + margin-top: -5px; + font-size: 11px; + width: 100%; } -.quad-status-contents { - display: none; - margin-top: 10px; - margin-left: 14px; - height: 10px; - width: 31px; +.cf_table td { + border: 0; + padding-top: 2px; + padding-bottom: 5px; } - -.battery-legend { - display: inline; - position: relative; - top: -2px; - margin-top: 0px; - left: 0; - right: 0; - width: 40px; - text-align: left; - color: silver; - margin-left: -8px; - padding-right: 4px +.cf_table tr:not(:last-child) td { + border-bottom: dotted 1px var(--subtleAccent); } -.quad-status-contents progress::-webkit-progress-bar { - height: 12px; - background-color: #eee; +.third { + width: 33%; } -.quad-status-contents progress::-webkit-progress-value { - background-color: #bcf; +.noboarder td { + border: none; } -.battery-status { - height: 11px; +.cf_table td:last-child { + text-align: right; } -.battery-status.state-ok { - background-color: #59AA29; -} -.battery-status.state-warning { - background-color: var(--error); +.gps_false { + background-color: #FF0004; + padding: 1px 7px 2px 7px; + border-radius: 3px; + color: #FFFFFF; + font-size: 11px; + margin-left: 3px; } -.battery-status.state-empty { - animation: error-blinker 1s linear infinite; +.gps_true { + background-color: var(--accent); + padding: 1px 7px 2px 7px; + border-radius: 3px; + color: #FFFFFF; + font-size: 11px; + margin-left: 3px; } -@keyframes error-blinker { - 0% { - background-color: none; - } - 50% { - background-color: var(--error); - } +/* fixing padding for all Tabs*/ +.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-firmware_flasher, + .tab-gps, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning, .tab-ports, .tab-receiver, + .tab-sensors, .tab-servos, .tab-osd, .tab-power { + height: 100%; + position: relative; } -.battery-icon { - background-image: url(../images/icons/cf_icon_bat_grey.svg); - background-size: contain; - background-position: center; - display: inline-block; - height: 30px; - width: 60px; - transition: none; - margin-top: 4px; - margin-left: -4px; - background-repeat: no-repeat; +/* fixing logging tab*/ +.properties { + width: 800px; } - -.armedicon, -.failsafeicon, -.linkicon { - margin-left: 8px; - margin-right: 8px; - margin-top: 6px; - height: 18px; - width: 18px; - opacity: 0.8; - background-size: contain; - background-position: center; - transition: none; +.properties dl { + width: 200px; } -.armedicon { - background-image: url(../images/icons/cf_icon_armed_grey.svg); -} -.armedicon.active { - background-image: url(../images/icons/cf_icon_armed_active.svg); +.properties dd { + width: 400px; + height: auto; } -.failsafeicon { - background-image: url(../images/icons/cf_icon_failsafe_grey.svg); -} -.failsafeicon.active { - background-image: url(../images/icons/cf_icon_failsafe_active.svg); +/* GPS Fix styling*/ +.fixtrue { + background-color: #56ac1d; + padding: 2px 5px; + border-radius: 3px; + color: #fff; + font-size: 10px; } -.linkicon { - background-image: url(../images/icons/cf_icon_link_grey.svg); +.fixfalse { + background-color: #e60000; + padding: 2px 5px; + border-radius: 3px; + color: #fff; + font-size: 10px; } -.linkicon.active { - background-image: url(../images/icons/cf_icon_link_active.svg); + +.cf_tooltiptext { + display:none; } .bottomStatusIcons { @@ -2043,7 +2164,7 @@ button.active { @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .content_wrapper { - padding: 15px; + padding: 15px 15px 15px 14px; } .tab_title { @@ -2061,10 +2182,6 @@ button.active { line-height: 15px; } -#content { - height: calc(100% - 151px); -} - .cf_table td { padding-top: 2px; padding-bottom: 2px; @@ -2074,29 +2191,10 @@ button.active { margin-bottom: 10px; } -#tabs li a { - font-weight: normal; - font-size: 12px; - padding-left: 60px; - padding-top: 6px; - padding-bottom: 2px; - content: ""; - text-shadow: none; - transition: none; - /* following is just for a graceful degradation */ - text-overflow: clip; - white-space: nowrap; - overflow: hidden; -} - -.tab_container { - width: 42px; -} - .gui_box_titlebar { font-size: 12px; height: 24px; - padding-bottom: 0px; + padding-bottom: 0; margin-bottom: 5px; float: left; } @@ -2105,7 +2203,7 @@ button.active { padding-left: 10px; padding-right: 10px; padding-top: 3px; - margin-bottom: 0px; + margin-bottom: 0; float: left; } @@ -2123,12 +2221,12 @@ input { } .gps_false { - padding: 0px 3px 0px 3px; + padding: 0 3px 0 3px; font-size: 10px; } .gps_true { - padding: 0px 3px 0px 3px; + padding: 0 3px 0 3px; font-size: 10px; } @@ -2151,15 +2249,6 @@ input { display: none; } -@media only screen and (max-height: 750px) , only screen and (max-device-height: 750px) { - -.tab_container { - overflow-x: hidden; - overflow-y: auto; -} - -} - .darkgrey_box { background-color: #575757; color: white; @@ -2210,8 +2299,7 @@ input { } .dialogReportProblems-listItem { - list-style: initial; - list-style-type: circle; + list-style: circle; margin-left: 20px; margin-bottom: 5px; } @@ -2249,3 +2337,156 @@ input { .noUi-connect { box-shadow: none; } + +/** Responsive grid **/ +@media all and (max-width: 575px) { + .sm, .md, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 576px) and (max-width: 767px) { + .xs, .md, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 768px) and (max-width: 991px) { + .xs, .sm, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 992px) and (max-width: 1139px) { + .xs, .sm, .md, .xl { + display: none !important; + } +} +@media all and (min-width: 1140px) { + .xs, .sm, .md, .lg { + display: none !important; + } +} +@media all and (min-width: 576px) { + .sm-max { + display: none !important; + } +} +@media all and (min-width: 768px) { + .md-max { + display: none !important; + } +} +@media all and (min-width: 992px) { + .lg-max { + display: none !important; + } +} +@media all and (max-width: 1139px) { + .lg-min { + display: none !important; + } +} +@media all and (max-width: 991px) { + .md-min { + display: none !important; + } +} +@media all and (max-width: 767px) { + .sm-min { + display: none !important; + } +} +.grid-row { + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + box-sizing: border-box; +} +.grid-col { + margin-left: 7px; + margin-right: 7px; +} +.grid-col.col1 { + width: calc(8.33% - 14px); +} +.grid-col.col2 { + width: calc(16.67% - 14px); +} +.grid-col.col3 { + width: calc(25% - 14px); +} +.grid-col.col4 { + width: calc(33.33% - 14px); +} +.grid-col.col5 { + width: calc(41.67% - 14px); +} +.grid-col.col6 { + width: calc(50% - 14px); +} +.grid-col.col7 { + width: calc(58.33% - 14px); +} +.grid-col.col8 { + width: calc(66.67% - 14px); +} +.grid-col.col9 { + width: calc(75% - 14px); +} +.grid-col.col10 { + width: calc(83.33% - 14px); +} +.grid-col.col11 { + width: calc(91.67% - 14px); +} +.grid-col.col12 { + width: calc(100% - 14px); +} +.grid-col:first-child { + margin-left: 0; +} +.grid-col:last-child { + margin-right: 0; +} +.grid-col.col1:first-child, .grid-col.col1:last-child { + width: calc(8.33% - 7px); +} +.grid-col.col2:first-child, .grid-col.col2:last-child { + width: calc(16.67% - 7px); +} +.grid-col.col3:first-child, .grid-col.col3:last-child { + width: calc(25% - 7px); +} +.grid-col.col4:first-child, .grid-col.col4:last-child { + width: calc(33.33% - 7px); +} +.grid-col.col5:first-child, .grid-col.col5:last-child { + width: calc(41.67% - 7px); +} +.grid-col.col6:first-child, .grid-col.col6:last-child { + width: calc(50% - 7px); +} +.grid-col.col7:first-child, .grid-col.col7:last-child { + width: calc(58.33% - 7px); +} +.grid-col.col8:first-child, .grid-col.col8:last-child { + width: calc(66.67% - 7px); +} +.grid-col.col9:first-child, .grid-col.col9:last-child { + width: calc(75% - 7px); +} +.grid-col.col10:first-child, .grid-col.col10:last-child { + width: calc(83.33% - 7px); +} +.grid-col.col11:first-child, .grid-col.col11:last-child { + width: calc(91.67% - 7px); +} +.grid-col.col12:first-child, .grid-col.col12:last-child { + width: calc(100% - 7px); +} +@media all and (max-width: 575px) { + .grid-col.col1, .grid-col.col2, .grid-col.col3, .grid-col.col4, .grid-col.col5, .grid-col.col6, .grid-col.col7, .grid-col.col8, .grid-col.col9, .grid-col.col10, .grid-col.col11, .grid-col.col12 { + width: 100% !important; + margin-left: 0 !important; + margin-right: 0 !important; + } +} diff --git a/src/css/main_cordova.css b/src/css/main_cordova.css new file mode 100644 index 0000000000..4b83daf66c --- /dev/null +++ b/src/css/main_cordova.css @@ -0,0 +1,102 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} +html, body, #loading, #webview_troubleshooting { + width: 100%; + height: 100%; +} +body { + display: flex; + flex-direction: column; + font-family: 'Open Sans', 'Segoe UI', Tahoma, sans-serif; + font-size: 12px; + color: #303030; + background-color: #3d3f3e; +} +#headerbar { + display: flex; + align-items: center; + justify-content: center; + height: 56px; + padding: 0 20px; + background: rgba(0, 0, 0, 0.15); +} +#headerbar img { + height: 20px; +} +#loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: #ffffff; +} +#loading p { + font-weight: bold; + margin-top: 20px; +} +#webview_troubleshooting { + display: none; + background: #ffffff; + padding: 20px; +} +#webview_apps { + list-style: inside; +} +#webview_step_btn1, #webview_step_btn2 { + margin-top: 10px; +} +#webview_step_btn2 { + display: none; +} +.box { + border: 1px solid #ccc; + border-radius: 4px; + width: 100%; + margin-bottom: 20px; + background-color: #f9f9f9; + overflow: hidden; +} +.box .box_titlebar { + width: 100%; + background-color: #828885; + color: #ffffff; + font-size: 13px; + height: 27px; + line-height: 27px; + font-weight: 600; + padding: 0 10px; +} +.box .box_titlebar.warning { + background-color: #ffbb00; +} +.box .box_body { + padding: 10px; +} +.divider { + margin: 10px 0 9px 0; + border-top: 1px solid #ccc; +} +.btn { + padding: 5px; + text-align: center; + background-color: #ffbb00; + border-radius: 4px; + border: 1px solid #dba718; + color: #ffffff; + font-weight: 600; + font-size: 12px; + line-height: 13px; + transition: all ease 0.2s; +} +.btn:hover { + background-color: #ffcc3f; + text-shadow: 0 1px rgba(255, 255, 255, 0.25); +} +.btn:focus { + outline: none; + background-color: #ffcc3f; + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); +} diff --git a/src/css/tabs/adjustments.css b/src/css/tabs/adjustments.css index 28ebed8830..e5edbf9f98 100644 --- a/src/css/tabs/adjustments.css +++ b/src/css/tabs/adjustments.css @@ -108,3 +108,13 @@ .tab-adjustments .adjustment .functionSwitchChannel { width: 5%; } + +@media all and (max-width: 575px) { + .tab-adjustments .overflow { + overflow: auto; + } + + .tab-adjustments .range { + min-width: 300px; + } +} diff --git a/src/css/tabs/auxiliary.css b/src/css/tabs/auxiliary.css index 5f0cf7bf10..f06311da32 100644 --- a/src/css/tabs/auxiliary.css +++ b/src/css/tabs/auxiliary.css @@ -30,13 +30,11 @@ } .tab-auxiliary .mode.off .info { - background: #cb4747; background: #828885; color: white; } .tab-auxiliary .mode.off:nth-child(odd) .info { - background: #cb4747; background: #828885; } @@ -54,18 +52,17 @@ .tab-auxiliary .modes { width: 100%; - border-spacing: 0px; } .tab-auxiliary .mode { background-color: #f9f9f9; vertical-align: top; - border-bottom: 1px solid #000000; + display: flex; } .tab-auxiliary .mode .name { min-height: 80px; - padding: 5px 0px; + padding: 5px 0; } .tab-auxiliary .mode .info { @@ -76,7 +73,7 @@ background-color: #e4e4e4; border-bottom: 5px solid white; color: grey; - min-width: 100px; + min-width: 140px; } .tab-auxiliary .mode .info .name { @@ -86,7 +83,7 @@ .tab-auxiliary .mode .info .buttons { position: absolute; - bottom: 0px; + bottom: 0; width: 100%; } @@ -103,16 +100,17 @@ } .tab-auxiliary .ranges { - margin: 10px; - padding-right: 0px; + padding-right: 0; border-bottom: 5px solid white; + width: 90%; + max-width: calc(100% - 140px); } .tab-auxiliary .range { position: relative; height: 70px; padding-top: 15px; - padding-left: 0px; + padding-left: 0; border-top: 1px solid #fff; border-bottom: 1px solid var(--subtleAccent); background-color: #ececec; @@ -131,25 +129,25 @@ } .tab-auxiliary .range:first-child { - border-top: 0px; + border-top: 0; } .tab-auxiliary .range:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-auxiliary .link:first-child { - border-top: 0px; + border-top: 0; } .tab-auxiliary .link:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-auxiliary .range>.buttons { position: absolute; - top: 0px; - right: 0px; + top: 0; + right: 0; } .tab-auxiliary .range>.buttons .a { @@ -252,7 +250,7 @@ } .tab-auxiliary .fixed_band { - bottom: 0px; + bottom: 0; } .tab-auxiliary .save_btn a { @@ -261,11 +259,67 @@ @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-auxiliary .fixed_band { - margin: 0px; width: calc(100% - -30px); - margin-left: -15px; + margin: 0 0 0 -15px; } .tab-auxiliary .fixed_band .save_btn a { margin-right: 15px; } } + +@media all and (max-width: 575px) { + .tab-auxiliary .mode { + flex-wrap: wrap; + } + .tab-auxiliary .mode .info { + width: 100%; + border-bottom: 0; + } + .tab-auxiliary .mode .info .name { + text-align: left; + padding-left: 10px; + min-height: auto; + } + .tab-auxiliary .mode .info .buttons { + right: 0; + width: auto; + display: flex; + } + .tab-auxiliary .mode .ranges { + width: 100%; + max-width: 100%; + } + .tab-auxiliary .range { + display: flex; + height: auto; + flex-wrap: wrap; + } + .tab-auxiliary .mode .range .channelInfo { + display: flex; + margin: 0 10px; + width: 100%; + flex-wrap: wrap; + } + .tab-auxiliary .limits { + width: 100%; + justify-content: space-between; + display: flex; + } + .tab-auxiliary .range .channel-slider { + width: 100%; + margin: 10px 10px 45px 10px; + } + .tab-auxiliary .delete a { + margin-top: 15px; + margin-right: 10px; + position: absolute; + float: none; + top: 0; + right: 0; + } + .tab-auxiliary .link { + height: auto; + display: flex; + padding-bottom: 10px; + } +} diff --git a/src/css/tabs/cli.css b/src/css/tabs/cli.css index ce64304ca2..d52cbf567b 100644 --- a/src/css/tabs/cli.css +++ b/src/css/tabs/cli.css @@ -7,21 +7,21 @@ } .tab-cli p { - padding: 0px; - border: 0px dotted var(--subtleAccent); + padding: 0; + border: 0 dotted var(--subtleAccent); } .tab-cli .backdrop { border: 1px solid var(--subtleAccent); background-color: rgba(0, 0, 0, 0.75); - margin-top: 0px; + margin-top: 0; height: calc(100% - 90px); /* - (p, textarea) */ background-image: url("../../images/light-wide-1.svg"); background-repeat: no-repeat; background-position: 50% 80%; background-size: 600px; border-radius: 5px; - box-shadow: inset 0px 0px 20px rgba(0, 0, 0, 0.80); + box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.80); width: 100%; } @@ -137,3 +137,9 @@ font-weight: bold; } /* End AutoComplete */ + +@media all and (max-width: 575px) { + .tab-cli .backdrop { + background-size: 100%; + } +} diff --git a/src/css/tabs/configuration.css b/src/css/tabs/configuration.css index 6420f4bd38..66b8392800 100644 --- a/src/css/tabs/configuration.css +++ b/src/css/tabs/configuration.css @@ -1,12 +1,42 @@ +.tab-configuration .ui-grid-col { + margin-bottom: 0; +} +.tab-configuration .mixerPreview { + max-width: 230px; + background-color: #eeeeee; + text-align: center; + float: left; + border-radius: 5px; + margin-top: 5px; +} +.tab-configuration .mixerPreview img { + width: 90%; + height: 90%; + padding: 5%; +} +.tab-configuration select.batterymetertype { + margin-right: 5px; + float: left; + width: 150px; +} +.tab-configuration input, +.tab-configuration select { + border: 1px solid var(--subtleAccent); + width: 230px; + height: 20px; + float: left; + margin-right: 15px; + border-radius: 3px; +} + .tab-configuration table { - margin-bottom: 0px; + margin-bottom: 0; width: 100%; float: left; } .tab-configuration table, .tab-configuration table th, .tab-configuration table td { - padding: 0px; - padding-left: 0px; + padding: 0; text-align: left; } @@ -40,17 +70,6 @@ border-bottom: 1px solid var(--subtleAccent); } -.tab-configuration .leftWrapper { - float: left; - width: calc(50% - 20px); -} - -.tab-configuration .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 20px; -} - .tab-configuration .mixerList { width: 100%; height: 20px; @@ -62,7 +81,7 @@ border-collapse: collapse; margin-bottom: 5px; margin-top: -5px; - padding: 0px; + padding: 0; } .tab-configuration dl.features dt { @@ -96,12 +115,12 @@ .tab-configuration .number .disabled { width: 48px; - padding: 0px 5px; + padding: 0 5px; background-color: #ececec; } .tab-configuration .number span { - margin-left: 0px; + margin-left: 0; } .tab-configuration .gps .line { @@ -117,9 +136,9 @@ } .tab-configuration .gps .select > div:first-child { - float: left; - height: 20px; - margin-right: 15px; + float: left; + height: 20px; + margin-right: 15px; margin-left: 3px; } @@ -128,7 +147,7 @@ } .tab-configuration .current .checkbox { - margin-top: 0px; + margin-top: 0; float: left; } @@ -138,7 +157,7 @@ } .tab-configuration .current .checkbox div input { - margin: 0px; + margin: 0; float: left; } @@ -153,17 +172,17 @@ } .tab-configuration .disarm .checkbox div { - margin-bottom: 0px; - margin-top: 0px; + margin-bottom: 0; + margin-top: 0; } .tab-configuration .disarm .checkbox div input { - margin: 0px; + margin: 0; float: left; } .tab-configuration .disarm .checkbox span { - margin-left: 0px; + margin-left: 0; } .tab-configuration .freelabel { @@ -176,12 +195,12 @@ } .tab-configuration span { - margin: 0px; + margin: 0; } .tab-configuration .disarm .checkbox { float: left; - padding-left: 0px; + padding-left: 0; margin-top: -5px; padding-bottom: 5px; border-bottom: 1px solid var(--subtleAccent); @@ -210,14 +229,14 @@ .tab-configuration .number, .tab-configuration .select - { +{ margin-bottom: 5px; clear: left; padding-bottom: 5px; border-bottom: 1px solid var(--subtleAccent); width: 100%; float: left; - } +} .tab-configuration .board_align_inputs, .tab-configuration .gyro_alignment_inputs { @@ -254,12 +273,12 @@ .tab-configuration .number:last-child, .tab-configuration .select:last-child { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .gui_box_titlebar { - margin-bottom: 0px; + margin-bottom: 0; } .tab-configuration .numberspacer { @@ -279,8 +298,8 @@ .tab-configuration .rssi td { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { @@ -312,12 +331,6 @@ width: 30px; } -.tab-configuration select.batterymetertype { - margin-right: 5px; - float: left; - width: 150px; -} - .tab-configuration .currentmetertype { float: left; width: 150px; @@ -340,17 +353,7 @@ } .tab-configuration .serialRXBox, .spiRxBox { - padding-top: 0px; -} - -.tab-configuration input, -.tab-configuration select { - border: 1px solid var(--subtleAccent); - width: 230px; - height: 20px; - float: left; - margin-right: 15px; - border-radius: 3px; + padding-top: 0; } @@ -361,24 +364,9 @@ .tab-configuration .beeper-configuration tr:last-child td, .tab-configuration .dshotBeaconConditions tr:last-child td, .tab-configuration .other tr:last-child td { - border-bottom: 0px; - padding-bottom: 0px; - margin-bottom: 0px; -} - -.tab-configuration .mixerPreview { - max-width: 230px; - background-color: #eeeeee; - text-align: center; - float: left; - border-radius: 5px; - margin-top: 5px; -} - -.tab-configuration .mixerPreview img { - width: 90%; - height: 90%; - padding: 5%; + border-bottom: 0; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .gui_box { @@ -463,26 +451,13 @@ } .tab-configuration .gpsSettings .note { - margin-top: 10px; -} - -.tab-configuration .note.note_adjust { - margin-left: 5px; - margin-right: 5px; + margin-top: 10px; } @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-configuration .gui_box span { line-height: 17px; } - .tab-configuration .leftWrapper { - width: calc(50% - 15px); - } - .tab-configuration .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 15px; - } .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { float: left; } @@ -499,3 +474,36 @@ float: left; } } +@media all and (max-width: 575px) { + .tab-configuration .mixerPreview { + max-width: none; + } + .tab-configuration select.escprotocol { + width: 100%; + margin-right: 0; + } + .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { + min-height: auto; + } + .tab-configuration .current td:nth-child(2) { + width: auto; + } + .tab-configuration .voltage td:nth-child(2) { + width: auto; + } + .tab-configuration .rssi td:nth-child(2) { + width: auto; + } + .tab-configuration .rxFailsafe td:nth-child(2) { + width: auto; + } + .tab-configuration .gps td:nth-child(2) { + width: auto; + } + select.features.rxMode, select.serialRX, .dshotbeacon > td > div.select > div, .dshotbeacon select.dshotBeeperBeaconTone { + width: 100%; + } + .tab-configuration .mixer .gui_box, .tab-configuration .motorstop .gui_box { + min-height: auto; + } +} diff --git a/src/css/tabs/failsafe.css b/src/css/tabs/failsafe.css index 47dcc74fce..821383aae5 100644 --- a/src/css/tabs/failsafe.css +++ b/src/css/tabs/failsafe.css @@ -254,8 +254,7 @@ width: 100%; border-bottom: 1px solid var(--subtleAccent); float: left; - padding: 0px; - padding-bottom: 6px; + padding: 0 0 6px; margin-bottom: 3px; } @@ -265,7 +264,7 @@ .tab-failsafe .featuresNew td:last-child { width: calc(100% - 125px); - margin-right: 0px; + margin-right: 0; } .tab-failsafe .featuresNew td { diff --git a/src/css/tabs/help.css b/src/css/tabs/help.css index 09b2b0c48f..b3c5544a3a 100644 --- a/src/css/tabs/help.css +++ b/src/css/tabs/help.css @@ -1,11 +1,6 @@ -.tab-help .twothird { - width: calc(67% - 15px); - margin-right: 15px; -} - .tab-help .gui_box { min-height: 500px; - margin-bottom: 0px; + margin-bottom: 0; } .tab-help ul { @@ -18,7 +13,7 @@ padding-bottom: 5px; background-image: url(../../images/arrow.svg); background-repeat: no-repeat; - background-position: 0px 8px; + background-position: 0 8px; background-size: 12px; } @@ -33,4 +28,12 @@ .tab-help .subline { margin-bottom: 5px; -} \ No newline at end of file +} + +/** (phones) **/ +@media all and (max-width: 575px) { + .tab-help .gui_box { + min-height: auto; + margin-bottom: 15px; + } +} diff --git a/src/css/tabs/landing.css b/src/css/tabs/landing.css index 73393ef85f..cbb6f580cc 100644 --- a/src/css/tabs/landing.css +++ b/src/css/tabs/landing.css @@ -14,21 +14,20 @@ .tab-landing .content_top { height: 140px; - background: #fff; padding: 20px; - background-image: url(../../images/pattern.png); + background: #fff url(../../images/pattern.png); background-size: 300px; } .tab-landing .content_mid { background-color: var(--accent); overflow: hidden; + padding: 0 15px; } .tab-landing .content_foot { clear: both; - padding: 20px; - padding-bottom: 5px; + padding: 20px 20px 5px; } /* hero block */ @@ -60,16 +59,8 @@ } /* text columns */ -.tab-landing .content_mid .column .wrap { - padding: 15px; - padding-bottom: 0px; - padding-top: 0px; -} - .tab-landing .content_mid .column .wrap2 { padding: 10px; - padding-bottom: 10px; - padding-top: 10px; } .tab-landing .content_mid h2 { @@ -83,18 +74,6 @@ } -.tab-landing .content_mid .text1 .wrap { - margin-left: 0px; -} - -.tab-landing .content_mid .text1 { - width: 37%; -} - -.tab-landing .content_mid .text2 { - width: 40%; -} - .tab-landing .content_mid .text2 ul { margin-top: 2px; } @@ -106,17 +85,10 @@ margin-left: 30px; } -.tab-landing .content_mid .text3 { - width: 23%; -} - .tab-landing .content_mid .text3 .wrap2 { border: 1px solid var(--subtleAccent); border-radius: 5px; background: white; - margin-right: 20px; - margin-left: 10px; - margin-top: 5px; min-height: 187px; font-size: 11px; } @@ -127,11 +99,7 @@ } .tab-landing .content_mid_bottom { - padding: 15px; - padding-top: 0px; - padding-bottom: 0px; - overflow: hidden; - float: left; + padding: 0 15px; } .tab-landing .content_mid_bottom .logo { @@ -140,7 +108,7 @@ } .tab-landing .content_mid_bottom .text4 { - margin-top: 0px; + margin-top: 0; margin-left: 5px; display: inline-block; } @@ -163,3 +131,10 @@ content: ", "; font-weight: normal; } + +/** (phones) **/ +@media all and (max-width: 575px) { + .tab-landing .logowrapper, .tab-landing .logowrapper img { + width: auto; + } +} diff --git a/src/css/tabs/led_strip.css b/src/css/tabs/led_strip.css index ac29ee1687..de197d43c6 100644 --- a/src/css/tabs/led_strip.css +++ b/src/css/tabs/led_strip.css @@ -442,3 +442,9 @@ z-index: 100; border: 1px dotted white; } + +@media all and (max-width: 575px) { + .tab-led-strip .controls { + width: 100%; + } +} diff --git a/src/css/tabs/logging.css b/src/css/tabs/logging.css index 55a8b85927..cb09663496 100644 --- a/src/css/tabs/logging.css +++ b/src/css/tabs/logging.css @@ -50,7 +50,7 @@ .tab-logging .fixed_band { width: 100%; - bottom: 0px; + bottom: 0; } .tab-logging .save_btn .back { @@ -67,3 +67,13 @@ height: 22px; } } + +@media all and (max-width: 575px) { + .tab-logging .properties dd { + width: 100%; + height: auto; + } + .tab-logging .properties { + width: auto; + } +} diff --git a/src/css/tabs/motors.css b/src/css/tabs/motors.css index b08f0dcfa1..fa4ab8eb01 100644 --- a/src/css/tabs/motors.css +++ b/src/css/tabs/motors.css @@ -1,7 +1,7 @@ .tab-motors .modelAndGraph { float: left; width: 100%; - margin-bottom: 0px; + margin-bottom: 0; } .tab-motors .spacer { @@ -30,7 +30,7 @@ .tab-motors .plot_control { float: right; width: 160px; - margin: 0px; + margin: 0; background-color: #ECECEC; border-top-right-radius: 3px; border-bottom-right-radius: 3px; @@ -56,7 +56,7 @@ color: #000; font-size: 10px; line-height: 17px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); text-transform: uppercase; letter-spacing: 0.03em; display: block; @@ -172,7 +172,7 @@ } .tab-motors .motorblock { - margin-bottom: 0px; + margin-bottom: 0; background-color: #ECECEC; /*background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15));*/ } @@ -291,7 +291,7 @@ } .tab-motors .motor_testing .sliders input:first-child { - margin-left: 0px; + margin-left: 0; } .tab-motors .motor_testing .values { @@ -309,7 +309,7 @@ .tab-motors .motor_testing .values li:first-child, .tab-motors .motor_testing .telemetry li:first-child { - margin-left: 0px; + margin-left: 0; } .tab-motors .motor_testing .values li, @@ -342,3 +342,86 @@ .tab-motors .motor_testing .notice .motorsEnableTestMode { margin-left: 10px; } + +@media all and (max-width: 575px) { + .tab-motors .modelAndGraph { + display: flex; + flex-wrap: wrap; + } + .tab-motors .mixerPreview { + order: 1; + width: calc(100% - 160px); + } + .tab-motors .mixerPreview img { + width: calc(100% - 20px); + } + .tab-motors #graph { + width: 100%; + order: 3; + } + .tab-motors .plot_control { + order: 2; + } + .tab-motors .power_info { + order: 4; + width: 100%; + margin-top: 10px; + } + .tab-motors .motorblock { + margin-bottom: 15px; + } + .tab-motors .motorblock > .spacer { + display: flex; + flex-wrap: wrap; + } + .tab-motors .left.motors { + width: 100%; + order: 1; + } + .tab-motors .right.servos { + width: 100%; + order: 3; + margin-top: 15px; + } + .tab-motors .motor_testing { + width: 100%; + display: flex; + flex-wrap: wrap; + order: 2; + } + .tab-motors .motor_testing .notice { + width: 100%; + margin-top: 15px; + } + .tab-motors .titles li, .tab-motors .m-block { + width: calc((100% - 80px) / 9); + } + .tab-motors .titles li:last-child, .tab-motors .m-block:last-child { + margin-right: 0; + } + .tab-motors .motor_testing .left { + width: 100%; + } + .tab-motors .servos .m-block, .tab-motors .servos .titles li { + width: calc((100% - 70px) / 8); + } + .tab-motors .servos .m-block:last-child, .tab-motors .servos .titles li:last-child { + margin-left: 0; + } + .tab-motors .motor_testing .sliders { + margin-left: 2px; + margin-right: -2px; + } + .tab-motors .motor_testing .sliders input { + width: calc((100% - 108px) / 9); + } + .tab-motors .motor_testing .values li, .tab-motors .motor_testing .telemetry li { + width: calc((100% - 80px) / 9); + } + .tab-motors .motor_testing .values li:last-child { + margin-left: 4px; + } + .tab-motors .motor_testing .telemetry li { + font-size: 6px; + } +} diff --git a/src/css/tabs/onboard_logging.css b/src/css/tabs/onboard_logging.css index 3b720ef5f7..487971e33b 100644 --- a/src/css/tabs/onboard_logging.css +++ b/src/css/tabs/onboard_logging.css @@ -139,6 +139,13 @@ margin-bottom: 0.5em; } +@media all and (max-width: 575px) { + .tab-onboard_logging dialog { + width: calc(100% - 2em); + border-radius: unset; + } +} + .dataflash-confirm-erase .dataflash-erase-progress { height: 125px; display: none; @@ -150,10 +157,7 @@ } .tab-onboard_logging .save-flash .helpicon { - margin-left: 7px; - margin-right: 0px; - margin-top: 4px; - margin-bottom: 0px; + margin: 4px 0 0 7px; display: inline-block; float: unset; } @@ -290,7 +294,7 @@ border: 1px solid #5bbb1b; } .tab-onboard_logging .sdcard-icon { - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); width: 90px; height: 90px; background-image: url(../../images/icons/cf_icon_sdcard.svg); @@ -303,3 +307,9 @@ border-radius: 45px; } + +@media all and (max-width: 575px) { + .tab-onboard_logging .blackboxRate select, .tab-onboard_logging .blackboxDebugMode select, .tab-onboard_logging .blackboxDevice select { + width: 120px; + } +} diff --git a/src/css/tabs/options.css b/src/css/tabs/options.css new file mode 100644 index 0000000000..5cdee88d57 --- /dev/null +++ b/src/css/tabs/options.css @@ -0,0 +1,16 @@ +.tab-options .freelabel { + margin-left: 10px; + position: relative; +} +.tab-options .switchery { + float: left; +} +.tab-options .margin-bottom { + margin-bottom: 10px; +} +.tab-options select { + background: var(--boxBackground); + color: var(--defaultText); + border: 1px solid var(--subtleAccent); + border-radius: 3px; +} diff --git a/src/css/tabs/osd.css b/src/css/tabs/osd.css index d5899f690d..be10a4b138 100644 --- a/src/css/tabs/osd.css +++ b/src/css/tabs/osd.css @@ -7,7 +7,7 @@ position: absolute; width: 100%; height: 26px; - top: 0px; + top: 0; left: 0; text-align: center; line-height: 24px; @@ -57,7 +57,7 @@ .info .progress::-webkit-progress-bar { background-color: #4f4f4f; border-radius: 4px; - box-shadow: inset 0px 0px 5px #2f2f2f; + box-shadow: inset 0 0 5px #2f2f2f; } .info .progress::-webkit-progress-value { @@ -86,9 +86,8 @@ } .tab-osd ul li { - list-style: initial; - list-style-type: circle; - margin-left: 30px; + list-style: circle; + margin-left: 30px; } .tab-osd .options { @@ -129,7 +128,7 @@ .tab-osd .options .description { position: relative; - left: 0px; + left: 0; font-style: italic; color: #818181; } @@ -310,8 +309,7 @@ #font-logo-preview-container { background:rgba(0, 255, 0, 0.4); margin-bottom: 10px; - width: 45%; - float: left; + box-sizing: border-box; } #font-logo-preview { @@ -321,11 +319,8 @@ } #font-logo-info { - width: 45%; - margin-left: 18px; font-size: 125%; line-height: 150%; - float: left; } #font-logo-info h3 { @@ -414,7 +409,7 @@ button { line-height: 23px; height: 23px; box-sizing: border-box; - padding-right: 0px; + padding-right: 0; } .tab-osd .switchable-field label { @@ -443,7 +438,7 @@ button { .tab-osd .switchable-field:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-osd input, @@ -458,11 +453,13 @@ button { width: 360px; float: left; position: sticky; - top: 0px; + top: 0; + margin-left: calc((100% - 362px) / 2); - /* please don't copy the generic background image from another project - * and replace the one that @nathantsoi took :) - */ + +/* please don't copy the generic background image from another project + * and replace the one that @nathantsoi took :) + */ background: url(../../images/osd-bg-1.jpg); background-size: cover; border-bottom-left-radius: 3px; @@ -479,7 +476,7 @@ button { .tab-osd .alarms label:last-child { border-bottom: none; - padding-bottom: 0px + padding-bottom: 0 } .tab-osd .alarms input { @@ -510,3 +507,56 @@ button { height: calc(100% - 30px); } } + +.tab-osd .grid-col.col4:first-child, .tab-osd .grid-col.col4:last-child { + width: calc((100% - 390px) / 2); +} + +.tab-osd .grid-row { + margin-bottom: 40px; +} + +.tab-osd .grid-col.col4 { + width: auto; +} + +@media all and (max-width: 575px) { + .tab-osd .osd-preview { + order: 1; + } + .tab-osd .osd-feature { + order: 2; + } + .tab-osd .osd-profile { + order: 3; + } + .tab-osd .preview.requires-osd-feature { + width: 100%; + max-width: 363px; + margin-left: 0; + } + .tab-osd .osd-feature, .tab-osd .osd-profile { + max-width: 100%; + } + #fontmanagercontent { + max-width: 100%; + } + .content_wrapper.font-preview { + padding: 15px 0; + } + #fontmanagercontent .grid-row { + margin-bottom: 15px; + } + .fontpresets_wrapper { + display: block; + position: relative; + right: 0; + top: 0; + margin-bottom: 15px; + } +} +@media all and (max-width: 575px) and (min-width: 390px) { + .tab-osd .preview.requires-osd-feature { + margin-left: calc((100% - 363px) / 2); + } +} diff --git a/src/css/tabs/pid_tuning.css b/src/css/tabs/pid_tuning.css index 59c0679f37..6f389dd05f 100644 --- a/src/css/tabs/pid_tuning.css +++ b/src/css/tabs/pid_tuning.css @@ -17,7 +17,7 @@ } .tab-pid_tuning .cf th:last-child { - border-right: 0px; + border-right: 0; border-top-right-radius: 3px; } @@ -27,8 +27,8 @@ .tab-pid_tuning .cf td:last-child { border-bottom-right-radius: 3px; - border-right: 0px; - padding-bottom: 0px; + border-right: 0; + padding-bottom: 0; } .tab-pid_tuning .cf input { @@ -69,7 +69,7 @@ .tab-pid_tuning table { float: left; - margin: 0px; + margin: 0; border-collapse: collapse; width: 100%; table-layout: fixed; @@ -90,12 +90,12 @@ .tab-pid_tuning table, .tab-pid_tuning table td { padding: 1px; - border-bottom: 0px solid var(--subtleAccent); + border-bottom: 0 solid var(--subtleAccent); } .tab-pid_tuning table th { - padding: 0px; - border: 0px; + padding: 0; + border: 0; height: 10px; font-weight: normal; text-overflow: ellipsis; @@ -124,7 +124,7 @@ } .tab-pid_tuning table tr td:last-child { - border-right: 0px solid var(--subtleAccent); + border-right: 0 solid var(--subtleAccent); } .tab-pid_tuning #pid_optional table th { @@ -219,8 +219,7 @@ } .tab-pid_tuning table td { - padding: 1px; - padding-left: 5px; + padding: 1px 1px 1px 5px; border-right: 1px solid var(--subtleAccent); } @@ -266,22 +265,20 @@ .tab-pid_tuning .tab-container { border-bottom: 3px solid var(--accent); - border-right-width: 0px; + border-right-width: 0; display: flex; flex-direction: row; flex-wrap: nowrap; - height: 29px; justify-content: start; width: 100%; } .tab-pid_tuning .tab-container > div { - display: flex; - justify-content: center; - align-items: center; background-color: #2e2e2e; - padding: 0 12px; + padding: 6px 12px; border-right: 1px solid white; + box-sizing: border-box; + text-align: center; } .tab-pid_tuning .tab-container > div:first-child { @@ -294,7 +291,6 @@ .tab-pid_tuning .tab-container > div a { display: block; - white-space: nowrap; color: #999999; } @@ -318,8 +314,7 @@ color: var(--quietText); height: 19px; font-weight: normal; - padding: 2px; - padding-left: 6px; + padding: 2px 2px 2px 6px; border-top-left-radius: 3px; border-top-right-radius: 3px; } @@ -335,7 +330,7 @@ .tab-pid_tuning .fixed_band { position: absolute; width: 100%; - bottom: 0px; + bottom: 0; } .fancy.header { @@ -358,12 +353,10 @@ height: 18px; background-color: #D6D6D6; float: left; - margin: 0px; - padding: 0px; + margin: 0; text-align: left; - padding-left: 5px; line-height: 13px; - padding-top: 5px; + padding: 5px 0 0 5px; font-size: 12px; border-bottom: 1px solid var(--subtleAccent); color: #828282; @@ -381,7 +374,7 @@ } .tab-pid_tuning .pid_mode .helpicon { - margin-top: 0px; + margin-top: 0; } .tab-pid_tuning .pid_titlebar { @@ -393,11 +386,11 @@ } .tab-pid_tuning .pid_titlebar.pid_titlebar_extended { - border-radius: 0px; + border-radius: 0; } .tab-pid_tuning .cf .throttleCurvePreview { - padding: 0px; + padding: 0; } .pid_roll { @@ -419,15 +412,9 @@ .show { width:130px; - float:right; margin-right:3px; } -.show a { - margin-left: 10px; - width: calc(100% - 10px); -} - .tab-pid_tuning .helpicon { margin-top: 1px; } @@ -439,7 +426,7 @@ .tab-pid_tuning .number .helpicon { margin-top: 3px; - margin-right: 0px; + margin-right: 0; } .tab-pid_tuning .gui_box_titlebar .helpicon { @@ -448,7 +435,7 @@ } .tab-pid_tuning .spacer_left { - padding-left: 0px; + padding-left: 0; float: right; width: calc(100% - 20px) } @@ -470,7 +457,7 @@ .tab-pid_tuning .number:last-child { padding-bottom: 5px; - border-bottom: 0px; + border-bottom: 0; } .tab-pid_tuning .number input { @@ -495,18 +482,16 @@ .tab-pid_tuning .resetbt { width: 140px; - float: right; + margin-right: 10px; } .tab-pid_tuning .copyprofilebtn { width: 150px; - float: right; margin-right:10px; } .tab-pid_tuning .copyrateprofilebtn { width: 150px; - float: right; margin-right:10px; } @@ -520,7 +505,7 @@ } .tab-pid_tuning .leftzero { - padding-left: 0px; + padding-left: 0; } .tab-pid_tuning .roll { @@ -626,7 +611,7 @@ .tab-pid_tuning .pidTuning tr { width: 100%; border-bottom: 1px solid var(--subtleAccent); - padding: 0px; + padding: 0; } .tab-pid_tuning .pidTuning td:first-child { @@ -644,16 +629,16 @@ } .tab-pid_tuning .new_rates td:first-child { - border-bottom-left-radius: 0px; + border-bottom-left-radius: 0; padding-left: 10px; } .tab-pid_tuning .new_rates td:last-child { - border-bottom-right-radius: 0px; + border-bottom-right-radius: 0; } .tab-pid_tuning .rc_curve .cf tr td { - padding: 0px; + padding: 0; } .tab-pid_tuning .rc_curve_bg { @@ -694,7 +679,7 @@ border: 1px solid var(--subtleAccent); border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; - border-top: 0px solid var(--subtleAccent); + border-top: 0 solid var(--subtleAccent); background: #f9f9f9; } @@ -718,6 +703,13 @@ width: 120px; } +@media all and (max-width: 575px) { + .tab-pid_tuning dialog { + width: calc(100% - 2em); + border-radius: unset; + } +} + .tab-pid_tuning .tuningSlider { -webkit-appearance: none; width: calc(100% - 14px); @@ -935,3 +927,98 @@ .tab-pid_tuning .float-left { float: left; } + +.tab-pid_tuning .content_wrapper_header { + display: flex; +} + +.tab-pid_tuning .content_wrapper_header_btns { + margin-left: auto; +} + +@media all and (max-width: 575px) { + .tab-pid_tuning .content_wrapper_header { + flex-wrap: wrap; + } + + .tab-pid_tuning .profile, .tab-pid_tuning .rate_profile, + .tab-pid_tuning .copyprofilebtn, .tab-pid_tuning .copyrateprofilebtn, + .tab-pid_tuning .resetbt, .tab-pid_tuning .show { + width: calc(50% - 5px); + } + + .tab-pid_tuning .rate_profile { + margin-left: 5px; + } + + .tab-pid_tuning .rate_profile, .tab-pid_tuning .controller, + .tab-pid_tuning .copyrateprofilebtn, .tab-pid_tuning .show { + margin-right: 0; + } + + .tab-pid_tuning .controller { + width: 100%; + } + + .tab-pid_tuning .content_wrapper_header_btns { + display: flex; + flex-wrap: wrap; + } + + .tab-pid_tuning .tab-container > div { + width: calc(100% / 3); + } + + .tab-pid_tuning .subtab-pid .cf_column, .tab-pid_tuning .subtab-rates .cf_column { + min-width: 100%; + width: 100%; + } + + .tab-pid_tuning .spacer_left { + width: 100%; + } + + .subtab-filter .two_columns { + flex-wrap: wrap; + } + + .subtab-filter .two_columns .two_columns_first { + margin-right: 0; + } + + .subtab-filter .two_columns .two_columns_second { + margin-left: 0; + } + + .tab-pid_tuning .sliderHeaders { + height: 18px; + background-color: #D6D6D6; + line-height: 13px; + font-size: 12px; + border-bottom: 1px solid var(--subtleAccent); + color: #828282; + font-weight: normal; + background-image: linear-gradient(315deg, rgba(255, 255, 255, .2) 10%, transparent 10%, transparent 20%, + rgba(255, 255, 255, .2) 20%, rgba(255, 255, 255, .2) 30%, transparent 30%, transparent 40%, + rgba(255, 255, 255, .2) 40%, rgba(255, 255, 255, .2) 50%, transparent 50%, transparent 60%, + rgba(255, 255, 255, .2) 60%, rgba(255, 255, 255, .2) 70%, transparent 70%, transparent 80%, + rgba(255, 255, 255, .2) 80%, rgba(255, 255, 255, .2) 90%, transparent 90%, transparent 100%, + rgba(255, 255, 255, .2) 100%, transparent); + } + + .tab-pid_tuning .sliderHeaders span { + color: #828282; + } + + .tab-pid_tuning .sliderLabels tr.sliderHeaders td:first-child { + text-align: left; + } + + .tab-pid_tuning .tuningPIDSliders .pid_titlebar th:last-child, .tab-pid_tuning .tuningFilterSliders .pid_titlebar th:last-child { + width: 20%; + } + + .tab-pid_tuning .tuningPIDSliders .pid_titlebar th:nth-child(2), .tab-pid_tuning .tuningFilterSliders .pid_titlebar th:nth-child(2) { + width: 20%; + } +} diff --git a/src/css/tabs/ports.css b/src/css/tabs/ports.css index 7ba9a3646d..c3eb8a3af4 100644 --- a/src/css/tabs/ports.css +++ b/src/css/tabs/ports.css @@ -13,9 +13,9 @@ } .tab-ports table, .tab-ports table th, .tab-ports table td { - border-left: 0px; - border-right: 0px; - border-top: 0px; + border-left: 0; + border-right: 0; + border-top: 0; } .tab-ports table tr td:first-child { @@ -37,9 +37,9 @@ .tab-ports table thead tr:first-child { font-size: 12px; height: 25px; - border-top: 0px; - border-right: 0px; - border-left: 0px; + border-top: 0; + border-right: 0; + border-left: 0; } .tab-ports .function input { @@ -99,12 +99,12 @@ .tab-ports .ports thead td:first-child { text-align: left; border-top-left-radius: 5px; - border-left: 0px; + border-left: 0; } .tab-ports .ports thead td:last-child { border-top-right-radius: 5px; - border-right: 0px; + border-right: 0; } @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { @@ -113,3 +113,45 @@ height: 22px; } } + +@media all and (max-width: 575px) { + .tab-ports .config { + text-align: left; + border-top-left-radius: 5px; + border-left: 0; + } + .tab-ports table td { + padding: 0; + } + .tab-ports .ports select { + margin: 0; + width: 100%; + border: none; + height: 25px; + border-radius: unset; + } + .tab-ports .portIdentifier td { + height: 18px; + background-color: #D6D6D6; + padding: 2px 5px; + font-size: 12px; + color: #828282; + font-weight: normal; + background-image: linear-gradient(315deg, rgba(255, 255, 255, .2) 10%, transparent 10%, transparent 20%, + rgba(255, 255, 255, .2) 20%, rgba(255, 255, 255, .2) 30%, transparent 30%, transparent 40%, + rgba(255, 255, 255, .2) 40%, rgba(255, 255, 255, .2) 50%, transparent 50%, transparent 60%, + rgba(255, 255, 255, .2) 60%, rgba(255, 255, 255, .2) 70%, transparent 70%, transparent 80%, + rgba(255, 255, 255, .2) 80%, rgba(255, 255, 255, .2) 90%, transparent 90%, transparent 100%, + rgba(255, 255, 255, .2) 100%, transparent); + } + .tab-ports .ports select[name=function-peripherals], .tab-ports .ports select[name=function-telemetry], + .tab-ports .ports select[name=function-sensors] { + border-bottom: 1px solid var(--subtleAccent); + } + .tab-ports .ports thead td { + font-size: 8px; + width: calc(100% / 5); + word-break: break-word; + white-space: unset; + } +} diff --git a/src/css/tabs/power.css b/src/css/tabs/power.css index 8f4e42202b..c3a2816740 100644 --- a/src/css/tabs/power.css +++ b/src/css/tabs/power.css @@ -2,15 +2,8 @@ display: none; } -.tab-power .leftWrapper { - float: left; - width:calc(50% - 20px) -} - -.tab-power .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 20px; +.tab-power .ui-grid-col { + margin-bottom: 0; } .tab-power td.configuration { @@ -19,7 +12,7 @@ } .tab-power .battery-state .configuration { - border-bottom: 0px; + border-bottom: 0; } .tab-power td.value { @@ -49,7 +42,7 @@ .tab-power .number, .tab-power .select - { +{ margin-bottom: 5px; clear: left; padding-bottom: 5px; @@ -69,8 +62,8 @@ .tab-power .number:last-child, .tab-power .select:last-child { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-power .require-support { diff --git a/src/css/tabs/receiver.css b/src/css/tabs/receiver.css index e40c5af07d..92b3e179cd 100644 --- a/src/css/tabs/receiver.css +++ b/src/css/tabs/receiver.css @@ -13,8 +13,6 @@ } .tab-receiver .bars { - float: left; - width: calc(50% - 20px); font-weight: bold; } @@ -136,16 +134,10 @@ background-color: #14407a; } -.tab-receiver .fc_column { - float: right; - width: 50%; - margin-left: 20px; -} - .tab-receiver .tunings { float: right; position: relative; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; width: 100%; border-top-left-radius: 5px; border-bottom-left-radius: 5px; @@ -153,9 +145,8 @@ .tab-receiver .tunings .head { height: 15px; - padding: 4px; text-align: left; - padding-left: 6px; + padding: 4px 4px 4px 6px; font-weight: normal; background: #828885; color: white; @@ -168,9 +159,8 @@ } .tab-receiver .tunings table, .tab-receiver .tunings table th, .tab-receiver .tunings table td { - padding: 4px; text-align: left; - padding-left: 6px; + padding: 4px 4px 4px 6px; } .tab-receiver .tunings table th { @@ -186,7 +176,7 @@ .tab-receiver .tunings table th:last-child { border-top-right-radius: 3px; - border-right: 0px; + border-right: 0; } .tab-receiver .tunings table td { @@ -200,7 +190,7 @@ .tab-receiver .tunings table td:last-child { border-bottom-right-radius: 3px; - border-right: 0px; + border-right: 0; } .tab-receiver .tunings table input { @@ -231,7 +221,7 @@ .tab-receiver .rssi_channel_wrapper { float: right; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; border-left: 0; width: 30%; box-sizing: border-box; @@ -244,7 +234,7 @@ .tab-receiver .rcmap_wrapper { float: right; position: relative; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; width: 70%; box-sizing: border-box; border-top-left-radius: 5px; @@ -293,11 +283,9 @@ width: calc(100% - 36px); height: 20px; z-index: 2; - border-radius: 0px; border: 1px solid var(--subtleAccent); margin: 4px; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; + border-radius: 3px 0 0 3px; } .tab-receiver select { @@ -333,7 +321,7 @@ } .tab-receiver .rcSmoothing table .helpicon { - margin-top: 0px; + margin-top: 0; } .tab-receiver .rcSmoothing td:first-child { @@ -478,3 +466,9 @@ border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } + +@media all and (max-width: 575px) { + .tab-receiver .bars { + margin-bottom: 10px; + } +} diff --git a/src/css/tabs/sensors.css b/src/css/tabs/sensors.css index bb21c0d4dd..e9a2816bcf 100644 --- a/src/css/tabs/sensors.css +++ b/src/css/tabs/sensors.css @@ -21,9 +21,8 @@ float: right; width: 160px; /* border: 1px solid silver; */ - height: 100%; height: 160px; - margin: 0px; + margin: 0; background-color: #ECECEC; border-top-right-radius: 3px; border-bottom-right-radius: 3px; @@ -170,3 +169,26 @@ .tab-sensors .legend .item:nth-child(4) { fill: #4DA74D; } + +@media all and (max-width: 575px) { + .tab-sensors .plot_control { + width: 130px; + } + .tab-sensors .plot_control dt { + width: 60px; + } + .tab-sensors .plot_control dd { + width: 50px; + } + .tab-sensors .plot_control dd select { + width: 100%; + } + .tab-sensors .plot_control .x, .tab-sensors .plot_control .y, .tab-sensors .plot_control .z { + height: 18px; + box-sizing: border-box; + } + .tab-sensors svg { + width: calc(100% - 130px); + margin-left: 0; + } +} diff --git a/src/css/tabs/servos.css b/src/css/tabs/servos.css index 2865670957..6edfc6ec51 100644 --- a/src/css/tabs/servos.css +++ b/src/css/tabs/servos.css @@ -1,5 +1,5 @@ .tab-servos .title { - margin-top: 0px; + margin-top: 0; line-height: 30px; text-align: center; font-weight: bold; @@ -18,9 +18,9 @@ } .tab-servos table, .tab-servos table th, .tab-servos table td { - border-left: 0px; - border-right: 0px; - border-top: 0px; + border-left: 0; + border-right: 0; + border-top: 0; } .tab-servos input[type="number"]::-webkit-inner-spin-button { @@ -130,7 +130,7 @@ .tab-servos .live { float: left; - margin-top: 0px; + margin-top: 0; } .tab-servos .live span { @@ -175,3 +175,16 @@ .tab-servos .short { width: 40px; } + +.tab-servos .table_overflow { + overflow: auto; +} + +@media all and (max-width: 575px) { + .tab-servos table th { + min-width: 30px; + } + .tab-servos .min, .tab-servos .max, .tab-servos .middle { + min-width: 60px; + } +} diff --git a/src/css/tabs/setup.css b/src/css/tabs/setup.css index f3f4257606..5c521b3064 100644 --- a/src/css/tabs/setup.css +++ b/src/css/tabs/setup.css @@ -1,45 +1,60 @@ -.tab_setup .model-and-info { +.tab-setup .ui-grid-col { + margin-bottom: 0; +} +.tab-setup .content_wrapper { + position: initial; +} +.tab-setup .default_btn { + margin-bottom: 10px; +} +.tab-setup .cell_setup { + border-bottom: solid 1px var(--subtleAccent); + padding-bottom: 8px; + padding-top: 7px; +} +#accel_calib_running, #mag_calib_running { + display: none; + width: 100%; + position: relative; + margin-bottom: 0; + margin-top: 0; float: left; + padding: 5px 0 5px 0; + text-align: center; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ffbb00; + color: #ffbb00; + font-weight: bold; + font-size: 12px; + line-height: 13px; + transition: all ease 0.2s; + text-decoration:none; +} +.tab-setup .data-loading-setup { + width: 100%; + height: 100%; } -.tab_setup .default_btn { +.tab-setup .modelwrapper { + clear: both; + margin-bottom: 5px; +} +.tab-setup .model-and-info { + position: relative; + height: 400px; margin-bottom: 10px; } - .tab-setup #interactive_block { position: absolute; - width: calc(75% - 30px); - height: calc(100% - 245px); + top: 0; + left: 0; + right: 0; + bottom: 0; background-color: #f9f9f9; border-radius: 5px; border: 1px solid #e4e4e4; - margin-bottom: 10px; -} - -.attitude_info { - position: absolute; - top: 10px; - left: 10px; - width: 120px; - margin: 0px 0px 0px 0px; - font-weight: normal; - color: var(--mutedText); -} - -.attitude_info dl { - width: 100%; } - -.attitude_info dt { - width: 50%; - float: left; -} - -.attitude_info dd { - width: 50%; - float: left; -} - .tab-setup #interactive_block a.reset { position: absolute; display: block; @@ -56,11 +71,9 @@ background-color: #ececec; z-index: 100; } - .tab-setup #interactive_block a.reset:hover { background-color: #dedcdc; } - .tab-setup #canvas_wrapper { position: absolute; width: 100%; @@ -69,11 +82,48 @@ left: 0; border-radius: 5px; } - #canvas { width: 100% !important; height: 100% !important; } +.attitude_info { + position: absolute; + top: 10px; + left: 10px; + width: 120px; + margin: 0 0 0 0; + font-weight: normal; + color: var(--mutedText); +} +.attitude_info dl { + width: 100%; +} +.attitude_info dt { + width: 50%; + float: left; +} +.attitude_info dd { + width: 50%; + float: left; +} +.instrumentsbox { + margin-bottom: 0; +} +@media all and (max-width: 575px) { + .tab-setup .cell_setup { + border-bottom: none; + padding-bottom: 15px; + padding-top: 0; + } + .tab-setup .default_btn { + margin-bottom: 5px; + } + .tab-setup .model-and-info { + height: 200px; + } +} + + .block.info .fields { padding: 5px 5px 3px 5px; @@ -120,42 +170,6 @@ bottom: 20px; } -.cell_setup { - border-bottom: solid 1px var(--subtleAccent); - padding-bottom: 8px; - padding-top: 7px; -} - -.tab_setup .content_wrapper { - position: initial; -} - -.initialstyle { - position: initial; -} - -.buttonarea { - min-height: 100px; - width: 20%; -} - -.halfbuttons { - width: calc(100% - 10px); -} - -.setupinfo { - width: 80%; -} - -.modelwrapper { - clear: both; - margin-bottom: 5px; -} - -.instrumentsbox { - margin-bottom: 0px; -} - @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .block.instrument .attitude { width: 50px !important; @@ -165,62 +179,6 @@ width: 50px; height: 50px; } - .tab-setup #interactive_block { - position: absolute; - width: calc(75% - 20px); - height: calc(100% - 218px); - } -} - -#accel_calib_running { - display: none; - - width: 100%; - position: relative; - margin-bottom: 0px; - margin-top: 0px; - float: left; - - padding: 5px 0px 5px 0px; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #ffbb00; - color: #ffbb00; - font-weight: bold; - font-size: 12px; - line-height: 13px; - transition: all ease 0.2s; - text-decoration:none; - -} - -#mag_calib_running { - display: none; - - width: 100%; - position: relative; - margin-bottom: 0px; - margin-top: 0px; - float: left; - - padding: 5px 0px 5px 0px; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #ffbb00; - color: #ffbb00; - font-weight: bold; - font-size: 12px; - line-height: 13px; - transition: all ease 0.2s; - text-decoration:none; -} - -.data-loading-setup { - width: 100%; - height: 100%; - } .tab-setup .regular-button { @@ -232,13 +190,11 @@ border: 1px solid #dba718; color: #000; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: inline-block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } .tab-setup .regular-button:hover { @@ -248,7 +204,7 @@ .tab-setup .regular-button:active { background-color: #ffcc3e; transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .tab-setup .regular-button.disabled { cursor: default; @@ -274,8 +230,13 @@ margin-bottom: 0.5em; } -.disarm-flag { - padding-left: 5px; +@media all and (max-width: 575px) { + .tab-setup dialog { + width: calc(100% - 2em); + border-radius: unset; + } } +.disarm-flag { + padding-left: 5px; } diff --git a/src/css/tabs/static_tab.css b/src/css/tabs/static_tab.css index e79e430104..2708a38149 100644 --- a/src/css/tabs/static_tab.css +++ b/src/css/tabs/static_tab.css @@ -1,6 +1,6 @@ #tab-static { background-color: inherit; - background-image: url(/images/osd-bg-1.jpg); + background-image: url(../../images/osd-bg-1.jpg); background-attachment: fixed; background-size: cover; background-position: bottom right; diff --git a/src/css/tabs/vtx.css b/src/css/tabs/vtx.css index 8759847946..c8c6e135a9 100644 --- a/src/css/tabs/vtx.css +++ b/src/css/tabs/vtx.css @@ -114,7 +114,7 @@ .tab-vtx .table_vtx_bands td, .tab-vtx .table_vtx_powerlevels td { - padding: 0px 1px; + padding: 0 1px; text-align: center; } @@ -144,3 +144,22 @@ #tab-vtx-templates { display: none; } + +@media all and (max-width: 575px) { + .tab-vtx .columnsWrapper { + flex-wrap: wrap; + } + + .tab-vtx .columnsWrapper .leftColumn { + width: 100%; + } + + .tab-vtx .columnsWrapper .rightColumn { + width: 100%; + flex-basis: auto; + } + .tab-vtx .leftWrapper { + width: 100%; + overflow: auto; + } +} diff --git a/src/images/light-wide-2-compact.svg b/src/images/light-wide-2-compact.svg new file mode 100644 index 0000000000..e232060e43 --- /dev/null +++ b/src/images/light-wide-2-compact.svg @@ -0,0 +1,133 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/js/Clipboard.js b/src/js/Clipboard.js index 60dac41b7c..fff7f0e84b 100644 --- a/src/js/Clipboard.js +++ b/src/js/Clipboard.js @@ -36,7 +36,7 @@ Clipboard._configureClipboardAsNwJs = function(nwGui) { if (onSuccess) { onSuccess(text); } - } + }; this.readText = function(onSuccess, onError) { @@ -54,8 +54,8 @@ Clipboard._configureClipboardAsNwJs = function(nwGui) { if (onSuccess) { onSuccess(text); } - } -} + }; +}; Clipboard._configureClipboardAsChrome = function() { @@ -69,15 +69,33 @@ Clipboard._configureClipboardAsChrome = function() { navigator.clipboard.writeText(text) .then(onSuccess) .catch(onError); - } + }; this.readText = function(onSuccess, onError) { navigator.clipboard.readText() .then(onSuccess) .catch(onError); - } + }; -} +}; + +Clipboard._configureClipboardAsCordova = function() { + + console.log('Cordova Clipboard available'); + + this.available = true; + this.readAvailable = true; + this.writeAvailable = true; + + this.writeText = function(text, onSuccess, onError) { + cordova.plugins.clipboard.copy(text, onSuccess, onError); + }; + + this.readText = function(onSuccess, onError) { + cordova.plugins.clipboard.paste(onSuccess, onError); + }; + +}; Clipboard._configureClipboardAsOther = function() { @@ -89,12 +107,12 @@ Clipboard._configureClipboardAsOther = function() { this.writeText = function(text, onSuccess, onError) { onError('Clipboard not available'); - } + }; this.readText = function(onSuccess, onError) { onError('Clipboard not available'); - } -} + }; +}; switch (GUI.Mode) { @@ -106,6 +124,10 @@ case GUI_Modes.ChromeApp: Clipboard._configureClipboardAsChrome(); break; +case GUI_Modes.Cordova: + Clipboard._configureClipboardAsCordova(); + break; + default: Clipboard._configureClipboardAsOther(); } diff --git a/src/js/Features.js b/src/js/Features.js index ad5e485794..8d29b88927 100644 --- a/src/js/Features.js +++ b/src/js/Features.js @@ -172,9 +172,10 @@ Features.prototype.generateElements = function (featuresElements) { + self._features[i].name + '" title="' + self._features[i].name - + '" type="checkbox"/>' + + '" type="checkbox"/>
' + featureName - + '' + + '
' + + '' + feature_tip_html + ''); var feature_e = newElement.find('input.feature'); diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index 9c80e4a42c..f21865c242 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -318,7 +318,8 @@ function configuration_restore(callback) { }; reader.onloadend = function (e) { - if (e.total != 0 && e.total == e.loaded) { + if ((e.total != 0 && e.total == e.loaded) || GUI.isCordova()) { + // Cordova: Ignore verification : seem to have a bug with progressEvent returned console.log('Read SUCCESSFUL'); try { // check if string provided is a valid JSON diff --git a/src/js/cordova_chromeapi.js b/src/js/cordova_chromeapi.js new file mode 100644 index 0000000000..73cead40ba --- /dev/null +++ b/src/js/cordova_chromeapi.js @@ -0,0 +1,418 @@ +'use strict'; + +const chromeCallbackWithError = function(message, callback) { + let err; + if (typeof message === 'string') { + err = { 'message' : message }; + } else { + err = message; + } + if (typeof callback !== 'function') { + console.error(err.message); + return; + } + try { + if (typeof chrome.runtime !== 'undefined') { + chrome.runtime.lastError = err; + } else { + console.error(err.message); + } + callback.apply(null, Array.prototype.slice.call(arguments, 2)); + } finally { + if (typeof chrome.runtime !== 'undefined') { + delete chrome.runtime.lastError; + } + } +}; +const chromeCallbackWithSuccess = function(argument, callback) { + if (typeof callback === 'function') { + if (typeof argument === 'undefined') { + callback(); + } else { + callback(argument); + } + } +}; + +const removeItemOfAnArray = async function (array, item) { + for (let i = (array.length - 1); i >= 0; i--) { + if (array[i] === item) { + return array.splice(i, 1); + } + } + return array; +}; + + +const chromeapiSerial = { + logHeader: 'SERIAL (adapted from Cordova): ', + connection: { + connectionId: 1, // Only one connection possible + paused: false, + persistent: false, + name, + bufferSize: 4096, + receiveTimeout: 0, + sendTimeout: 0, + bitrate: 9600, + dataBits: 'eight', + parityBit: 'no', + stopBits: 'one', + ctsFlowControl: false, + }, + setConnectionOptions: function(ConnectionOptions) { + if (ConnectionOptions.persistent) { + this.connection.persistent = ConnectionOptions.persistent; + } + if (ConnectionOptions.name) { + this.connection.name = ConnectionOptions.name; + } + if (ConnectionOptions.bufferSize) { + this.connection.bufferSize = ConnectionOptions.bufferSize; + } + if (ConnectionOptions.receiveTimeout) { + this.connection.receiveTimeout = ConnectionOptions.receiveTimeout; + } + if (ConnectionOptions.sendTimeout) { + this.connection.sendTimeout = ConnectionOptions.sendTimeout; + } + if (ConnectionOptions.bitrate) { + this.connection.bitrate = ConnectionOptions.bitrate; + } + if (ConnectionOptions.dataBits) { + this.connection.dataBits = ConnectionOptions.dataBits; + } + if (ConnectionOptions.parityBit) { + this.connection.parityBit = ConnectionOptions.parityBit; + } + if (ConnectionOptions.stopBits) { + this.connection.stopBits = ConnectionOptions.stopBits; + } + if (ConnectionOptions.ctsFlowControl) { + this.connection.ctsFlowControl = ConnectionOptions.ctsFlowControl; + } + }, + getCordovaSerialConnectionOptions: function() { + let dataBits, stopBits, parityBit; + if (this.connection.dataBits === 'seven') { + dataBits = 7; + } else { + dataBits = 8; + } + if (this.connection.stopBits === 'two') { + stopBits = 2; + } else { + stopBits = 1; + } + if (this.connection.parityBit === 'odd') { + parityBit = 0; + } else if (this.connection.parityBit === 'even') { + parityBit = 1; + } + return { + baudRate: this.connection.bitrate, + dataBits: dataBits, + stopBits: stopBits, + parity: parityBit, + sleepOnPause: false, + }; + }, + + // Chrome serial API methods + getDevices: async function(callback) { + const self = this; + cordova.plugins.usbevent.listDevices(function(list) { + const devices = []; + if (list.devices !== undefined) { + let count = 0; + list.devices.forEach(device => { + count++; + devices.push({ + path: `${device.vendorId}/${device.productId}`, + vendorId: device.vendorId, + productId: device.productId, + displayName: `${device.vendorId}/${device.productId}`, + }); + if (count === list.devices.length) { + if (callback) { + callback(devices); + } + } + }); + } else { + if (callback) { + callback(devices); + } + } + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, + connect: function(path, ConnectionOptions, callback) { + const self = this; + if (typeof ConnectionOptions !== 'undefined') { + self.setConnectionOptions(ConnectionOptions); + } + const pathSplit = path.split('/'); + if (pathSplit.length === 2) { + const vid = parseInt(pathSplit[0]); + const pid = parseInt(pathSplit[1]); + console.log(`${self.logHeader}request permission (vid=${vid} / pid=${pid})`); + cordova_serial.requestPermission({vid: vid, pid: pid}, function() { + const options = self.getCordovaSerialConnectionOptions(); + cordova_serial.open(options, function () { + cordova_serial.registerReadCallback(function (data) { + const info = { + connectionId: self.connection.connectionId, + data: data, + }; + self.onReceive.receiveData(info); + }, function () { + console.warn(`${self.logHeader}failed to register read callback`); + }); + chromeCallbackWithSuccess(self.connection, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + } else { + chromeCallbackWithError(`${self.logHeader} invalid vendor id / product id`, callback); + } + }, + disconnect: function(connectionId, callback) { + const self = this; + cordova_serial.close(function () { + chromeCallbackWithSuccess(true, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback(false)); + }); + }, + setPaused: function(connectionId, paused, callback) { + this.connection.paused = paused; // Change connectionInfo but don't pause the connection + chromeCallbackWithSuccess(undefined, callback); + }, + getInfo: function(callback) { + chromeCallbackWithSuccess(this.connection, callback); + }, + send: function(connectionId, data, callback) { + const string = Array.prototype.map.call(new Uint8Array(data), x => (`00${x.toString(16)}`).slice(-2)).join(''); + cordova_serial.writeHex(string, function () { + chromeCallbackWithSuccess({ + bytesSent: string.length >> 1, + }, callback); + }, function(error) { + const info = { + bytesSent: 0, + error: 'undefined', + }; + chrome.serial.onReceiveError.receiveError(info); + chromeCallbackWithError(`SERIAL (adapted from Cordova): ${error}`, callback(info)); + }); + }, + getControlSignals: function(connectionId, callback) { + // Not supported yet + console.warn('chrome.serial.getControlSignals not supported yet'); + chromeCallbackWithSuccess({}, callback); + }, + setControlSignals: function(connectionId, signals, callback) { + // Not supported yet + console.warn('chrome.serial.setControlSignals not supported yet'); + chromeCallbackWithSuccess({ + result: false, + }, callback); + }, + // update: function() { }, + // getConnections: function() { }, + // flush: function() { }, + // setBreak: function() { }, + // clearBreak: function() { }, + + onReceive: { + listeners: [], + addListener: function(functionReference) { + this.listeners.push(functionReference); + }, + removeListener: async function(functionReference) { + this.listeners = await removeItemOfAnArray(this.listeners, functionReference); + }, + receiveData: function(data) { + if (data.data.byteLength > 0) { + for (let i = (this.listeners.length - 1); i >= 0; i--) { + this.listeners[i](data); + } + } + }, + }, + onReceiveError: { + listeners: [], + addListener: function(functionReference) { + this.listeners.push(functionReference); + }, + removeListener: async function(functionReference) { + this.listeners = await removeItemOfAnArray(this.listeners, functionReference); + }, + receiveError: function(error) { + for (let i = (this.listeners.length - 1); i >= 0; i--) { + this.listeners[i](error); + } + }, + }, +}; + + +const chromeapiFilesystem = { + logHeader: 'FILESYSTEM (adapted from Cordova): ', + savedEntries: [], + getFileExtension: function(fileName) { + const re = /(?:\.([^.]+))?$/; + return re.exec(fileName)[1]; + }, + + // Chrome fileSystem API methods + getDisplayPath: function(entry, callback) { + chromeCallbackWithSuccess(entry.fullPath, callback); + }, + getWritableEntry: function(entry, callback) { + // Entry returned by chooseEntry method is writable on Android + chromeCallbackWithSuccess(entry, callback); + }, + isWritableEntry: function(entry, callback) { + // Entry returned by chooseEntry method is writable on Android + chromeCallbackWithSuccess(true, callback); + }, + chooseEntryOpenFile: function(options, callback) { + const self = this; + fileChooser.open(function(uri) { + window.resolveLocalFileSystemURL(uri, function(entry) { + if (options.accepts && options.accepts[0].extensions && options.accepts[0].extensions && options.accepts[0].extensions.length > 0) { + self.getDisplayPath(entry, function(fileName) { + const extension = self.getFileExtension(fileName); + if (options.accepts[0].extensions.indexOf(extension) > -1) { + chromeCallbackWithSuccess(entry, callback); + } else { + navigator.notification.alert('Invalid file extension', function() { + chromeCallbackWithError(`${self.logHeader}file opened has an incorrect extension`, callback); + }, 'Choose a file', 'Ok'); + } + }); + } else { + console.log('no extensions : any type of file accepted'); + chromeCallbackWithSuccess(entry, callback); + } + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, + chooseEntrySaveFile: function(options, callback) { + const self = this; + if (!options.suggestedName) { + options.suggestedName = 'newfile'; + } + const extension = self.getFileExtension(options.suggestedName); + const folder = 'Betaflight configurator'; + navigator.notification.prompt(i18n.getMessage('dialogFileNameDescription', { + folder: folder, + }), function(res) { + if (res.buttonIndex === 1) { + const newExtension = self.getFileExtension(res.input1); + let fileName = res.input1; + if (newExtension === undefined) { + fileName += `.${extension}`; + } + window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(rootEntry) { + rootEntry.getDirectory(folder, { create: true }, function(directoryEntry) { + directoryEntry.getFile(fileName, { create: false }, function(fileEntry) { + console.log(fileEntry); + navigator.notification.confirm(i18n.getMessage('dialogFileAlreadyExistsDescription'), function(resp) { + if (resp === 1) { + chromeCallbackWithSuccess(fileEntry, callback); + } else { + chromeCallbackWithError(`${self.logHeader}Canceled: file already exists`, callback); + } + }, i18n.getMessage('dialogFileAlreadyExistsTitle'), [i18n.getMessage('yes'), i18n.getMessage('cancel')]); + }, function() { + directoryEntry.getFile(fileName, { create: true }, function(fileEntry) { + chromeCallbackWithSuccess(fileEntry, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + } else { + chromeCallbackWithError(`${self.logHeader}Canceled: no file name`, callback); + } + }, i18n.getMessage('dialogFileNameTitle'), [i18n.getMessage('initialSetupButtonSave'), i18n.getMessage('cancel')], options.suggestedName); + }, + chooseEntry: function(options, callback) { + const self = this; + if (typeof options === 'undefined' || typeof options.type === 'undefined') { + self.chooseEntryOpenFile(options, callback); + } else if (options.type === 'openDirectory') { + // not supported yet + console.warn('chrome.fileSystem.chooseEntry: options.type = openDirectory not supported yet'); + chromeCallbackWithSuccess(undefined, callback); + } else if (options.type === 'openWritableFile') { + // Entry returned by chooseEntry method is writable on Android + self.chooseEntryOpenFile(options, callback); + } else if (options.type === 'saveFile') { + self.chooseEntrySaveFile(options, callback); + } else { + self.chooseEntryOpenFile(options, callback); + } + }, + restoreEntry: function(id, callback) { + this.isRestorable(id, function(isRestorable) { + if (isRestorable) { + chromeCallbackWithSuccess(this.savedEntries[id], callback); + } else { + chromeCallbackWithError(`${self.logHeader}This entry can't be restored`, callback); + } + }); + }, + isRestorable: function(id, callback) { + if (typeof this.savedEntries[id] !== 'undefined') { + chromeCallbackWithSuccess(true, callback); + } else { + chromeCallbackWithSuccess(false, callback); + } + }, + retainEntry: function(entry) { + const id = this.savedEntries.length; + if (id >= 500) { + for (let i=0 ; i<500 ; i++) { + if (i < 499) { + this.savedEntries[i] = this.savedEntries[i+1]; + } else { + this.savedEntries[i] = entry; + } + } + return 499; + } else { + this.savedEntries[id] = entry; + return id; + } + }, + /**requestFileSystem: function(options, callback) { }, + getVolumeList: function(callback) { },*/ +}; + + +const cordovaChromeapi = { + init: function(callback) { + chrome.serial = chromeapiSerial; + chrome.fileSystem = chromeapiFilesystem; + if (callback) { + callback(); + } + }, +}; diff --git a/src/js/cordova_startup.js b/src/js/cordova_startup.js new file mode 100644 index 0000000000..5650df1e44 --- /dev/null +++ b/src/js/cordova_startup.js @@ -0,0 +1,67 @@ +'use strict'; + +const cordovaUI = { + uiZoom: 1, + canChangeUI: true, + init: async function() { + const self = this; + const screenWidth = $(window).width(); + const screenHeight = $(window).height(); + let length; + let orientation; + if (screenWidth > screenHeight) { + length = screenWidth; + orientation = 'landscape'; + } else { + length = screenHeight; + orientation = 'portrait'; + } + if (length < 1024) { + self.uiZoom = length/1024; + } + if (screenWidth > 575 && screenHeight > 575) { + self.canChangeUI = false; + } + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI === undefined) { + if ((orientation === 'landscape' && screenHeight <= 575) + || (orientation === 'portrait' && screenWidth <= 575)) { + ConfigStorage.set({'cordovaForceComputerUI': false}); + } else { + ConfigStorage.set({'cordovaForceComputerUI': true}); + } + } + }); + self.set(); + }, + set: function() { + const self = this; + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI) { + window.screen.orientation.lock('landscape'); + $('body').css('zoom', self.uiZoom); + } else { + window.screen.orientation.lock('portrait'); + $('body').css('zoom', 1); + } + }); + }, +}; + +const cordovaApp = { + initialize: function() { + this.bindEvents(); + }, + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + onDeviceReady: function() { + $('.open_firmware_flasher, .tab_firmware_flasher').hide(); + cordovaUI.init(); + navigator.splashscreen.hide(); + cordovaChromeapi.init(); + appReady(); + }, +}; + +cordovaApp.initialize(); diff --git a/src/js/gui.js b/src/js/gui.js index e723563d14..d56ffcbf79 100644 --- a/src/js/gui.js +++ b/src/js/gui.js @@ -19,6 +19,7 @@ var GUI_control = function () { 'changelog', 'firmware_flasher', 'privacy_policy', + 'options', 'help' ]; this.defaultAllowedFCTabsWhenConnected = [ @@ -48,33 +49,51 @@ var GUI_control = function () { this.allowedTabs = this.defaultAllowedTabsWhenDisconnected; // check which operating system is user running - if (navigator.appVersion.indexOf("Win") != -1) this.operating_system = "Windows"; - else if (navigator.appVersion.indexOf("Mac") != -1) this.operating_system = "MacOS"; - else if (navigator.appVersion.indexOf("CrOS") != -1) this.operating_system = "ChromeOS"; - else if (navigator.appVersion.indexOf("Linux") != -1) this.operating_system = "Linux"; - else if (navigator.appVersion.indexOf("X11") != -1) this.operating_system = "UNIX"; - else this.operating_system = "Unknown"; + this.operating_system = GUI_checkOperatingSystem(); // Check the method of execution this.nwGui = null; try { - this.nwGui = require('nw.gui'); - this.Mode = GUI_Modes.NWJS; + this.nwGui = require('nw.gui'); + this.Mode = GUI_Modes.NWJS; } catch (ex) { - if (window.chrome && chrome.storage && chrome.storage.local) { - this.Mode = GUI_Modes.ChromeApp; - } else { - this.Mode = GUI_Modes.Other; - } + if (typeof cordovaApp !== 'undefined') { + this.Mode = GUI_Modes.Cordova; + } else { + if (window.chrome && chrome.storage && chrome.storage.local) { + this.Mode = GUI_Modes.ChromeApp; + } else { + this.Mode = GUI_Modes.Other; + } + } } }; const GUI_Modes = { NWJS: "NW.js", ChromeApp: "Chrome", + Cordova: "Cordova", Other: "Other" }; +function GUI_checkOperatingSystem() { + if (navigator.appVersion.indexOf("Win") !== -1) { + return "Windows"; + } else if (navigator.appVersion.indexOf("Mac") !== -1) { + return "MacOS"; + } else if (navigator.appVersion.indexOf("CrOS") !== -1) { + return "ChromeOS"; + } else if (navigator.appVersion.indexOf("Android") !== -1) { + return "Android"; + } else if (navigator.appVersion.indexOf("Linux") !== -1) { + return "Linux"; + } else if (navigator.appVersion.indexOf("X11") !== -1) { + return "UNIX"; + } else { + return "Unknown"; + } +} + // Timer managing methods // name = string @@ -363,13 +382,16 @@ GUI_control.prototype.selectDefaultTabWhenConnected = function() { }; GUI_control.prototype.isChromeApp = function () { - return this.Mode == GUI_Modes.ChromeApp; + return this.Mode === GUI_Modes.ChromeApp; }; GUI_control.prototype.isNWJS = function () { - return this.Mode == GUI_Modes.NWJS; + return this.Mode === GUI_Modes.NWJS; }; +GUI_control.prototype.isCordova = function () { + return this.Mode === GUI_Modes.Cordova; + }; GUI_control.prototype.isOther = function () { - return this.Mode == GUI_Modes.Other; + return this.Mode === GUI_Modes.Other; }; diff --git a/src/js/localization.js b/src/js/localization.js index af52f5439c..280b52d399 100644 --- a/src/js/localization.js +++ b/src/js/localization.js @@ -51,10 +51,12 @@ i18n.init = function(cb) { }; i18n.changeLanguage = function(languageSelected) { - ConfigStorage.set({'userLanguageSelect': languageSelected}); - i18next.changeLanguage(getValidLocale(languageSelected)); - i18n.selectedLanguage = languageSelected; - GUI.log(i18n.getMessage('language_changed')); + if (typeof ConfigStorage !== 'undefined') { + ConfigStorage.set({'userLanguageSelect': languageSelected}); + } + i18next.changeLanguage(getValidLocale(languageSelected)); + i18n.selectedLanguage = languageSelected; + GUI.log(i18n.getMessage('language_changed')); }; i18n.getMessage = function(messageID, parameters) { @@ -159,17 +161,22 @@ i18n.localizePage = function(forceReTranslate) { * returns the current locale to the callback */ function getStoredUserLocale(cb) { - ConfigStorage.get('userLanguageSelect', function (result) { - let userLanguage = 'DEFAULT'; - if (result.userLanguageSelect) { - userLanguage = result.userLanguageSelect; - } - i18n.selectedLanguage = userLanguage; + if (typeof ConfigStorage !== 'undefined') { + ConfigStorage.get('userLanguageSelect', function (result) { + let userLanguage = 'DEFAULT'; + if (result.userLanguageSelect) { + userLanguage = result.userLanguageSelect; + } + i18n.selectedLanguage = userLanguage; - userLanguage = getValidLocale(userLanguage); + userLanguage = getValidLocale(userLanguage); + cb(userLanguage); + }); + } else { + const userLanguage = getValidLocale('DEFAULT'); cb(userLanguage); - }); + } } function getValidLocale(userLocale) { diff --git a/src/js/main.js b/src/js/main.js index 90429fe9a3..059a6ea43a 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -4,6 +4,12 @@ window.googleAnalytics = analytics; window.analytics = null; $(document).ready(function () { + if (typeof cordovaApp === 'undefined') { + appReady(); + } +}); + +function appReady() { $.getJSON('version.json', function(data) { CONFIGURATOR.version = data.version; CONFIGURATOR.gitChangesetId = data.gitChangesetId; @@ -29,7 +35,7 @@ $(document).ready(function () { initializeSerialBackend(); }); }); -}); +} function checkSetupAnalytics(callback) { if (!analytics) { @@ -143,13 +149,17 @@ function closeSerial() { } function closeHandler() { - this.hide(); + if (!GUI.isCordova()) { + this.hide(); + } analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppClose', { sessionControl: 'end' }); closeSerial(); - this.close(true); + if (!GUI.isCordova()) { + this.close(true); + } } //Process to execute to real start the app @@ -171,14 +181,16 @@ function startProcess() { GUI.nwGui.Shell.openExternal(url); }); nwWindow.on('close', closeHandler); - } else if (!GUI.isOther()) { + } else if (GUI.isChromeApp()) { chrome.app.window.onClosed.addListener(closeHandler); // This event does not actually get fired: chrome.runtime.onSuspend.addListener(closeHandler); + } else if (GUI.isCordova()) { + window.addEventListener('beforeunload', closeHandler); } $('.connect_b a.connect').removeClass('disabled'); - $('#logo .version').text(CONFIGURATOR.version); + $('#logo .version, #tab_logoversion .version').text(CONFIGURATOR.version); updateStatusBarVersion(); updateTopBarVersion(); @@ -202,6 +214,10 @@ function startProcess() { ); }); + if (GUI.isCordova()) { + UI_PHONES.init(); + } + const ui_tabs = $('#tabs > ul'); $('a', ui_tabs).click(function () { if ($(this).parent().hasClass('active') === false && !GUI.tab_switch_in_progress) { // only initialize when the tab isn't already active @@ -274,6 +290,9 @@ function startProcess() { case 'privacy_policy': TABS.staticTab.initialize('privacy_policy', content_ready); break; + case 'options': + TABS.options.initialize(content_ready); + break; case 'firmware_flasher': TABS.firmware_flasher.initialize(content_ready); break; @@ -354,117 +373,6 @@ function startProcess() { $('#tabs ul.mode-disconnected li a:first').click(); - // options - $('a#options').click(function () { - const el = $(this); - - if (!el.hasClass('active')) { - el.addClass('active'); - el.after('
'); - - $('div#options-window').load('./tabs/options.html', function () { - // translate to user-selected language - i18n.localizePage(); - - ConfigStorage.get('permanentExpertMode', function (result) { - if (result.permanentExpertMode) { - $('div.permanentExpertMode input').prop('checked', true); - } - - $('div.permanentExpertMode input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'permanentExpertMode': checked}); - - $('input[name="expertModeCheckbox"]').prop('checked', checked).change(); - }).change(); - }); - - ConfigStorage.get('rememberLastTab', function (result) { - $('div.rememberLastTab input') - .prop('checked', !!result.rememberLastTab) - .change(function() { ConfigStorage.set({rememberLastTab: $(this).is(':checked')}); }) - .change(); - }); - - if (GUI.operating_system !== 'ChromeOS') { - ConfigStorage.get('checkForConfiguratorUnstableVersions', function (result) { - if (result.checkForConfiguratorUnstableVersions) { - $('div.checkForConfiguratorUnstableVersions input').prop('checked', true); - } - - $('div.checkForConfiguratorUnstableVersions input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'checkForConfiguratorUnstableVersions': checked}); - - checkForConfiguratorUpdates(); - }); - }); - } else { - $('div.checkForConfiguratorUnstableVersions').hide(); - } - - ConfigStorage.get('analyticsOptOut', function (result) { - if (result.analyticsOptOut) { - $('div.analyticsOptOut input').prop('checked', true); - } - - $('div.analyticsOptOut input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'analyticsOptOut': checked}); - - checkSetupAnalytics(function (analyticsService) { - if (checked) { - analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptOut'); - } - - analyticsService.setOptOut(checked); - - if (!checked) { - analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptIn'); - } - }); - }).change(); - }); - - $('div.cliAutoComplete input') - .prop('checked', CliAutoComplete.configEnabled) - .change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'cliAutoComplete': checked}); - CliAutoComplete.setEnabled(checked); - }).change(); - - $('#darkThemeSelect') - .val(DarkTheme.configEnabled) - .change(function () { - const value = parseInt($(this).val()); - - ConfigStorage.set({'darkTheme': value}); - setDarkTheme(value); - }).change(); - - function close_and_cleanup(e) { - if (e.type === 'click' && !$.contains($('div#options-window')[0], e.target) || e.type === 'keyup' && e.keyCode === 27) { - $(document).unbind('click keyup', close_and_cleanup); - - $('div#options-window').slideUp(250, function () { - el.removeClass('active'); - $(this).empty().remove(); - }); - } - } - - $(document).bind('click keyup', close_and_cleanup); - - $(this).slideDown(250); - }); - } - }); - // listen to all input change events and adjust the value within limits if necessary $("#content").on('focus', 'input[type="number"]', function () { const element = $(this); @@ -535,22 +443,19 @@ function startProcess() { $("#showlog").on('click', function () { let state = $(this).data('state'); if (state) { - $("#log").animate({height: 27}, 200, function () { + setTimeout(function() { const command_log = $('div#log'); command_log.scrollTop($('div.wrapper', command_log).height()); - }); + }, 200); $("#log").removeClass('active'); - $("#content").removeClass('logopen'); - $(".tab_container").removeClass('logopen'); + $("#tab-content-container").removeClass('logopen'); $("#scrollicon").removeClass('active'); ConfigStorage.set({'logopen': false}); state = false; } else { - $("#log").animate({height: 111}, 200); $("#log").addClass('active'); - $("#content").addClass('logopen'); - $(".tab_container").addClass('logopen'); + $("#tab-content-container").addClass('logopen'); $("#scrollicon").addClass('active'); ConfigStorage.set({'logopen': true}); @@ -567,11 +472,12 @@ function startProcess() { }); ConfigStorage.get('permanentExpertMode', function (result) { + const experModeCheckbox = 'input[name="expertModeCheckbox"]'; if (result.permanentExpertMode) { - $('input[name="expertModeCheckbox"]').prop('checked', true); + $(experModeCheckbox).prop('checked', true); } - $('input[name="expertModeCheckbox"]').change(function () { + $(experModeCheckbox).change(function () { const checked = $(this).is(':checked'); checkSetupAnalytics(function (analyticsService) { analyticsService.setDimension(analyticsService.DIMENSIONS.CONFIGURATOR_EXPERT_MODE, checked ? 'On' : 'Off'); @@ -819,7 +725,7 @@ function updateTopBarVersion(firmwareVersion, firmwareId, hardwareId) { const versionText = `${configuratorVersion}
${firmwareVersionAndId}
${targetVersion}`; - $('#logo .logo_text').html(versionText); + $('#logo .logo_text, #tab_logoversion .version').html(versionText); } function updateStatusBarVersion(firmwareVersion, firmwareId, hardwareId) { diff --git a/src/js/main_cordova.js b/src/js/main_cordova.js new file mode 100644 index 0000000000..bd7ce0e6aa --- /dev/null +++ b/src/js/main_cordova.js @@ -0,0 +1,251 @@ +'use strict'; + +const REQUIRED_WEBVIEW_VERSION = 72; +const WEBVIEW = { + chromeVersion: '', + majorChromeVersion: 0, + appsId: { + androidWebview: 'com.android.webview', + googleWebview: 'com.google.android.webview', + chrome: 'com.android.chrome', + }, + apps: { + 'com.android.webview': { }, + 'com.google.android.webview': { + name: 'Android System WebView', + displayName: 'Google Android Webview', + }, + 'com.android.chrome': { + name: 'Google Chrome', + displayName: 'Chrome', + }, + }, + matchingVersion: 0, + usedApp: null, + uptodateApps: [], + htmlElements: { + webview_step_msg: '#webview_step_msg', + webview_step_btn1: '#webview_step_btn1', + webview_step_btn2: '#webview_step_btn2', + }, + advices: { + installGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewInstall', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $('#webview_step_btn1').text(i18n.getMessage('cordovaWebviewInstallBtn')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + callback(); + }, + updateGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUpdate', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUpdateBtn')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + callback(); + }, + updateAndroidChrome: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUpdate', { + app: WEBVIEW.apps[WEBVIEW.appsId.chrome].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUpdateBtn')) + .attr('app_id', WEBVIEW.appsId.chrome); + callback(); + }, + uninstallGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUninstall', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUninstallBtn1')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + $(WEBVIEW.htmlElements.webview_step_btn2).text(i18n.getMessage('cordovaWebviewUninstallBtn2')) + .attr('app_id', WEBVIEW.appsId.googleWebview) + .show(); + callback(); + }, + selectWebview: function(id, callback) { + let app; + if (id === WEBVIEW.appsId.googleWebview) { + app = WEBVIEW.apps[WEBVIEW.appsId.googleWebview].displayName; + } else if (id === WEBVIEW.appsId.chrome) { + app = WEBVIEW.apps[WEBVIEW.appsId.chrome].displayName; + } + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewEnable', { + app: app, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).hide(); + $(WEBVIEW.htmlElements.webview_step_btn2).text(i18n.getMessage('cordovaWebviewEnableBtn')).show(); + callback(); + }, + }, + getAdvice1: function(callback) { + const self = this; + if (self.usedApp === WEBVIEW.appsId.googleWebview) { + self.advices.updateGoogleAndroidWebview(callback); + } else if (self.usedApp === WEBVIEW.appsId.chrome) { + self.advices.updateAndroidChrome(callback); + } + }, + getAdvice2: function(callback) { + const self = this; + if (self.uptodateApps.length > 0) { + self.advices.selectWebview(callback); + } else { + if ((self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled) + && (self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled)) { + self.advices.uninstallGoogleAndroidWebview(callback); + } else if (!(self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled) + && !(self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled)) { + self.advices.installGoogleAndroidWebview(callback); + } else { + self.getAdvice3(callback); + } + } + }, + getAdvice3: function(callback) { + const self = this; + if (self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled + && !self.apps[WEBVIEW.appsId.googleWebview].uptodate) { + self.advices.updateGoogleAndroidWebview(callback); + } else if (self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled + && !self.apps[WEBVIEW.appsId.chrome].uptodate) { + self.advices.updateAndroidChrome(callback); + } + }, + getAdvice: function(callback) { + const self = this; + if (self.usedApp && self.usedApp !== WEBVIEW.appsId.androidWebview) { + this.getAdvice1(callback); + } else { + this.getAdvice2(callback); + } + }, + tryToFindUsedApp: function(callback) { + const self = this; + const appsId = Object.keys(self.apps); + for (let i=0; i${i18n.getMessage('cordovaWebviewUsed')})`); + } + if (i === appsId.length-1) { + callback(); + } + } + }, + checkInstalledApps: function(callback) { + const self = this; + const appsId = Object.keys(self.apps); + let installedApps = 0; + + function checkAvailability(id, i) { + appAvailability.check(id, function(info) { + appInstalled(info, id, i); + }, function() { + appNotInstalled(id, i); + }); + } + function end(i) { + if (i === appsId.length-1) { + if (installedApps === 0) { + $('#webview_apps').append('
  • '); + } + i18n.localizePage(); + console.log('callback'); + callback(); + } + } + function appInstalled(info, id, i) { + installedApps++; + self.apps[id].installed = true; + self.apps[id].enabled = info.enabled; + self.apps[id].version = info.version; + self.apps[id].majorVersion = parseInt(info.version.split('.')[0]); + if (self.chromeVersion === self.apps[id].version) { + self.apps[id].used = 'could'; + self.matchingVersion++; + } else { + self.apps[id].used = 'no'; + } + let color; + if (self.apps[id].majorVersion >= REQUIRED_WEBVIEW_VERSION) { + color = 'green'; + self.apps[id].uptodate = true; + self.uptodateApps.push(id); + } else { + color = 'red'; + self.apps[id].uptodate = false; + } + let app = `
  • ${id} (${self.apps[id].version})`; + if (!self.apps[id].enabled) { + app += ' ()'; + } + app += '
  • '; + $('#webview_apps').append(app); + end(i); + } + function appNotInstalled(id, i) { + self.apps[id].installed = false; + end(i); + } + + for (let i=0; i= REQUIRED_WEBVIEW_VERSION) { + navigator.splashscreen.show(); + document.location.href = 'main.html'; + } else { + navigator.splashscreen.hide(); + self.checkInstalledApps(function() { + self.tryToFindUsedApp(function() { + self.getAdvice(function() { + $('#loading').hide(); + $('#webview_troubleshooting').show(); + }); + }); + }); + } + }, +}; + + +const cordovaApp = { + initialize: function() { + this.bindEvents(); + }, + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + onDeviceReady: function() { + i18n.init(function() { + i18n.localizePage(); + WEBVIEW.exec(); + }); + }, +}; +cordovaApp.initialize(); + +$(WEBVIEW.htmlElements.webview_step_btn1).on('click', function() { + const appId = $(WEBVIEW.htmlElements.webview_step_btn1).attr('app_id'); + cordova.plugins.market.open(appId); +}); +$(WEBVIEW.htmlElements.webview_step_btn2).on('click', function() { + if ($(WEBVIEW.htmlElements.webview_step_btn2).attr('app_id') !== undefined) { + const appId = $(WEBVIEW.htmlElements.webview_step_btn2).attr('app_id'); + window.cordova.plugins.settings.open(['application_details', false, appId]); + } else { + window.cordova.plugins.settings.open('settings'); + } +}); diff --git a/src/js/model.js b/src/js/model.js index 1ac61f12be..ce46927e61 100644 --- a/src/js/model.js +++ b/src/js/model.js @@ -146,6 +146,8 @@ Model.prototype.resize = function () { }; Model.prototype.dispose = function () { - this.renderer.forceContextLoss(); - this.renderer.dispose(); + if (this.canUseWebGLRenderer()) { + this.renderer.forceContextLoss(); + this.renderer.dispose(); + } }; diff --git a/src/js/phones_ui.js b/src/js/phones_ui.js new file mode 100644 index 0000000000..202d277221 --- /dev/null +++ b/src/js/phones_ui.js @@ -0,0 +1,87 @@ +'use strict'; + +const UI_PHONES = { + background: '#background', + tabContainer: '.tab_container', + tabContentContainer: '#tab-content-container', + headerbar: '.headerbar', + init: function() { + const self = this; + $('#menu_btn').click(function() { + self.openSideMenu(); + }); + $(this.background).click(function() { + self.closeSideMenu(); + }); + $('#tabs a').click(function() { + if ($('.tab_container').hasClass('reveal')) { + self.closeSideMenu(); + } + }); + $('#reveal_btn').click(function() { + self.expandHeader(); + }); + $(`${this.background}, ${this.tabContainer}`).swipe( { + swipeLeft: function() { + self.closeSideMenu(); + }, + }); + $('#side_menu_swipe').swipe( { + swipeRight: function() { + self.openSideMenu(); + }, + }); + }, + initToolbar: function() { + $('.toolbar_expand_btn').click(this.expandToolbar); + }, + openSideMenu: function() { + $(this.background).fadeIn(300); + $(this.tabContainer).addClass('reveal'); + }, + closeSideMenu: function() { + $(this.background).fadeOut(300); + $(this.tabContainer).removeClass('reveal'); + }, + expandHeader: function() { + const self = this; + let expand, headerExpanded, reveal; + if (GUI.connected_to) { + expand = 'expand2'; + headerExpanded = 'header_expanded2'; + reveal = '.header-wrapper'; + } else { + expand = 'expand'; + headerExpanded = 'headerExpanded'; + reveal = '#port-picker'; + } + if ($(self.headerbar).hasClass(expand)) { + $(reveal).removeClass('reveal'); + setTimeout(function() { + $(self.tabContentContainer).removeClass(headerExpanded); + $(self.headerbar).removeClass(expand); + }, 100); + } else { + $(self.tabContentContainer).addClass(headerExpanded); + $(self.headerbar).addClass(expand); + setTimeout(function() { + $(reveal).addClass('reveal'); + }, 100); + } + }, + expandToolbar: function() { + const toolbar = $('.content_toolbar.xs-compressed'); + if (toolbar.length > 0) { + if ($('.content_toolbar.xs-compressed').hasClass('expanded')) { + toolbar.removeClass('expanded'); + } else { + toolbar.addClass('expanded'); + } + } + }, + reset: function() { + $(this.tabContentContainer).removeClass('header_expanded2 header_expanded'); + $('#port-picker, .header-wrapper').removeClass('reveal'); + $(this.headerbar).removeClass('expand2 expand'); + }, +}; diff --git a/src/js/port_handler.js b/src/js/port_handler.js index 838ff177fa..1c2f26f9f5 100644 --- a/src/js/port_handler.js +++ b/src/js/port_handler.js @@ -40,7 +40,7 @@ PortHandler.check = function () { if (GUI.connected_to) { for (var i = 0; i < removed_ports.length; i++) { if (removed_ports[i] == GUI.connected_to) { - $('div#port-picker a.connect').click(); + $('div#header_btns a.connect').click(); } } } @@ -116,7 +116,7 @@ PortHandler.check = function () { // we need firmware flasher protection over here if (GUI.active_tab != 'firmware_flasher') { GUI.timeout_add('auto-connect_timeout', function () { - $('div#port-picker a.connect').click(); + $('div#header_btns a.connect').click(); }, 100); // timeout so bus have time to initialize after being detected by the system } } @@ -164,7 +164,6 @@ PortHandler.check_usb_devices = function (callback) { } self.dfu_available = false; } - if(callback) callback(self.dfu_available); if (!$('option:selected', portPickerElement).data().isDFU) { diff --git a/src/js/serial_backend.js b/src/js/serial_backend.js index ed18a5700c..2235276f76 100644 --- a/src/js/serial_backend.js +++ b/src/js/serial_backend.js @@ -68,7 +68,7 @@ function initializeSerialBackend() { // lock port select & baud while we are connecting / connected $('div#port-picker #port, div#port-picker #baud, div#port-picker #delay').prop('disabled', true); - $('div.connect_controls a.connect_state').text(i18n.getMessage('connecting')); + $('div.connect_controls div.connect_state').text(i18n.getMessage('connecting')); serial.connect(portName, {bitrate: selected_baud}, onOpen); @@ -107,7 +107,7 @@ function initializeSerialBackend() { // auto-connect ConfigStorage.get('auto_connect', function (result) { - if (result.auto_connect === 'undefined' || result.auto_connect) { + if (result.auto_connect === undefined || result.auto_connect) { // default or enabled by user GUI.auto_connect = true; @@ -147,6 +147,10 @@ function initializeSerialBackend() { } function finishClose(finishedCallback) { + if (GUI.isCordova()) { + UI_PHONES.reset(); + } + var wasConnected = CONFIGURATOR.connectionValid; analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Disconnected'); @@ -183,7 +187,7 @@ function finishClose(finishedCallback) { // reset connect / disconnect button $('div.connect_controls a.connect').removeClass('active'); - $('div.connect_controls a.connect_state').text(i18n.getMessage('connect')); + $('div.connect_controls div.connect_state').text(i18n.getMessage('connect')); // reset active sensor indicators sensor_status(0); @@ -309,7 +313,7 @@ function onOpen(openInfo) { } function abortConnect() { - $('div#connectbutton a.connect_state').text(i18n.getMessage('connect')); + $('div#connectbutton div.connect_state').text(i18n.getMessage('connect')); $('div#connectbutton a.connect').removeClass('active'); // unlock port select & baud @@ -409,6 +413,7 @@ function checkReportProblems() { }); problemDialog.showModal(); + $('#dialogReportProblems').scrollTop(0); } processUid(); @@ -456,6 +461,10 @@ function finishOpen() { GUI.allowedTabs.splice(GUI.allowedTabs.indexOf('led_strip'), 1); } + if (GUI.isCordova()) { + UI_PHONES.reset(); + } + onConnect(); GUI.selectDefaultTabWhenConnected(); @@ -474,7 +483,7 @@ function onConnect() { $('div#flashbutton a.flash').removeClass('active'); } GUI.timeout_remove('connecting'); // kill connecting timer - $('div#connectbutton a.connect_state').text(i18n.getMessage('disconnect')).addClass('active'); + $('div#connectbutton div.connect_state').text(i18n.getMessage('disconnect')).addClass('active'); $('div#connectbutton a.connect').addClass('active'); $('#tabs ul.mode-disconnected').hide(); diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index bc9538a478..359502f571 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -176,9 +176,13 @@ TABS.auxiliary.initialize = function (callback) { $(elementName + ' .channel-slider').Link('lower').to($(elementName + ' .lowerLimitValue')); $(elementName + ' .channel-slider').Link('upper').to($(elementName + ' .upperLimitValue')); + let sliderValues = [900, 1000, 1200, 1400, 1500, 1600, 1800, 2000, 2100]; + if ($(window).width() < 575) { + sliderValues = [1000, 1200, 1400, 1600, 1800, 2000]; + } $(rangeElement).find(".pips-channel-range").noUiSlider_pips({ mode: 'values', - values: [900, 1000, 1200, 1400, 1500, 1600, 1800, 2000, 2100], + values: sliderValues, density: 4, stepped: true }); @@ -250,7 +254,7 @@ TABS.auxiliary.initialize = function (callback) { configureRangeTemplate(auxChannelCount); configureLinkTemplate(); - var modeTableBodyElement = $('.tab-auxiliary .modes tbody') + const modeTableBodyElement = $('.tab-auxiliary .modes'); for (var modeIndex = 0; modeIndex < AUX_CONFIG.length; modeIndex++) { var modeId = AUX_CONFIG_IDS[modeIndex]; diff --git a/src/js/tabs/cli.js b/src/js/tabs/cli.js index 775e8c94d5..50b39280f7 100644 --- a/src/js/tabs/cli.js +++ b/src/js/tabs/cli.js @@ -111,6 +111,8 @@ TABS.cli.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + TABS.cli.adaptPhones(); + CONFIGURATOR.cliActive = true; var textarea = $('.tab-cli textarea[name="commands"]'); @@ -320,6 +322,17 @@ TABS.cli.initialize = function (callback) { }); }; +TABS.cli.adaptPhones = function() { + if ($(window).width() < 575) { + const backdropHeight = $('.note').height() + 22 + 38; + $('.backdrop').css('height', `calc(100% - ${backdropHeight}px)`); + } + + if (GUI.isCordova()) { + UI_PHONES.initToolbar(); + } +}; + TABS.cli.history = { history: [], index: 0 diff --git a/src/js/tabs/led_strip.js b/src/js/tabs/led_strip.js index 43ba635b56..46b0443489 100644 --- a/src/js/tabs/led_strip.js +++ b/src/js/tabs/led_strip.js @@ -593,6 +593,11 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { updateBulkCmd(); + if ($(window).width() < 575) { + const gridZoom = $('.tab_title').width() / 496; + $('.mainGrid, .gridSections').css('zoom', gridZoom); + } + GUI.content_ready(callback); } diff --git a/src/js/tabs/options.js b/src/js/tabs/options.js new file mode 100644 index 0000000000..c3e3e8ad2d --- /dev/null +++ b/src/js/tabs/options.js @@ -0,0 +1,143 @@ +'use strict'; + +TABS.options = {}; +TABS.options.initialize = function (callback) { + if (GUI.active_tab !== 'options') { + GUI.active_tab = 'options'; + } + + $('#content').load("./tabs/options.html", function () { + i18n.localizePage(); + + TABS.options.initPermanentExpertMode(); + TABS.options.initRememberLastTab(); + TABS.options.initCheckForConfiguratorUnstableVersions(); + TABS.options.initAnalyticsOptOut(); + TABS.options.initCliAutoComplete(); + TABS.options.initCordovaForceComputerUI(); + TABS.options.initDarkTheme(); + + GUI.content_ready(callback); + }); +}; + +TABS.options.cleanup = function (callback) { + if (callback) { + callback(); + } +}; + +TABS.options.initPermanentExpertMode = function () { + ConfigStorage.get('permanentExpertMode', function (result) { + if (result.permanentExpertMode) { + $('div.permanentExpertMode input').prop('checked', true); + } + + $('div.permanentExpertMode input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'permanentExpertMode': checked}); + + $('input[name="expertModeCheckbox"]').prop('checked', checked).change(); + }).change(); + }); +}; + +TABS.options.initRememberLastTab = function () { + ConfigStorage.get('rememberLastTab', function (result) { + $('div.rememberLastTab input') + .prop('checked', !!result.rememberLastTab) + .change(function() { ConfigStorage.set({rememberLastTab: $(this).is(':checked')}); }) + .change(); + }); +}; + +TABS.options.initCheckForConfiguratorUnstableVersions = function () { + if (GUI.operating_system !== 'ChromeOS') { + ConfigStorage.get('checkForConfiguratorUnstableVersions', function (result) { + if (result.checkForConfiguratorUnstableVersions) { + $('div.checkForConfiguratorUnstableVersions input').prop('checked', true); + } + + $('div.checkForConfiguratorUnstableVersions input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'checkForConfiguratorUnstableVersions': checked}); + + checkForConfiguratorUpdates(); + }); + }); + } else { + $('div.checkForConfiguratorUnstableVersions').hide(); + } +}; + +TABS.options.initAnalyticsOptOut = function () { + ConfigStorage.get('analyticsOptOut', function (result) { + if (result.analyticsOptOut) { + $('div.analyticsOptOut input').prop('checked', true); + } + + $('div.analyticsOptOut input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'analyticsOptOut': checked}); + + checkSetupAnalytics(function (analyticsService) { + if (checked) { + analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptOut'); + } + + analyticsService.setOptOut(checked); + + if (!checked) { + analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptIn'); + } + }); + }).change(); + }); +}; + +TABS.options.initCliAutoComplete = function () { + $('div.cliAutoComplete input') + .prop('checked', CliAutoComplete.configEnabled) + .change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'cliAutoComplete': checked}); + CliAutoComplete.setEnabled(checked); + }).change(); +}; + +TABS.options.initCordovaForceComputerUI = function () { + if (GUI.isCordova() && cordovaUI.canChangeUI) { + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI) { + $('div.cordovaForceComputerUI input').prop('checked', true); + } + + $('div.cordovaForceComputerUI input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'cordovaForceComputerUI': checked}); + + if (typeof cordovaUI.set === 'function') { + cordovaUI.set(); + } + }); + }); + } else { + $('div.cordovaForceComputerUI').hide(); + } +}; + +TABS.options.initDarkTheme = function () { + $('#darkThemeSelect') + .val(DarkTheme.configEnabled) + .change(function () { + const value = parseInt($(this).val()); + + ConfigStorage.set({'darkTheme': value}); + setDarkTheme(value); + }).change(); +}; diff --git a/src/js/tabs/osd.js b/src/js/tabs/osd.js index 081a1cda7c..9a16246fd2 100644 --- a/src/js/tabs/osd.js +++ b/src/js/tabs/osd.js @@ -2200,6 +2200,12 @@ TABS.osd.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + if ($(window).width() < 390) { + const previewZoom = ($(window).width() - 30) / 360; + $('.display-layout .preview').css('zoom', previewZoom); + } + + // Open modal window OSD.GUI.fontManager = new jBox('Modal', { width: 750, diff --git a/src/js/tabs/pid_tuning.js b/src/js/tabs/pid_tuning.js index a29a6e89ea..106e2720d7 100644 --- a/src/js/tabs/pid_tuning.js +++ b/src/js/tabs/pid_tuning.js @@ -2586,28 +2586,28 @@ TABS.pid_tuning.changeRatesTypeLogo = function() { switch(self.currentRatesType) { case self.RATES_TYPE.RACEFLIGHT: - ratesLogoElement.attr("src", "../images/rate_logos/raceflight.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/raceflight.svg"); break; case self.RATES_TYPE.KISS: - ratesLogoElement.attr("src", "../images/rate_logos/kiss.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/kiss.svg"); break; case self.RATES_TYPE.ACTUAL: - ratesLogoElement.attr("src", "../images/rate_logos/actual.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/actual.svg"); break; case self.RATES_TYPE.QUICKRATES: - ratesLogoElement.attr("src", "../images/rate_logos/quickrates.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/quickrates.svg"); break; // add future rates types here default: // BetaFlight - ratesLogoElement.attr("src", "../images/rate_logos/betaflight.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/betaflight.svg"); break; } diff --git a/src/js/tabs/ports.js b/src/js/tabs/ports.js index 4159514561..8203f5a234 100644 --- a/src/js/tabs/ports.js +++ b/src/js/tabs/ports.js @@ -184,9 +184,11 @@ TABS.ports.initialize = function (callback, scrollPosition) { let lastVtxControlSelected; var ports_e = $('.tab-ports .ports'); + const portIdentifierTemplateE = $('#tab-ports-templates .portIdentifier'); var port_configuration_template_e = $('#tab-ports-templates .portConfiguration'); for (var portIndex = 0; portIndex < SERIAL_CONFIG.ports.length; portIndex++) { + const portIdentifierE = portIdentifierTemplateE.clone(); var port_configuration_e = port_configuration_template_e.clone(); var serialPort = SERIAL_CONFIG.ports[portIndex]; @@ -216,6 +218,7 @@ TABS.ports.initialize = function (callback, scrollPosition) { var blackbox_baudrate_e = port_configuration_e.find('select.blackbox_baudrate'); blackbox_baudrate_e.val(blackboxBaudrate); + portIdentifierE.find('.identifier').text(portIdentifierToNameMapping[serialPort.identifier]); port_configuration_e.find('.identifier').text(portIdentifierToNameMapping[serialPort.identifier]); port_configuration_e.data('index', portIndex); @@ -288,6 +291,7 @@ TABS.ports.initialize = function (callback, scrollPosition) { } } + ports_e.find('tbody').append(portIdentifierE); ports_e.find('tbody').append(port_configuration_e); } diff --git a/src/js/tabs/vtx.js b/src/js/tabs/vtx.js index 1346b0c348..1336fc84aa 100644 --- a/src/js/tabs/vtx.js +++ b/src/js/tabs/vtx.js @@ -41,6 +41,10 @@ TABS.vtx.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + if (GUI.isCordova()) { + UI_PHONES.initToolbar(); + } + self.updating = false; GUI.content_ready(callback); } @@ -112,8 +116,9 @@ TABS.vtx.initialize = function (callback) { // Load schema const urlVtxSchema = chrome.runtime.getURL(`resources/jsonschema/vtxconfig_schema-${vtxConfig.version}.json`); - if (GUI.Mode === GUI_Modes.ChromeApp) { + if (GUI.Mode === GUI_Modes.ChromeApp || GUI.isCordova()) { // FIXME the ChromeOs don't let us use a Schema Validator because almost all of them use eval, and/or use require + // On android : Fetch API cannot load : URL scheme "file" is not supported callback_valid(); } else { fetch(urlVtxSchema) diff --git a/src/main.html b/src/main.html index 479be3a275..bfda01a57e 100644 --- a/src/main.html +++ b/src/main.html @@ -33,12 +33,16 @@ + + + + @@ -117,6 +121,7 @@ + @@ -127,30 +132,30 @@ + +
    +
    +
    + -
    -
    -
    - -
    - -
    -
    -
    - -
    - +
    +
    -
    - -
    + class="auto_connect" i18n="autoConnect">
    -
    -
    -
      -
    • -
      -
    • -
    -
    - +
    +
    +
    +
    +
    +
    +
    Battery voltage
    +
    +
    +
    +
    -
    +
    • @@ -223,22 +223,39 @@
    -
    -
    -
    -
    -
    +
    +
    +
      +
    • +
      +
    • +
    +
    +
    -
    Battery voltage
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    -
    @@ -246,67 +263,76 @@
    -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    -
      -
    • -
    • +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
        +
      • +
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • - -
      -
        -
      • - -
      • -
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • + +
    +
      +
    • + +
    • +
    +
    +
    -
    +
    -
    D: 0%
    + diff --git a/src/main_cordova.html b/src/main_cordova.html new file mode 100644 index 0000000000..e1e828e92c --- /dev/null +++ b/src/main_cordova.html @@ -0,0 +1,48 @@ + + + + + + Betaflight configurator + + + + +
    + +
    +
    + +

    +
    +
    +
    +
    + +
    +
    +

    +

    +
    +

    + + +
    +
    +
    +
    + +
    +
    +
      +
      +
      +
      + + + + + + + + diff --git a/src/tabs/adjustments.html b/src/tabs/adjustments.html index 90b6074597..69afd8d15b 100644 --- a/src/tabs/adjustments.html +++ b/src/tabs/adjustments.html @@ -14,20 +14,22 @@
      - - +
      +
      + - + - - - -
      + + + + +
      diff --git a/src/tabs/auxiliary.html b/src/tabs/auxiliary.html index d27d0eabd7..14872a1b53 100644 --- a/src/tabs/auxiliary.html +++ b/src/tabs/auxiliary.html @@ -15,10 +15,7 @@
      - - - -
      +
      @@ -27,20 +24,24 @@
      - - - - - - - -
      -

      -
      - - -
      -
      +
      +
      +
      +

      +
      + + + + + + + + +
      +
      +
      +
      +
      diff --git a/src/tabs/cli.html b/src/tabs/cli.html index 70a40dfaa4..1e17b91f22 100644 --- a/src/tabs/cli.html +++ b/src/tabs/cli.html @@ -1,4 +1,4 @@ -
      +

      @@ -11,15 +11,25 @@
      -
      -
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + -
      \ No newline at end of file +
      diff --git a/src/tabs/configuration.html b/src/tabs/configuration.html index a228b25cc3..cce43d6e96 100644 --- a/src/tabs/configuration.html +++ b/src/tabs/configuration.html @@ -4,365 +4,361 @@
      -
      +

      - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      -
      -
      -
      -
      -
      -
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      -
      +
      -
      -
      -
      - -
      - -
      +
      +
      +
      +
      +
      + +
      -
      +
      +
      - -
      -
      -
      -
      -
      -
      -
      -

      + +
      +
      +
      +
      +
      +
      +
      +

      +
      +
      +
      +
      -
      + +
      +
      +
      + + + +
      +
      + + +
      +
      +
      +
      - +
      - -
      +
      - - - -
      -
      - - -
      -
      -
      -
      -
      - -
      - -
      -
      -
      - -
      - +
      +
      -
      -
      - -
      - + +
      +
      +
      +
      +
      -
      -
      -
      -
      -
      -
      - -
      -
      +
      +
      +
      +
      -
      -
      -
      +
      +
      +
      -
      -
      - -
      +
      +
      +
      +
      +
      +
      +
      +
      +
      - -
      - - - -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      +
      +
      + +
      +
      +
      +
      -
      + +
      +
      + +
      +
      +
      - +
      - + +
      -
      + -
      -
      -
      - -
      - -
      +
      + + + + +
      + + + + +
      + +
      +
      + +
      + +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      -
      -
      + +
      +
      -
      -
      + +
      +
      -
      +
      +
      +
      -
      +
      -
      -
      -
      -
      - - -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      -
      - -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      + + +
      -
      -
      - -
      -
      - -
      -
      - -
      +
      + +
      +
      +
      -
      -
      -
      -
      -
      -
      -
      -
      - - - - -
      -
      -
      -
      -
      -
      - - -
      -
      -
      -

      -
      - - -
      -
      -
      -

      -
      - - -
      +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +

      +
      + + +
      +
      +
      +

      +
      + +
      - -
      - - - -
      -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      - -
      - - - -
      -
      -
      -
      -
      -
      -
      -

      -
      - - - - - - - - - - - -
      -
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      +
      + + + + + + + + + + + +
      - -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      -
      - -
      -
      - -
      -
      - -
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      + +
      +
      + +
      +
      +
      +
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      -
      -
      -

      -
      - -
      - - -
      -
      - + + + + + + + + + + +
      +
      +
      +
      +

      +
      + +
      + - -
      -
      -
      - -
      - -
      -
      -
      - -
      - + + +
      +
      + + +
      +
      +
      +
      -
      -
      - -
      - -
      + +
      +
      +
      +
      -
      -
      - -
      - -
      + +
      +
      +
      +
      -
      - - + +
      +
      +
      +
      +
      + +
      +
      +
      + +
      - -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      - -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      + +
      +
      + +
      +
      + +
      +
      + -
      -
      -
      - -
      - + i18n="configurationBatteryCurrent"> + +
      +
      +
      +
      +
      -
      -
      - - - - -
      -
      -
      -
      -
      -
      -
      - - - - - - - - - -
      -
      -
      - -
      - -
      -
      -
      -
      - -
      - -
      -
      - - - - -
      -
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      + +
      +
      + + + + +
      -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - -
      -
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + +
      - -
      +
      +
      +
      diff --git a/src/tabs/failsafe.html b/src/tabs/failsafe.html index 71b6d7efa5..d672c567aa 100644 --- a/src/tabs/failsafe.html +++ b/src/tabs/failsafe.html @@ -7,190 +7,192 @@

      -
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      +
      +
      +
      +
      -
      - +
      +
      + +
      +
      + +
      -
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      +
      +
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      + +
      -
      -
      -
      -
      -
      - - - - -
      -
      -
      - -
      - -
      -
      -
      - -
      +
      +
      +
      +
      -
      - -
      -
      - -
      -
      -
      - +
      +
      +
      -
      -
      - -
      -
      -
      - -
      -
      - -
      +
      +
      +
      +
      +
      +
      + + + + +
      +
      +
      +
      + +
      -
      -
      -
      - +
      + +
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - +
      + +
      +
      + +
      +
      +
      +
      -
      - +
      +
      +
      +
      -
      - +
      +
      + +
      +
      + +
      +
      -
      - +
      +
      +
      +
      -
      - +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      diff --git a/src/tabs/gps.html b/src/tabs/gps.html index 096b88f947..90392e76b9 100644 --- a/src/tabs/gps.html +++ b/src/tabs/gps.html @@ -6,8 +6,8 @@
      -
      -
      +
      +
      @@ -46,10 +46,8 @@
      -
      -
      -
      -
      +
      +
      @@ -144,26 +142,26 @@
      -
      -
      -
      -
      +
      +
      +
      -
      -
      - -
      -
      -
      -
      -
      -
      - -
      - + - –
      -
      +
      + +
      +
      +
      +
      +
      +
      + +
      + + + – +
      +
      +
      diff --git a/src/tabs/help.html b/src/tabs/help.html index 568d0af00e..aaed030457 100644 --- a/src/tabs/help.html +++ b/src/tabs/help.html @@ -1,6 +1,6 @@
      -
      -
      +
      +
      @@ -14,7 +14,7 @@
      -
      +
      @@ -38,4 +38,4 @@
      -
      \ No newline at end of file +
      diff --git a/src/tabs/landing.html b/src/tabs/landing.html index 052cb5b82a..bb031557fe 100644 --- a/src/tabs/landing.html +++ b/src/tabs/landing.html @@ -2,24 +2,25 @@
      - +
      -
      -
      +
      + +

      -
      +

      -
      +

      diff --git a/src/tabs/motors.html b/src/tabs/motors.html index 8e023d618e..8e622737b4 100644 --- a/src/tabs/motors.html +++ b/src/tabs/motors.html @@ -184,9 +184,10 @@
      -
      +
      +
      diff --git a/src/tabs/onboard_logging.html b/src/tabs/onboard_logging.html index 89b8953aec..8e8cc4c79d 100644 --- a/src/tabs/onboard_logging.html +++ b/src/tabs/onboard_logging.html @@ -1,4 +1,4 @@ -
      +
      @@ -114,43 +114,44 @@

      -
      -
      -
      -
      - -

      +
      +
      +
      +
      + +

      -
      -
        -
      • -
        -
      • -
      • -
        -
      • -
      -
      +
      +
        +
      • +
        +
      • +
      • +
        +
      • +
      -
      -
      -
      -
      +
      +
      +
      +
      -
      -
      -

      +
      +
      +
      +

      -
      - -
      +
      +
      - -

      + +

      +
      +
      diff --git a/src/tabs/options.html b/src/tabs/options.html index 1c0048b885..1bf9b0f40b 100644 --- a/src/tabs/options.html +++ b/src/tabs/options.html @@ -1,23 +1,55 @@ -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - - +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      +
      +
      diff --git a/src/tabs/osd.html b/src/tabs/osd.html index 7c2af76dea..719dfd731b 100644 --- a/src/tabs/osd.html +++ b/src/tabs/osd.html @@ -17,8 +17,8 @@

      -
      -
      +
      +
      @@ -33,13 +33,11 @@

      -
      -
      - -
      +
      +
      -
      -
      +
      +
      +
      -
      -
      -
      -
      +
      +
      +
      +
      -
      -
      -
      - +
      +
      + +
      -
      +
      -
      +
      @@ -113,7 +112,7 @@