diff --git a/.gitignore b/.gitignore
index a9aaff62a..de9eaa33e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,12 +22,12 @@ dist/
node_modules/
tmp/
temp/
-hooks/
platforms/
/plugins/
/plugins/android.json
/plugins/ios.json
www/
+!www/README.md
$RECYCLE.BIN/
.DS_Store
@@ -39,4 +39,3 @@ e2e/build
!/desktop/assets/
!/desktop/electron.js
src/configconstants.ts
-src/assets/lang
diff --git a/.travis.yml b/.travis.yml
index 88df17369..25bb9edc0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,4 +13,8 @@ before_script:
- rm -Rf node_modules/electron-builder-squirrel-windows node_modules/electron-windows-notifications #Avoid electron fail
script:
-- npm run build
\ No newline at end of file
+ - npm run build
+
+after_success:
+ - chmod +x scripts/aot.sh
+ - scripts/aot.sh
diff --git a/README.md b/README.md
index a2fd1259f..886c6cbae 100644
--- a/README.md
+++ b/README.md
@@ -12,4 +12,11 @@ This is the primary repository of source code for the official Moodle Mobile app
License
-------
-[Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
\ No newline at end of file
+[Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Big Thanks
+-----------
+
+Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs](https://saucelabs.com)
+
+![Sauce Labs Logo](https://user-images.githubusercontent.com/557037/43443976-d88d5a78-94a2-11e8-8915-9f06521423dd.png)
\ No newline at end of file
diff --git a/config.xml b/config.xml
index c69710433..c0e695b8f 100644
--- a/config.xml
+++ b/config.xml
@@ -1,5 +1,5 @@
-
+
Moodle
Moodle official app
Moodle Mobile team
@@ -94,42 +94,39 @@
-
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/desktop/assets/mac/parent.plist b/desktop/assets/mac/parent.plist
index 1bbc8550e..9e39db337 100644
--- a/desktop/assets/mac/parent.plist
+++ b/desktop/assets/mac/parent.plist
@@ -14,5 +14,7 @@
com.apple.security.files.user-selected.read-only
+ com.apple.security.device.audio-input
+
\ No newline at end of file
diff --git a/desktop/assets/windows/AppXManifest.xml b/desktop/assets/windows/AppXManifest.xml
index c83f2536f..61785fce3 100644
--- a/desktop/assets/windows/AppXManifest.xml
+++ b/desktop/assets/windows/AppXManifest.xml
@@ -6,7 +6,7 @@
+ Version="3.6.0.0" />
Moodle Desktop
Moodle Pty Ltd.
diff --git a/desktop/electron.js b/desktop/electron.js
index 51087a40d..d4a7bdbfa 100644
--- a/desktop/electron.js
+++ b/desktop/electron.js
@@ -5,6 +5,7 @@ const path = require('path');
const url = require('url');
const fs = require('fs');
const os = require('os');
+const userAgent = 'MoodleMobile';
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
@@ -64,6 +65,9 @@ function createWindow() {
mainWindow.on('focus', () => {
mainWindow.webContents.send('coreAppFocused'); // Send an event to the main window.
});
+
+ // Append some text to the user agent.
+ mainWindow.webContents.setUserAgent(mainWindow.webContents.getUserAgent() + ' ' + userAgent);
}
// This method will be called when Electron has finished initialization and is ready to create browser windows.
diff --git a/gulpfile.js b/gulpfile.js
index 673d3ad3d..17f687ba2 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -9,6 +9,7 @@ var gulp = require('gulp'),
flatten = require('gulp-flatten'),
npmPath = require('path'),
File = gutil.File,
+ exec = require('child_process').exec,
license = '' +
'// (C) Copyright 2015 Martin Dougiamas\n' +
'//\n' +
@@ -24,17 +25,6 @@ var gulp = require('gulp'),
'// See the License for the specific language governing permissions and\n' +
'// limitations under the License.\n\n';
-// Get the names of the JSON files inside a directory.
-function getFilenames(dir) {
- if (fs.existsSync(dir)) {
- return fs.readdirSync(dir).filter(function(file) {
- return file.indexOf('.json') > -1;
- });
- } else {
- return [];
- }
-}
-
/**
* Copy a property from one object to another, adding a prefix to the key if needed.
* @param {Object} target Object to copy the properties to.
@@ -75,7 +65,8 @@ function treatMergedData(data) {
var mergedOrdered = {};
for (var filepath in data) {
- var pathSplit = filepath.split('/');
+ var pathSplit = filepath.split('/'),
+ prefix;
pathSplit.pop();
@@ -120,71 +111,53 @@ function treatMergedData(data) {
}
/**
- * Build lang files.
+ * Build lang file.
*
- * @param {String[]} filenames Names of the language files.
+ * @param {String} language Language to translate.
* @param {String[]} langPaths Paths to the possible language files.
* @param {String} buildDest Path where to leave the built files.
* @param {Function} done Function to call when done.
* @return {Void}
*/
-function buildLangs(filenames, langPaths, buildDest, done) {
- if (!filenames || !filenames.length) {
- // If no filenames supplied, stop. Maybe it's an empty lang folder.
- done();
- return;
- }
+function buildLang(language, langPaths, buildDest, done) {
+ var filename = language + '.json',
+ data = {},
+ firstFile = null;
- var count = 0;
-
- function taskFinished() {
- count++;
- if (count == filenames.length) {
- done();
+ var paths = langPaths.map(function(path) {
+ if (path.slice(-1) != '/') {
+ path = path + '/';
}
- }
-
- // Now create the build files for each supported language.
- filenames.forEach(function(filename) {
- var language = filename.replace('.json', ''),
- data = {},
- firstFile = null;
-
- var paths = langPaths.map(function(path) {
- if (path.slice(-1) != '/') {
- path = path + '/';
- }
- return path + language + '.json';
- });
-
- gulp.src(paths)
- .pipe(slash())
- .pipe(clipEmptyFiles())
- .pipe(through(function(file) {
- if (!firstFile) {
- firstFile = file;
- }
- return treatFile(file, data);
- }, function() {
- /* This implementation is based on gulp-jsoncombine module.
- * https://github.com/reflog/gulp-jsoncombine */
- if (firstFile) {
- var joinedPath = path.join(firstFile.base, language+'.json');
-
- var joinedFile = new File({
- cwd: firstFile.cwd,
- base: firstFile.base,
- path: joinedPath,
- contents: treatMergedData(data)
- });
-
- this.emit('data', joinedFile);
- }
- this.emit('end');
- }))
- .pipe(gulp.dest(buildDest))
- .on('end', taskFinished);
+ return path + language + '.json';
});
+
+ gulp.src(paths, { allowEmpty: true })
+ .pipe(slash())
+ .pipe(clipEmptyFiles())
+ .pipe(through(function(file) {
+ if (!firstFile) {
+ firstFile = file;
+ }
+ return treatFile(file, data);
+ }, function() {
+ /* This implementation is based on gulp-jsoncombine module.
+ * https://github.com/reflog/gulp-jsoncombine */
+ if (firstFile) {
+ var joinedPath = path.join(firstFile.base, language+'.json');
+
+ var joinedFile = new File({
+ cwd: firstFile.cwd,
+ base: firstFile.base,
+ path: joinedPath,
+ contents: treatMergedData(data)
+ });
+
+ this.emit('data', joinedFile);
+ }
+ this.emit('end');
+ }))
+ .pipe(gulp.dest(buildDest))
+ .on('end', done);
}
// Delete a folder and all its contents.
@@ -204,10 +177,7 @@ function deleteFolderRecursive(path) {
}
// List of app lang files. To be used only if cannot get it from filesystem.
-var appLangFiles = ['ar.json', 'bg.json', 'ca.json', 'cs.json', 'da.json', 'de.json', 'en.json', 'es-mx.json', 'es.json', 'eu.json',
- 'fa.json', 'fr.json', 'he.json', 'hu.json', 'it.json', 'ja.json', 'nl.json', 'pl.json', 'pt-br.json', 'pt.json', 'ro.json',
- 'ru.json', 'sv.json', 'tr.json', 'zh-cn.json', 'zh-tw.json'],
- paths = {
+var paths = {
src: './src',
assets: './src/assets',
lang: [
@@ -220,76 +190,84 @@ var appLangFiles = ['ar.json', 'bg.json', 'ca.json', 'cs.json', 'da.json', 'de.j
config: './src/config.json',
};
-gulp.task('default', ['lang', 'config']);
-
-gulp.task('watch', function() {
- var langsPaths = paths.lang.map(function(path) {
- return path + '*.json';
- });
- gulp.watch(langsPaths, { interval: 500 }, ['lang']);
- gulp.watch(paths.config, { interval: 500 }, ['config']);
-});
-
// Build the language files into a single file per language.
gulp.task('lang', function(done) {
- // Get filenames to know which languages are available.
- var filenames = getFilenames(paths.lang[0]);
-
- buildLangs(filenames, paths.lang, path.join(paths.assets, 'lang'), done);
+ buildLang('en', paths.lang, path.join(paths.assets, 'lang'), done);
});
// Convert config.json into a TypeScript class.
gulp.task('config', function(done) {
- gulp.src(paths.config)
- .pipe(through(function(file) {
- // Convert the contents of the file into a TypeScript class.
- // Disable the rule variable-name in the file.
- var config = JSON.parse(file.contents.toString()),
- contents = license + '// tslint:disable: variable-name\n' + 'export class CoreConfigConstants {\n';
+ // Get the last commit.
+ exec('git log -1 --pretty=format:"%H"', function (err, commit, stderr) {
+ if (err) {
+ console.error('An error occurred while getting the last commit: ' + err);
+ } else if (stderr) {
+ console.error('An error occurred while getting the last commit: ' + stderr);
+ }
- for (var key in config) {
- var value = config[key];
- if (typeof value == 'string') {
- // Wrap the string in ' .
- value = "'" + value + "'";
- } else if (typeof value != 'number' && typeof value != 'boolean') {
- // Stringify with 4 spaces of indentation, and then add 4 more spaces in each line.
- value = JSON.stringify(value, null, 4).replace(/^(?: )/gm, ' ').replace(/^(?:})/gm, ' }');
- // Replace " by ' in values.
- value = value.replace(/: "([^"]*)"/g, ": '$1'");
+ gulp.src(paths.config)
+ .pipe(through(function(file) {
+ // Convert the contents of the file into a TypeScript class.
+ // Disable the rule variable-name in the file.
+ var config = JSON.parse(file.contents.toString()),
+ contents = license + '// tslint:disable: variable-name\n' + 'export class CoreConfigConstants {\n',
+ that = this;
- // Check if the keys have "-" in it.
- var matches = value.match(/"([^"]*\-[^"]*)":/g);
- if (matches) {
- // Replace " by ' in keys. We cannot remove them because keys have chars like '-'.
- value = value.replace(/"([^"]*)":/g, "'$1':");
- } else {
- // Remove ' in keys.
- value = value.replace(/"([^"]*)":/g, "$1:");
+ for (var key in config) {
+ var value = config[key];
+ if (typeof value == 'string') {
+ // Wrap the string in ' and scape them.
+ value = "'" + value.replace(/([^\\])'/g, "$1\\'") + "'";
+ } else if (typeof value != 'number' && typeof value != 'boolean') {
+ // Stringify with 4 spaces of indentation, and then add 4 more spaces in each line.
+ value = JSON.stringify(value, null, 4).replace(/^(?: )/gm, ' ').replace(/^(?:})/gm, ' }');
+ // Replace " by ' in values.
+ value = value.replace(/: "([^"]*)"/g, ": '$1'");
+
+ // Check if the keys have "-" in it.
+ var matches = value.match(/"([^"]*\-[^"]*)":/g);
+ if (matches) {
+ // Replace " by ' in keys. We cannot remove them because keys have chars like '-'.
+ value = value.replace(/"([^"]*)":/g, "'$1':");
+ } else {
+ // Remove ' in keys.
+ value = value.replace(/"([^"]*)":/g, "$1:");
+ }
+
+ // Add type any to the key.
+ key = key + ': any';
}
- // Add type any to the key.
- key = key + ': any';
+ // If key has quotation marks, remove them.
+ if (key[0] == '"') {
+ key = key.substr(1, key.length - 2);
+ }
+ contents += ' static ' + key + ' = ' + value + ';\n';
}
- // If key has quotation marks, remove them.
- if (key[0] == '"') {
- key = key.substr(1, key.length - 2);
- }
- contents += ' static ' + key + ' = ' + value + ';\n';
- }
+ // Add compilation info.
+ contents += ' static compilationtime = ' + Date.now() + ';\n';
+ contents += ' static lastcommit = \'' + commit + '\';\n';
- // Add compilation time.
- contents += ' static compilationtime = ' + Date.now() + ';\n';
+ contents += '}\n';
- contents += '}\n';
+ file.contents = new Buffer(contents);
+ this.emit('data', file);
+ }))
+ .pipe(rename('configconstants.ts'))
+ .pipe(gulp.dest(paths.src))
+ .on('end', done);
+ });
+});
- file.contents = new Buffer(contents);
- this.emit('data', file);
- }))
- .pipe(rename('configconstants.ts'))
- .pipe(gulp.dest(paths.src))
- .on('end', done);
+gulp.task('default', gulp.parallel('lang', 'config'));
+
+gulp.task('watch', function() {
+ var langsPaths = paths.lang.map(function(path) {
+ return path + 'en.json';
+ });
+ gulp.watch(langsPaths, { interval: 500 }, gulp.parallel('lang'));
+ gulp.watch(paths.config, { interval: 500 }, gulp.parallel('config'));
});
var templatesSrc = [
@@ -306,7 +284,7 @@ var templatesSrc = [
gulp.task('copy-component-templates', function(done) {
deleteFolderRecursive(templatesDest);
- gulp.src(templatesSrc)
+ gulp.src(templatesSrc, { allowEmpty: true })
.pipe(flatten())
.pipe(gulp.dest(templatesDest))
.on('end', done);
diff --git a/hooks/after_prepare/030_android_splash.js b/hooks/after_prepare/030_android_splash.js
new file mode 100755
index 000000000..26c1d64f3
--- /dev/null
+++ b/hooks/after_prepare/030_android_splash.js
@@ -0,0 +1,49 @@
+#!/usr/bin/env node
+
+// This hook copies Android splash screen files from dev directories into the appropriate platform specific location.
+// The code was extracted from here: http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/
+
+var filesToCopy = [{
+ 'resources/android/splash/drawable-land-hdpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-hdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-land-ldpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-ldpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-land-mdpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-mdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-land-xhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-xhdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-land-xxhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-xxhdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-land-xxxhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-land-xxxhdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-hdpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-hdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-ldpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-ldpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-mdpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-mdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-xhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-xhdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-xxhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-xxhdpi/screen.png'
+ }, {
+ 'resources/android/splash/drawable-port-xxxhdpi-screen.png': 'platforms/android/app/src/main/res/drawable-port-xxxhdpi/screen.png'
+ }
+];
+
+var fs = require('fs');
+var path = require('path');
+
+// no need to configure below
+var rootDir = process.argv[2];
+
+filesToCopy.forEach(function(obj) {
+ Object.keys(obj).forEach(function(key) {
+ var val = obj[key];
+ var srcFile = path.join(rootDir, key);
+ var destFile = path.join(rootDir, val);
+ var destDir = path.dirname(destFile);
+ if (fs.existsSync(srcFile) && fs.existsSync(destDir)) {
+ fs.createReadStream(srcFile).pipe(fs.createWriteStream(destFile));
+ }
+ });
+});
diff --git a/ionic.config.json b/ionic.config.json
index aaf62dfe2..a866b2bd9 100644
--- a/ionic.config.json
+++ b/ionic.config.json
@@ -1,10 +1,11 @@
{
"name": "moodlemobile",
- "app_id": "com.moodle.moodlemobile",
- "type": "ionic-angular",
"integrations": {
"cordova": {},
"gulp": {}
},
- "watchPatterns": []
+ "type": "ionic-angular",
+ "watchPatterns": [],
+ "pro_id": "com.moodle.moodlemobile",
+ "id": "com.moodle.moodlemobile"
}
diff --git a/package-lock.json b/package-lock.json
index f88b6a810..9fa7a402d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,19 +1,25 @@
{
"name": "moodlemobile",
- "version": "3.5.1",
+ "version": "3.6.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "7zip-bin": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz",
+ "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==",
+ "dev": true
+ },
"@angular-devkit/build-optimizer": {
"version": "0.0.35",
"resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.35.tgz",
"integrity": "sha512-7JxZZAYFSCc0tP6+NrRn3b2Cd1b9d+a3+OfwVNyNsNd2unelqUMko2hm0KLbC8BXcXt/OILg1E/ZgLAXSS47nw==",
"dev": true,
"requires": {
- "loader-utils": "1.1.0",
- "source-map": "0.5.7",
- "typescript": "2.6.2",
- "webpack-sources": "1.1.0"
+ "loader-utils": "^1.1.0",
+ "source-map": "^0.5.6",
+ "typescript": "~2.6.1",
+ "webpack-sources": "^1.0.1"
},
"dependencies": {
"source-map": {
@@ -29,7 +35,7 @@
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.10.tgz",
"integrity": "sha512-QNYXqnti8BeFriNaZ/juLnO6l0MVlVNUmLycC9ma+pdTiEJl8rtgZ0WXxgOCjScyKpInkWn2J+m9FI/78SYFpw==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/common": {
@@ -37,7 +43,7 @@
"resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.10.tgz",
"integrity": "sha512-4zgI/Q6bo/KCvrDPf8gc2IpTJ3PFKgd9RF4jZuh1uc+uEYTAj396tDF8o412AJ/iwtYOHWUx+YgzAvT8dHXZ5Q==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/compiler": {
@@ -45,7 +51,7 @@
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.10.tgz",
"integrity": "sha512-FI9ip+aWGpKQB+VfNbFQ+wyh0K4Th8Q/MrHxW6CN4BYVAfFtfORRohvyyYk0sRxuQO8JFN3W/FFfdXjuL+cZKw==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/compiler-cli": {
@@ -53,10 +59,10 @@
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.10.tgz",
"integrity": "sha512-RhI26rVALRn3LrU0CAIEj56m60vLyCd8e2Ah79yRP6vlXL8k6SylXytUljTeXIBtiVu2Bi1qKGf2s1X674GzCw==",
"requires": {
- "chokidar": "1.7.0",
- "minimist": "1.2.0",
- "reflect-metadata": "0.1.12",
- "tsickle": "0.27.5"
+ "chokidar": "^1.4.2",
+ "minimist": "^1.2.0",
+ "reflect-metadata": "^0.1.2",
+ "tsickle": "^0.27.2"
}
},
"@angular/core": {
@@ -64,7 +70,7 @@
"resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.10.tgz",
"integrity": "sha512-glDuTtHTcAVhfU3NVewxz/W+Iweq5IaeW2tnMa+RKLopYk9fRs8eR5iTixTGvegwKR770vfXg/gR7P6Ii5cYGQ==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/forms": {
@@ -72,7 +78,7 @@
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.10.tgz",
"integrity": "sha512-XQR4cd1Eey9aDT3CxQ6pbBWSBEg1408ZV/EUblKgMgt4k8PfDiuLSbF+MI/TOYAg3UkcVAxN1no4hWtkou8Rpw==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/http": {
@@ -80,7 +86,7 @@
"resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.10.tgz",
"integrity": "sha512-euEJbxpH+pKBAwGUSo7XvNdods/kY6I4s8OUaJPUMtraQkhE6TJ0OMYvnqmGbdLimsg3ZMxqm54jCOjj9saEOQ==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/platform-browser": {
@@ -88,7 +94,7 @@
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.10.tgz",
"integrity": "sha512-oF1A0BS1wpTlxfv6YytkFCkztvvtVllnh5IUnoyV+siVT3qogKat9ZmzCmcDJ5SvIDYkY+rXBhumyFzBZ5ufFg==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@angular/platform-browser-dynamic": {
@@ -96,63 +102,63 @@
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.10.tgz",
"integrity": "sha512-TquhIkyR6uXfmzk6RiEl5+8Kk653Wqe4F+pKn5gFi+Z6cDm4nkDlT9kgT3e6c08JHw9fGGAvNmsalq7oS+PnNg==",
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.7.1"
}
},
"@ionic-native/badge": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/badge/-/badge-4.7.0.tgz",
- "integrity": "sha512-WMJXnNcqi7aHihpXiMX0t3eNXmcSa8T1VT8ImwT2ZKWG/BKf4nLXlvkgiAEKyXUfgIlTvz+2cSq/EKxZW4sWNQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/badge/-/badge-4.17.0.tgz",
+ "integrity": "sha512-Xv8SQsZzhY161C7EZ53J/iRNy8J8eOMMFz/4phi5YRmd/gbxSE6iPDdS5OUktpSHSDDHXxzofIhbh1PABAHbkA=="
},
"@ionic-native/camera": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-4.7.0.tgz",
- "integrity": "sha512-5zVAuWuOggoDSg61qNLRq7FKH0X9SK8jb1gfB/yNeWMMkBgN2HSwd6lpVuLG8ijEx5At3B7AxzQzQw5WCoUxQg=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-4.17.0.tgz",
+ "integrity": "sha512-C/T7yEZ11kSrF89rJwoaRa3F/ez8Wuz7Htb9jW71GBdAEt/wjegKBUDwB+ij/r8dzlBkdNWh1m6ax4NfJUhYpQ=="
},
"@ionic-native/clipboard": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/clipboard/-/clipboard-4.7.0.tgz",
- "integrity": "sha512-rvfphVFt25A7hnoMvEYvvXEdZyf4tsvP1gUDMgBrzcDoA+yeNzrotsworn+V7vRltqiXekYdKwM7kKB7jtU1Sw=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/clipboard/-/clipboard-4.17.0.tgz",
+ "integrity": "sha512-spDY3NIPg+nDDYgy63NLwJWVs37d1iZMYHfzcf/8CAK+H+VeSnS3CDoXdsL9ga3Y/YuR6uItf3Q8xhUTUPgljA=="
},
"@ionic-native/core": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-4.3.0.tgz",
- "integrity": "sha512-Pf0qCzqlVFmIpZpvo35Kl0e+1K8GUgPMcKBnN57gWh+5Ecj3dPcb+MbP4murJo/dnFsIYPYdXRZRf74hjo6gtw=="
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-4.11.0.tgz",
+ "integrity": "sha512-bBFE6bM0P254CWmqAqWe2ju7WPo51yn/vIoBrEb5SX2Iousn+1xYwuIO93n9+nlx17EI7Uz+h2mPej4Chi7hLQ=="
},
"@ionic-native/device": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-4.7.0.tgz",
- "integrity": "sha512-jU+PldoDtJtDB7oPHx/OdBODpFBiTrlTLmj6oQ0DF2IxmJA2sy/CPDgnl5HKnd0lbf6JBYtjlXvrGKLffTZPpw=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-4.17.0.tgz",
+ "integrity": "sha512-hboYQYlrDSI5ix0s9PDA2Ff+WO5I7lSuRnqFqg/YOmiwmTW/MeL4Fk3WVJ7ZplAqGJD2UimqDoyZXdw6tQga/g=="
},
"@ionic-native/file": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-4.7.0.tgz",
- "integrity": "sha512-W5wHpBHBMns3NBrUYAUNDSN843MzWYWZ72rBX56onNKCDaYXZS4WuFExVHh2P91RWq095hmohQNpPiDB8ElQ8g=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-4.17.0.tgz",
+ "integrity": "sha512-16nqDPGY/dbtJCRHIra0DskghXWHbRYfJYGsYSioMWodqoDRLyjYYEc0Z1qZXL8Ei6X1IdmgtICgjC9gnsWRiw=="
},
"@ionic-native/file-opener": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-4.7.0.tgz",
- "integrity": "sha512-xaqAl3UJWR0kV/wZcKWmzvBO21iNe+Lk2ef9rQK+DDd/lKrtew7cZRQ7CPQGxPdW13t9ES4DeMiSpfkIgXQzYQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-4.17.0.tgz",
+ "integrity": "sha512-yqdOLqEr2yGqdSvp01oxi8sr5hriySHWYG8treNaGQxoZfeCN0aAFNR8ZgAWmeH2KWiLSvPNbQx+Ii15r+TKbA=="
},
"@ionic-native/file-transfer": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-4.7.0.tgz",
- "integrity": "sha512-GKyKFgr3KoMfFo/19KVDeDVizP1gUA3fyo2Mk9uJx1y7sxUv4EPxJWO/uQamLxsmkOm5QF/kaWPFTelzxcZWPQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-4.17.0.tgz",
+ "integrity": "sha512-GtCnjCMH02r5BLONYkPjcYDAXSHmrO9t8jPY5LoI29bx2B6vwX+NFBARHPNSFPEwRi1zZKs/J0uJ1hkhDzOvxg=="
},
"@ionic-native/globalization": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/globalization/-/globalization-4.7.0.tgz",
- "integrity": "sha512-a1Kc6MBFlO4uqBBSNue0hNX9njL3cHdlOhuo0wTc3Iy2qLAqtXx6pYbQhsUVBovAwWeeNo7/yqLndYLKhdM9Ig=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/globalization/-/globalization-4.17.0.tgz",
+ "integrity": "sha512-H1fbQil4psgN5QVo+NDXd+nRKFDMPDWWijtVHyoIbVqwFhChHc3aZknrMu7trlfX0RFZxeZYUciFGfj10TfBdA=="
},
"@ionic-native/in-app-browser": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-4.7.0.tgz",
- "integrity": "sha512-d028yq4CTGBRGgq7cJMG7n9f6MjrpSMr/RTlSRDfO38dAODYfsB7Urw850I19JOMTWB94BMZUrIpK1LevWuHuQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-4.17.0.tgz",
+ "integrity": "sha512-iEOSyhpxj0btN5S9x86+/d2Zq28OxnNvP/jqOADZnolAdVeyDuDg6dORUbywoCGAf5PKUOXDbOFKGdyJAEV5EA=="
},
"@ionic-native/keyboard": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-4.7.0.tgz",
- "integrity": "sha512-bvJm4gyBn9gQuLx5Q1fjWdOcFXHEWtyJgNTkPGJ8Bv4lL9Yforg1yvuWR/jEspOT5IsNfGYZGDVXWMO3/NImGA=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-4.17.0.tgz",
+ "integrity": "sha512-2BHO1bV4mehWZNfdsWQ/uojxYFNvk4I6u0KYnNb61RiJRY83joCEw3oFkOMRGLZthPf6TN1cueZUIAGMHXA3nA=="
},
"@ionic-native/local-notifications": {
"version": "4.5.2",
@@ -160,44 +166,49 @@
"integrity": "sha512-/O2hNsWW6ixlAPY9Tw6wfIIUmNOPmd11DcxCTQ5vR8+oGPyYPj3IXkgUCI/U29Y3hDikSxdWTI19FtCxnzYKNA=="
},
"@ionic-native/media-capture": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/media-capture/-/media-capture-4.7.0.tgz",
- "integrity": "sha512-31iLJFO+3RNs+mA8rLW5uI3SST8wIl9gtrRCEjvbcnuXaPIS145K6hqsaQUgv0V6BzFRemMxT/cAfV2r2k7Nlw=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/media-capture/-/media-capture-4.17.0.tgz",
+ "integrity": "sha512-C3TBHxbPF1HDtt0h2Esg6ASofgorWKAbfIpUpZ6UoGFO++HJyZyrxTxPRaU37vvhO9kUcF29rweZge8XvH9OLw=="
},
"@ionic-native/network": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-4.7.0.tgz",
- "integrity": "sha512-d3c5iuv22Mhd6HH5ZVsz3Y6jvE3iEO3AFGpOLUbDzqp+jFzqxnr6HShwCfD1rPbLusNnKvan3J10R39UsGEYLA=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-4.17.0.tgz",
+ "integrity": "sha512-isAZx0CWIGHxl4u7GYkwkertNrSarNXhQQ4iQgqOefDJUtOj78zJsYNVxUWk1MiqTyQrnV9H7+WHWf62JAR82w=="
},
"@ionic-native/push": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/push/-/push-4.7.0.tgz",
- "integrity": "sha512-ynucoNm2Kg30rYAdgOv0h9oGGjVLz+AugL7O1/ng5piMFhC46O/eIUDJPTwkPqyM1USR/d99zbosttRo9aNgLg=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/push/-/push-4.17.0.tgz",
+ "integrity": "sha512-hOM7CwBbZXHq31DNrTqEVcaS/W9uZcgm/gv9iu2hMtYlVwaM3ppvCC/SQuOOaS1elyfMhM5rzXP6n3csifcjDA=="
+ },
+ "@ionic-native/screen-orientation": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-4.17.0.tgz",
+ "integrity": "sha512-NSN5I6y8Wq3xQV/fnsZdhb7iXnIyJ6SZmCw6aVJEX3rZUy48lwr/KlC4uR3S6NStBXnuWuZjFy7PITQl93UbGQ=="
},
"@ionic-native/splash-screen": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-4.3.0.tgz",
- "integrity": "sha512-psShN4u3hiLkuva8GaCUqwFuVrd8nizXxM8n0eZyFdXedFHFF3CqBMPzPdH98fcoseyOD7QekOtrm0lV6QlD8w=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-4.17.0.tgz",
+ "integrity": "sha512-LRLkw+wyuN3WcH5aE2W6qyBa/CTFsfQU8pjPaTmgsanZXa8A0B1XcJKzCw27cAQZc5oqozWEIYQSyAtKEVP2FA=="
},
"@ionic-native/sqlite": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/sqlite/-/sqlite-4.7.0.tgz",
- "integrity": "sha512-VkyBzXMOWxFa/r/SBjmWzDTdfzUfKnWY/HsOhwUG6Kfbr8DOMKbYydl/ytShjhkrW1dn7eSbOhYFbRR5CK11kQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/sqlite/-/sqlite-4.17.0.tgz",
+ "integrity": "sha512-6Nkmecor6Qs9+hKSl2MfgDcjretV9SeWX2TxTOvm2KXumFEOXp7uv7kilz/epKVyybfkFKJQ5n77zsVQByFTbg=="
},
"@ionic-native/status-bar": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-4.3.0.tgz",
- "integrity": "sha512-gjS0U2uT6XYshysvzNu98Pf6b5SZ7SGSYkZW1mft19geFn6/MKunX1CJkjpXmiTn14nAD1+FBxF43Oi2OfoM4g=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-4.17.0.tgz",
+ "integrity": "sha512-lFlhDRNbErvJorHl0qUzRCEmmGd2j8LHpvNZJLwD3IvKI4v+IgethSCA+R5V0pmOpN+aVSLDUgr3aJW439en0w=="
},
"@ionic-native/web-intent": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/web-intent/-/web-intent-4.7.0.tgz",
- "integrity": "sha512-G8fcZA7W6gp1GO4HmcpQm9G8QfJiLsl6SYG5OmeYaqn8au6Ggif7Aqv2RWX7o/17BEYRnyCXh5MYMfJFbOWLQw=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/web-intent/-/web-intent-4.17.0.tgz",
+ "integrity": "sha512-8HOIOIuv660/mg2fCE9ccn13nS9tsMCP3+d8ciDt1lhNjnkjsdJBA0Tk/UyjnSY3CIcs260FBlp3ucFzxUZMoA=="
},
"@ionic-native/zip": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@ionic-native/zip/-/zip-4.7.0.tgz",
- "integrity": "sha512-yIwegf7/D5sJ2syxPYdHiIbqVbTqo0dbmhUbGw34t4L4FnCW2E9owVYQKcejTRiHQbgCIOTx7viGqr9Bnhq89A=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/zip/-/zip-4.17.0.tgz",
+ "integrity": "sha512-tv3R0fvOsGRHQO8ILKElG2DAJESsMsRJqdZ7VkvzepXu2WAYYMNIK/YNNJESy9sQWfGruq9aj94d6p0NMOdtng=="
},
"@ionic/app-scripts": {
"version": "3.1.9",
@@ -206,31 +217,31 @@
"dev": true,
"requires": {
"@angular-devkit/build-optimizer": "0.0.35",
- "autoprefixer": "7.2.6",
- "chalk": "2.4.1",
- "chokidar": "1.7.0",
- "clean-css": "4.1.11",
- "cross-spawn": "5.1.0",
- "express": "4.16.3",
- "fs-extra": "4.0.3",
- "glob": "7.1.2",
- "json-loader": "0.5.7",
+ "autoprefixer": "^7.1.6",
+ "chalk": "^2.3.0",
+ "chokidar": "^1.7.0",
+ "clean-css": "^4.1.9",
+ "cross-spawn": "^5.1.0",
+ "express": "^4.16.2",
+ "fs-extra": "^4.0.2",
+ "glob": "^7.1.2",
+ "json-loader": "^0.5.7",
"node-sass": "4.7.2",
- "os-name": "2.0.1",
- "postcss": "6.0.22",
- "proxy-middleware": "0.15.0",
- "reflect-metadata": "0.1.12",
+ "os-name": "^2.0.1",
+ "postcss": "^6.0.13",
+ "proxy-middleware": "^0.15.0",
+ "reflect-metadata": "^0.1.10",
"rollup": "0.50.0",
"rollup-plugin-commonjs": "8.2.6",
"rollup-plugin-node-resolve": "3.0.0",
- "source-map": "0.6.1",
- "tiny-lr": "1.1.1",
- "tslint": "5.10.0",
- "tslint-eslint-rules": "4.1.1",
+ "source-map": "^0.6.1",
+ "tiny-lr": "^1.0.5",
+ "tslint": "^5.8.0",
+ "tslint-eslint-rules": "^4.1.1",
"uglify-es": "3.2.2",
"webpack": "3.8.1",
"ws": "3.3.2",
- "xml2js": "0.4.19"
+ "xml2js": "^0.4.19"
}
},
"@ngx-translate/core": {
@@ -253,7 +264,7 @@
"resolved": "https://registry.npmjs.org/@types/cordova-plugin-file/-/cordova-plugin-file-4.3.2.tgz",
"integrity": "sha512-kCvVcLxo2M6NxBCngW8JuFlS3YpsqE6VcH9PKnOdWwtpCBTi7WXhQU9kb0h0/TVX5Bp8ab+qLz0mm9wSkcXdXg==",
"requires": {
- "cordova-plugin-file": "6.0.1"
+ "cordova-plugin-file": "*"
}
},
"@types/cordova-plugin-file-transfer": {
@@ -261,7 +272,7 @@
"resolved": "https://registry.npmjs.org/@types/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-0.0.3.tgz",
"integrity": "sha1-u6d+jQTQejlRR5eiA8JXxbECNoA=",
"requires": {
- "@types/cordova-plugin-file": "4.3.2"
+ "@types/cordova-plugin-file": "*"
}
},
"@types/cordova-plugin-globalization": {
@@ -284,12 +295,6 @@
"resolved": "https://registry.npmjs.org/@types/promise.prototype.finally/-/promise.prototype.finally-2.0.2.tgz",
"integrity": "sha512-Fs99h+iFQZ4ZY2vO3+uJCrx+5KQnJ4FPerZ3oT/1L5aA7vnmK/d7Z/Ml1yHtNCh9UQcjFTR4Xo/Jss2f39Fgtw=="
},
- "7zip-bin-mac": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz",
- "integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=",
- "optional": true
- },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -302,7 +307,7 @@
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
"dev": true,
"requires": {
- "mime-types": "2.1.18",
+ "mime-types": "~2.1.18",
"negotiator": "0.6.1"
}
},
@@ -318,7 +323,7 @@
"integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
"dev": true,
"requires": {
- "acorn": "4.0.13"
+ "acorn": "^4.0.3"
},
"dependencies": {
"acorn": {
@@ -335,10 +340,10 @@
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
- "co": "4.6.0",
- "fast-deep-equal": "1.1.0",
- "fast-json-stable-stringify": "2.0.0",
- "json-schema-traverse": "0.3.1"
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
}
},
"ajv-keywords": {
@@ -353,9 +358,9 @@
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
"requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
+ "kind-of": "^3.0.2",
+ "longest": "^1.0.1",
+ "repeat-string": "^1.5.2"
}
},
"amdefine": {
@@ -364,6 +369,15 @@
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
},
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "^0.1.0"
+ }
+ },
"ansi-cyan": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
@@ -401,14 +415,16 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
"requires": {
- "color-convert": "1.9.2"
+ "color-convert": "^1.9.0"
},
"dependencies": {
"color-convert": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
"integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
+ "dev": true,
"requires": {
"color-name": "1.1.1"
}
@@ -416,7 +432,8 @@
"color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
+ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
+ "dev": true
}
}
},
@@ -431,15 +448,18 @@
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
+ "micromatch": "^2.1.5",
+ "normalize-path": "^2.0.0"
}
},
- "app-builder-bin": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.10.3.tgz",
- "integrity": "sha512-DQva42HxatQkic4T2ybHpELsBlesj3ftMmSJkaSRP9N5q9qiQHjQO7t8o6j6nTKyKSNF7xr1jQtevyVvAPq9Wg==",
- "optional": true
+ "append-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+ "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+ "dev": true,
+ "requires": {
+ "buffer-equal": "^1.0.0"
+ }
},
"aproba": {
"version": "1.2.0",
@@ -447,35 +467,6 @@
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true
},
- "archiver": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
- "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
- "optional": true,
- "requires": {
- "archiver-utils": "1.3.0",
- "async": "2.6.1",
- "buffer-crc32": "0.2.13",
- "glob": "7.1.2",
- "lodash": "4.17.10",
- "readable-stream": "2.3.6",
- "tar-stream": "1.6.1",
- "zip-stream": "1.2.0"
- }
- },
- "archiver-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
- "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
- "requires": {
- "glob": "7.1.2",
- "graceful-fs": "4.1.11",
- "lazystream": "1.0.0",
- "lodash": "4.17.10",
- "normalize-path": "2.1.1",
- "readable-stream": "2.3.6"
- }
- },
"archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
@@ -488,16 +479,17 @@
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"dev": true,
"requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.3.6"
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
}
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
"requires": {
- "sprintf-js": "1.0.3"
+ "sprintf-js": "~1.0.2"
}
},
"arr-diff": {
@@ -505,7 +497,16 @@
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"requires": {
- "arr-flatten": "1.1.0"
+ "arr-flatten": "^1.0.1"
+ }
+ },
+ "arr-filter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+ "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "^1.0.0"
}
},
"arr-flatten": {
@@ -513,6 +514,15 @@
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
},
+ "arr-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "^1.0.0"
+ }
+ },
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
@@ -543,12 +553,66 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
"dev": true
},
+ "array-initial": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+ "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+ "dev": true,
+ "requires": {
+ "array-slice": "^1.0.0",
+ "is-number": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "array-last": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "dev": true,
+ "requires": {
+ "is-number": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
"array-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
"dev": true
},
+ "array-sort": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+ "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+ "dev": true,
+ "requires": {
+ "default-compare": "^1.0.0",
+ "get-value": "^2.0.6",
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
"array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
@@ -572,9 +636,9 @@
"integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "inherits": "2.0.3",
- "minimalistic-assert": "1.0.1"
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
}
},
"assert": {
@@ -619,8 +683,29 @@
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "dev": true,
"requires": {
- "lodash": "4.17.10"
+ "lodash": "^4.17.10"
+ }
+ },
+ "async-done": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz",
+ "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.2",
+ "process-nextick-args": "^1.0.7",
+ "stream-exhaust": "^1.0.1"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ }
}
},
"async-each": {
@@ -632,7 +717,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
"integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
- "optional": true
+ "dev": true
},
"async-foreach": {
"version": "0.1.3",
@@ -646,6 +731,15 @@
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
"dev": true
},
+ "async-settle": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+ "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+ "dev": true,
+ "requires": {
+ "async-done": "^1.2.2"
+ }
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -664,12 +758,12 @@
"integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
"dev": true,
"requires": {
- "browserslist": "2.11.3",
- "caniuse-lite": "1.0.30000852",
- "normalize-range": "0.1.2",
- "num2fraction": "1.2.2",
- "postcss": "6.0.22",
- "postcss-value-parser": "3.3.0"
+ "browserslist": "^2.11.3",
+ "caniuse-lite": "^1.0.30000805",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^6.0.17",
+ "postcss-value-parser": "^3.2.3"
}
},
"aws-sign2": {
@@ -690,9 +784,9 @@
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"dev": true,
"requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
},
"dependencies": {
"ansi-styles": {
@@ -707,11 +801,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
}
},
"supports-color": {
@@ -722,6 +816,23 @@
}
}
},
+ "bach": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "dev": true,
+ "requires": {
+ "arr-filter": "^1.1.1",
+ "arr-flatten": "^1.0.1",
+ "arr-map": "^2.0.0",
+ "array-each": "^1.0.0",
+ "array-initial": "^1.0.0",
+ "array-last": "^1.1.1",
+ "async-done": "^1.2.2",
+ "async-settle": "^1.0.0",
+ "now-and-later": "^2.0.0"
+ }
+ },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -733,13 +844,13 @@
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
"dev": true,
"requires": {
- "cache-base": "1.0.1",
- "class-utils": "0.3.6",
- "component-emitter": "1.2.1",
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "mixin-deep": "1.3.1",
- "pascalcase": "0.1.1"
+ "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"
},
"dependencies": {
"define-property": {
@@ -748,7 +859,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "1.0.2"
+ "is-descriptor": "^1.0.0"
}
},
"is-accessor-descriptor": {
@@ -757,7 +868,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-data-descriptor": {
@@ -766,7 +877,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-descriptor": {
@@ -775,9 +886,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
}
},
"isobject": {
@@ -807,7 +918,7 @@
"dev": true,
"optional": true,
"requires": {
- "tweetnacl": "0.14.5"
+ "tweetnacl": "^0.14.3"
}
},
"beeper": {
@@ -827,36 +938,28 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
"integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
},
- "bl": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
- "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
- "optional": true,
- "requires": {
- "readable-stream": "2.3.6",
- "safe-buffer": "5.1.2"
- }
- },
"block-stream": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true,
"requires": {
- "inherits": "2.0.3"
+ "inherits": "~2.0.0"
}
},
"bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
},
"bluebird-lst": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz",
"integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==",
+ "dev": true,
"requires": {
- "bluebird": "3.5.1"
+ "bluebird": "^3.5.1"
}
},
"bn.js": {
@@ -871,10 +974,10 @@
"integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
"dev": true,
"requires": {
- "continuable-cache": "0.3.1",
- "error": "7.0.2",
- "raw-body": "1.1.7",
- "safe-json-parse": "1.0.1"
+ "continuable-cache": "^0.3.1",
+ "error": "^7.0.0",
+ "raw-body": "~1.1.0",
+ "safe-json-parse": "~1.0.1"
},
"dependencies": {
"bytes": {
@@ -889,8 +992,8 @@
"integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
"dev": true,
"requires": {
- "bytes": "1.0.0",
- "string_decoder": "0.10.31"
+ "bytes": "1",
+ "string_decoder": "0.10"
}
},
"string_decoder": {
@@ -908,15 +1011,15 @@
"dev": true,
"requires": {
"bytes": "3.0.0",
- "content-type": "1.0.4",
+ "content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "1.1.2",
- "http-errors": "1.6.3",
+ "depd": "~1.1.1",
+ "http-errors": "~1.6.2",
"iconv-lite": "0.4.19",
- "on-finished": "2.3.0",
+ "on-finished": "~2.3.0",
"qs": "6.5.1",
"raw-body": "2.3.2",
- "type-is": "1.6.16"
+ "type-is": "~1.6.15"
}
},
"boom": {
@@ -925,7 +1028,7 @@
"integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
"dev": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"brace-expansion": {
@@ -933,7 +1036,7 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
- "balanced-match": "1.0.0",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -942,9 +1045,9 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
}
},
"brorand": {
@@ -976,12 +1079,12 @@
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
"requires": {
- "buffer-xor": "1.0.3",
- "cipher-base": "1.0.4",
- "create-hash": "1.2.0",
- "evp_bytestokey": "1.0.3",
- "inherits": "2.0.3",
- "safe-buffer": "5.1.2"
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
}
},
"browserify-cipher": {
@@ -990,9 +1093,9 @@
"integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
"dev": true,
"requires": {
- "browserify-aes": "1.2.0",
- "browserify-des": "1.0.1",
- "evp_bytestokey": "1.0.3"
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
}
},
"browserify-des": {
@@ -1001,9 +1104,9 @@
"integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==",
"dev": true,
"requires": {
- "cipher-base": "1.0.4",
- "des.js": "1.0.0",
- "inherits": "2.0.3"
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1"
}
},
"browserify-rsa": {
@@ -1012,8 +1115,8 @@
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "randombytes": "2.0.6"
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
}
},
"browserify-sign": {
@@ -1022,13 +1125,13 @@
"integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "browserify-rsa": "4.0.1",
- "create-hash": "1.2.0",
- "create-hmac": "1.1.7",
- "elliptic": "6.4.0",
- "inherits": "2.0.3",
- "parse-asn1": "5.1.1"
+ "bn.js": "^4.1.1",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.2",
+ "elliptic": "^6.0.0",
+ "inherits": "^2.0.1",
+ "parse-asn1": "^5.0.0"
}
},
"browserify-zlib": {
@@ -1037,7 +1140,7 @@
"integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
"dev": true,
"requires": {
- "pako": "1.0.6"
+ "pako": "~1.0.5"
}
},
"browserslist": {
@@ -1046,8 +1149,8 @@
"integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
"dev": true,
"requires": {
- "caniuse-lite": "1.0.30000852",
- "electron-to-chromium": "1.3.48"
+ "caniuse-lite": "^1.0.30000792",
+ "electron-to-chromium": "^1.3.30"
}
},
"buffer": {
@@ -1056,37 +1159,38 @@
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
"dev": true,
"requires": {
- "base64-js": "1.3.0",
- "ieee754": "1.1.12",
- "isarray": "1.0.0"
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
}
},
"buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "optional": true,
+ "dev": true,
"requires": {
- "buffer-alloc-unsafe": "1.1.0",
- "buffer-fill": "1.0.0"
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
}
},
"buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
- "optional": true
+ "dev": true
},
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+ "buffer-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "dev": true
},
"buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
- "optional": true
+ "dev": true
},
"buffer-from": {
"version": "1.1.0",
@@ -1099,26 +1203,60 @@
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
- "builder-util-runtime": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.0.tgz",
- "integrity": "sha512-tkTF1o7XAX79ZkMo8822ZdQMpEBGSgfJ9kEYgyTAja90BPu7HO8C02pb8iSlFXfmK0Q0UA6D8MmnSNNPi0JLeg==",
- "optional": true,
+ "builder-util": {
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.17.0.tgz",
+ "integrity": "sha512-F4s0uU/H0ZBes4CXkICDvUoC3MS9eW4rv5r+wkzcijJBqDfYNV7LLXxnN50P1bOVpFXa8Cw/NUHnsq95Xf478g==",
+ "dev": true,
"requires": {
- "bluebird-lst": "1.0.5",
- "debug": "3.1.0",
- "fs-extra-p": "4.6.1",
- "sax": "1.2.4"
+ "7zip-bin": "~4.0.2",
+ "app-builder-bin": "1.11.4",
+ "bluebird-lst": "^1.0.5",
+ "builder-util-runtime": "^4.4.1",
+ "chalk": "^2.4.1",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "is-ci": "^1.1.0",
+ "js-yaml": "^3.12.0",
+ "lazy-val": "^1.0.3",
+ "semver": "^5.5.0",
+ "source-map-support": "^0.5.6",
+ "stat-mode": "^0.2.2",
+ "temp-file": "^3.1.3"
},
"dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "optional": true,
+ "app-builder-bin": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.11.4.tgz",
+ "integrity": "sha512-04sgoFSz6q5pbAxAXcxfUFPl16gJsay5b8dudFXUwQbFfS7ox2uGgbOO5LGHF0t7sM7q/N82ztGePuuCSkKZHQ==",
+ "dev": true
+ },
+ "builder-util-runtime": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz",
+ "integrity": "sha512-8L2pbL6D3VdI1f8OMknlZJpw0c7KK15BRz3cY77AOUElc4XlCv2UhVV01jJM7+6Lx7henaQh80ALULp64eFYAQ==",
+ "dev": true,
"requires": {
- "ms": "2.0.0"
+ "bluebird-lst": "^1.0.5",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "sax": "^1.2.4"
}
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
}
}
},
@@ -1146,15 +1284,15 @@
"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
"dev": true,
"requires": {
- "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"
+ "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"
},
"dependencies": {
"isobject": {
@@ -1177,8 +1315,8 @@
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
"requires": {
- "camelcase": "2.1.1",
- "map-obj": "1.0.1"
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
}
},
"caniuse-lite": {
@@ -1199,18 +1337,19 @@
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"dev": true,
"requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
+ "align-text": "^0.1.3",
+ "lazy-cache": "^1.0.3"
}
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
"requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.4.0"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
"chart.js": {
@@ -1218,8 +1357,8 @@
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.2.tgz",
"integrity": "sha512-90wl3V9xRZ8tnMvMlpcW+0Yg13BelsGS9P9t0ClaDxv/hdypHDr/YAGf+728m11P5ljwyB0ZHfPKCapZFqSqYA==",
"requires": {
- "chartjs-color": "2.2.0",
- "moment": "2.22.2"
+ "chartjs-color": "^2.1.0",
+ "moment": "^2.10.2"
}
},
"chartjs-color": {
@@ -1227,8 +1366,8 @@
"resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz",
"integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=",
"requires": {
- "chartjs-color-string": "0.5.0",
- "color-convert": "0.5.3"
+ "chartjs-color-string": "^0.5.0",
+ "color-convert": "^0.5.3"
}
},
"chartjs-color-string": {
@@ -1236,7 +1375,7 @@
"resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz",
"integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==",
"requires": {
- "color-name": "1.1.3"
+ "color-name": "^1.0.0"
}
},
"chokidar": {
@@ -1244,22 +1383,28 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.1",
- "fsevents": "1.2.4",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
+ "anymatch": "^1.3.0",
+ "async-each": "^1.0.0",
+ "fsevents": "^1.0.0",
+ "glob-parent": "^2.0.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^2.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0"
}
},
+ "chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=",
+ "dev": true
+ },
"ci-info": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
"integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
- "optional": true
+ "dev": true
},
"cipher-base": {
"version": "1.0.4",
@@ -1267,8 +1412,8 @@
"integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "safe-buffer": "5.1.2"
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
}
},
"class-utils": {
@@ -1277,10 +1422,10 @@
"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
"dev": true,
"requires": {
- "arr-union": "3.1.0",
- "define-property": "0.2.5",
- "isobject": "3.0.1",
- "static-extend": "0.1.2"
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
},
"dependencies": {
"define-property": {
@@ -1289,7 +1434,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
},
"isobject": {
@@ -1306,7 +1451,7 @@
"integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
"dev": true,
"requires": {
- "source-map": "0.5.7"
+ "source-map": "0.5.x"
},
"dependencies": {
"source-map": {
@@ -1323,7 +1468,7 @@
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
"requires": {
- "restore-cursor": "2.0.0"
+ "restore-cursor": "^2.0.0"
}
},
"cli-spinners": {
@@ -1338,23 +1483,40 @@
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
}
},
"clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
"dev": true
},
"clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
"dev": true
},
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "process-nextick-args": "^2.0.0",
+ "readable-stream": "^2.3.5"
+ }
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -1367,14 +1529,36 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
+ "collection-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "dev": true,
+ "requires": {
+ "arr-map": "^2.0.2",
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ }
+ }
+ },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
"dev": true,
"requires": {
- "map-visit": "1.0.0",
- "object-visit": "1.0.1"
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
}
},
"color-convert": {
@@ -1399,13 +1583,18 @@
"integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==",
"dev": true
},
+ "com-darryncampbell-cordova-plugin-intent": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/com-darryncampbell-cordova-plugin-intent/-/com-darryncampbell-cordova-plugin-intent-1.1.1.tgz",
+ "integrity": "sha512-h+V54+qCFY1h5csX8lAKTxBn5DdbP/8/sm7vS6X0WZPI+OTKycxeoJC+oGtPHhlvTh4gSEVW5/MkDqANRcmaug=="
+ },
"combined-stream": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"dev": true,
"requires": {
- "delayed-stream": "1.0.0"
+ "delayed-stream": "~1.0.0"
}
},
"commander": {
@@ -1414,36 +1603,42 @@
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
+ "compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=",
+ "dev": true
+ },
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
"dev": true
},
- "compress-commons": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
- "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
- "optional": true,
- "requires": {
- "buffer-crc32": "0.2.13",
- "crc32-stream": "2.0.0",
- "normalize-path": "2.1.1",
- "readable-stream": "2.3.6"
- }
- },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
"console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
"dev": true,
"requires": {
- "date-now": "0.1.4"
+ "date-now": "^0.1.4"
}
},
"console-control-strings": {
@@ -1476,6 +1671,15 @@
"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
"dev": true
},
+ "convert-source-map": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
@@ -1494,51 +1698,92 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
- "cordova-android": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-6.1.2.tgz",
- "integrity": "sha1-lgZzmhFPCjf0kFPjZMlthPtGK/g=",
+ "copy-props": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
+ "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
+ "dev": true,
"requires": {
- "cordova-common": "1.5.1",
+ "each-props": "^1.3.0",
+ "is-plain-object": "^2.0.1"
+ }
+ },
+ "cordova-android": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-7.1.2.tgz",
+ "integrity": "sha512-w28HJGtfAZCT96hVH9BMppWMnmDTZplKu2NRQZN2dCr5e9r7aHpay41MYy9IBkh8+7E7lMo/jZkRwBDNr4VnEg==",
+ "requires": {
+ "abbrev": "*",
+ "android-versions": "1.3.0",
+ "ansi": "*",
+ "balanced-match": "*",
+ "base64-js": "1.2.0",
+ "big-integer": "*",
+ "bplist-parser": "*",
+ "brace-expansion": "*",
+ "concat-map": "*",
+ "cordova-common": "2.2.5",
+ "cordova-registry-mapper": "*",
"elementtree": "0.1.6",
- "nopt": "3.0.6",
+ "glob": "5.0.15",
+ "inflight": "*",
+ "inherits": "*",
+ "minimatch": "*",
+ "nopt": "3.0.1",
+ "once": "*",
+ "path-is-absolute": "*",
+ "plist": "2.1.0",
"properties-parser": "0.2.3",
"q": "1.4.1",
- "shelljs": "0.5.3"
+ "sax": "0.3.5",
+ "semver": "*",
+ "shelljs": "0.5.3",
+ "underscore": "*",
+ "unorm": "*",
+ "wrappy": "*",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "*"
},
"dependencies": {
"abbrev": {
- "version": "1.0.9",
+ "version": "1.1.1",
"bundled": true
},
+ "android-versions": {
+ "version": "1.3.0",
+ "bundled": true,
+ "requires": {
+ "semver": "^5.4.1"
+ }
+ },
"ansi": {
"version": "0.3.1",
"bundled": true
},
"balanced-match": {
- "version": "0.4.2",
+ "version": "1.0.0",
"bundled": true
},
"base64-js": {
- "version": "0.0.8",
+ "version": "1.2.0",
"bundled": true
},
"big-integer": {
- "version": "1.6.16",
+ "version": "1.6.32",
"bundled": true
},
"bplist-parser": {
"version": "0.1.1",
"bundled": true,
"requires": {
- "big-integer": "1.6.16"
+ "big-integer": "^1.6.7"
}
},
"brace-expansion": {
- "version": "1.1.6",
+ "version": "1.1.11",
"bundled": true,
"requires": {
- "balanced-match": "0.4.2",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -1547,22 +1792,20 @@
"bundled": true
},
"cordova-common": {
- "version": "1.5.1",
+ "version": "2.2.5",
"bundled": true,
"requires": {
- "ansi": "0.3.1",
- "bplist-parser": "0.1.1",
- "cordova-registry-mapper": "1.1.15",
+ "ansi": "^0.3.1",
+ "bplist-parser": "^0.1.0",
+ "cordova-registry-mapper": "^1.1.8",
"elementtree": "0.1.6",
- "glob": "5.0.15",
- "minimatch": "3.0.3",
- "osenv": "0.1.3",
- "plist": "1.2.0",
- "q": "1.4.1",
- "semver": "5.3.0",
- "shelljs": "0.5.3",
- "underscore": "1.8.3",
- "unorm": "1.4.1"
+ "glob": "^5.0.13",
+ "minimatch": "^3.0.0",
+ "plist": "^2.1.0",
+ "q": "^1.4.1",
+ "shelljs": "^0.5.3",
+ "underscore": "^1.8.3",
+ "unorm": "^1.3.3"
}
},
"cordova-registry-mapper": {
@@ -1580,64 +1823,44 @@
"version": "5.0.15",
"bundled": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.3",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"inflight": {
"version": "1.0.6",
"bundled": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"bundled": true
},
- "lodash": {
- "version": "3.10.1",
- "bundled": true
- },
"minimatch": {
- "version": "3.0.3",
+ "version": "3.0.4",
"bundled": true,
"requires": {
- "brace-expansion": "1.1.6"
+ "brace-expansion": "^1.1.7"
}
},
"nopt": {
- "version": "3.0.6",
+ "version": "3.0.1",
"bundled": true,
"requires": {
- "abbrev": "1.0.9"
+ "abbrev": "1"
}
},
"once": {
"version": "1.4.0",
"bundled": true,
"requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true
- },
- "osenv": {
- "version": "0.1.3",
- "bundled": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "wrappy": "1"
}
},
"path-is-absolute": {
@@ -1645,13 +1868,12 @@
"bundled": true
},
"plist": {
- "version": "1.2.0",
+ "version": "2.1.0",
"bundled": true,
"requires": {
- "base64-js": "0.0.8",
- "util-deprecate": "1.0.2",
- "xmlbuilder": "4.0.0",
- "xmldom": "0.1.22"
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.x"
}
},
"properties-parser": {
@@ -1667,7 +1889,7 @@
"bundled": true
},
"semver": {
- "version": "5.3.0",
+ "version": "5.5.0",
"bundled": true
},
"shelljs": {
@@ -1675,50 +1897,93 @@
"bundled": true
},
"underscore": {
- "version": "1.8.3",
+ "version": "1.9.1",
"bundled": true
},
"unorm": {
"version": "1.4.1",
"bundled": true
},
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true
- },
"wrappy": {
"version": "1.0.2",
"bundled": true
},
"xmlbuilder": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "lodash": "3.10.1"
- }
+ "version": "8.2.2",
+ "bundled": true
},
"xmldom": {
- "version": "0.1.22",
+ "version": "0.1.27",
"bundled": true
}
}
},
- "cordova-ios": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-4.3.1.tgz",
- "integrity": "sha1-e+zJUBROx6wfVgzphesHv+4bd/E=",
+ "cordova-android-support-gradle-release": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-android-support-gradle-release/-/cordova-android-support-gradle-release-2.0.1.tgz",
+ "integrity": "sha512-HlX75PN8b9y3LIlAFLQspSbO7dr7hTRi2/n4A2Hz4AHb7NxiVt6VU+6j+JcseDveVdddh1sKMZd0xPtFMVNjXA==",
"requires": {
- "cordova-common": "1.5.1",
- "ios-sim": "5.0.12",
+ "semver": "5.1.0",
+ "xml2js": "~0.4.19"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.1.0",
+ "resolved": "http://registry.npmjs.org/semver/-/semver-5.1.0.tgz",
+ "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU="
+ }
+ }
+ },
+ "cordova-clipboard": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/cordova-clipboard/-/cordova-clipboard-1.2.1.tgz",
+ "integrity": "sha512-WTGxyQJYsgmll8wDEo0u4XevZDUH1ZH1VPoOwwNkQ8YOtCNQS8gRIIVtZ70Kan+Vo+CiUMV0oJXdNAdARb8JwQ=="
+ },
+ "cordova-ios": {
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-4.5.5.tgz",
+ "integrity": "sha512-3+30m2dZ2yii7kg+H7cgpdpkXpMj54zoX5imjGGG4Z7dPXKmalTLc/9rLq+Iaa+Q1BqyOrUFaHopWOODRU6vCg==",
+ "requires": {
+ "abbrev": "*",
+ "ansi": "*",
+ "balanced-match": "*",
+ "base64-js": "1.2.0",
+ "big-integer": "*",
+ "bplist-creator": "*",
+ "bplist-parser": "*",
+ "brace-expansion": "*",
+ "concat-map": "*",
+ "cordova-common": "2.2.5",
+ "cordova-registry-mapper": "*",
+ "elementtree": "0.1.6",
+ "glob": "5.0.15",
+ "inflight": "*",
+ "inherits": "*",
+ "ios-sim": "6.1.3",
+ "minimatch": "*",
"nopt": "3.0.6",
- "plist": "1.2.0",
- "q": "1.4.1",
+ "once": "*",
+ "path-is-absolute": "*",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "sax": "0.3.5",
"shelljs": "0.5.3",
- "xcode": "0.8.9"
+ "simctl": "*",
+ "simple-plist": "0.2.1",
+ "stream-buffers": "2.2.0",
+ "tail": "0.4.0",
+ "underscore": "*",
+ "unorm": "*",
+ "uuid": "3.0.1",
+ "wrappy": "*",
+ "xcode": "0.9.3",
+ "xml-escape": "1.1.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "*"
},
"dependencies": {
"abbrev": {
- "version": "1.0.9",
+ "version": "1.1.1",
"bundled": true
},
"ansi": {
@@ -1726,36 +1991,36 @@
"bundled": true
},
"balanced-match": {
- "version": "0.4.2",
+ "version": "1.0.0",
"bundled": true
},
"base64-js": {
- "version": "0.0.8",
+ "version": "1.2.0",
"bundled": true
},
"big-integer": {
- "version": "1.6.17",
+ "version": "1.6.32",
"bundled": true
},
"bplist-creator": {
- "version": "0.0.4",
+ "version": "0.0.7",
"bundled": true,
"requires": {
- "stream-buffers": "0.2.6"
+ "stream-buffers": "~2.2.0"
}
},
"bplist-parser": {
"version": "0.1.1",
"bundled": true,
"requires": {
- "big-integer": "1.6.17"
+ "big-integer": "^1.6.7"
}
},
"brace-expansion": {
- "version": "1.1.6",
+ "version": "1.1.11",
"bundled": true,
"requires": {
- "balanced-match": "0.4.2",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -1764,22 +2029,20 @@
"bundled": true
},
"cordova-common": {
- "version": "1.5.1",
+ "version": "2.2.5",
"bundled": true,
"requires": {
- "ansi": "0.3.1",
- "bplist-parser": "0.1.1",
- "cordova-registry-mapper": "1.1.15",
+ "ansi": "^0.3.1",
+ "bplist-parser": "^0.1.0",
+ "cordova-registry-mapper": "^1.1.8",
"elementtree": "0.1.6",
- "glob": "5.0.15",
- "minimatch": "3.0.3",
- "osenv": "0.1.3",
- "plist": "1.2.0",
- "q": "1.4.1",
- "semver": "5.3.0",
- "shelljs": "0.5.3",
- "underscore": "1.8.3",
- "unorm": "1.4.1"
+ "glob": "^5.0.13",
+ "minimatch": "^3.0.0",
+ "plist": "^2.1.0",
+ "q": "^1.4.1",
+ "shelljs": "^0.5.3",
+ "underscore": "^1.8.3",
+ "unorm": "^1.3.3"
}
},
"cordova-registry-mapper": {
@@ -1797,19 +2060,19 @@
"version": "5.0.15",
"bundled": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.3",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"inflight": {
"version": "1.0.6",
"bundled": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -1817,13 +2080,13 @@
"bundled": true
},
"ios-sim": {
- "version": "5.0.12",
+ "version": "6.1.3",
"bundled": true,
"requires": {
- "bplist-parser": "0.0.6",
+ "bplist-parser": "^0.0.6",
"nopt": "1.0.9",
- "plist": "1.2.0",
- "simctl": "0.1.0"
+ "plist": "^2.1.0",
+ "simctl": "^1.1.1"
},
"dependencies": {
"bplist-parser": {
@@ -1834,96 +2097,63 @@
"version": "1.0.9",
"bundled": true,
"requires": {
- "abbrev": "1.0.9"
+ "abbrev": "1"
}
}
}
},
- "lodash": {
- "version": "3.10.1",
- "bundled": true
- },
"minimatch": {
- "version": "3.0.3",
+ "version": "3.0.4",
"bundled": true,
"requires": {
- "brace-expansion": "1.1.6"
+ "brace-expansion": "^1.1.7"
}
},
- "node-uuid": {
- "version": "1.4.7",
- "bundled": true
- },
"nopt": {
"version": "3.0.6",
"bundled": true,
"requires": {
- "abbrev": "1.0.9"
+ "abbrev": "1"
}
},
"once": {
"version": "1.4.0",
"bundled": true,
"requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true
- },
- "osenv": {
- "version": "0.1.3",
- "bundled": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "wrappy": "1"
}
},
"path-is-absolute": {
"version": "1.0.1",
"bundled": true
},
- "pegjs": {
- "version": "0.9.0",
- "bundled": true
- },
"plist": {
- "version": "1.2.0",
+ "version": "2.1.0",
"bundled": true,
"requires": {
- "base64-js": "0.0.8",
- "util-deprecate": "1.0.2",
- "xmlbuilder": "4.0.0",
- "xmldom": "0.1.27"
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.x"
}
},
"q": {
- "version": "1.4.1",
+ "version": "1.5.1",
"bundled": true
},
"sax": {
"version": "0.3.5",
"bundled": true
},
- "semver": {
- "version": "5.3.0",
- "bundled": true
- },
"shelljs": {
"version": "0.5.3",
"bundled": true
},
"simctl": {
- "version": "0.1.0",
+ "version": "1.1.1",
"bundled": true,
"requires": {
- "shelljs": "0.2.6",
- "tail": "0.4.0"
+ "shelljs": "^0.2.6",
+ "tail": "^0.4.0"
},
"dependencies": {
"shelljs": {
@@ -1933,22 +2163,31 @@
}
},
"simple-plist": {
- "version": "0.1.4",
+ "version": "0.2.1",
"bundled": true,
"requires": {
- "bplist-creator": "0.0.4",
- "bplist-parser": "0.0.6",
- "plist": "1.2.0"
+ "bplist-creator": "0.0.7",
+ "bplist-parser": "0.1.1",
+ "plist": "2.0.1"
},
"dependencies": {
- "bplist-parser": {
- "version": "0.0.6",
+ "base64-js": {
+ "version": "1.1.2",
"bundled": true
+ },
+ "plist": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "base64-js": "1.1.2",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.x"
+ }
}
}
},
"stream-buffers": {
- "version": "0.2.6",
+ "version": "2.2.0",
"bundled": true
},
"tail": {
@@ -1956,15 +2195,15 @@
"bundled": true
},
"underscore": {
- "version": "1.8.3",
+ "version": "1.9.1",
"bundled": true
},
"unorm": {
"version": "1.4.1",
"bundled": true
},
- "util-deprecate": {
- "version": "1.0.2",
+ "uuid": {
+ "version": "3.0.1",
"bundled": true
},
"wrappy": {
@@ -1972,20 +2211,21 @@
"bundled": true
},
"xcode": {
- "version": "0.8.9",
+ "version": "0.9.3",
"bundled": true,
"requires": {
- "node-uuid": "1.4.7",
- "pegjs": "0.9.0",
- "simple-plist": "0.1.4"
+ "pegjs": "^0.10.0",
+ "simple-plist": "^0.2.1",
+ "uuid": "3.0.1"
}
},
+ "xml-escape": {
+ "version": "1.1.0",
+ "bundled": true
+ },
"xmlbuilder": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "lodash": "3.10.1"
- }
+ "version": "8.2.2",
+ "bundled": true
},
"xmldom": {
"version": "0.1.27",
@@ -1993,11 +2233,114 @@
}
}
},
+ "cordova-plugin-app-event": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-app-event/-/cordova-plugin-app-event-1.2.1.tgz",
+ "integrity": "sha1-DuuxQTKqQ7suXAgamr29l8otgTI="
+ },
+ "cordova-plugin-badge": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-badge/-/cordova-plugin-badge-0.8.8.tgz",
+ "integrity": "sha512-RhIBtd5xhD/iLnxjt35jvOae28oNW/wtMZBOmQR3Rf0y4wirvA1bpAZEhBoFqL+rZGhsd6ddOdQXdex1T0DRyQ=="
+ },
+ "cordova-plugin-camera": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-4.0.3.tgz",
+ "integrity": "sha1-c3Olk4MYyGzP2E43E+I4LRD+B2s="
+ },
+ "cordova-plugin-customurlscheme": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-customurlscheme/-/cordova-plugin-customurlscheme-4.3.0.tgz",
+ "integrity": "sha1-Avlod4tAk5kOsEB/P6GxRY1wX5Q="
+ },
+ "cordova-plugin-device": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.2.tgz",
+ "integrity": "sha1-/Ajzci5n7ve2xnv8mag99q3Quro="
+ },
"cordova-plugin-file": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.1.tgz",
"integrity": "sha1-SWBrjBWlaI1HKPkuSnMloGHeB/U="
},
+ "cordova-plugin-file-opener2": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-2.0.19.tgz",
+ "integrity": "sha1-yjrhIlOVt3qx/lsgrMv+zGiOJJM="
+ },
+ "cordova-plugin-file-transfer": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-1.7.1.tgz",
+ "integrity": "sha1-p12L4uvDu5sjxbG70ZkhTsJnWGs="
+ },
+ "cordova-plugin-globalization": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-globalization/-/cordova-plugin-globalization-1.11.0.tgz",
+ "integrity": "sha1-6sMVgQAphJOvowvolA5pj2HvvP4="
+ },
+ "cordova-plugin-inappbrowser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-inappbrowser/-/cordova-plugin-inappbrowser-3.0.0.tgz",
+ "integrity": "sha1-1K4A02Z2IQdRBXrSWK5K1KkWGto="
+ },
+ "cordova-plugin-ionic-keyboard": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.1.3.tgz",
+ "integrity": "sha512-6ucQ6FdlLdBm8kJfFnzozmBTjru/0xekHP/dAhjoCZggkGRlgs8TsUJFkxa/bV+qi7Dlo50JjmpE4UMWAO+aOQ=="
+ },
+ "cordova-plugin-local-notifications-mm": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-local-notifications-mm/-/cordova-plugin-local-notifications-mm-1.0.13.tgz",
+ "integrity": "sha512-uZjYumhkvLH6tYU7cmR9Qx9ho8xPS2/lBGgKRsejVDtBFNnkSkkR3X/at2MuBe3ZJ7qAnJdFAN4rMY3yd+dG/g=="
+ },
+ "cordova-plugin-media-capture": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-media-capture/-/cordova-plugin-media-capture-3.0.2.tgz",
+ "integrity": "sha1-2mV8L6rc/H/cKGjlnSFe2D5wDDo="
+ },
+ "cordova-plugin-network-information": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-2.0.1.tgz",
+ "integrity": "sha1-6QQh9DDGq3bUCSI/Jfzvu7zhdpA="
+ },
+ "cordova-plugin-screen-orientation": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.1.tgz",
+ "integrity": "sha1-daNXzik4CB6PYdRgU5S213Rjwfg="
+ },
+ "cordova-plugin-splashscreen": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz",
+ "integrity": "sha1-dH509W4gHNWFvGLRS8oZ9oZ/8e0="
+ },
+ "cordova-plugin-statusbar": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.4.2.tgz",
+ "integrity": "sha1-/B+9wNjXAzp+jh8ff/FnrJvU+vY="
+ },
+ "cordova-plugin-whitelist": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.3.tgz",
+ "integrity": "sha1-tehezbv+Wu3tQKG/TuI3LmfZb7Q="
+ },
+ "cordova-plugin-zip": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-zip/-/cordova-plugin-zip-3.1.0.tgz",
+ "integrity": "sha1-F2yCSOog058c+VnvXmFWrMqWshc="
+ },
+ "cordova-sqlite-storage": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-2.6.0.tgz",
+ "integrity": "sha512-m+KylFwNRsQloJ6TZihupfma2muXkmNglh8cFSiJQqriTTm6eq0gyPaAuKxgoPswe679G+0aUai07NFC/f0GGQ==",
+ "requires": {
+ "cordova-sqlite-storage-dependencies": "1.2.1"
+ }
+ },
+ "cordova-sqlite-storage-dependencies": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-1.2.1.tgz",
+ "integrity": "sha512-4ihQApBGVKR1QZ4oOSGctKFfthtCfiWMTcIIfxe97vKxlvGr9NyXOvYG9vXU9S7yVR7Ua+Rj47hkE7pQIKvQTg=="
+ },
"core-js": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
@@ -2008,30 +2351,14 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
- "crc": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
- "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
- "optional": true
- },
- "crc32-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
- "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
- "optional": true,
- "requires": {
- "crc": "3.5.0",
- "readable-stream": "2.3.6"
- }
- },
"create-ecdh": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
"integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "elliptic": "6.4.0"
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.0.0"
}
},
"create-hash": {
@@ -2040,11 +2367,11 @@
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true,
"requires": {
- "cipher-base": "1.0.4",
- "inherits": "2.0.3",
- "md5.js": "1.3.4",
- "ripemd160": "2.0.2",
- "sha.js": "2.4.11"
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
}
},
"create-hmac": {
@@ -2053,12 +2380,12 @@
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
"requires": {
- "cipher-base": "1.0.4",
- "create-hash": "1.2.0",
- "inherits": "2.0.3",
- "ripemd160": "2.0.2",
- "safe-buffer": "5.1.2",
- "sha.js": "2.4.11"
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
}
},
"cross-spawn": {
@@ -2067,9 +2394,9 @@
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"dev": true,
"requires": {
- "lru-cache": "4.1.3",
- "shebang-command": "1.2.0",
- "which": "1.3.1"
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
}
},
"cryptiles": {
@@ -2078,7 +2405,7 @@
"integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
"dev": true,
"requires": {
- "boom": "2.10.1"
+ "boom": "2.x.x"
}
},
"crypto-browserify": {
@@ -2087,17 +2414,17 @@
"integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
"dev": true,
"requires": {
- "browserify-cipher": "1.0.1",
- "browserify-sign": "4.0.4",
- "create-ecdh": "4.0.3",
- "create-hash": "1.2.0",
- "create-hmac": "1.1.7",
- "diffie-hellman": "5.0.3",
- "inherits": "2.0.3",
- "pbkdf2": "3.0.16",
- "public-encrypt": "4.0.2",
- "randombytes": "2.0.6",
- "randomfill": "1.0.4"
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
}
},
"currently-unhandled": {
@@ -2106,7 +2433,7 @@
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
- "array-find-index": "1.0.2"
+ "array-find-index": "^1.0.1"
}
},
"d": {
@@ -2115,7 +2442,7 @@
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"dev": true,
"requires": {
- "es5-ext": "0.10.45"
+ "es5-ext": "^0.10.9"
}
},
"dashdash": {
@@ -2124,7 +2451,7 @@
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -2151,6 +2478,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -2167,22 +2495,36 @@
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
"dev": true
},
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
"dev": true,
"requires": {
- "clone": "1.0.4"
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
}
},
+ "default-resolution": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+ "dev": true
+ },
"define-properties": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
"integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
"requires": {
- "foreach": "2.0.5",
- "object-keys": "1.0.11"
+ "foreach": "^2.0.5",
+ "object-keys": "^1.0.8"
}
},
"define-property": {
@@ -2191,8 +2533,8 @@
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
"dev": true,
"requires": {
- "is-descriptor": "1.0.2",
- "isobject": "3.0.1"
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
},
"dependencies": {
"is-accessor-descriptor": {
@@ -2201,7 +2543,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-data-descriptor": {
@@ -2210,7 +2552,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-descriptor": {
@@ -2219,9 +2561,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
}
},
"isobject": {
@@ -2256,20 +2598,14 @@
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"dev": true
},
- "deprecated": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
- "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
- "dev": true
- },
"des.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
"integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "minimalistic-assert": "1.0.1"
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
}
},
"destroy": {
@@ -2302,9 +2638,9 @@
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "miller-rabin": "4.0.1",
- "randombytes": "2.0.6"
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
}
},
"doctrine": {
@@ -2313,7 +2649,7 @@
"integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
"dev": true,
"requires": {
- "esutils": "1.1.6",
+ "esutils": "^1.1.6",
"isarray": "0.0.1"
},
"dependencies": {
@@ -2337,13 +2673,25 @@
"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
"dev": true
},
+ "dotenv": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz",
+ "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==",
+ "dev": true
+ },
+ "dotenv-expand": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
+ "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=",
+ "dev": true
+ },
"duplexer2": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
"integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
"dev": true,
"requires": {
- "readable-stream": "1.1.14"
+ "readable-stream": "~1.1.9"
},
"dependencies": {
"isarray": {
@@ -2354,14 +2702,14 @@
},
"readable-stream": {
"version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
"isarray": "0.0.1",
- "string_decoder": "0.10.31"
+ "string_decoder": "~0.10.x"
}
},
"string_decoder": {
@@ -2372,6 +2720,28 @@
}
}
},
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "each-props": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+ "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.1",
+ "object.defaults": "^1.1.0"
+ }
+ },
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
@@ -2379,7 +2749,7 @@
"dev": true,
"optional": true,
"requires": {
- "jsbn": "0.1.1"
+ "jsbn": "~0.1.0"
}
},
"ee-first": {
@@ -2388,67 +2758,173 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true
},
- "electron-builder-squirrel-windows": {
- "version": "20.19.0",
- "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-20.19.0.tgz",
- "integrity": "sha512-iFAtCoC0FyX8dJUvoY+NPUskdKPk7k+IyWv8GeNx/lXGxWmIo6kixXQwqCl51RTCwWvffc+Z9rssvsBx+NZvtQ==",
- "optional": true,
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+ "dev": true
+ },
+ "electron-builder-lib": {
+ "version": "20.23.1",
+ "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.23.1.tgz",
+ "integrity": "sha512-9bYeANVqFPpSmswPwXv8efu9voPE1Q8hw/jNwiWGICjPeYjHyKwa4ao+Vd1beY6ZhUDVhxxXIdlJWnmvH7Mcxw==",
+ "dev": true,
"requires": {
- "7zip-bin": "3.1.0",
- "archiver": "2.1.1",
- "bluebird-lst": "1.0.5",
- "builder-util": "5.13.2",
- "fs-extra-p": "4.6.1",
- "sanitize-filename": "1.6.1"
+ "7zip-bin": "~4.0.2",
+ "app-builder-bin": "1.11.4",
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "5.17.0",
+ "builder-util-runtime": "4.4.1",
+ "chromium-pickle-js": "^0.2.0",
+ "debug": "^3.1.0",
+ "ejs": "^2.6.1",
+ "electron-osx-sign": "0.4.10",
+ "electron-publish": "20.23.1",
+ "env-paths": "^1.0.0",
+ "fs-extra-p": "^4.6.1",
+ "hosted-git-info": "^2.7.1",
+ "is-ci": "^1.1.0",
+ "isbinaryfile": "^3.0.2",
+ "js-yaml": "^3.12.0",
+ "lazy-val": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "normalize-package-data": "^2.4.0",
+ "plist": "^3.0.1",
+ "read-config-file": "3.1.0",
+ "sanitize-filename": "^1.6.1",
+ "semver": "^5.5.0",
+ "sumchecker": "^2.0.2",
+ "temp-file": "^3.1.3"
},
"dependencies": {
- "7zip-bin": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-3.1.0.tgz",
- "integrity": "sha512-juYJNi8JEpTUWXwz8ssa8Oop4n/kwJ/pIQP22vJAVAe6RTRD+0m+e9LRNnfK2EDaX8uwmUzLNGviFQRD6SxeOw==",
- "optional": true,
- "requires": {
- "7zip-bin-mac": "1.0.1"
- }
+ "app-builder-bin": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.11.4.tgz",
+ "integrity": "sha512-04sgoFSz6q5pbAxAXcxfUFPl16gJsay5b8dudFXUwQbFfS7ox2uGgbOO5LGHF0t7sM7q/N82ztGePuuCSkKZHQ==",
+ "dev": true
},
- "builder-util": {
- "version": "5.13.2",
- "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.13.2.tgz",
- "integrity": "sha512-pdt5hkCS69Hhy6b8VuZbLi9fYtjkhah2QPB7Rwg7/475kFOhMEkbYhGckfDPcdT64Vk+1RHtZd2oiNiZNyaZ3w==",
- "optional": true,
+ "builder-util-runtime": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz",
+ "integrity": "sha512-8L2pbL6D3VdI1f8OMknlZJpw0c7KK15BRz3cY77AOUElc4XlCv2UhVV01jJM7+6Lx7henaQh80ALULp64eFYAQ==",
+ "dev": true,
"requires": {
- "7zip-bin": "4.0.2",
- "app-builder-bin": "1.10.3",
- "bluebird-lst": "1.0.5",
- "builder-util-runtime": "4.4.0",
- "chalk": "2.4.1",
- "debug": "3.1.0",
- "fs-extra-p": "4.6.1",
- "is-ci": "1.1.0",
- "js-yaml": "3.12.0",
- "lazy-val": "1.0.3",
- "semver": "5.5.0",
- "source-map-support": "0.5.6",
- "stat-mode": "0.2.2",
- "temp-file": "3.1.3"
- },
- "dependencies": {
- "7zip-bin": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz",
- "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==",
- "optional": true
- }
+ "bluebird-lst": "^1.0.5",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "sax": "^1.2.4"
}
},
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "optional": true,
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
+ },
+ "hosted-git-info": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "electron-osx-sign": {
+ "version": "0.4.10",
+ "resolved": "http://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz",
+ "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "compare-version": "^0.1.2",
+ "debug": "^2.6.8",
+ "isbinaryfile": "^3.0.2",
+ "minimist": "^1.2.0",
+ "plist": "^2.1.0"
+ },
+ "dependencies": {
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.x"
+ }
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true
+ }
+ }
+ },
+ "electron-publish": {
+ "version": "20.23.1",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.23.1.tgz",
+ "integrity": "sha512-FsNL5bY4/Uab5YGYWE+/7wL8znkghEPwJvDyD0985Obw0Eg9JZP1MpUbt4jUxrK8z5wTLVMFdSv7ymV8yq6ypA==",
+ "dev": true,
+ "requires": {
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "~5.17.0",
+ "builder-util-runtime": "^4.4.1",
+ "chalk": "^2.4.1",
+ "fs-extra-p": "^4.6.1",
+ "lazy-val": "^1.0.3",
+ "mime": "^2.3.1"
+ },
+ "dependencies": {
+ "builder-util-runtime": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz",
+ "integrity": "sha512-8L2pbL6D3VdI1f8OMknlZJpw0c7KK15BRz3cY77AOUElc4XlCv2UhVV01jJM7+6Lx7henaQh80ALULp64eFYAQ==",
+ "dev": true,
+ "requires": {
+ "bluebird-lst": "^1.0.5",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "sax": "^1.2.4"
+ }
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "mime": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+ "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
}
}
},
@@ -2458,16 +2934,16 @@
"integrity": "sha512-aCNKjlHyY4yqmavth/BVbmYhuL/3hrLIhg5P0fIQzGrlFA4V9TmA8FTlhjq4fT+FgDOynPBhHS5ZWLMU6ZUh3A==",
"dev": true,
"requires": {
- "colors": "1.3.0",
- "debug": "2.6.9",
- "detect-libc": "1.0.3",
- "fs-extra": "3.0.1",
- "node-abi": "2.4.3",
- "node-gyp": "3.7.0",
- "ora": "1.4.0",
- "rimraf": "2.6.2",
- "spawn-rx": "2.0.12",
- "yargs": "7.1.0"
+ "colors": "^1.2.0",
+ "debug": "^2.6.3",
+ "detect-libc": "^1.0.3",
+ "fs-extra": "^3.0.1",
+ "node-abi": "^2.0.0",
+ "node-gyp": "^3.6.0",
+ "ora": "^1.2.0",
+ "rimraf": "^2.6.1",
+ "spawn-rx": "^2.0.10",
+ "yargs": "^7.0.2"
},
"dependencies": {
"fs-extra": {
@@ -2476,9 +2952,9 @@
"integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "3.0.1",
- "universalify": "0.1.1"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^3.0.0",
+ "universalify": "^0.1.0"
}
},
"jsonfile": {
@@ -2487,7 +2963,7 @@
"integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11"
+ "graceful-fs": "^4.1.6"
}
}
}
@@ -2498,32 +2974,19 @@
"integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=",
"dev": true
},
- "electron-windows-notifications": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/electron-windows-notifications/-/electron-windows-notifications-2.1.1.tgz",
- "integrity": "sha512-RDPUlSOKrcuo7+eqqv9TPkJgNIO6E1SJzqx6LBTKTAvvHn9c2lRPIsrPJbKSRVC2V82SSv2358TbEkFC85tTVA==",
- "optional": true,
- "requires": {
- "debug": "2.6.9",
- "is-electron-renderer": "2.0.1",
- "sanitize-xml-string": "1.1.0",
- "uuid": "3.2.1",
- "xml-escape": "1.1.0"
- }
- },
"elliptic": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
"integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "brorand": "1.1.0",
- "hash.js": "1.1.4",
- "hmac-drbg": "1.0.1",
- "inherits": "2.0.3",
- "minimalistic-assert": "1.0.1",
- "minimalistic-crypto-utils": "1.0.1"
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
}
},
"emojis-list": {
@@ -2539,23 +3002,12 @@
"dev": true
},
"end-of-stream": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
- "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
"dev": true,
"requires": {
- "once": "1.3.3"
- },
- "dependencies": {
- "once": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
- "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
- "dev": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- }
+ "once": "^1.4.0"
}
},
"enhanced-resolve": {
@@ -2564,19 +3016,25 @@
"integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "memory-fs": "0.4.1",
- "object-assign": "4.1.1",
- "tapable": "0.2.8"
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.4.0",
+ "object-assign": "^4.0.1",
+ "tapable": "^0.2.7"
}
},
+ "env-paths": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
+ "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
+ "dev": true
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
"dev": true,
"requires": {
- "prr": "1.0.1"
+ "prr": "~1.0.1"
}
},
"error": {
@@ -2585,8 +3043,8 @@
"integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
"dev": true,
"requires": {
- "string-template": "0.2.1",
- "xtend": "4.0.1"
+ "string-template": "~0.2.1",
+ "xtend": "~4.0.0"
}
},
"error-ex": {
@@ -2595,7 +3053,7 @@
"integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
"dev": true,
"requires": {
- "is-arrayish": "0.2.1"
+ "is-arrayish": "^0.2.1"
}
},
"es-abstract": {
@@ -2603,11 +3061,11 @@
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
"integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
"requires": {
- "es-to-primitive": "1.1.1",
- "function-bind": "1.1.1",
- "has": "1.0.3",
- "is-callable": "1.1.3",
- "is-regex": "1.0.4"
+ "es-to-primitive": "^1.1.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.1",
+ "is-callable": "^1.1.3",
+ "is-regex": "^1.0.4"
}
},
"es-to-primitive": {
@@ -2615,9 +3073,9 @@
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
"integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
"requires": {
- "is-callable": "1.1.3",
- "is-date-object": "1.0.1",
- "is-symbol": "1.0.1"
+ "is-callable": "^1.1.1",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.1"
}
},
"es5-ext": {
@@ -2626,9 +3084,9 @@
"integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==",
"dev": true,
"requires": {
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1",
- "next-tick": "1.0.0"
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.1",
+ "next-tick": "1"
}
},
"es6-iterator": {
@@ -2637,9 +3095,9 @@
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45",
- "es6-symbol": "3.1.1"
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
}
},
"es6-map": {
@@ -2648,12 +3106,12 @@
"integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45",
- "es6-iterator": "2.0.3",
- "es6-set": "0.1.5",
- "es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-set": "~0.1.5",
+ "es6-symbol": "~3.1.1",
+ "event-emitter": "~0.3.5"
}
},
"es6-promise": {
@@ -2661,17 +3119,22 @@
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
"integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y="
},
+ "es6-promise-plugin": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz",
+ "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA=="
+ },
"es6-set": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
"integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45",
- "es6-iterator": "2.0.3",
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
"es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
+ "event-emitter": "~0.3.5"
}
},
"es6-symbol": {
@@ -2680,8 +3143,8 @@
"integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45"
+ "d": "1",
+ "es5-ext": "~0.10.14"
}
},
"es6-weak-map": {
@@ -2690,10 +3153,10 @@
"integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1"
+ "d": "1",
+ "es5-ext": "^0.10.14",
+ "es6-iterator": "^2.0.1",
+ "es6-symbol": "^3.1.1"
}
},
"escape-html": {
@@ -2705,7 +3168,8 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
},
"escope": {
"version": "3.6.0",
@@ -2713,16 +3177,17 @@
"integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
"dev": true,
"requires": {
- "es6-map": "0.1.5",
- "es6-weak-map": "2.0.2",
- "esrecurse": "4.2.1",
- "estraverse": "4.2.0"
+ "es6-map": "^0.1.3",
+ "es6-weak-map": "^2.0.1",
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
}
},
"esprima": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
},
"esrecurse": {
"version": "4.2.1",
@@ -2730,7 +3195,7 @@
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
"dev": true,
"requires": {
- "estraverse": "4.2.0"
+ "estraverse": "^4.1.0"
}
},
"estraverse": {
@@ -2763,8 +3228,8 @@
"integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
"dev": true,
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.45"
+ "d": "1",
+ "es5-ext": "~0.10.14"
}
},
"events": {
@@ -2779,8 +3244,8 @@
"integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
"dev": true,
"requires": {
- "md5.js": "1.3.4",
- "safe-buffer": "5.1.2"
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
}
},
"execa": {
@@ -2789,13 +3254,13 @@
"integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"dev": true,
"requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
+ "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"
}
},
"expand-brackets": {
@@ -2803,7 +3268,7 @@
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"requires": {
- "is-posix-bracket": "0.1.1"
+ "is-posix-bracket": "^0.1.0"
}
},
"expand-range": {
@@ -2811,7 +3276,7 @@
"resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"requires": {
- "fill-range": "2.2.4"
+ "fill-range": "^2.1.0"
}
},
"expand-tilde": {
@@ -2820,7 +3285,7 @@
"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
"dev": true,
"requires": {
- "homedir-polyfill": "1.0.1"
+ "homedir-polyfill": "^1.0.1"
}
},
"express": {
@@ -2829,36 +3294,36 @@
"integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
"dev": true,
"requires": {
- "accepts": "1.3.5",
+ "accepts": "~1.3.5",
"array-flatten": "1.1.1",
"body-parser": "1.18.2",
"content-disposition": "0.5.2",
- "content-type": "1.0.4",
+ "content-type": "~1.0.4",
"cookie": "0.3.1",
"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",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
"finalhandler": "1.1.1",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
- "methods": "1.1.2",
- "on-finished": "2.3.0",
- "parseurl": "1.3.2",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
"path-to-regexp": "0.1.7",
- "proxy-addr": "2.0.3",
+ "proxy-addr": "~2.0.3",
"qs": "6.5.1",
- "range-parser": "1.2.0",
+ "range-parser": "~1.2.0",
"safe-buffer": "5.1.1",
"send": "0.16.2",
"serve-static": "1.13.2",
"setprototypeof": "1.1.0",
- "statuses": "1.4.0",
- "type-is": "1.6.16",
+ "statuses": "~1.4.0",
+ "type-is": "~1.6.16",
"utils-merge": "1.0.1",
- "vary": "1.1.2"
+ "vary": "~1.1.2"
},
"dependencies": {
"path-to-regexp": {
@@ -2887,8 +3352,8 @@
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
"dev": true,
"requires": {
- "assign-symbols": "1.0.0",
- "is-extendable": "1.0.1"
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
},
"dependencies": {
"is-extendable": {
@@ -2897,7 +3362,7 @@
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
"dev": true,
"requires": {
- "is-plain-object": "2.0.4"
+ "is-plain-object": "^2.0.4"
}
}
}
@@ -2907,7 +3372,7 @@
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"requires": {
- "is-extglob": "1.0.0"
+ "is-extglob": "^1.0.0"
}
},
"extsprintf": {
@@ -2922,9 +3387,9 @@
"integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
"dev": true,
"requires": {
- "ansi-gray": "0.1.1",
- "color-support": "1.1.3",
- "time-stamp": "1.1.0"
+ "ansi-gray": "^0.1.1",
+ "color-support": "^1.1.3",
+ "time-stamp": "^1.0.0"
}
},
"fast-deep-equal": {
@@ -2945,7 +3410,7 @@
"integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
"dev": true,
"requires": {
- "websocket-driver": "0.7.0"
+ "websocket-driver": ">=0.5.1"
}
},
"filename-regex": {
@@ -2958,11 +3423,11 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "3.0.0",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
}
},
"finalhandler": {
@@ -2972,28 +3437,22 @@
"dev": true,
"requires": {
"debug": "2.6.9",
- "encodeurl": "1.0.2",
- "escape-html": "1.0.3",
- "on-finished": "2.3.0",
- "parseurl": "1.3.2",
- "statuses": "1.4.0",
- "unpipe": "1.0.0"
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.4.0",
+ "unpipe": "~1.0.0"
}
},
- "find-index": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
- "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
- "dev": true
- },
"find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
}
},
"findup-sync": {
@@ -3002,10 +3461,10 @@
"integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
"dev": true,
"requires": {
- "detect-file": "1.0.0",
- "is-glob": "3.1.0",
- "micromatch": "3.1.10",
- "resolve-dir": "1.0.1"
+ "detect-file": "^1.0.0",
+ "is-glob": "^3.1.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
},
"dependencies": {
"arr-diff": {
@@ -3026,16 +3485,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "1.1.0",
- "array-unique": "0.3.2",
- "extend-shallow": "2.0.1",
- "fill-range": "4.0.0",
- "isobject": "3.0.1",
- "repeat-element": "1.1.2",
- "snapdragon": "0.8.2",
- "snapdragon-node": "2.1.1",
- "split-string": "3.1.0",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"extend-shallow": {
@@ -3044,7 +3503,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -3055,13 +3514,13 @@
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
"dev": true,
"requires": {
- "debug": "2.6.9",
- "define-property": "0.2.5",
- "extend-shallow": "2.0.1",
- "posix-character-classes": "0.1.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"define-property": {
@@ -3070,7 +3529,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
},
"extend-shallow": {
@@ -3079,7 +3538,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
},
"is-accessor-descriptor": {
@@ -3088,7 +3547,7 @@
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -3097,7 +3556,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -3108,7 +3567,7 @@
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -3117,7 +3576,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -3128,9 +3587,9 @@
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
}
},
"kind-of": {
@@ -3147,14 +3606,14 @@
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"requires": {
- "array-unique": "0.3.2",
- "define-property": "1.0.0",
- "expand-brackets": "2.1.4",
- "extend-shallow": "2.0.1",
- "fragment-cache": "0.2.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"define-property": {
@@ -3163,7 +3622,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "1.0.2"
+ "is-descriptor": "^1.0.0"
}
},
"extend-shallow": {
@@ -3172,7 +3631,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -3183,10 +3642,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "2.0.1",
- "is-number": "3.0.0",
- "repeat-string": "1.6.1",
- "to-regex-range": "2.1.1"
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
},
"dependencies": {
"extend-shallow": {
@@ -3195,7 +3654,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -3206,7 +3665,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-data-descriptor": {
@@ -3215,7 +3674,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-descriptor": {
@@ -3224,9 +3683,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
}
},
"is-extglob": {
@@ -3241,7 +3700,7 @@
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "is-extglob": "2.1.1"
+ "is-extglob": "^2.1.0"
}
},
"is-number": {
@@ -3250,7 +3709,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -3259,7 +3718,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -3282,19 +3741,19 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "braces": "2.3.2",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "extglob": "2.0.4",
- "fragment-cache": "0.2.1",
- "kind-of": "6.0.2",
- "nanomatch": "1.2.9",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
}
}
}
@@ -3305,25 +3764,29 @@
"integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
"dev": true,
"requires": {
- "expand-tilde": "2.0.2",
- "is-plain-object": "2.0.4",
- "object.defaults": "1.1.0",
- "object.pick": "1.3.0",
- "parse-filepath": "1.0.2"
+ "expand-tilde": "^2.0.2",
+ "is-plain-object": "^2.0.3",
+ "object.defaults": "^1.1.0",
+ "object.pick": "^1.2.0",
+ "parse-filepath": "^1.0.1"
}
},
- "first-chunk-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
- "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
- "dev": true
- },
"flagged-respawn": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
"integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
"dev": true
},
+ "flush-write-stream": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.4"
+ }
+ },
"font-awesome": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
@@ -3339,7 +3802,7 @@
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"requires": {
- "for-in": "1.0.2"
+ "for-in": "^1.0.1"
}
},
"foreach": {
@@ -3359,9 +3822,9 @@
"integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
"dev": true,
"requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.6",
- "mime-types": "2.1.18"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
}
},
"forwarded": {
@@ -3376,7 +3839,7 @@
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
"dev": true,
"requires": {
- "map-cache": "0.2.2"
+ "map-cache": "^0.2.2"
}
},
"fresh": {
@@ -3385,48 +3848,55 @@
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"dev": true
},
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "optional": true
- },
"fs-extra": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "4.0.0",
- "universalify": "0.1.1"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
}
},
"fs-extra-p": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz",
"integrity": "sha512-IsTMbUS0svZKZTvqF4vDS9c/L7Mw9n8nZQWWeSzAGacOSe+8CzowhUN0tdZEZFIJNP5HC7L9j3MMikz/G4hDeQ==",
+ "dev": true,
"requires": {
- "bluebird-lst": "1.0.5",
- "fs-extra": "6.0.1"
+ "bluebird-lst": "^1.0.5",
+ "fs-extra": "^6.0.1"
},
"dependencies": {
"fs-extra": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
"integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+ "dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "4.0.0",
- "universalify": "0.1.1"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
}
}
}
},
+ "fs-mkdirp-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+ "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "through2": "^2.0.3"
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"fsevents": {
"version": "1.2.4",
@@ -3434,8 +3904,8 @@
"integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
"optional": true,
"requires": {
- "nan": "2.10.0",
- "node-pre-gyp": "0.10.0"
+ "nan": "^2.9.2",
+ "node-pre-gyp": "^0.10.0"
},
"dependencies": {
"abbrev": {
@@ -3457,8 +3927,8 @@
"bundled": true,
"optional": true,
"requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.3.6"
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
}
},
"balanced-match": {
@@ -3469,7 +3939,7 @@
"version": "1.1.11",
"bundled": true,
"requires": {
- "balanced-match": "1.0.0",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -3523,7 +3993,7 @@
"bundled": true,
"optional": true,
"requires": {
- "minipass": "2.2.4"
+ "minipass": "^2.2.1"
}
},
"fs.realpath": {
@@ -3536,14 +4006,14 @@
"bundled": true,
"optional": true,
"requires": {
- "aproba": "1.2.0",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
}
},
"glob": {
@@ -3551,12 +4021,12 @@
"bundled": true,
"optional": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "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"
}
},
"has-unicode": {
@@ -3569,7 +4039,7 @@
"bundled": true,
"optional": true,
"requires": {
- "safer-buffer": "2.1.2"
+ "safer-buffer": "^2.1.0"
}
},
"ignore-walk": {
@@ -3577,7 +4047,7 @@
"bundled": true,
"optional": true,
"requires": {
- "minimatch": "3.0.4"
+ "minimatch": "^3.0.4"
}
},
"inflight": {
@@ -3585,8 +4055,8 @@
"bundled": true,
"optional": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -3602,7 +4072,7 @@
"version": "1.0.0",
"bundled": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"isarray": {
@@ -3614,7 +4084,7 @@
"version": "3.0.4",
"bundled": true,
"requires": {
- "brace-expansion": "1.1.11"
+ "brace-expansion": "^1.1.7"
}
},
"minimist": {
@@ -3625,8 +4095,8 @@
"version": "2.2.4",
"bundled": true,
"requires": {
- "safe-buffer": "5.1.1",
- "yallist": "3.0.2"
+ "safe-buffer": "^5.1.1",
+ "yallist": "^3.0.0"
}
},
"minizlib": {
@@ -3634,7 +4104,7 @@
"bundled": true,
"optional": true,
"requires": {
- "minipass": "2.2.4"
+ "minipass": "^2.2.1"
}
},
"mkdirp": {
@@ -3654,9 +4124,9 @@
"bundled": true,
"optional": true,
"requires": {
- "debug": "2.6.9",
- "iconv-lite": "0.4.21",
- "sax": "1.2.4"
+ "debug": "^2.1.2",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
}
},
"node-pre-gyp": {
@@ -3664,16 +4134,16 @@
"bundled": true,
"optional": true,
"requires": {
- "detect-libc": "1.0.3",
- "mkdirp": "0.5.1",
- "needle": "2.2.0",
- "nopt": "4.0.1",
- "npm-packlist": "1.1.10",
- "npmlog": "4.1.2",
- "rc": "1.2.7",
- "rimraf": "2.6.2",
- "semver": "5.5.0",
- "tar": "4.4.1"
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.0",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.1.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
}
},
"nopt": {
@@ -3681,8 +4151,8 @@
"bundled": true,
"optional": true,
"requires": {
- "abbrev": "1.1.1",
- "osenv": "0.1.5"
+ "abbrev": "1",
+ "osenv": "^0.1.4"
}
},
"npm-bundled": {
@@ -3695,8 +4165,8 @@
"bundled": true,
"optional": true,
"requires": {
- "ignore-walk": "3.0.1",
- "npm-bundled": "1.0.3"
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1"
}
},
"npmlog": {
@@ -3704,10 +4174,10 @@
"bundled": true,
"optional": true,
"requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
}
},
"number-is-nan": {
@@ -3723,7 +4193,7 @@
"version": "1.4.0",
"bundled": true,
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
"os-homedir": {
@@ -3741,8 +4211,8 @@
"bundled": true,
"optional": true,
"requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
}
},
"path-is-absolute": {
@@ -3760,10 +4230,10 @@
"bundled": true,
"optional": true,
"requires": {
- "deep-extend": "0.5.1",
- "ini": "1.3.5",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
+ "deep-extend": "^0.5.1",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
@@ -3778,13 +4248,13 @@
"bundled": true,
"optional": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
"rimraf": {
@@ -3792,7 +4262,7 @@
"bundled": true,
"optional": true,
"requires": {
- "glob": "7.1.2"
+ "glob": "^7.0.5"
}
},
"safe-buffer": {
@@ -3824,28 +4294,28 @@
"bundled": true,
"optional": true
},
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
"string_decoder": {
"version": "1.1.1",
"bundled": true,
"optional": true,
"requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
+ "safe-buffer": "~5.1.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
@@ -3858,13 +4328,13 @@
"bundled": true,
"optional": true,
"requires": {
- "chownr": "1.0.1",
- "fs-minipass": "1.2.5",
- "minipass": "2.2.4",
- "minizlib": "1.1.0",
- "mkdirp": "0.5.1",
- "safe-buffer": "5.1.1",
- "yallist": "3.0.2"
+ "chownr": "^1.0.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.2.4",
+ "minizlib": "^1.1.0",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.1",
+ "yallist": "^3.0.2"
}
},
"util-deprecate": {
@@ -3877,7 +4347,7 @@
"bundled": true,
"optional": true,
"requires": {
- "string-width": "1.0.2"
+ "string-width": "^1.0.2"
}
},
"wrappy": {
@@ -3896,10 +4366,10 @@
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.2"
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
}
},
"function-bind": {
@@ -3913,14 +4383,14 @@
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"requires": {
- "aproba": "1.2.0",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.3"
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
}
},
"gaze": {
@@ -3929,7 +4399,7 @@
"integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
- "globule": "1.2.1"
+ "globule": "^1.0.0"
}
},
"generate-function": {
@@ -3944,7 +4414,7 @@
"integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
"dev": true,
"requires": {
- "is-property": "1.0.2"
+ "is-property": "^1.0.0"
}
},
"get-caller-file": {
@@ -3977,7 +4447,7 @@
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -3992,13 +4462,14 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"glob-base": {
@@ -4006,8 +4477,8 @@
"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
}
},
"glob-parent": {
@@ -4015,174 +4486,418 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"requires": {
- "is-glob": "2.0.1"
+ "is-glob": "^2.0.0"
}
},
"glob-stream": {
- "version": "3.1.18",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
- "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
"dev": true,
"requires": {
- "glob": "4.5.3",
- "glob2base": "0.0.12",
- "minimatch": "2.0.10",
- "ordered-read-streams": "0.1.0",
- "through2": "0.6.5",
- "unique-stream": "1.0.0"
+ "extend": "^3.0.0",
+ "glob": "^7.1.1",
+ "glob-parent": "^3.1.0",
+ "is-negated-glob": "^1.0.0",
+ "ordered-read-streams": "^1.0.0",
+ "pumpify": "^1.3.5",
+ "readable-stream": "^2.1.5",
+ "remove-trailing-separator": "^1.0.1",
+ "to-absolute-glob": "^2.0.0",
+ "unique-stream": "^2.0.2"
},
"dependencies": {
- "glob": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
- "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"dev": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "2.0.10",
- "once": "1.4.0"
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
}
},
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
- "minimatch": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
- "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
+ "is-extglob": "^2.1.0"
}
}
}
},
"glob-watcher": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
- "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz",
+ "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==",
"dev": true,
"requires": {
- "gaze": "0.5.2"
+ "async-done": "^1.2.0",
+ "chokidar": "^2.0.0",
+ "just-debounce": "^1.0.0",
+ "object.defaults": "^1.1.0"
},
"dependencies": {
- "gaze": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
- "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
"dev": true,
"requires": {
- "globule": "0.1.0"
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
}
},
- "glob": {
- "version": "3.1.21",
- "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
- "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
- "dev": true,
- "requires": {
- "graceful-fs": "1.2.3",
- "inherits": "1.0.2",
- "minimatch": "0.2.14"
- }
- },
- "globule": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
- "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
- "dev": true,
- "requires": {
- "glob": "3.1.21",
- "lodash": "1.0.2",
- "minimatch": "0.2.14"
- }
- },
- "graceful-fs": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
- "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
"dev": true
},
- "inherits": {
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
- "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
- "dev": true
- },
- "lodash": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
- "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
- "dev": true
- },
- "lru-cache": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
- "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
- "dev": true
- },
- "minimatch": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
- "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "lru-cache": "2.7.3",
- "sigmund": "1.0.1"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "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"
}
}
}
},
- "glob2base": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
- "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
- "dev": true,
- "requires": {
- "find-index": "0.1.1"
- }
- },
"global-modules": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
"requires": {
- "global-prefix": "1.0.2",
- "is-windows": "1.0.2",
- "resolve-dir": "1.0.1"
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
}
},
"global-prefix": {
@@ -4191,11 +4906,11 @@
"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
"dev": true,
"requires": {
- "expand-tilde": "2.0.2",
- "homedir-polyfill": "1.0.1",
- "ini": "1.3.5",
- "is-windows": "1.0.2",
- "which": "1.3.1"
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
}
},
"globule": {
@@ -4204,9 +4919,9 @@
"integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
"dev": true,
"requires": {
- "glob": "7.1.2",
- "lodash": "4.17.10",
- "minimatch": "3.0.4"
+ "glob": "~7.1.1",
+ "lodash": "~4.17.10",
+ "minimatch": "~3.0.2"
}
},
"glogg": {
@@ -4215,7 +4930,7 @@
"integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
"dev": true,
"requires": {
- "sparkles": "1.0.1"
+ "sparkles": "^1.0.0"
}
},
"graceful-fs": {
@@ -4224,55 +4939,47 @@
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"gulp": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
- "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
+ "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
"dev": true,
"requires": {
- "archy": "1.0.0",
- "chalk": "1.1.3",
- "deprecated": "0.0.1",
- "gulp-util": "3.0.8",
- "interpret": "1.1.0",
- "liftoff": "2.5.0",
- "minimist": "1.2.0",
- "orchestrator": "0.3.8",
- "pretty-hrtime": "1.0.3",
- "semver": "4.3.6",
- "tildify": "1.2.0",
- "v8flags": "2.1.1",
- "vinyl-fs": "0.3.14"
+ "glob-watcher": "^5.0.0",
+ "gulp-cli": "^2.0.0",
+ "undertaker": "^1.0.0",
+ "vinyl-fs": "^3.0.0"
},
"dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "gulp-cli": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz",
+ "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-colors": "^1.0.1",
+ "archy": "^1.0.0",
+ "array-sort": "^1.0.0",
+ "color-support": "^1.1.3",
+ "concat-stream": "^1.6.0",
+ "copy-props": "^2.0.1",
+ "fancy-log": "^1.3.2",
+ "gulplog": "^1.0.0",
+ "interpret": "^1.1.0",
+ "isobject": "^3.0.1",
+ "liftoff": "^2.5.0",
+ "matchdep": "^2.0.0",
+ "mute-stdout": "^1.0.0",
+ "pretty-hrtime": "^1.0.0",
+ "replace-homedir": "^1.0.0",
+ "semver-greatest-satisfied-range": "^1.1.0",
+ "v8flags": "^3.0.1",
+ "yargs": "^7.1.0"
}
},
- "semver": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
- "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true
}
}
@@ -4283,7 +4990,7 @@
"integrity": "sha1-vumATiU7vaVc+8Em6NuuZDPtzMg=",
"dev": true,
"requires": {
- "through2": "2.0.3"
+ "through2": "~2.0.1"
}
},
"gulp-flatten": {
@@ -4292,8 +4999,8 @@
"integrity": "sha512-eg4spVTAiv1xXmugyaCxWne1oPtNG0UHEtABx5W8ScLiqAYceyYm6GYA36x0Qh8KOIXmAZV97L2aYGnKREG3Sg==",
"dev": true,
"requires": {
- "plugin-error": "0.1.2",
- "through2": "2.0.3"
+ "plugin-error": "^0.1.2",
+ "through2": "^2.0.0"
}
},
"gulp-rename": {
@@ -4308,8 +5015,8 @@
"integrity": "sha1-8VUhrCOxeNtE5VHjDi/Lykv2/h0=",
"dev": true,
"requires": {
- "slash": "0.1.3",
- "through2": "0.5.1"
+ "slash": "~0.1.3",
+ "through2": "~0.5.1"
},
"dependencies": {
"isarray": {
@@ -4324,10 +5031,10 @@
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
"isarray": "0.0.1",
- "string_decoder": "0.10.31"
+ "string_decoder": "~0.10.x"
}
},
"string_decoder": {
@@ -4342,8 +5049,8 @@
"integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
"dev": true,
"requires": {
- "readable-stream": "1.0.34",
- "xtend": "3.0.0"
+ "readable-stream": "~1.0.17",
+ "xtend": "~3.0.0"
}
},
"xtend": {
@@ -4360,24 +5067,24 @@
"integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
"dev": true,
"requires": {
- "array-differ": "1.0.0",
- "array-uniq": "1.0.3",
- "beeper": "1.1.1",
- "chalk": "1.1.3",
- "dateformat": "2.2.0",
- "fancy-log": "1.3.2",
- "gulplog": "1.0.0",
- "has-gulplog": "0.1.0",
- "lodash._reescape": "3.0.0",
- "lodash._reevaluate": "3.0.0",
- "lodash._reinterpolate": "3.0.0",
- "lodash.template": "3.6.2",
- "minimist": "1.2.0",
- "multipipe": "0.1.2",
- "object-assign": "3.0.0",
+ "array-differ": "^1.0.0",
+ "array-uniq": "^1.0.2",
+ "beeper": "^1.0.0",
+ "chalk": "^1.0.0",
+ "dateformat": "^2.0.0",
+ "fancy-log": "^1.1.0",
+ "gulplog": "^1.0.0",
+ "has-gulplog": "^0.1.0",
+ "lodash._reescape": "^3.0.0",
+ "lodash._reevaluate": "^3.0.0",
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.template": "^3.0.0",
+ "minimist": "^1.1.0",
+ "multipipe": "^0.1.2",
+ "object-assign": "^3.0.0",
"replace-ext": "0.0.1",
- "through2": "2.0.3",
- "vinyl": "0.5.3"
+ "through2": "^2.0.0",
+ "vinyl": "^0.5.0"
},
"dependencies": {
"ansi-styles": {
@@ -4388,28 +5095,57 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
}
},
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
"object-assign": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
"integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
"dev": true
},
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.0",
+ "clone-stats": "^0.0.1",
+ "replace-ext": "0.0.1"
+ }
}
}
},
@@ -4419,19 +5155,25 @@
"integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
"dev": true,
"requires": {
- "glogg": "1.0.1"
+ "glogg": "^1.0.0"
}
},
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
"har-validator": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
"integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
"dev": true,
"requires": {
- "chalk": "1.1.3",
- "commander": "2.15.1",
- "is-my-json-valid": "2.17.2",
- "pinkie-promise": "2.0.1"
+ "chalk": "^1.1.1",
+ "commander": "^2.9.0",
+ "is-my-json-valid": "^2.12.4",
+ "pinkie-promise": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
@@ -4446,11 +5188,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
}
},
"supports-color": {
@@ -4466,7 +5208,7 @@
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
- "function-bind": "1.1.1"
+ "function-bind": "^1.1.1"
}
},
"has-ansi": {
@@ -4475,13 +5217,14 @@
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
},
"has-gulplog": {
"version": "0.1.0",
@@ -4489,9 +5232,15 @@
"integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
"dev": true,
"requires": {
- "sparkles": "1.0.1"
+ "sparkles": "^1.0.0"
}
},
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -4504,9 +5253,9 @@
"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
"dev": true,
"requires": {
- "get-value": "2.0.6",
- "has-values": "1.0.0",
- "isobject": "3.0.1"
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
},
"dependencies": {
"isobject": {
@@ -4523,8 +5272,8 @@
"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
"dev": true,
"requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
},
"dependencies": {
"is-number": {
@@ -4533,7 +5282,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -4542,7 +5291,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -4553,7 +5302,7 @@
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -4564,8 +5313,8 @@
"integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "safe-buffer": "5.1.2"
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
}
},
"hash.js": {
@@ -4574,8 +5323,8 @@
"integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "minimalistic-assert": "1.0.1"
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.0"
}
},
"hawk": {
@@ -4584,10 +5333,10 @@
"integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
"dev": true,
"requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
+ "boom": "2.x.x",
+ "cryptiles": "2.x.x",
+ "hoek": "2.x.x",
+ "sntp": "1.x.x"
}
},
"hmac-drbg": {
@@ -4596,9 +5345,9 @@
"integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
"dev": true,
"requires": {
- "hash.js": "1.1.4",
- "minimalistic-assert": "1.0.1",
- "minimalistic-crypto-utils": "1.0.1"
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
"hoek": {
@@ -4613,7 +5362,7 @@
"integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
"dev": true,
"requires": {
- "parse-passwd": "1.0.0"
+ "parse-passwd": "^1.0.0"
}
},
"hosted-git-info": {
@@ -4628,10 +5377,10 @@
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"dev": true,
"requires": {
- "depd": "1.1.2",
+ "depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
- "statuses": "1.4.0"
+ "statuses": ">= 1.4.0 < 2"
}
},
"http-parser-js": {
@@ -4646,9 +5395,9 @@
"integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
"dev": true,
"requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.1",
- "sshpk": "1.14.2"
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
}
},
"https-browserify": {
@@ -4686,7 +5435,7 @@
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"dev": true,
"requires": {
- "repeating": "2.0.1"
+ "repeating": "^2.0.0"
}
},
"indexof": {
@@ -4699,9 +5448,10 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -4749,8 +5499,8 @@
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
"requires": {
- "is-relative": "1.0.0",
- "is-windows": "1.0.2"
+ "is-relative": "^1.0.0",
+ "is-windows": "^1.0.1"
}
},
"is-accessor-descriptor": {
@@ -4759,7 +5509,7 @@
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
},
"is-arrayish": {
@@ -4773,7 +5523,7 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"requires": {
- "binary-extensions": "1.11.0"
+ "binary-extensions": "^1.0.0"
}
},
"is-buffer": {
@@ -4787,7 +5537,7 @@
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
"requires": {
- "builtin-modules": "1.1.1"
+ "builtin-modules": "^1.0.0"
}
},
"is-callable": {
@@ -4799,9 +5549,9 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
"integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
- "optional": true,
+ "dev": true,
"requires": {
- "ci-info": "1.1.3"
+ "ci-info": "^1.0.0"
}
},
"is-data-descriptor": {
@@ -4810,7 +5560,7 @@
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
},
"is-date-object": {
@@ -4824,9 +5574,9 @@
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
},
"dependencies": {
"kind-of": {
@@ -4842,18 +5592,12 @@
"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
"integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
},
- "is-electron-renderer": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz",
- "integrity": "sha1-pGnQVvl1aXxYyYxgI+sKp5r4laI=",
- "optional": true
- },
"is-equal-shallow": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"requires": {
- "is-primitive": "2.0.0"
+ "is-primitive": "^2.0.0"
}
},
"is-extendable": {
@@ -4872,7 +5616,7 @@
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"is-fullwidth-code-point": {
@@ -4881,7 +5625,7 @@
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"is-glob": {
@@ -4889,7 +5633,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"requires": {
- "is-extglob": "1.0.0"
+ "is-extglob": "^1.0.0"
}
},
"is-module": {
@@ -4910,19 +5654,25 @@
"integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
"dev": true,
"requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "is-my-ip-valid": "1.0.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
+ "generate-function": "^2.0.0",
+ "generate-object-property": "^1.1.0",
+ "is-my-ip-valid": "^1.0.0",
+ "jsonpointer": "^4.0.0",
+ "xtend": "^4.0.0"
}
},
+ "is-negated-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+ "dev": true
+ },
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
},
"is-odd": {
@@ -4931,7 +5681,7 @@
"integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
"dev": true,
"requires": {
- "is-number": "4.0.0"
+ "is-number": "^4.0.0"
},
"dependencies": {
"is-number": {
@@ -4948,7 +5698,7 @@
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
"requires": {
- "isobject": "3.0.1"
+ "isobject": "^3.0.1"
},
"dependencies": {
"isobject": {
@@ -4980,7 +5730,7 @@
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
"integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
"requires": {
- "has": "1.0.3"
+ "has": "^1.0.1"
}
},
"is-relative": {
@@ -4989,7 +5739,7 @@
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
"requires": {
- "is-unc-path": "1.0.0"
+ "is-unc-path": "^1.0.0"
}
},
"is-stream": {
@@ -5015,7 +5765,7 @@
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"dev": true,
"requires": {
- "unc-path-regex": "0.1.2"
+ "unc-path-regex": "^0.1.2"
}
},
"is-utf8": {
@@ -5024,6 +5774,12 @@
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
+ "is-valid-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+ "dev": true
+ },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -5035,6 +5791,15 @@
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
+ "isbinaryfile": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5071,9 +5836,10 @@
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
"integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
"requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.0"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
}
},
"jsbn": {
@@ -5101,6 +5867,15 @@
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
},
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -5117,10 +5892,17 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
"requires": {
- "graceful-fs": "4.1.11"
+ "graceful-fs": "^4.1.6"
}
},
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
"jsonpointer": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
@@ -5152,11 +5934,11 @@
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
"integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==",
"requires": {
- "core-js": "2.3.0",
- "es6-promise": "3.0.2",
- "lie": "3.1.1",
- "pako": "1.0.6",
- "readable-stream": "2.0.6"
+ "core-js": "~2.3.0",
+ "es6-promise": "~3.0.2",
+ "lie": "~3.1.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.0.6"
},
"dependencies": {
"process-nextick-args": {
@@ -5169,12 +5951,12 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
"integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "0.10.31",
- "util-deprecate": "1.0.2"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
}
},
"string_decoder": {
@@ -5184,12 +5966,28 @@
}
}
},
+ "just-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "dev": true
+ },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
+ }
+ },
+ "last-run": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+ "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+ "dev": true,
+ "requires": {
+ "default-resolution": "^2.0.0",
+ "es6-weak-map": "^2.0.1"
}
},
"lazy-cache": {
@@ -5201,14 +5999,16 @@
"lazy-val": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz",
- "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg=="
+ "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==",
+ "dev": true
},
"lazystream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
"requires": {
- "readable-stream": "2.3.6"
+ "readable-stream": "^2.0.5"
}
},
"lcid": {
@@ -5217,7 +6017,16 @@
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"dev": true,
"requires": {
- "invert-kv": "1.0.0"
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "lead": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+ "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+ "dev": true,
+ "requires": {
+ "flush-write-stream": "^1.0.2"
}
},
"lie": {
@@ -5225,7 +6034,7 @@
"resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
"integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
"requires": {
- "immediate": "3.0.6"
+ "immediate": "~3.0.5"
}
},
"liftoff": {
@@ -5234,14 +6043,14 @@
"integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
"dev": true,
"requires": {
- "extend": "3.0.1",
- "findup-sync": "2.0.0",
- "fined": "1.1.0",
- "flagged-respawn": "1.0.0",
- "is-plain-object": "2.0.4",
- "object.map": "1.0.1",
- "rechoir": "0.6.2",
- "resolve": "1.7.1"
+ "extend": "^3.0.0",
+ "findup-sync": "^2.0.0",
+ "fined": "^1.0.1",
+ "flagged-respawn": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "object.map": "^1.0.0",
+ "rechoir": "^0.6.2",
+ "resolve": "^1.1.7"
}
},
"livereload-js": {
@@ -5256,11 +6065,11 @@
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
}
},
"loader-runner": {
@@ -5275,9 +6084,9 @@
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
"dev": true,
"requires": {
- "big.js": "3.2.0",
- "emojis-list": "2.1.0",
- "json5": "0.5.1"
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0"
}
},
"locate-path": {
@@ -5286,8 +6095,8 @@
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
},
"dependencies": {
"path-exists": {
@@ -5301,7 +6110,8 @@
"lodash": {
"version": "4.17.10",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
},
"lodash._basecopy": {
"version": "3.0.1",
@@ -5369,13 +6179,19 @@
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true
+ },
"lodash.escape": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
"integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
"dev": true,
"requires": {
- "lodash._root": "3.0.1"
+ "lodash._root": "^3.0.0"
}
},
"lodash.isarguments": {
@@ -5396,9 +6212,9 @@
"integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
"dev": true,
"requires": {
- "lodash._getnative": "3.9.1",
- "lodash.isarguments": "3.1.0",
- "lodash.isarray": "3.0.4"
+ "lodash._getnative": "^3.0.0",
+ "lodash.isarguments": "^3.0.0",
+ "lodash.isarray": "^3.0.0"
}
},
"lodash.mergewith": {
@@ -5419,15 +6235,15 @@
"integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
"dev": true,
"requires": {
- "lodash._basecopy": "3.0.1",
- "lodash._basetostring": "3.0.1",
- "lodash._basevalues": "3.0.0",
- "lodash._isiterateecall": "3.0.9",
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0",
- "lodash.keys": "3.1.2",
- "lodash.restparam": "3.6.1",
- "lodash.templatesettings": "3.1.1"
+ "lodash._basecopy": "^3.0.0",
+ "lodash._basetostring": "^3.0.0",
+ "lodash._basevalues": "^3.0.0",
+ "lodash._isiterateecall": "^3.0.0",
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.escape": "^3.0.0",
+ "lodash.keys": "^3.0.0",
+ "lodash.restparam": "^3.0.0",
+ "lodash.templatesettings": "^3.0.0"
}
},
"lodash.templatesettings": {
@@ -5436,8 +6252,8 @@
"integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
"dev": true,
"requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0"
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.escape": "^3.0.0"
}
},
"log-symbols": {
@@ -5446,7 +6262,7 @@
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
"dev": true,
"requires": {
- "chalk": "2.4.1"
+ "chalk": "^2.0.1"
}
},
"longest": {
@@ -5461,8 +6277,8 @@
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
"requires": {
- "currently-unhandled": "0.4.1",
- "signal-exit": "3.0.2"
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
}
},
"lru-cache": {
@@ -5471,8 +6287,8 @@
"integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
"dev": true,
"requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
}
},
"macos-release": {
@@ -5487,7 +6303,7 @@
"integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
"dev": true,
"requires": {
- "vlq": "0.2.3"
+ "vlq": "^0.2.2"
}
},
"make-iterator": {
@@ -5496,7 +6312,7 @@
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.2"
},
"dependencies": {
"kind-of": {
@@ -5525,7 +6341,295 @@
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
"dev": true,
"requires": {
- "object-visit": "1.0.1"
+ "object-visit": "^1.0.0"
+ }
+ },
+ "matchdep": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+ "dev": true,
+ "requires": {
+ "findup-sync": "^2.0.0",
+ "micromatch": "^3.0.4",
+ "resolve": "^1.4.0",
+ "stack-trace": "0.0.10"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ }
}
},
"math-random": {
@@ -5539,8 +6643,8 @@
"integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
"dev": true,
"requires": {
- "hash-base": "3.0.4",
- "inherits": "2.0.3"
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
}
},
"media-typer": {
@@ -5555,7 +6659,7 @@
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
"dev": true,
"requires": {
- "mimic-fn": "1.2.0"
+ "mimic-fn": "^1.0.0"
}
},
"memory-fs": {
@@ -5564,8 +6668,8 @@
"integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
"dev": true,
"requires": {
- "errno": "0.1.7",
- "readable-stream": "2.3.6"
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
}
},
"meow": {
@@ -5574,16 +6678,16 @@
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
"requires": {
- "camelcase-keys": "2.1.0",
- "decamelize": "1.2.0",
- "loud-rejection": "1.6.0",
- "map-obj": "1.0.1",
- "minimist": "1.2.0",
- "normalize-package-data": "2.4.0",
- "object-assign": "4.1.1",
- "read-pkg-up": "1.0.1",
- "redent": "1.0.0",
- "trim-newlines": "1.0.0"
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
}
},
"merge-descriptors": {
@@ -5603,19 +6707,19 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
+ "arr-diff": "^2.0.0",
+ "array-unique": "^0.2.1",
+ "braces": "^1.8.2",
+ "expand-brackets": "^0.1.4",
+ "extglob": "^0.3.1",
+ "filename-regex": "^2.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.1",
+ "kind-of": "^3.0.2",
+ "normalize-path": "^2.0.1",
+ "object.omit": "^2.0.0",
+ "parse-glob": "^3.0.4",
+ "regex-cache": "^0.4.2"
}
},
"miller-rabin": {
@@ -5624,8 +6728,8 @@
"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "brorand": "1.1.0"
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
}
},
"mime": {
@@ -5646,7 +6750,7 @@
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"dev": true,
"requires": {
- "mime-db": "1.33.0"
+ "mime-db": "~1.33.0"
}
},
"mimic-fn": {
@@ -5672,7 +6776,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
- "brace-expansion": "1.1.11"
+ "brace-expansion": "^1.1.7"
}
},
"minimist": {
@@ -5686,8 +6790,8 @@
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
"dev": true,
"requires": {
- "for-in": "1.0.2",
- "is-extendable": "1.0.1"
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
},
"dependencies": {
"is-extendable": {
@@ -5696,7 +6800,7 @@
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
"dev": true,
"requires": {
- "is-plain-object": "2.0.4"
+ "is-plain-object": "^2.0.4"
}
}
}
@@ -5724,7 +6828,8 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
},
"multipipe": {
"version": "0.1.2",
@@ -5735,6 +6840,12 @@
"duplexer2": "0.0.2"
}
},
+ "mute-stdout": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
+ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
+ "dev": true
+ },
"nan": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
@@ -5746,18 +6857,18 @@
"integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
"dev": true,
"requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "fragment-cache": "0.2.1",
- "is-odd": "2.0.0",
- "is-windows": "1.0.2",
- "kind-of": "6.0.2",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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-odd": "^2.0.0",
+ "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"
},
"dependencies": {
"arr-diff": {
@@ -5780,12 +6891,6 @@
}
}
},
- "natives": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz",
- "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==",
- "dev": true
- },
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@@ -5804,40 +6909,187 @@
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
"dev": true
},
+ "nl.kingsquare.cordova.background-audio": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/nl.kingsquare.cordova.background-audio/-/nl.kingsquare.cordova.background-audio-1.0.1.tgz",
+ "integrity": "sha1-Gx1NzaijXAx/x5UzN7FzsUtPmGA="
+ },
"node-abi": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz",
"integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==",
"dev": true,
"requires": {
- "semver": "5.5.0"
+ "semver": "^5.4.1"
}
},
"node-gyp": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz",
- "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==",
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
"dev": true,
"requires": {
- "fstream": "1.0.11",
- "glob": "7.1.2",
- "graceful-fs": "4.1.11",
- "mkdirp": "0.5.1",
- "nopt": "3.0.6",
- "npmlog": "4.1.2",
- "osenv": "0.1.5",
- "request": "2.79.0",
- "rimraf": "2.6.2",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "which": "1.3.1"
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "^2.87.0",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
},
"dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "har-validator": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+ "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "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.0",
+ "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.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
"semver": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
"dev": true
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
}
}
},
@@ -5847,28 +7099,28 @@
"integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
"dev": true,
"requires": {
- "assert": "1.4.1",
- "browserify-zlib": "0.2.0",
- "buffer": "4.9.1",
- "console-browserify": "1.1.0",
- "constants-browserify": "1.0.0",
- "crypto-browserify": "3.12.0",
- "domain-browser": "1.2.0",
- "events": "1.1.1",
- "https-browserify": "1.0.0",
- "os-browserify": "0.3.0",
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^1.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
"path-browserify": "0.0.0",
- "process": "0.11.10",
- "punycode": "1.4.1",
- "querystring-es3": "0.2.1",
- "readable-stream": "2.3.6",
- "stream-browserify": "2.0.1",
- "stream-http": "2.8.3",
- "string_decoder": "1.1.1",
- "timers-browserify": "2.0.10",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
"tty-browserify": "0.0.0",
- "url": "0.11.0",
- "util": "0.10.4",
+ "url": "^0.11.0",
+ "util": "^0.10.3",
"vm-browserify": "0.0.4"
}
},
@@ -5884,25 +7136,25 @@
"integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==",
"dev": true,
"requires": {
- "async-foreach": "0.1.3",
- "chalk": "1.1.3",
- "cross-spawn": "3.0.1",
- "gaze": "1.1.3",
- "get-stdin": "4.0.1",
- "glob": "7.1.2",
- "in-publish": "2.0.0",
- "lodash.assign": "4.2.0",
- "lodash.clonedeep": "4.5.0",
- "lodash.mergewith": "4.6.1",
- "meow": "3.7.0",
- "mkdirp": "0.5.1",
- "nan": "2.10.0",
- "node-gyp": "3.7.0",
- "npmlog": "4.1.2",
- "request": "2.79.0",
- "sass-graph": "2.2.4",
- "stdout-stream": "1.4.0",
- "true-case-path": "1.0.2"
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash.assign": "^4.2.0",
+ "lodash.clonedeep": "^4.3.2",
+ "lodash.mergewith": "^4.6.0",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.3.2",
+ "node-gyp": "^3.3.1",
+ "npmlog": "^4.0.0",
+ "request": "~2.79.0",
+ "sass-graph": "^2.2.4",
+ "stdout-stream": "^1.4.0",
+ "true-case-path": "^1.0.2"
},
"dependencies": {
"ansi-styles": {
@@ -5917,11 +7169,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
}
},
"cross-spawn": {
@@ -5930,8 +7182,8 @@
"integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"dev": true,
"requires": {
- "lru-cache": "4.1.3",
- "which": "1.3.1"
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
}
},
"supports-color": {
@@ -5948,7 +7200,7 @@
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"dev": true,
"requires": {
- "abbrev": "1.1.1"
+ "abbrev": "1"
}
},
"normalize-package-data": {
@@ -5957,10 +7209,10 @@
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true,
"requires": {
- "hosted-git-info": "2.6.0",
- "is-builtin-module": "1.0.0",
- "semver": "5.5.0",
- "validate-npm-package-license": "3.0.3"
+ "hosted-git-info": "^2.1.4",
+ "is-builtin-module": "^1.0.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
}
},
"normalize-path": {
@@ -5968,7 +7220,7 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"requires": {
- "remove-trailing-separator": "1.1.0"
+ "remove-trailing-separator": "^1.0.1"
}
},
"normalize-range": {
@@ -5977,13 +7229,22 @@
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
"dev": true
},
+ "now-and-later": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
+ "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.2"
+ }
+ },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"dev": true,
"requires": {
- "path-key": "2.0.1"
+ "path-key": "^2.0.0"
}
},
"npmlog": {
@@ -5992,10 +7253,10 @@
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
- "are-we-there-yet": "1.1.5",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
}
},
"num2fraction": {
@@ -6028,9 +7289,9 @@
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
"dev": true,
"requires": {
- "copy-descriptor": "0.1.1",
- "define-property": "0.2.5",
- "kind-of": "3.2.2"
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
},
"dependencies": {
"define-property": {
@@ -6039,7 +7300,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
}
}
@@ -6055,7 +7316,7 @@
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
"dev": true,
"requires": {
- "isobject": "3.0.1"
+ "isobject": "^3.0.0"
},
"dependencies": {
"isobject": {
@@ -6066,16 +7327,28 @@
}
}
},
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
"object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
"integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
"dev": true,
"requires": {
- "array-each": "1.0.1",
- "array-slice": "1.1.0",
- "for-own": "1.0.0",
- "isobject": "3.0.1"
+ "array-each": "^1.0.1",
+ "array-slice": "^1.0.0",
+ "for-own": "^1.0.0",
+ "isobject": "^3.0.0"
},
"dependencies": {
"for-own": {
@@ -6084,7 +7357,7 @@
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
"requires": {
- "for-in": "1.0.2"
+ "for-in": "^1.0.1"
}
},
"isobject": {
@@ -6101,8 +7374,8 @@
"integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
"dev": true,
"requires": {
- "for-own": "1.0.0",
- "make-iterator": "1.0.1"
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
},
"dependencies": {
"for-own": {
@@ -6111,7 +7384,7 @@
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
"requires": {
- "for-in": "1.0.2"
+ "for-in": "^1.0.1"
}
}
}
@@ -6121,8 +7394,8 @@
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
+ "for-own": "^0.1.4",
+ "is-extendable": "^0.1.1"
}
},
"object.pick": {
@@ -6131,7 +7404,7 @@
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
"dev": true,
"requires": {
- "isobject": "3.0.1"
+ "isobject": "^3.0.1"
},
"dependencies": {
"isobject": {
@@ -6142,6 +7415,27 @@
}
}
},
+ "object.reduce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+ "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+ "dev": true,
+ "requires": {
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ }
+ }
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -6155,8 +7449,9 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
"onetime": {
@@ -6165,7 +7460,7 @@
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
"requires": {
- "mimic-fn": "1.2.0"
+ "mimic-fn": "^1.0.0"
}
},
"ora": {
@@ -6174,28 +7469,20 @@
"integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==",
"dev": true,
"requires": {
- "chalk": "2.4.1",
- "cli-cursor": "2.1.0",
- "cli-spinners": "1.3.1",
- "log-symbols": "2.2.0"
- }
- },
- "orchestrator": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
- "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
- "dev": true,
- "requires": {
- "end-of-stream": "0.1.5",
- "sequencify": "0.0.7",
- "stream-consume": "0.1.1"
+ "chalk": "^2.1.0",
+ "cli-cursor": "^2.1.0",
+ "cli-spinners": "^1.0.1",
+ "log-symbols": "^2.1.0"
}
},
"ordered-read-streams": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
- "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
- "dev": true
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+ "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.1"
+ }
},
"os-browserify": {
"version": "0.3.0",
@@ -6215,7 +7502,7 @@
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
- "lcid": "1.0.0"
+ "lcid": "^1.0.0"
}
},
"os-name": {
@@ -6224,8 +7511,8 @@
"integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=",
"dev": true,
"requires": {
- "macos-release": "1.1.0",
- "win-release": "1.1.1"
+ "macos-release": "^1.0.0",
+ "win-release": "^1.0.0"
}
},
"os-tmpdir": {
@@ -6240,8 +7527,8 @@
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
}
},
"p-finally": {
@@ -6256,7 +7543,7 @@
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "p-try": "1.0.0"
+ "p-try": "^1.0.0"
}
},
"p-locate": {
@@ -6265,7 +7552,7 @@
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
- "p-limit": "1.3.0"
+ "p-limit": "^1.1.0"
}
},
"p-try": {
@@ -6285,11 +7572,11 @@
"integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
"dev": true,
"requires": {
- "asn1.js": "4.10.1",
- "browserify-aes": "1.2.0",
- "create-hash": "1.2.0",
- "evp_bytestokey": "1.0.3",
- "pbkdf2": "3.0.16"
+ "asn1.js": "^4.0.0",
+ "browserify-aes": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3"
}
},
"parse-filepath": {
@@ -6298,9 +7585,9 @@
"integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
"dev": true,
"requires": {
- "is-absolute": "1.0.0",
- "map-cache": "0.2.2",
- "path-root": "0.1.1"
+ "is-absolute": "^1.0.0",
+ "map-cache": "^0.2.0",
+ "path-root": "^0.1.1"
}
},
"parse-glob": {
@@ -6308,10 +7595,10 @@
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
+ "glob-base": "^0.3.0",
+ "is-dotfile": "^1.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.0"
}
},
"parse-json": {
@@ -6320,7 +7607,7 @@
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
- "error-ex": "1.3.1"
+ "error-ex": "^1.2.0"
}
},
"parse-passwd": {
@@ -6359,7 +7646,7 @@
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
- "pinkie-promise": "2.0.1"
+ "pinkie-promise": "^2.0.0"
}
},
"path-is-absolute": {
@@ -6385,7 +7672,7 @@
"integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
"dev": true,
"requires": {
- "path-root-regex": "0.1.2"
+ "path-root-regex": "^0.1.0"
}
},
"path-root-regex": {
@@ -6415,9 +7702,9 @@
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
}
},
"pbkdf2": {
@@ -6426,13 +7713,28 @@
"integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==",
"dev": true,
"requires": {
- "create-hash": "1.2.0",
- "create-hmac": "1.1.7",
- "ripemd160": "2.0.2",
- "safe-buffer": "5.1.2",
- "sha.js": "2.4.11"
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
}
},
+ "pegjs": {
+ "version": "0.10.0",
+ "resolved": "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
+ "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "phonegap-plugin-push": {
+ "version": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#cf2ed2075d9d2d58a4c4f79543f669ed6366c148",
+ "from": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#moodle"
+ },
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
@@ -6451,7 +7753,18 @@
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
- "pinkie": "2.0.4"
+ "pinkie": "^2.0.0"
+ }
+ },
+ "plist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",
+ "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.2.3",
+ "xmlbuilder": "^9.0.7",
+ "xmldom": "0.1.x"
}
},
"plugin-error": {
@@ -6460,11 +7773,11 @@
"integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
"dev": true,
"requires": {
- "ansi-cyan": "0.1.1",
- "ansi-red": "0.1.1",
- "arr-diff": "1.1.0",
- "arr-union": "2.1.0",
- "extend-shallow": "1.1.4"
+ "ansi-cyan": "^0.1.1",
+ "ansi-red": "^0.1.1",
+ "arr-diff": "^1.0.1",
+ "arr-union": "^2.0.1",
+ "extend-shallow": "^1.1.2"
},
"dependencies": {
"arr-diff": {
@@ -6473,8 +7786,8 @@
"integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
"dev": true,
"requires": {
- "arr-flatten": "1.1.0",
- "array-slice": "0.2.3"
+ "arr-flatten": "^1.0.1",
+ "array-slice": "^0.2.3"
}
},
"arr-union": {
@@ -6495,7 +7808,7 @@
"integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
"dev": true,
"requires": {
- "kind-of": "1.1.0"
+ "kind-of": "^1.1.0"
}
},
"kind-of": {
@@ -6518,9 +7831,9 @@
"integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==",
"dev": true,
"requires": {
- "chalk": "2.4.1",
- "source-map": "0.6.1",
- "supports-color": "5.4.0"
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
}
},
"postcss-value-parser": {
@@ -6556,9 +7869,9 @@
"resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz",
"integrity": "sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ==",
"requires": {
- "define-properties": "1.1.2",
- "es-abstract": "1.12.0",
- "function-bind": "1.1.1"
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.9.0",
+ "function-bind": "^1.1.1"
}
},
"proxy-addr": {
@@ -6567,7 +7880,7 @@
"integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
"dev": true,
"requires": {
- "forwarded": "0.1.2",
+ "forwarded": "~0.1.2",
"ipaddr.js": "1.6.0"
}
},
@@ -6589,17 +7902,44 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
+ "psl": {
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+ "dev": true
+ },
"public-encrypt": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
"integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "browserify-rsa": "4.0.1",
- "create-hash": "1.2.0",
- "parse-asn1": "5.1.1",
- "randombytes": "2.0.6"
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
}
},
"punycode": {
@@ -6631,9 +7971,9 @@
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
"integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
"requires": {
- "is-number": "4.0.0",
- "kind-of": "6.0.2",
- "math-random": "1.0.1"
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
},
"dependencies": {
"is-number": {
@@ -6654,7 +7994,7 @@
"integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
"dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "safe-buffer": "^5.1.0"
}
},
"randomfill": {
@@ -6663,8 +8003,8 @@
"integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
"dev": true,
"requires": {
- "randombytes": "2.0.6",
- "safe-buffer": "5.1.2"
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
}
},
"range-parser": {
@@ -6700,7 +8040,7 @@
"depd": "1.1.1",
"inherits": "2.0.3",
"setprototypeof": "1.0.3",
- "statuses": "1.4.0"
+ "statuses": ">= 1.3.1 < 2"
}
},
"setprototypeof": {
@@ -6711,15 +8051,73 @@
}
}
},
+ "read-config-file": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.1.0.tgz",
+ "integrity": "sha512-z3VTrR9fgFu+Ll6MhTdtxbPFBKNGKgzYYnRjOcZvQeE/zwJTjPYVrps0ATgaSWU2/BnucUg3knP+Oz4zo9vEoA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.2",
+ "ajv-keywords": "^3.2.0",
+ "bluebird-lst": "^1.0.5",
+ "dotenv": "^6.0.0",
+ "dotenv-expand": "^4.2.0",
+ "fs-extra-p": "^4.6.1",
+ "js-yaml": "^3.12.0",
+ "json5": "^1.0.1",
+ "lazy-val": "^1.0.3"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
+ "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
+ }
+ },
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.4.0",
- "path-type": "1.1.0"
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
}
},
"read-pkg-up": {
@@ -6728,8 +8126,8 @@
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
}
},
"readable-stream": {
@@ -6737,13 +8135,13 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.2",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
"readdirp": {
@@ -6751,10 +8149,10 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
"integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
"requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.3.6",
- "set-immediate-shim": "1.0.1"
+ "graceful-fs": "^4.1.2",
+ "minimatch": "^3.0.2",
+ "readable-stream": "^2.0.2",
+ "set-immediate-shim": "^1.0.1"
}
},
"rechoir": {
@@ -6763,7 +8161,7 @@
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"requires": {
- "resolve": "1.7.1"
+ "resolve": "^1.1.6"
}
},
"redent": {
@@ -6772,8 +8170,8 @@
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"dev": true,
"requires": {
- "indent-string": "2.1.0",
- "strip-indent": "1.0.1"
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
}
},
"reflect-metadata": {
@@ -6786,7 +8184,7 @@
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"requires": {
- "is-equal-shallow": "0.1.3"
+ "is-equal-shallow": "^0.1.3"
}
},
"regex-not": {
@@ -6795,8 +8193,29 @@
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
"dev": true,
"requires": {
- "extend-shallow": "3.0.2",
- "safe-regex": "1.1.0"
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "remove-bom-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+ "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5",
+ "is-utf8": "^0.2.1"
+ }
+ },
+ "remove-bom-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "dev": true,
+ "requires": {
+ "remove-bom-buffer": "^3.0.0",
+ "safe-buffer": "^5.1.0",
+ "through2": "^2.0.3"
}
},
"remove-trailing-separator": {
@@ -6820,41 +8239,52 @@
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
"requires": {
- "is-finite": "1.0.2"
+ "is-finite": "^1.0.0"
}
},
"replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
+ "replace-homedir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+ "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1",
+ "is-absolute": "^1.0.0",
+ "remove-trailing-separator": "^1.1.0"
+ }
+ },
"request": {
"version": "2.79.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
"integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
"dev": true,
"requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.7.0",
- "caseless": "0.11.0",
- "combined-stream": "1.0.6",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "2.0.6",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.18",
- "oauth-sign": "0.8.2",
- "qs": "6.3.2",
- "stringstream": "0.0.6",
- "tough-cookie": "2.3.4",
- "tunnel-agent": "0.4.3",
- "uuid": "3.2.1"
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "caseless": "~0.11.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.1.1",
+ "har-validator": "~2.0.6",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "oauth-sign": "~0.8.1",
+ "qs": "~6.3.0",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "~0.4.1",
+ "uuid": "^3.0.0"
},
"dependencies": {
"qs": {
@@ -6883,7 +8313,7 @@
"integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
"dev": true,
"requires": {
- "path-parse": "1.0.5"
+ "path-parse": "^1.0.5"
}
},
"resolve-dir": {
@@ -6892,8 +8322,17 @@
"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
"dev": true,
"requires": {
- "expand-tilde": "2.0.2",
- "global-modules": "1.0.0"
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ }
+ },
+ "resolve-options": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+ "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+ "dev": true,
+ "requires": {
+ "value-or-function": "^3.0.0"
}
},
"resolve-url": {
@@ -6908,8 +8347,8 @@
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"dev": true,
"requires": {
- "onetime": "2.0.1",
- "signal-exit": "3.0.2"
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
}
},
"ret": {
@@ -6924,7 +8363,7 @@
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"dev": true,
"requires": {
- "align-text": "0.1.4"
+ "align-text": "^0.1.1"
}
},
"rimraf": {
@@ -6933,7 +8372,7 @@
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
- "glob": "7.1.2"
+ "glob": "^7.0.5"
}
},
"ripemd160": {
@@ -6942,8 +8381,8 @@
"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
"requires": {
- "hash-base": "3.0.4",
- "inherits": "2.0.3"
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
}
},
"rollup": {
@@ -6958,11 +8397,11 @@
"integrity": "sha512-qK0+uhktmnAgZkHkqFuajNmPw93fjrO7+CysDaxWE5jrUR9XSlSvuao5ZJP+XizxA8weakhgYYBtbVz9SGBpjA==",
"dev": true,
"requires": {
- "acorn": "5.6.2",
- "estree-walker": "0.5.2",
- "magic-string": "0.22.5",
- "resolve": "1.7.1",
- "rollup-pluginutils": "2.3.0"
+ "acorn": "^5.2.1",
+ "estree-walker": "^0.5.0",
+ "magic-string": "^0.22.4",
+ "resolve": "^1.4.0",
+ "rollup-pluginutils": "^2.0.1"
}
},
"rollup-plugin-node-resolve": {
@@ -6971,10 +8410,10 @@
"integrity": "sha1-i4l8TDAw1QASd7BRSyXSygloPuA=",
"dev": true,
"requires": {
- "browser-resolve": "1.11.2",
- "builtin-modules": "1.1.1",
- "is-module": "1.0.0",
- "resolve": "1.7.1"
+ "browser-resolve": "^1.11.0",
+ "builtin-modules": "^1.1.0",
+ "is-module": "^1.0.0",
+ "resolve": "^1.1.6"
}
},
"rollup-pluginutils": {
@@ -6983,8 +8422,8 @@
"integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==",
"dev": true,
"requires": {
- "estree-walker": "0.5.2",
- "micromatch": "2.3.11"
+ "estree-walker": "^0.5.2",
+ "micromatch": "^2.3.11"
}
},
"rxjs": {
@@ -7012,7 +8451,7 @@
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"dev": true,
"requires": {
- "ret": "0.1.15"
+ "ret": "~0.1.10"
}
},
"safer-buffer": {
@@ -7025,27 +8464,21 @@
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
"integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
- "optional": true,
+ "dev": true,
"requires": {
- "truncate-utf8-bytes": "1.0.2"
+ "truncate-utf8-bytes": "^1.0.0"
}
},
- "sanitize-xml-string": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/sanitize-xml-string/-/sanitize-xml-string-1.1.0.tgz",
- "integrity": "sha512-RzX25K64YtZm9FvdZr/Ac7Eeq0va1YX0xmpOkjWoREhgKXXldrJRVJhBel83nS8omIcaKcNTdLY8XzOIK920HA==",
- "optional": true
- },
"sass-graph": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
"dev": true,
"requires": {
- "glob": "7.1.2",
- "lodash": "4.17.10",
- "scss-tokenizer": "0.2.3",
- "yargs": "7.1.0"
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^7.0.0"
}
},
"sax": {
@@ -7059,8 +8492,8 @@
"integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
"dev": true,
"requires": {
- "js-base64": "2.4.5",
- "source-map": "0.4.4"
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
},
"dependencies": {
"source-map": {
@@ -7069,7 +8502,7 @@
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"dev": true,
"requires": {
- "amdefine": "1.0.1"
+ "amdefine": ">=0.0.4"
}
}
}
@@ -7077,7 +8510,17 @@
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "semver-greatest-satisfied-range": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+ "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+ "dev": true,
+ "requires": {
+ "sver-compat": "^1.5.0"
+ }
},
"send": {
"version": "0.16.2",
@@ -7086,35 +8529,29 @@
"dev": true,
"requires": {
"debug": "2.6.9",
- "depd": "1.1.2",
- "destroy": "1.0.4",
- "encodeurl": "1.0.2",
- "escape-html": "1.0.3",
- "etag": "1.8.1",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
"fresh": "0.5.2",
- "http-errors": "1.6.3",
+ "http-errors": "~1.6.2",
"mime": "1.4.1",
"ms": "2.0.0",
- "on-finished": "2.3.0",
- "range-parser": "1.2.0",
- "statuses": "1.4.0"
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
}
},
- "sequencify": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
- "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
- "dev": true
- },
"serve-static": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
"dev": true,
"requires": {
- "encodeurl": "1.0.2",
- "escape-html": "1.0.3",
- "parseurl": "1.3.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
"send": "0.16.2"
}
},
@@ -7140,10 +8577,10 @@
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
"dev": true,
"requires": {
- "extend-shallow": "2.0.1",
- "is-extendable": "0.1.1",
- "is-plain-object": "2.0.4",
- "split-string": "3.1.0"
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
},
"dependencies": {
"extend-shallow": {
@@ -7152,7 +8589,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -7175,8 +8612,8 @@
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "safe-buffer": "5.1.2"
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
}
},
"shebang-command": {
@@ -7185,7 +8622,7 @@
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
"requires": {
- "shebang-regex": "1.0.0"
+ "shebang-regex": "^1.0.0"
}
},
"shebang-regex": {
@@ -7194,12 +8631,6 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
- "dev": true
- },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -7218,14 +8649,14 @@
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
"dev": true,
"requires": {
- "base": "0.11.2",
- "debug": "2.6.9",
- "define-property": "0.2.5",
- "extend-shallow": "2.0.1",
- "map-cache": "0.2.2",
- "source-map": "0.5.7",
- "source-map-resolve": "0.5.2",
- "use": "3.1.0"
+ "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"
},
"dependencies": {
"define-property": {
@@ -7234,7 +8665,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
},
"extend-shallow": {
@@ -7243,7 +8674,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
},
"source-map": {
@@ -7260,9 +8691,9 @@
"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
"dev": true,
"requires": {
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "snapdragon-util": "3.0.1"
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
},
"dependencies": {
"define-property": {
@@ -7271,7 +8702,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "1.0.2"
+ "is-descriptor": "^1.0.0"
}
},
"is-accessor-descriptor": {
@@ -7280,7 +8711,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-data-descriptor": {
@@ -7289,7 +8720,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-descriptor": {
@@ -7298,9 +8729,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
}
},
"isobject": {
@@ -7323,7 +8754,7 @@
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.2.0"
}
},
"sntp": {
@@ -7332,7 +8763,7 @@
"integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
"dev": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"source-list-map": {
@@ -7352,11 +8783,11 @@
"integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
"dev": true,
"requires": {
- "atob": "2.1.1",
- "decode-uri-component": "0.2.0",
- "resolve-url": "0.2.1",
- "source-map-url": "0.4.0",
- "urix": "0.1.0"
+ "atob": "^2.1.1",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
}
},
"source-map-support": {
@@ -7364,8 +8795,8 @@
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
"requires": {
- "buffer-from": "1.1.0",
- "source-map": "0.6.1"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
"source-map-url": {
@@ -7386,9 +8817,9 @@
"integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==",
"dev": true,
"requires": {
- "debug": "2.6.9",
- "lodash.assign": "4.2.0",
- "rxjs": "5.5.11"
+ "debug": "^2.5.1",
+ "lodash.assign": "^4.2.0",
+ "rxjs": "^5.1.1"
}
},
"spdx-correct": {
@@ -7397,8 +8828,8 @@
"integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
"dev": true,
"requires": {
- "spdx-expression-parse": "3.0.0",
- "spdx-license-ids": "3.0.0"
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
}
},
"spdx-exceptions": {
@@ -7413,8 +8844,8 @@
"integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"dev": true,
"requires": {
- "spdx-exceptions": "2.1.0",
- "spdx-license-ids": "3.0.0"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
@@ -7429,13 +8860,14 @@
"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
"dev": true,
"requires": {
- "extend-shallow": "3.0.2"
+ "extend-shallow": "^3.0.0"
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
},
"sshpk": {
"version": "1.14.2",
@@ -7443,15 +8875,15 @@
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
"dev": true,
"requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "safer-buffer": "2.1.2",
- "tweetnacl": "0.14.5"
+ "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"
},
"dependencies": {
"assert-plus": {
@@ -7462,11 +8894,17 @@
}
}
},
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
"stat-mode": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
"integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
- "optional": true
+ "dev": true
},
"static-extend": {
"version": "0.1.2",
@@ -7474,8 +8912,8 @@
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
"dev": true,
"requires": {
- "define-property": "0.2.5",
- "object-copy": "0.1.0"
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
},
"dependencies": {
"define-property": {
@@ -7484,7 +8922,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
}
}
@@ -7501,7 +8939,7 @@
"integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
"dev": true,
"requires": {
- "readable-stream": "2.3.6"
+ "readable-stream": "^2.0.1"
}
},
"stream-browserify": {
@@ -7510,14 +8948,14 @@
"integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.6"
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
}
},
- "stream-consume": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
- "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==",
+ "stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
"dev": true
},
"stream-http": {
@@ -7526,20 +8964,18 @@
"integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
"dev": true,
"requires": {
- "builtin-status-codes": "3.0.0",
- "inherits": "2.0.3",
- "readable-stream": "2.3.6",
- "to-arraybuffer": "1.0.1",
- "xtend": "4.0.1"
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
}
},
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
},
"string-template": {
"version": "0.2.1",
@@ -7553,9 +8989,17 @@
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
}
},
"stringstream": {
@@ -7570,7 +9014,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"strip-bom": {
@@ -7579,7 +9023,7 @@
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
"requires": {
- "is-utf8": "0.2.1"
+ "is-utf8": "^0.2.0"
}
},
"strip-eof": {
@@ -7594,15 +9038,35 @@
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
"requires": {
- "get-stdin": "4.0.1"
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "sumchecker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
+ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0"
}
},
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
"requires": {
- "has-flag": "3.0.0"
+ "has-flag": "^3.0.0"
+ }
+ },
+ "sver-compat": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+ "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "^2.0.1",
+ "es6-symbol": "^3.1.1"
}
},
"sw-toolbox": {
@@ -7610,8 +9074,8 @@
"resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
"integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
"requires": {
- "path-to-regexp": "1.7.0",
- "serviceworker-cache-polyfill": "4.0.0"
+ "path-to-regexp": "^1.0.1",
+ "serviceworker-cache-polyfill": "^4.0.0"
}
},
"symbol-observable": {
@@ -7631,47 +9095,21 @@
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true,
"requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "tar-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz",
- "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==",
- "optional": true,
- "requires": {
- "bl": "1.2.2",
- "buffer-alloc": "1.2.0",
- "end-of-stream": "1.4.1",
- "fs-constants": "1.0.0",
- "readable-stream": "2.3.6",
- "to-buffer": "1.1.1",
- "xtend": "4.0.1"
- },
- "dependencies": {
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "optional": true,
- "requires": {
- "once": "1.4.0"
- }
- }
+ "block-stream": "*",
+ "fstream": "^1.0.2",
+ "inherits": "2"
}
},
"temp-file": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.3.tgz",
"integrity": "sha512-oz2J77loDE9sGrlRTqBzwbsUvoBD2BpyXeaRPKyGwBIwaamSs2jdqAfhutw7Tch9llr1u8E2ruoug09rNPa3PA==",
- "optional": true,
+ "dev": true,
"requires": {
- "async-exit-hook": "2.0.1",
- "bluebird-lst": "1.0.5",
- "fs-extra-p": "4.6.1",
- "lazy-val": "1.0.3"
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.5",
+ "fs-extra-p": "^4.6.1",
+ "lazy-val": "^1.0.3"
}
},
"through": {
@@ -7686,17 +9124,18 @@
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
"dev": true,
"requires": {
- "readable-stream": "2.3.6",
- "xtend": "4.0.1"
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
}
},
- "tildify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
- "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
"dev": true,
"requires": {
- "os-homedir": "1.0.2"
+ "through2": "~2.0.0",
+ "xtend": "~4.0.0"
}
},
"time-stamp": {
@@ -7711,7 +9150,7 @@
"integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
"dev": true,
"requires": {
- "setimmediate": "1.0.5"
+ "setimmediate": "^1.0.4"
}
},
"tiny-lr": {
@@ -7720,12 +9159,12 @@
"integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
"dev": true,
"requires": {
- "body": "5.1.0",
- "debug": "3.1.0",
- "faye-websocket": "0.10.0",
- "livereload-js": "2.3.0",
- "object-assign": "4.1.1",
- "qs": "6.5.1"
+ "body": "^5.1.0",
+ "debug": "^3.1.0",
+ "faye-websocket": "~0.10.0",
+ "livereload-js": "^2.3.0",
+ "object-assign": "^4.1.0",
+ "qs": "^6.4.0"
},
"dependencies": {
"debug": {
@@ -7739,25 +9178,29 @@
}
}
},
+ "to-absolute-glob": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+ "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "^1.0.0",
+ "is-negated-glob": "^1.0.0"
+ }
+ },
"to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
- "to-buffer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
- "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
- "optional": true
- },
"to-object-path": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
},
"to-regex": {
@@ -7766,10 +9209,10 @@
"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
"dev": true,
"requires": {
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "regex-not": "1.0.2",
- "safe-regex": "1.1.0"
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
}
},
"to-regex-range": {
@@ -7778,8 +9221,8 @@
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "is-number": "3.0.0",
- "repeat-string": "1.6.1"
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
},
"dependencies": {
"is-number": {
@@ -7788,18 +9231,27 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
}
}
},
+ "to-through": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+ "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "dev": true,
+ "requires": {
+ "through2": "^2.0.3"
+ }
+ },
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"dev": true,
"requires": {
- "punycode": "1.4.1"
+ "punycode": "^1.4.1"
}
},
"trim-newlines": {
@@ -7814,7 +9266,7 @@
"integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
"dev": true,
"requires": {
- "glob": "6.0.4"
+ "glob": "^6.0.4"
},
"dependencies": {
"glob": {
@@ -7823,11 +9275,11 @@
"integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
"dev": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
}
}
@@ -7836,9 +9288,9 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
"integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
- "optional": true,
+ "dev": true,
"requires": {
- "utf8-byte-length": "1.0.4"
+ "utf8-byte-length": "^1.0.1"
}
},
"ts-md5": {
@@ -7851,10 +9303,10 @@
"resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz",
"integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==",
"requires": {
- "minimist": "1.2.0",
- "mkdirp": "0.5.1",
- "source-map": "0.6.1",
- "source-map-support": "0.5.6"
+ "minimist": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "source-map": "^0.6.0",
+ "source-map-support": "^0.5.0"
}
},
"tslib": {
@@ -7868,18 +9320,18 @@
"integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=",
"dev": true,
"requires": {
- "babel-code-frame": "6.26.0",
- "builtin-modules": "1.1.1",
- "chalk": "2.4.1",
- "commander": "2.15.1",
- "diff": "3.5.0",
- "glob": "7.1.2",
- "js-yaml": "3.12.0",
- "minimatch": "3.0.4",
- "resolve": "1.7.1",
- "semver": "5.5.0",
- "tslib": "1.9.2",
- "tsutils": "2.27.1"
+ "babel-code-frame": "^6.22.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.7.0",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.12.1"
}
},
"tslint-eslint-rules": {
@@ -7888,9 +9340,9 @@
"integrity": "sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=",
"dev": true,
"requires": {
- "doctrine": "0.7.2",
- "tslib": "1.9.2",
- "tsutils": "1.9.1"
+ "doctrine": "^0.7.2",
+ "tslib": "^1.0.0",
+ "tsutils": "^1.4.0"
},
"dependencies": {
"tsutils": {
@@ -7907,7 +9359,7 @@
"integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==",
"dev": true,
"requires": {
- "tslib": "1.9.2"
+ "tslib": "^1.8.1"
}
},
"tty-browserify": {
@@ -7936,9 +9388,15 @@
"dev": true,
"requires": {
"media-typer": "0.3.0",
- "mime-types": "2.1.18"
+ "mime-types": "~2.1.18"
}
},
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
"typescript": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
@@ -7951,8 +9409,8 @@
"integrity": "sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug==",
"dev": true,
"requires": {
- "commander": "2.12.2",
- "source-map": "0.6.1"
+ "commander": "~2.12.1",
+ "source-map": "~0.6.1"
},
"dependencies": {
"commander": {
@@ -7976,9 +9434,9 @@
"integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
"dev": true,
"requires": {
- "source-map": "0.5.7",
- "uglify-js": "2.8.29",
- "webpack-sources": "1.1.0"
+ "source-map": "^0.5.6",
+ "uglify-js": "^2.8.29",
+ "webpack-sources": "^1.0.1"
},
"dependencies": {
"camelcase": {
@@ -7993,8 +9451,8 @@
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"dev": true,
"requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
+ "center-align": "^0.1.1",
+ "right-align": "^0.1.1",
"wordwrap": "0.0.2"
}
},
@@ -8010,9 +9468,9 @@
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
"dev": true,
"requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
+ "source-map": "~0.5.1",
+ "uglify-to-browserify": "~1.0.0",
+ "yargs": "~3.10.0"
}
},
"yargs": {
@@ -8021,9 +9479,9 @@
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"dev": true,
"requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
+ "camelcase": "^1.0.2",
+ "cliui": "^2.1.0",
+ "decamelize": "^1.0.0",
"window-size": "0.1.0"
}
}
@@ -8041,16 +9499,39 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
+ "undertaker": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz",
+ "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.0.1",
+ "arr-map": "^2.0.0",
+ "bach": "^1.0.0",
+ "collection-map": "^1.0.0",
+ "es6-weak-map": "^2.0.1",
+ "last-run": "^1.1.0",
+ "object.defaults": "^1.0.0",
+ "object.reduce": "^1.0.0",
+ "undertaker-registry": "^1.0.0"
+ }
+ },
+ "undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+ "dev": true
+ },
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
"integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
"dev": true,
"requires": {
- "arr-union": "3.1.0",
- "get-value": "2.0.6",
- "is-extendable": "0.1.1",
- "set-value": "0.4.3"
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^0.4.3"
},
"dependencies": {
"extend-shallow": {
@@ -8059,7 +9540,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
},
"set-value": {
@@ -8068,24 +9549,29 @@
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
"dev": true,
"requires": {
- "extend-shallow": "2.0.1",
- "is-extendable": "0.1.1",
- "is-plain-object": "2.0.4",
- "to-object-path": "0.3.0"
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.1",
+ "to-object-path": "^0.3.0"
}
}
}
},
"unique-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
- "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
- "dev": true
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "^1.0.0",
+ "through2-filter": "^2.0.0"
+ }
},
"universalify": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
},
"unpipe": {
"version": "1.0.0",
@@ -8099,8 +9585,8 @@
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
"dev": true,
"requires": {
- "has-value": "0.3.1",
- "isobject": "3.0.1"
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
},
"dependencies": {
"has-value": {
@@ -8109,9 +9595,9 @@
"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
"dev": true,
"requires": {
- "get-value": "2.0.6",
- "has-values": "0.1.4",
- "isobject": "2.1.0"
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
},
"dependencies": {
"isobject": {
@@ -8145,6 +9631,23 @@
"integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
"dev": true
},
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ }
+ }
+ },
"urix": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
@@ -8175,7 +9678,7 @@
"integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.2"
},
"dependencies": {
"kind-of": {
@@ -8186,17 +9689,11 @@
}
}
},
- "user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true
- },
"utf8-byte-length": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
"integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=",
- "optional": true
+ "dev": true
},
"util": {
"version": "0.10.4",
@@ -8221,15 +9718,16 @@
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
- "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
},
"v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz",
+ "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==",
"dev": true,
"requires": {
- "user-home": "1.1.1"
+ "homedir-polyfill": "^1.0.1"
}
},
"validate-npm-package-license": {
@@ -8238,10 +9736,16 @@
"integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
"dev": true,
"requires": {
- "spdx-correct": "3.0.0",
- "spdx-expression-parse": "3.0.0"
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
}
},
+ "value-or-function": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+ "dev": true
+ },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -8254,9 +9758,9 @@
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0",
+ "assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
- "extsprintf": "1.3.0"
+ "extsprintf": "^1.2.0"
},
"dependencies": {
"assert-plus": {
@@ -8268,101 +9772,57 @@
}
},
"vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+ "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
"dev": true,
"requires": {
- "clone": "1.0.4",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
+ "clone": "^2.1.1",
+ "clone-buffer": "^1.0.0",
+ "clone-stats": "^1.0.0",
+ "cloneable-readable": "^1.0.0",
+ "remove-trailing-separator": "^1.0.1",
+ "replace-ext": "^1.0.0"
}
},
"vinyl-fs": {
- "version": "0.3.14",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
- "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
+ "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
"dev": true,
"requires": {
- "defaults": "1.0.3",
- "glob-stream": "3.1.18",
- "glob-watcher": "0.0.6",
- "graceful-fs": "3.0.11",
- "mkdirp": "0.5.1",
- "strip-bom": "1.0.0",
- "through2": "0.6.5",
- "vinyl": "0.4.6"
- },
- "dependencies": {
- "clone": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
- "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
- "dev": true
- },
- "graceful-fs": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
- "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
- "dev": true,
- "requires": {
- "natives": "1.1.4"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "strip-bom": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
- "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
- "dev": true,
- "requires": {
- "first-chunk-stream": "1.0.0",
- "is-utf8": "0.2.1"
- }
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- }
- },
- "vinyl": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
- "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
- "dev": true,
- "requires": {
- "clone": "0.2.0",
- "clone-stats": "0.0.1"
- }
- }
+ "fs-mkdirp-stream": "^1.0.0",
+ "glob-stream": "^6.1.0",
+ "graceful-fs": "^4.0.0",
+ "is-valid-glob": "^1.0.0",
+ "lazystream": "^1.0.0",
+ "lead": "^1.0.0",
+ "object.assign": "^4.0.4",
+ "pumpify": "^1.3.5",
+ "readable-stream": "^2.3.3",
+ "remove-bom-buffer": "^3.0.0",
+ "remove-bom-stream": "^1.2.0",
+ "resolve-options": "^1.1.0",
+ "through2": "^2.0.0",
+ "to-through": "^2.0.0",
+ "value-or-function": "^3.0.0",
+ "vinyl": "^2.0.0",
+ "vinyl-sourcemap": "^1.1.0"
+ }
+ },
+ "vinyl-sourcemap": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+ "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+ "dev": true,
+ "requires": {
+ "append-buffer": "^1.0.2",
+ "convert-source-map": "^1.5.0",
+ "graceful-fs": "^4.1.6",
+ "normalize-path": "^2.1.1",
+ "now-and-later": "^2.0.0",
+ "remove-bom-buffer": "^3.0.0",
+ "vinyl": "^2.0.0"
}
},
"vlq": {
@@ -8386,9 +9846,9 @@
"integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
"dev": true,
"requires": {
- "chokidar": "2.0.3",
- "graceful-fs": "4.1.11",
- "neo-async": "2.5.1"
+ "chokidar": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0"
},
"dependencies": {
"anymatch": {
@@ -8397,8 +9857,8 @@
"integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
"dev": true,
"requires": {
- "micromatch": "3.1.10",
- "normalize-path": "2.1.1"
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
}
},
"arr-diff": {
@@ -8419,16 +9879,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "1.1.0",
- "array-unique": "0.3.2",
- "extend-shallow": "2.0.1",
- "fill-range": "4.0.0",
- "isobject": "3.0.1",
- "repeat-element": "1.1.2",
- "snapdragon": "0.8.2",
- "snapdragon-node": "2.1.1",
- "split-string": "3.1.0",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"extend-shallow": {
@@ -8437,7 +9897,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -8448,18 +9908,18 @@
"integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
"dev": true,
"requires": {
- "anymatch": "2.0.0",
- "async-each": "1.0.1",
- "braces": "2.3.2",
- "fsevents": "1.2.4",
- "glob-parent": "3.1.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "4.0.0",
- "normalize-path": "2.1.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0",
- "upath": "1.1.0"
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.1.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.0"
}
},
"expand-brackets": {
@@ -8468,13 +9928,13 @@
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
"dev": true,
"requires": {
- "debug": "2.6.9",
- "define-property": "0.2.5",
- "extend-shallow": "2.0.1",
- "posix-character-classes": "0.1.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"define-property": {
@@ -8483,7 +9943,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "is-descriptor": "^0.1.0"
}
},
"extend-shallow": {
@@ -8492,7 +9952,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
},
"is-accessor-descriptor": {
@@ -8501,7 +9961,7 @@
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -8510,7 +9970,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -8521,7 +9981,7 @@
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -8530,7 +9990,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -8541,9 +10001,9 @@
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
}
},
"kind-of": {
@@ -8560,14 +10020,14 @@
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"requires": {
- "array-unique": "0.3.2",
- "define-property": "1.0.0",
- "expand-brackets": "2.1.4",
- "extend-shallow": "2.0.1",
- "fragment-cache": "0.2.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
},
"dependencies": {
"define-property": {
@@ -8576,7 +10036,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "1.0.2"
+ "is-descriptor": "^1.0.0"
}
},
"extend-shallow": {
@@ -8585,7 +10045,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -8596,10 +10056,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "2.0.1",
- "is-number": "3.0.0",
- "repeat-string": "1.6.1",
- "to-regex-range": "2.1.1"
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
},
"dependencies": {
"extend-shallow": {
@@ -8608,7 +10068,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "0.1.1"
+ "is-extendable": "^0.1.0"
}
}
}
@@ -8619,8 +10079,8 @@
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"dev": true,
"requires": {
- "is-glob": "3.1.0",
- "path-dirname": "1.0.2"
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
},
"dependencies": {
"is-glob": {
@@ -8629,7 +10089,7 @@
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "is-extglob": "2.1.1"
+ "is-extglob": "^2.1.0"
}
}
}
@@ -8640,7 +10100,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-data-descriptor": {
@@ -8649,7 +10109,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "6.0.2"
+ "kind-of": "^6.0.0"
}
},
"is-descriptor": {
@@ -8658,9 +10118,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
}
},
"is-extglob": {
@@ -8675,7 +10135,7 @@
"integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
"dev": true,
"requires": {
- "is-extglob": "2.1.1"
+ "is-extglob": "^2.1.1"
}
},
"is-number": {
@@ -8684,7 +10144,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -8693,7 +10153,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -8716,51 +10176,56 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "braces": "2.3.2",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "extglob": "2.0.4",
- "fragment-cache": "0.2.1",
- "kind-of": "6.0.2",
- "nanomatch": "1.2.9",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "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"
}
}
}
},
+ "web-animations-js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.1.tgz",
+ "integrity": "sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA="
+ },
"webpack": {
"version": "3.8.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz",
"integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==",
"dev": true,
"requires": {
- "acorn": "5.6.2",
- "acorn-dynamic-import": "2.0.2",
- "ajv": "5.5.2",
- "ajv-keywords": "2.1.1",
- "async": "2.6.1",
- "enhanced-resolve": "3.4.1",
- "escope": "3.6.0",
- "interpret": "1.1.0",
- "json-loader": "0.5.7",
- "json5": "0.5.1",
- "loader-runner": "2.3.0",
- "loader-utils": "1.1.0",
- "memory-fs": "0.4.1",
- "mkdirp": "0.5.1",
- "node-libs-browser": "2.1.0",
- "source-map": "0.5.7",
- "supports-color": "4.5.0",
- "tapable": "0.2.8",
- "uglifyjs-webpack-plugin": "0.4.6",
- "watchpack": "1.6.0",
- "webpack-sources": "1.1.0",
- "yargs": "8.0.2"
+ "acorn": "^5.0.0",
+ "acorn-dynamic-import": "^2.0.0",
+ "ajv": "^5.1.5",
+ "ajv-keywords": "^2.0.0",
+ "async": "^2.1.2",
+ "enhanced-resolve": "^3.4.0",
+ "escope": "^3.6.0",
+ "interpret": "^1.0.0",
+ "json-loader": "^0.5.4",
+ "json5": "^0.5.1",
+ "loader-runner": "^2.3.0",
+ "loader-utils": "^1.1.0",
+ "memory-fs": "~0.4.1",
+ "mkdirp": "~0.5.0",
+ "node-libs-browser": "^2.0.0",
+ "source-map": "^0.5.3",
+ "supports-color": "^4.2.1",
+ "tapable": "^0.2.7",
+ "uglifyjs-webpack-plugin": "^0.4.6",
+ "watchpack": "^1.4.0",
+ "webpack-sources": "^1.0.1",
+ "yargs": "^8.0.2"
},
"dependencies": {
"ansi-regex": {
@@ -8781,7 +10246,7 @@
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "2.0.0"
+ "locate-path": "^2.0.0"
}
},
"has-flag": {
@@ -8802,10 +10267,10 @@
"integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "strip-bom": "3.0.0"
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
}
},
"os-locale": {
@@ -8814,9 +10279,9 @@
"integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
"dev": true,
"requires": {
- "execa": "0.7.0",
- "lcid": "1.0.0",
- "mem": "1.1.0"
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
}
},
"path-type": {
@@ -8825,7 +10290,7 @@
"integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
"dev": true,
"requires": {
- "pify": "2.3.0"
+ "pify": "^2.0.0"
}
},
"read-pkg": {
@@ -8834,9 +10299,9 @@
"integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
"dev": true,
"requires": {
- "load-json-file": "2.0.0",
- "normalize-package-data": "2.4.0",
- "path-type": "2.0.0"
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
}
},
"read-pkg-up": {
@@ -8845,8 +10310,8 @@
"integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
"dev": true,
"requires": {
- "find-up": "2.1.0",
- "read-pkg": "2.0.0"
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
}
},
"source-map": {
@@ -8861,8 +10326,8 @@
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
@@ -8871,7 +10336,7 @@
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
- "ansi-regex": "3.0.0"
+ "ansi-regex": "^3.0.0"
}
},
"strip-bom": {
@@ -8886,7 +10351,7 @@
"integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
"dev": true,
"requires": {
- "has-flag": "2.0.0"
+ "has-flag": "^2.0.0"
}
},
"which-module": {
@@ -8901,19 +10366,19 @@
"integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
"dev": true,
"requires": {
- "camelcase": "4.1.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.2",
- "os-locale": "2.1.0",
- "read-pkg-up": "2.0.0",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "2.1.1",
- "which-module": "2.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "7.0.0"
+ "camelcase": "^4.1.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "read-pkg-up": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^7.0.0"
}
},
"yargs-parser": {
@@ -8922,7 +10387,7 @@
"integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
"dev": true,
"requires": {
- "camelcase": "4.1.0"
+ "camelcase": "^4.1.0"
}
}
}
@@ -8933,7 +10398,7 @@
"integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==",
"dev": true,
"requires": {
- "lodash": "4.17.10"
+ "lodash": "^4.17.5"
}
},
"webpack-sources": {
@@ -8942,8 +10407,8 @@
"integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
"dev": true,
"requires": {
- "source-list-map": "2.0.0",
- "source-map": "0.6.1"
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
}
},
"websocket-driver": {
@@ -8952,8 +10417,8 @@
"integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
"dev": true,
"requires": {
- "http-parser-js": "0.4.13",
- "websocket-extensions": "0.1.3"
+ "http-parser-js": ">=0.4.0",
+ "websocket-extensions": ">=0.1.1"
}
},
"websocket-extensions": {
@@ -8968,7 +10433,7 @@
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "isexe": "2.0.0"
+ "isexe": "^2.0.0"
}
},
"which-module": {
@@ -8983,7 +10448,7 @@
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"requires": {
- "string-width": "1.0.2"
+ "string-width": "^1.0.2 || 2"
}
},
"win-release": {
@@ -8992,7 +10457,7 @@
"integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=",
"dev": true,
"requires": {
- "semver": "5.5.0"
+ "semver": "^5.0.1"
}
},
"window-size": {
@@ -9013,14 +10478,15 @@
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"ws": {
"version": "3.3.2",
@@ -9028,37 +10494,36 @@
"integrity": "sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ==",
"dev": true,
"requires": {
- "async-limiter": "1.0.0",
- "safe-buffer": "5.1.2",
- "ultron": "1.1.1"
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
}
},
- "xml-escape": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz",
- "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=",
- "optional": true
- },
"xml2js": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
"integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
- "dev": true,
"requires": {
- "sax": "1.2.4",
- "xmlbuilder": "9.0.7"
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~9.0.1"
}
},
"xmlbuilder": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
- "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
"dev": true
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
},
"y18n": {
"version": "3.2.1",
@@ -9078,19 +10543,19 @@
"integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
"dev": true,
"requires": {
- "camelcase": "3.0.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.2",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "5.0.0"
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^5.0.0"
},
"dependencies": {
"camelcase": {
@@ -9107,7 +10572,7 @@
"integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
"dev": true,
"requires": {
- "camelcase": "3.0.0"
+ "camelcase": "^3.0.0"
},
"dependencies": {
"camelcase": {
@@ -9118,18 +10583,6 @@
}
}
},
- "zip-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
- "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
- "optional": true,
- "requires": {
- "archiver-utils": "1.3.0",
- "compress-commons": "1.2.2",
- "lodash": "4.17.10",
- "readable-stream": "2.3.6"
- }
- },
"zone.js": {
"version": "0.8.26",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
diff --git a/package.json b/package.json
index b2c25cd47..c5361461b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "moodlemobile",
- "version": "3.5.1",
+ "version": "3.6.0",
"description": "The official app for Moodle.",
"author": {
"name": "Moodle Pty Ltd.",
@@ -48,64 +48,90 @@
"@angular/http": "5.2.10",
"@angular/platform-browser": "5.2.10",
"@angular/platform-browser-dynamic": "5.2.10",
- "@ionic-native/badge": "^4.5.3",
- "@ionic-native/camera": "^4.5.2",
- "@ionic-native/clipboard": "^4.3.2",
- "@ionic-native/core": "4.3.0",
- "@ionic-native/device": "^4.5.3",
- "@ionic-native/file": "^4.3.3",
- "@ionic-native/file-opener": "^4.7.0",
- "@ionic-native/file-transfer": "^4.3.3",
- "@ionic-native/globalization": "^4.3.2",
- "@ionic-native/in-app-browser": "^4.3.3",
- "@ionic-native/keyboard": "^4.3.2",
+ "@ionic-native/badge": "4.17.0",
+ "@ionic-native/camera": "4.17.0",
+ "@ionic-native/clipboard": "4.17.0",
+ "@ionic-native/core": "4.11.0",
+ "@ionic-native/device": "4.17.0",
+ "@ionic-native/file": "4.17.0",
+ "@ionic-native/file-opener": "4.17.0",
+ "@ionic-native/file-transfer": "4.17.0",
+ "@ionic-native/globalization": "4.17.0",
+ "@ionic-native/in-app-browser": "4.17.0",
+ "@ionic-native/keyboard": "4.17.0",
"@ionic-native/local-notifications": "4.5.2",
- "@ionic-native/media-capture": "^4.5.2",
- "@ionic-native/network": "^4.3.2",
- "@ionic-native/push": "^4.5.3",
- "@ionic-native/splash-screen": "4.3.0",
- "@ionic-native/sqlite": "^4.3.2",
- "@ionic-native/status-bar": "4.3.0",
- "@ionic-native/web-intent": "^4.7.0",
- "@ionic-native/zip": "^4.3.3",
- "@ngx-translate/core": "^8.0.0",
- "@ngx-translate/http-loader": "^2.0.0",
+ "@ionic-native/media-capture": "4.17.0",
+ "@ionic-native/network": "4.17.0",
+ "@ionic-native/push": "4.17.0",
+ "@ionic-native/screen-orientation": "4.17.0",
+ "@ionic-native/splash-screen": "4.17.0",
+ "@ionic-native/sqlite": "4.17.0",
+ "@ionic-native/status-bar": "4.17.0",
+ "@ionic-native/web-intent": "4.17.0",
+ "@ionic-native/zip": "4.17.0",
+ "@ngx-translate/core": "8.0.0",
+ "@ngx-translate/http-loader": "2.0.1",
"@types/cordova": "0.0.34",
"@types/cordova-plugin-file-transfer": "0.0.3",
"@types/cordova-plugin-globalization": "0.0.3",
"@types/cordova-plugin-network-information": "0.0.3",
- "@types/node": "^8.0.47",
- "@types/promise.prototype.finally": "^2.0.2",
- "chart.js": "^2.7.2",
- "cordova-android": "7.0.0",
- "cordova-ios": "4.5.4",
+ "@types/node": "8.10.19",
+ "@types/promise.prototype.finally": "2.0.2",
+ "chart.js": "2.7.2",
+ "com-darryncampbell-cordova-plugin-intent": "1.1.1",
+ "cordova-android": "7.1.2",
+ "cordova-android-support-gradle-release": "2.0.1",
+ "cordova-clipboard": "1.2.1",
+ "cordova-ios": "4.5.5",
+ "cordova-plugin-app-event": "1.2.1",
+ "cordova-plugin-badge": "0.8.8",
+ "cordova-plugin-camera": "4.0.3",
+ "cordova-plugin-customurlscheme": "4.3.0",
+ "cordova-plugin-device": "2.0.2",
+ "cordova-plugin-file": "6.0.1",
+ "cordova-plugin-file-opener2": "2.0.19",
+ "cordova-plugin-file-transfer": "1.7.1",
+ "cordova-plugin-globalization": "1.11.0",
+ "cordova-plugin-inappbrowser": "3.0.0",
+ "cordova-plugin-ionic-keyboard": "2.1.3",
+ "cordova-plugin-local-notifications-mm": "1.0.13",
+ "cordova-plugin-media-capture": "3.0.2",
+ "cordova-plugin-network-information": "2.0.1",
+ "cordova-plugin-screen-orientation": "3.0.1",
+ "cordova-plugin-splashscreen": "5.0.2",
+ "cordova-plugin-statusbar": "2.4.2",
+ "cordova-plugin-whitelist": "1.3.3",
+ "cordova-plugin-zip": "3.1.0",
+ "cordova-sqlite-storage": "2.6.0",
+ "es6-promise-plugin": "4.2.2",
"font-awesome": "4.7.0",
- "ionic-angular": "^3.9.2",
+ "ionic-angular": "3.9.2",
"ionicons": "3.0.0",
- "jszip": "^3.1.4",
- "moment": "^2.19.1",
- "promise.prototype.finally": "^3.0.1",
+ "jszip": "3.1.5",
+ "moment": "2.22.2",
+ "nl.kingsquare.cordova.background-audio": "1.0.1",
+ "phonegap-plugin-push": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#moodle",
+ "promise.prototype.finally": "3.1.0",
"rxjs": "5.5.11",
"sw-toolbox": "3.6.0",
- "ts-md5": "^1.2.2",
+ "ts-md5": "1.2.4",
+ "web-animations-js": "2.3.1",
"zone.js": "0.8.26"
},
"devDependencies": {
"@ionic/app-scripts": "3.1.9",
- "electron-rebuild": "^1.8.1",
- "gulp": "^3.9.1",
- "gulp-clip-empty-files": "^0.1.2",
- "gulp-flatten": "^0.4.0",
- "gulp-rename": "^1.2.2",
- "gulp-slash": "^1.1.3",
- "node-loader": "^0.6.0",
- "through": "^2.3.8",
- "typescript": "~2.6.2",
- "webpack-merge": "^4.1.2"
- },
- "optionalDependencies": {
- "electron-windows-notifications": "^2.1.1",
- "electron-builder-squirrel-windows": "^20.19.0"
+ "electron-rebuild": "1.8.1",
+ "electron-builder-lib": "20.23.1",
+ "gulp": "4.0.0",
+ "gulp-clip-empty-files": "0.1.2",
+ "gulp-flatten": "0.4.0",
+ "gulp-rename": "1.3.0",
+ "gulp-slash": "1.1.3",
+ "gulp-util": "3.0.8",
+ "node-loader": "0.6.0",
+ "through": "2.3.8",
+ "typescript": "2.6.2",
+ "webpack-merge": "4.1.2"
},
"browser": {
"electron": false
@@ -114,7 +140,39 @@
"platforms": [
"android",
"ios"
- ]
+ ],
+ "plugins": {
+ "com-darryncampbell-cordova-plugin-intent": {},
+ "cordova-android-support-gradle-release": {
+ "ANDROID_SUPPORT_VERSION": "27.1.0"
+ },
+ "cordova-clipboard": {},
+ "cordova-plugin-badge": {},
+ "cordova-plugin-camera": {},
+ "cordova-plugin-customurlscheme": {
+ "URL_SCHEME": "moodlemobile"
+ },
+ "cordova-plugin-device": {},
+ "cordova-plugin-file": {},
+ "cordova-plugin-file-opener2": {},
+ "cordova-plugin-file-transfer": {},
+ "cordova-plugin-globalization": {},
+ "cordova-plugin-inappbrowser": {},
+ "cordova-plugin-ionic-keyboard": {},
+ "cordova-plugin-local-notifications-mm": {},
+ "cordova-plugin-media-capture": {},
+ "cordova-plugin-network-information": {},
+ "cordova-plugin-screen-orientation": {},
+ "cordova-plugin-splashscreen": {},
+ "cordova-plugin-statusbar": {},
+ "cordova-plugin-whitelist": {},
+ "cordova-plugin-zip": {},
+ "cordova-sqlite-storage": {},
+ "nl.kingsquare.cordova.background-audio": {},
+ "phonegap-plugin-push": {
+ "SENDER_ID": "694767596569"
+ }
+ }
},
"main": "desktop/electron.js",
"build": {
@@ -162,10 +220,11 @@
"icon": "resources/desktop/icon.ico"
},
"linux": {
- "category": "Education"
+ "category": "Education",
+ "target": "AppImage"
},
"snap": {
"confinement": "classic"
}
}
-}
\ No newline at end of file
+}
diff --git a/scripts/aot.sh b/scripts/aot.sh
new file mode 100755
index 000000000..5246a8010
--- /dev/null
+++ b/scripts/aot.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+# Compile AOT.
+if [ $TRAVIS_BRANCH == 'integration' ] || [ $TRAVIS_BRANCH == 'master' ] || [ -z $TRAVIS_BRANCH ] ; then
+ cd scripts
+ ./build_lang.sh
+ cd ..
+
+ if [ $TRAVIS_BRANCH == 'master' ] && [ ! -z $GIT_TOKEN ] ; then
+ git remote set-url origin https://$GIT_TOKEN@github.com/$TRAVIS_REPO_SLUG.git
+ git fetch -q origin
+ git add src/assets/lang
+ git add */en.json
+ git commit -m 'Update lang files [ci skip]'
+ git push origin HEAD:$TRAVIS_BRANCH
+
+ version=`grep versionname src/config.json| cut -d: -f2|cut -d'"' -f2`
+ date=`date +%Y%m%d`'00'
+
+ pushd ../../moodle-local_moodlemobileapp
+ sed -ie "s/release[ ]*=[ ]*'[^']*';/release = '$version';/1" version.php
+ sed -ie "s/version[ ]*=[ ]*[0-9]*;/version = $date;/1" version.php
+ rm version.phpe
+ git remote set-url origin https://$GIT_TOKEN@github.com/moodlehq/moodle-local_moodlemobileapp.git
+ git fetch -q origin
+ git add .
+ git commit -m "Update lang files from $version"
+ git push
+ popd
+ fi
+
+ sed -ie $'s~throw new Error("No ResourceLoader.*~url = "templates/" + url;\\\nvar resolve;\\\nvar reject;\\\nvar promise = new Promise(function (res, rej) {\\\nresolve = res;\\\nreject = rej;\\\n});\\\nvar xhr = new XMLHttpRequest();\\\nxhr.open("GET", url, true);\\\nxhr.responseType = "text";\\\nxhr.onload = function () {\\\nvar response = xhr.response || xhr.responseText;\\\nvar status = xhr.status === 1223 ? 204 : xhr.status;\\\nif (status === 0) {\\\nstatus = response ? 200 : 0;\\\n}\\\nif (200 <= status \&\& status <= 300) {\\\nresolve(response);\\\n}\\\nelse {\\\nreject("Failed to load " + url);\\\n}\\\n};\\\nxhr.onerror = function () { reject("Failed to load " + url); };\\\nxhr.send();\\\nreturn promise;\\\n~g' node_modules/@angular/platform-browser-dynamic/esm5/platform-browser-dynamic.js
+ sed -ie "s/context\.isProd || hasArg('--minifyJs')/hasArg('--minifyJs')/g" node_modules/@ionic/app-scripts/dist/util/config.js
+ sed -ie "s/context\.isProd || hasArg('--optimizeJs')/hasArg('--optimizeJs')/g" node_modules/@ionic/app-scripts/dist/util/config.js
+ npm run ionic:build -- --prod
+fi
+
+# Copy to PGB git (only on a configured travis build).
+if [ ! -z $GIT_ORG ] && [ ! -z $GIT_TOKEN ] ; then
+ gitfolder=${PWD##*/}
+ cd ..
+ git clone --depth 1 --no-single-branch https://github.com/$GIT_ORG/moodlemobile-phonegapbuild.git pgb
+ cd pgb
+ git checkout $TRAVIS_BRANCH
+ rm -Rf assets build index.html templates
+ cp -Rf ../$gitfolder/www/* ./
+ rm -Rf assets/countries assets/mimetypes
+ git add .
+ git commit -m "Travis build: $TRAVIS_BUILD_NUMBER"
+ git push https://$GIT_TOKEN@github.com/$GIT_ORG/moodlemobile-phonegapbuild.git
+fi
diff --git a/scripts/build_lang.sh b/scripts/build_lang.sh
new file mode 100755
index 000000000..dac901789
--- /dev/null
+++ b/scripts/build_lang.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+source "functions.sh"
+forceLang=$1
+
+print_title 'Getting languages'
+git clone --depth 1 --no-single-branch https://git.in.moodle.com/moodle/moodle-langpacks.git $LANGPACKSFOLDER
+pushd $LANGPACKSFOLDER
+BRANCHES=($(git branch -r --format="%(refname:lstrip=3)" --sort="refname" | grep MOODLE_))
+BRANCH=${BRANCHES[${#BRANCHES[@]}-1]}
+git checkout $BRANCH
+git pull
+popd
+
+print_title 'Getting local mobile langs'
+git clone --depth 1 https://github.com/moodlehq/moodle-local_moodlemobileapp.git ../../moodle-local_moodlemobileapp
+
+if [ -z $forceLang ]; then
+ php -f moodle_to_json.php
+else
+ php -f moodle_to_json.php "$forceLang"
+fi
+
+print_ok 'All done!'
\ No newline at end of file
diff --git a/scripts/create_langindex.sh b/scripts/create_langindex.sh
new file mode 100755
index 000000000..1988778e4
--- /dev/null
+++ b/scripts/create_langindex.sh
@@ -0,0 +1,266 @@
+#!/bin/bash
+source "functions.sh"
+
+#Saves or updates a key on langindex_old.json
+function save_key {
+ key=$1
+ found=$2
+
+ print_ok "$key=$found"
+ echo "{\"$key\": \"$found\"}" > langindex_old.json
+ jq -s '.[0] + .[1]' langindex.json langindex_old.json > langindex_new.json
+ mv langindex_new.json langindex.json
+}
+
+#Removes a key on langindex_old.json
+function remove_key {
+ key=$1
+ found=$2
+
+ print_ok "$key=$found"
+ echo "{\"$key\": \"$found\"}" > langindex_old.json
+ jq -s '.[0] - .[1]' langindex.json langindex_old.json > langindex_new.json
+ mv langindex_new.json langindex.json
+}
+
+#Check if and i exists in php file
+function exists_in_file {
+ file=$1
+ id=$2
+
+ file=`echo $file | sed s/^mod_workshop_assessment/workshopform/1`
+ file=`echo $file | sed s/^mod_assign_/assign/1`
+ file=`echo $file | sed s/^mod_//1`
+
+ completeFile="$LANGPACKSFOLDER/en/$file.php"
+ if [ -f "$completeFile" ]; then
+ coincidence=`grep "string\[\'$id\'\]" $completeFile`
+ if [ ! -z "$coincidence" ]; then
+ found=$file
+ return
+ fi
+ fi
+ found=0
+}
+
+#Checks if a key exists on the original local_moodlemobileapp.php
+function exists_in_mobile {
+ file='local_moodlemobileapp'
+ exists_in_file $file $key
+}
+
+function do_match {
+ match=$1
+ filematch=""
+
+ coincidence=`grep "$match" $LANGPACKSFOLDER/en/*.php | wc -l`
+ if [ $coincidence -eq 1 ]; then
+ filematch=`grep "$match" $LANGPACKSFOLDER/en/*.php | cut -d'/' -f5 | cut -d'.' -f1`
+ exists_in_file $filematch $plainid
+ elif [ $coincidence -gt 0 ] && [ "$#" -gt 1 ]; then
+ print_message $2
+ tput setaf 6
+ grep "$match" $LANGPACKSFOLDER/en/*.php
+ fi
+}
+
+#Find if the id or the value can be found on files to help providing a solution.
+function find_matches {
+ do_match "string\[\'$plainid\'\] = \'$value\'" "Found EXACT match for $key in the following paths"
+ if [ $coincidence -gt 0 ]; then
+ case=1
+ return
+ fi
+
+ do_match " = \'$value\'" "Found some string VALUES for $key in the following paths"
+ if [ $coincidence -gt 0 ]; then
+ case=2
+ return
+ fi
+
+ do_match "string\[\'$plainid\'\]" "Found some string KEYS for $key in the following paths, value $value"
+ if [ $coincidence -gt 0 ]; then
+ case=3
+ return
+ fi
+
+ print_message "No match found for $key add it to local_moodlemobileapp"
+ save_key $key "local_moodlemobileapp"
+}
+
+function find_single_matches {
+ do_match "string\[\'$plainid\'\] = \'$value\'"
+ if [ ! -z $filematch ] && [ $found != 0 ]; then
+ case=1
+ return
+ fi
+
+ do_match " = \'$value\'"
+ if [ ! -z $filematch ] && [ $filematch != 'local_moodlemobileapp' ]; then
+ case=2
+ print_message "Found some string VALUES for $key in the following paths $filematch"
+ tput setaf 6
+ grep "$match" $LANGPACKSFOLDER/en/*.php
+ return
+ fi
+
+ do_match "string\[\'$plainid\'\]"
+ if [ ! -z $filematch ] && [ $found != 0 ]; then
+ case=3
+ return
+ fi
+}
+
+
+#Tries to gues the file where the id will be found.
+function guess_file {
+ key=$1
+ value=$2
+
+ type=`echo $key | cut -d'.' -f1`
+ component=`echo $key | cut -d'.' -f2`
+ plainid=`echo $key | cut -d'.' -f3-`
+
+ if [ -z "$plainid" ]; then
+ plainid=$component
+ component='moodle'
+ fi
+
+ exists_in_file $component $plainid
+
+ if [ $found == 0 ]; then
+ tempid=`echo $plainid | sed s/^mod_//1`
+ if [ $component == 'moodle' ] && [ "$tempid" != "$plainid" ]; then
+ exists_in_file $plainid pluginname
+
+ if [ $found != 0 ]; then
+ found=$found/pluginname
+ fi
+ fi
+ fi
+
+ # Not found in file, try in local_moodlemobileapp
+ if [ $found == 0 ]; then
+ exists_in_mobile
+ fi
+
+ # Still not found, if only found in one file, use it.
+ if [ $found == 0 ]; then
+ find_single_matches
+ fi
+
+ # Last fallback.
+ if [ $found == 0 ]; then
+ exists_in_file 'moodle' $plainid
+ fi
+
+ if [ $found == 0 ]; then
+ find_matches
+ else
+ save_key $key $found
+ fi
+}
+
+#Finds if there's a better file where to get the id from.
+function find_better_file {
+ key=$1
+ value=$2
+ current=$3
+
+ type=`echo $key | cut -d'.' -f1`
+ component=`echo $key | cut -d'.' -f2`
+ plainid=`echo $key | cut -d'.' -f3-`
+
+ if [ -z "$plainid" ]; then
+ plainid=$component
+ component='moodle'
+ fi
+
+ currentFile=`echo $current | cut -d'/' -f1`
+ currentStr=`echo $current | cut -d'/' -f2-`
+ if [ $currentFile == $current ]; then
+ currentStr=$plainid
+ fi
+
+ exists_in_file $component $plainid
+ if [ $found != 0 ] && [ $currentStr == $plainid ]; then
+ if [ $found != $currentFile ]; then
+ print_ok "Key '$key' found in component, no need to replace old '$current'"
+ fi
+
+ return
+ fi
+
+ # Still not found, if only found in one file, use it.
+ if [ $found == 0 ]; then
+ find_single_matches
+ fi
+
+ if [ $found != 0 ] && [ $found != $currentFile ] && [ $case -lt 3 ]; then
+ print_message "Indexed string '$key' found in '$found' better than '$current'"
+ return
+ fi
+
+ if [ $currentFile == 'local_moodlemobileapp' ]; then
+ exists_in_mobile
+ else
+ exists_in_file $currentFile $currentStr
+ fi
+
+ if [ $found == 0 ]; then
+ print_error "Indexed string '$key' not found on current place '$current'"
+ if [ $currentFile != 'local_moodlemobileapp' ]; then
+ print_error "Execute this on AMOS
+ CPY [$currentStr,$currentFile],[$key,local_moodlemobileapp]"
+ save_key $key "local_moodlemobileapp"
+ fi
+ fi
+}
+
+#Parses the file.
+function parse_file {
+ findbetter=$2
+ keys=`jq -r 'keys[]' $1`
+ for key in $keys; do
+ # Check if already parsed.
+ exec="jq -r .\"$key\" langindex.json"
+ found=`$exec`
+
+ exec="jq -r .\"$key\" $1"
+ value=`$exec`
+ if [ -z "$found" ] || [ "$found" == 'null' ]; then
+ guess_file $key "$value"
+ elif [ ! -z "$findbetter" ]; then
+ find_better_file "$key" "$value" "$found"
+ fi
+ done
+}
+
+print_title 'Generating language from code...'
+gulp lang
+
+print_title 'Getting languages'
+git clone https://git.in.moodle.com/moodle/moodle-langpacks.git $LANGPACKSFOLDER
+pushd $LANGPACKSFOLDER
+BRANCHES=($(git branch -r --format="%(refname:lstrip=3)" --sort="refname" | grep MOODLE_))
+BRANCH=${BRANCHES[${#BRANCHES[@]}-1]}
+git checkout $BRANCH
+git pull
+popd
+
+print_title 'Processing file'
+#Create langindex.json if not exists.
+if [ ! -f 'langindex.json' ]; then
+ echo "{}" > langindex.json
+fi
+
+findbetter=$1
+parse_file '../src/assets/lang/en.json' $findbetter
+
+echo
+
+jq -S --indent 2 -s '.[0]' langindex.json > langindex_new.json
+mv langindex_new.json langindex.json
+rm langindex_old.json
+
+print_ok 'All done!'
\ No newline at end of file
diff --git a/scripts/functions.sh b/scripts/functions.sh
new file mode 100644
index 000000000..ed1472357
--- /dev/null
+++ b/scripts/functions.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+LANGPACKSFOLDER='../../moodle-langpacks'
+
+function check_success {
+ if [ $? -ne 0 ]; then
+ print_error "$1"
+ elif [ "$#" -gt 1 ]; then
+ print_ok "$2"
+ fi
+}
+
+function print_success {
+ if [ $? -ne 0 ]; then
+ print_message "$1"
+ $3=0
+ else
+ print_ok "$2"
+ fi
+}
+
+function print_error {
+ tput setaf 1; echo " ERROR: $1"
+}
+
+function print_ok {
+ tput setaf 2; echo " OK: $1"
+ echo
+}
+
+function print_message {
+ tput setaf 3; echo "-------- $1"
+ echo
+}
+
+function print_title {
+ stepnumber=$(($stepnumber + 1))
+ echo
+ tput setaf 5; echo "$stepnumber $1"
+ tput setaf 5; echo '=================='
+}
\ No newline at end of file
diff --git a/scripts/langindex.json b/scripts/langindex.json
new file mode 100644
index 000000000..22b33e825
--- /dev/null
+++ b/scripts/langindex.json
@@ -0,0 +1,1743 @@
+{
+ "addon.badges.alignment": "badges",
+ "addon.badges.badgedetails": "badges",
+ "addon.badges.badges": "badges",
+ "addon.badges.bendorsement": "badges",
+ "addon.badges.claimcomment": "badges",
+ "addon.badges.claimid": "badges",
+ "addon.badges.contact": "badges",
+ "addon.badges.dateawarded": "badges",
+ "addon.badges.expired": "badges",
+ "addon.badges.expirydate": "badges",
+ "addon.badges.imageauthoremail": "badges",
+ "addon.badges.imageauthorname": "badges",
+ "addon.badges.imageauthorurl": "badges",
+ "addon.badges.imagecaption": "badges",
+ "addon.badges.issuancedetails": "badges",
+ "addon.badges.issuerdetails": "badges",
+ "addon.badges.issueremail": "badges",
+ "addon.badges.issuername": "badges",
+ "addon.badges.issuerurl": "badges",
+ "addon.badges.language": "badges",
+ "addon.badges.noalignment": "badges",
+ "addon.badges.nobadges": "badges",
+ "addon.badges.norelated": "badges",
+ "addon.badges.recipientdetails": "badges",
+ "addon.badges.relatedbages": "badges",
+ "addon.badges.version": "badges",
+ "addon.badges.warnexpired": "badges",
+ "addon.block_activitymodules.pluginname": "block_activity_modules",
+ "addon.block_myoverview.all": "block_myoverview",
+ "addon.block_myoverview.favourites": "block_myoverview",
+ "addon.block_myoverview.future": "block_myoverview",
+ "addon.block_myoverview.hiddencourses": "block_myoverview",
+ "addon.block_myoverview.inprogress": "block_myoverview",
+ "addon.block_myoverview.lastaccessed": "block_myoverview",
+ "addon.block_myoverview.morecourses": "block_myoverview",
+ "addon.block_myoverview.nocourses": "block_myoverview",
+ "addon.block_myoverview.past": "block_myoverview",
+ "addon.block_myoverview.pluginname": "block_myoverview",
+ "addon.block_myoverview.title": "block_myoverview",
+ "addon.block_recentlyaccessedcourses.nocourses": "block_recentlyaccessedcourses",
+ "addon.block_recentlyaccessedcourses.pluginname": "block_recentlyaccessedcourses",
+ "addon.block_recentlyaccesseditems.noitems": "block_recentlyaccesseditems",
+ "addon.block_recentlyaccesseditems.pluginname": "block_recentlyaccesseditems",
+ "addon.block_sitemainmenu.pluginname": "block_site_main_menu",
+ "addon.block_starredcourses.nocourses": "block_starredcourses",
+ "addon.block_starredcourses.pluginname": "block_starredcourses",
+ "addon.block_timeline.duedate": "block_timeline",
+ "addon.block_timeline.next30days": "block_timeline",
+ "addon.block_timeline.next3months": "block_timeline",
+ "addon.block_timeline.next6months": "block_timeline",
+ "addon.block_timeline.next7days": "block_timeline",
+ "addon.block_timeline.nocoursesinprogress": "block_timeline",
+ "addon.block_timeline.noevents": "block_timeline",
+ "addon.block_timeline.overdue": "block_timeline",
+ "addon.block_timeline.pluginname": "block_timeline",
+ "addon.block_timeline.sortbycourses": "block_timeline",
+ "addon.block_timeline.sortbydates": "block_timeline",
+ "addon.calendar.calendar": "calendar",
+ "addon.calendar.calendarevents": "local_moodlemobileapp",
+ "addon.calendar.defaultnotificationtime": "local_moodlemobileapp",
+ "addon.calendar.errorloadevent": "local_moodlemobileapp",
+ "addon.calendar.errorloadevents": "local_moodlemobileapp",
+ "addon.calendar.eventendtime": "calendar",
+ "addon.calendar.eventstarttime": "calendar",
+ "addon.calendar.gotoactivity": "calendar",
+ "addon.calendar.noevents": "local_moodlemobileapp",
+ "addon.calendar.notifications": "local_moodlemobileapp",
+ "addon.calendar.typecategory": "calendar",
+ "addon.calendar.typeclose": "calendar",
+ "addon.calendar.typecourse": "calendar",
+ "addon.calendar.typedue": "calendar",
+ "addon.calendar.typegradingdue": "calendar",
+ "addon.calendar.typegroup": "calendar",
+ "addon.calendar.typeopen": "calendar",
+ "addon.calendar.typesite": "calendar",
+ "addon.calendar.typeuser": "calendar",
+ "addon.competency.activities": "tool_lp",
+ "addon.competency.competencies": "competency",
+ "addon.competency.competenciesmostoftennotproficientincourse": "tool_lp",
+ "addon.competency.coursecompetencies": "tool_lp",
+ "addon.competency.coursecompetencyratingsarenotpushedtouserplans": "tool_lp",
+ "addon.competency.coursecompetencyratingsarepushedtouserplans": "tool_lp",
+ "addon.competency.crossreferencedcompetencies": "tool_lp",
+ "addon.competency.duedate": "tool_lp",
+ "addon.competency.errornocompetenciesfound": "local_moodlemobileapp",
+ "addon.competency.evidence": "tool_lp",
+ "addon.competency.evidence_competencyrule": "competency",
+ "addon.competency.evidence_coursecompleted": "competency",
+ "addon.competency.evidence_coursemodulecompleted": "competency",
+ "addon.competency.evidence_courserestored": "competency",
+ "addon.competency.evidence_evidenceofpriorlearninglinked": "competency",
+ "addon.competency.evidence_evidenceofpriorlearningunlinked": "competency",
+ "addon.competency.evidence_manualoverride": "competency",
+ "addon.competency.evidence_manualoverrideincourse": "competency",
+ "addon.competency.evidence_manualoverrideinplan": "competency",
+ "addon.competency.learningplancompetencies": "tool_lp",
+ "addon.competency.learningplans": "tool_lp",
+ "addon.competency.myplans": "tool_lp",
+ "addon.competency.noactivities": "tool_lp",
+ "addon.competency.nocompetencies": "local_moodlemobileapp",
+ "addon.competency.nocrossreferencedcompetencies": "tool_lp",
+ "addon.competency.noevidence": "tool_lp",
+ "addon.competency.noplanswerecreated": "tool_lp",
+ "addon.competency.path": "tool_lp",
+ "addon.competency.planstatusactive": "competency",
+ "addon.competency.planstatuscomplete": "competency",
+ "addon.competency.planstatusdraft": "competency",
+ "addon.competency.planstatusinreview": "competency",
+ "addon.competency.planstatuswaitingforreview": "competency",
+ "addon.competency.proficient": "tool_lp",
+ "addon.competency.progress": "tool_lp",
+ "addon.competency.rating": "tool_lp",
+ "addon.competency.reviewstatus": "tool_lp",
+ "addon.competency.status": "tool_lp",
+ "addon.competency.template": "tool_lp",
+ "addon.competency.usercompetencystatus_idle": "competency",
+ "addon.competency.usercompetencystatus_inreview": "competency",
+ "addon.competency.usercompetencystatus_waitingforreview": "competency",
+ "addon.competency.userplans": "competency",
+ "addon.competency.xcompetenciesproficientoutofy": "tool_lp",
+ "addon.competency.xcompetenciesproficientoutofyincourse": "tool_lp",
+ "addon.coursecompletion.complete": "local_moodlemobileapp",
+ "addon.coursecompletion.completecourse": "block_selfcompletion",
+ "addon.coursecompletion.completed": "completion",
+ "addon.coursecompletion.completiondate": "report_completion",
+ "addon.coursecompletion.completionmenuitem": "completion",
+ "addon.coursecompletion.couldnotloadreport": "local_moodlemobileapp",
+ "addon.coursecompletion.coursecompletion": "completion",
+ "addon.coursecompletion.criteria": "completion",
+ "addon.coursecompletion.criteriagroup": "completion",
+ "addon.coursecompletion.criteriarequiredall": "completion",
+ "addon.coursecompletion.criteriarequiredany": "completion",
+ "addon.coursecompletion.inprogress": "completion",
+ "addon.coursecompletion.manualselfcompletion": "completion",
+ "addon.coursecompletion.notyetstarted": "completion",
+ "addon.coursecompletion.pending": "completion",
+ "addon.coursecompletion.required": "moodle",
+ "addon.coursecompletion.requiredcriteria": "completion",
+ "addon.coursecompletion.requirement": "block_completionstatus",
+ "addon.coursecompletion.status": "moodle",
+ "addon.coursecompletion.viewcoursereport": "completion",
+ "addon.files.couldnotloadfiles": "local_moodlemobileapp",
+ "addon.files.emptyfilelist": "local_moodlemobileapp",
+ "addon.files.erroruploadnotworking": "local_moodlemobileapp",
+ "addon.files.files": "moodle",
+ "addon.files.privatefiles": "moodle",
+ "addon.files.sitefiles": "moodle",
+ "addon.messageoutput_airnotifier.processorsettingsdesc": "local_moodlemobileapp",
+ "addon.messages.acceptandaddcontact": "message",
+ "addon.messages.addcontact": "message",
+ "addon.messages.addcontactconfirm": "message",
+ "addon.messages.addtofavourites": "message",
+ "addon.messages.addtoyourcontacts": "message",
+ "addon.messages.blocknoncontacts": "message",
+ "addon.messages.blockuser": "message",
+ "addon.messages.blockuserconfirm": "message",
+ "addon.messages.contactableprivacy": "message",
+ "addon.messages.contactableprivacy_coursemember": "message",
+ "addon.messages.contactableprivacy_onlycontacts": "message",
+ "addon.messages.contactableprivacy_site": "message",
+ "addon.messages.contactblocked": "message",
+ "addon.messages.contactlistempty": "local_moodlemobileapp",
+ "addon.messages.contactname": "local_moodlemobileapp",
+ "addon.messages.contactrequestsent": "message",
+ "addon.messages.contacts": "message",
+ "addon.messages.decline": "message",
+ "addon.messages.deleteallconfirm": "message",
+ "addon.messages.deleteconversation": "message",
+ "addon.messages.deletemessage": "local_moodlemobileapp",
+ "addon.messages.deletemessageconfirmation": "local_moodlemobileapp",
+ "addon.messages.errordeletemessage": "local_moodlemobileapp",
+ "addon.messages.errorwhileretrievingcontacts": "local_moodlemobileapp",
+ "addon.messages.errorwhileretrievingdiscussions": "local_moodlemobileapp",
+ "addon.messages.errorwhileretrievingmessages": "local_moodlemobileapp",
+ "addon.messages.errorwhileretrievingusers": "local_moodlemobileapp",
+ "addon.messages.groupconversations": "message",
+ "addon.messages.groupinfo": "message",
+ "addon.messages.individualconversations": "message",
+ "addon.messages.info": "message",
+ "addon.messages.isnotinyourcontacts": "message",
+ "addon.messages.message": "message",
+ "addon.messages.messagenotsent": "local_moodlemobileapp",
+ "addon.messages.messagepreferences": "message",
+ "addon.messages.messages": "message",
+ "addon.messages.newmessage": "message",
+ "addon.messages.newmessages": "local_moodlemobileapp",
+ "addon.messages.nocontactrequests": "message",
+ "addon.messages.nocontactsgetstarted": "message",
+ "addon.messages.nofavourites": "message",
+ "addon.messages.nogroupconversations": "message",
+ "addon.messages.noindividualconversations": "message",
+ "addon.messages.nomessagesfound": "message",
+ "addon.messages.noncontacts": "message",
+ "addon.messages.nousersfound": "local_moodlemobileapp",
+ "addon.messages.numparticipants": "message",
+ "addon.messages.removecontact": "message",
+ "addon.messages.removecontactconfirm": "message",
+ "addon.messages.removefromfavourites": "message",
+ "addon.messages.removefromyourcontacts": "message",
+ "addon.messages.requests": "moodle",
+ "addon.messages.requirecontacttomessage": "message",
+ "addon.messages.searchcombined": "message",
+ "addon.messages.searchnocontactsfound": "message",
+ "addon.messages.searchnomessagesfound": "message",
+ "addon.messages.searchnononcontactsfound": "message",
+ "addon.messages.sendcontactrequest": "message",
+ "addon.messages.showdeletemessages": "local_moodlemobileapp",
+ "addon.messages.type_blocked": "local_moodlemobileapp",
+ "addon.messages.type_offline": "local_moodlemobileapp",
+ "addon.messages.type_online": "local_moodlemobileapp",
+ "addon.messages.type_search": "local_moodlemobileapp",
+ "addon.messages.type_strangers": "local_moodlemobileapp",
+ "addon.messages.unabletomessage": "message",
+ "addon.messages.unblockuser": "message",
+ "addon.messages.unblockuserconfirm": "message",
+ "addon.messages.userwouldliketocontactyou": "message",
+ "addon.messages.warningconversationmessagenotsent": "local_moodlemobileapp",
+ "addon.messages.warningmessagenotsent": "local_moodlemobileapp",
+ "addon.messages.wouldliketocontactyou": "message",
+ "addon.messages.you": "message",
+ "addon.messages.youhaveblockeduser": "message",
+ "addon.messages.yourcontactrequestpending": "message",
+ "addon.mod_assign.acceptsubmissionstatement": "local_moodlemobileapp",
+ "addon.mod_assign.addattempt": "assign",
+ "addon.mod_assign.addnewattempt": "assign",
+ "addon.mod_assign.addnewattemptfromprevious": "assign",
+ "addon.mod_assign.addsubmission": "assign",
+ "addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary": "assign",
+ "addon.mod_assign.allowsubmissionsfromdate": "assign",
+ "addon.mod_assign.allowsubmissionsfromdatesummary": "assign",
+ "addon.mod_assign.applytoteam": "assign",
+ "addon.mod_assign.assignmentisdue": "assign",
+ "addon.mod_assign.attemptnumber": "assign",
+ "addon.mod_assign.attemptreopenmethod": "assign",
+ "addon.mod_assign.attemptreopenmethod_manual": "assign",
+ "addon.mod_assign.attemptreopenmethod_untilpass": "assign",
+ "addon.mod_assign.attemptsettings": "assign",
+ "addon.mod_assign.cannoteditduetostatementsubmission": "local_moodlemobileapp",
+ "addon.mod_assign.cannotgradefromapp": "local_moodlemobileapp",
+ "addon.mod_assign.cannotsubmitduetostatementsubmission": "local_moodlemobileapp",
+ "addon.mod_assign.confirmsubmission": "assign",
+ "addon.mod_assign.currentattempt": "assign",
+ "addon.mod_assign.currentattemptof": "assign",
+ "addon.mod_assign.currentgrade": "assign",
+ "addon.mod_assign.cutoffdate": "assign",
+ "addon.mod_assign.defaultteam": "assign",
+ "addon.mod_assign.duedate": "assign",
+ "addon.mod_assign.duedateno": "assign",
+ "addon.mod_assign.duedatereached": "assign",
+ "addon.mod_assign.editingstatus": "assign",
+ "addon.mod_assign.editsubmission": "assign",
+ "addon.mod_assign.erroreditpluginsnotsupported": "local_moodlemobileapp",
+ "addon.mod_assign.errorshowinginformation": "local_moodlemobileapp",
+ "addon.mod_assign.extensionduedate": "assign",
+ "addon.mod_assign.feedbacknotsupported": "local_moodlemobileapp",
+ "addon.mod_assign.grade": "grades",
+ "addon.mod_assign.graded": "assign",
+ "addon.mod_assign.gradedby": "assign",
+ "addon.mod_assign.gradedfollowupsubmit": "assign",
+ "addon.mod_assign.gradedon": "assign",
+ "addon.mod_assign.gradelocked": "assign",
+ "addon.mod_assign.gradenotsynced": "local_moodlemobileapp",
+ "addon.mod_assign.gradeoutof": "assign",
+ "addon.mod_assign.gradingstatus": "assign",
+ "addon.mod_assign.groupsubmissionsettings": "assign",
+ "addon.mod_assign.hiddenuser": "assign",
+ "addon.mod_assign.latesubmissions": "assign",
+ "addon.mod_assign.latesubmissionsaccepted": "assign",
+ "addon.mod_assign.markingworkflowstate": "assign",
+ "addon.mod_assign.markingworkflowstateinmarking": "assign",
+ "addon.mod_assign.markingworkflowstateinreview": "assign",
+ "addon.mod_assign.markingworkflowstatenotmarked": "assign",
+ "addon.mod_assign.markingworkflowstatereadyforrelease": "assign",
+ "addon.mod_assign.markingworkflowstatereadyforreview": "assign",
+ "addon.mod_assign.markingworkflowstatereleased": "assign",
+ "addon.mod_assign.modulenameplural": "assign",
+ "addon.mod_assign.multipleteams": "assign",
+ "addon.mod_assign.multipleteams_desc": "assign",
+ "addon.mod_assign.noattempt": "assign",
+ "addon.mod_assign.nomoresubmissionsaccepted": "assign",
+ "addon.mod_assign.noonlinesubmissions": "assign",
+ "addon.mod_assign.nosubmission": "assign",
+ "addon.mod_assign.notallparticipantsareshown": "local_moodlemobileapp",
+ "addon.mod_assign.noteam": "assign",
+ "addon.mod_assign.noteam_desc": "assign",
+ "addon.mod_assign.notgraded": "assign",
+ "addon.mod_assign.numberofdraftsubmissions": "assign",
+ "addon.mod_assign.numberofparticipants": "assign",
+ "addon.mod_assign.numberofsubmissionsneedgrading": "assign",
+ "addon.mod_assign.numberofsubmittedassignments": "assign",
+ "addon.mod_assign.numberofteams": "assign",
+ "addon.mod_assign.numwords": "moodle",
+ "addon.mod_assign.outof": "assign",
+ "addon.mod_assign.overdue": "assign",
+ "addon.mod_assign.savechanges": "assign",
+ "addon.mod_assign.submission": "assign",
+ "addon.mod_assign.submissioneditable": "assign",
+ "addon.mod_assign.submissionnoteditable": "assign",
+ "addon.mod_assign.submissionnotsupported": "local_moodlemobileapp",
+ "addon.mod_assign.submissionslocked": "assign",
+ "addon.mod_assign.submissionstatus": "assign",
+ "addon.mod_assign.submissionstatus_": "assign",
+ "addon.mod_assign.submissionstatus_draft": "assign",
+ "addon.mod_assign.submissionstatus_marked": "assign",
+ "addon.mod_assign.submissionstatus_new": "assign",
+ "addon.mod_assign.submissionstatus_reopened": "assign",
+ "addon.mod_assign.submissionstatus_submitted": "assign",
+ "addon.mod_assign.submissionstatusheading": "assign",
+ "addon.mod_assign.submissionteam": "assign",
+ "addon.mod_assign.submitassignment": "assign",
+ "addon.mod_assign.submitassignment_help": "assign",
+ "addon.mod_assign.submittedearly": "assign",
+ "addon.mod_assign.submittedlate": "assign",
+ "addon.mod_assign.timemodified": "assign",
+ "addon.mod_assign.timeremaining": "assign",
+ "addon.mod_assign.ungroupedusers": "assign",
+ "addon.mod_assign.unlimitedattempts": "assign",
+ "addon.mod_assign.userswhoneedtosubmit": "assign",
+ "addon.mod_assign.userwithid": "local_moodlemobileapp",
+ "addon.mod_assign.viewsubmission": "assign",
+ "addon.mod_assign.warningsubmissiongrademodified": "local_moodlemobileapp",
+ "addon.mod_assign.warningsubmissionmodified": "local_moodlemobileapp",
+ "addon.mod_assign.wordlimit": "assignsubmission_onlinetext",
+ "addon.mod_assign_feedback_comments.pluginname": "assignfeedback_comments",
+ "addon.mod_assign_feedback_editpdf.pluginname": "assignfeedback_editpdf",
+ "addon.mod_assign_feedback_file.pluginname": "assignfeedback_file",
+ "addon.mod_assign_submission_comments.pluginname": "assignsubmission_comments",
+ "addon.mod_assign_submission_file.pluginname": "assignsubmission_file",
+ "addon.mod_assign_submission_onlinetext.pluginname": "assignsubmission_onlinetext",
+ "addon.mod_book.errorchapter": "book",
+ "addon.mod_book.modulenameplural": "book",
+ "addon.mod_chat.beep": "chat",
+ "addon.mod_chat.currentusers": "chat",
+ "addon.mod_chat.enterchat": "chat",
+ "addon.mod_chat.entermessage": "chat",
+ "addon.mod_chat.errorwhileconnecting": "local_moodlemobileapp",
+ "addon.mod_chat.errorwhilegettingchatdata": "local_moodlemobileapp",
+ "addon.mod_chat.errorwhilegettingchatusers": "local_moodlemobileapp",
+ "addon.mod_chat.errorwhileretrievingmessages": "local_moodlemobileapp",
+ "addon.mod_chat.errorwhilesendingmessage": "local_moodlemobileapp",
+ "addon.mod_chat.messagebeepsyou": "chat",
+ "addon.mod_chat.messageenter": "chat",
+ "addon.mod_chat.messageexit": "chat",
+ "addon.mod_chat.modulenameplural": "chat",
+ "addon.mod_chat.mustbeonlinetosendmessages": "local_moodlemobileapp",
+ "addon.mod_chat.nomessages": "chat",
+ "addon.mod_chat.send": "chat",
+ "addon.mod_chat.sessionstart": "chat",
+ "addon.mod_chat.talk": "chat",
+ "addon.mod_choice.cannotsubmit": "choice",
+ "addon.mod_choice.choiceoptions": "choice",
+ "addon.mod_choice.errorgetchoice": "local_moodlemobileapp",
+ "addon.mod_choice.expired": "choice",
+ "addon.mod_choice.full": "choice",
+ "addon.mod_choice.modulenameplural": "choice",
+ "addon.mod_choice.noresultsviewable": "choice",
+ "addon.mod_choice.notopenyet": "choice",
+ "addon.mod_choice.numberofuser": "choice",
+ "addon.mod_choice.numberofuserinpercentage": "choice",
+ "addon.mod_choice.previewonly": "choice",
+ "addon.mod_choice.publishinfoanonafter": "choice",
+ "addon.mod_choice.publishinfoanonclose": "choice",
+ "addon.mod_choice.publishinfofullafter": "choice",
+ "addon.mod_choice.publishinfofullclose": "choice",
+ "addon.mod_choice.publishinfonever": "choice",
+ "addon.mod_choice.removemychoice": "choice",
+ "addon.mod_choice.responses": "choice",
+ "addon.mod_choice.responsesresultgraphdescription": "local_moodlemobileapp",
+ "addon.mod_choice.responsesresultgraphheader": "choice",
+ "addon.mod_choice.resultsnotsynced": "local_moodlemobileapp",
+ "addon.mod_choice.savemychoice": "choice",
+ "addon.mod_choice.userchoosethisoption": "choice",
+ "addon.mod_choice.yourselection": "choice",
+ "addon.mod_data.addentries": "data",
+ "addon.mod_data.advancedsearch": "data",
+ "addon.mod_data.alttext": "data",
+ "addon.mod_data.approve": "data",
+ "addon.mod_data.approved": "data",
+ "addon.mod_data.ascending": "data",
+ "addon.mod_data.authorfirstname": "data",
+ "addon.mod_data.authorlastname": "data",
+ "addon.mod_data.confirmdeleterecord": "data",
+ "addon.mod_data.descending": "data",
+ "addon.mod_data.disapprove": "data",
+ "addon.mod_data.emptyaddform": "data",
+ "addon.mod_data.entrieslefttoadd": "data",
+ "addon.mod_data.entrieslefttoaddtoview": "data",
+ "addon.mod_data.errorapproving": "local_moodlemobileapp",
+ "addon.mod_data.errordeleting": "local_moodlemobileapp",
+ "addon.mod_data.errormustsupplyvalue": "data",
+ "addon.mod_data.expired": "data",
+ "addon.mod_data.fields": "data",
+ "addon.mod_data.foundrecords": "data",
+ "addon.mod_data.latlongboth": "data",
+ "addon.mod_data.menuchoose": "data",
+ "addon.mod_data.modulenameplural": "data",
+ "addon.mod_data.more": "data",
+ "addon.mod_data.nomatch": "data",
+ "addon.mod_data.norecords": "data",
+ "addon.mod_data.notapproved": "data",
+ "addon.mod_data.notopenyet": "data",
+ "addon.mod_data.numrecords": "data",
+ "addon.mod_data.other": "data",
+ "addon.mod_data.recordapproved": "data",
+ "addon.mod_data.recorddeleted": "data",
+ "addon.mod_data.recorddisapproved": "data",
+ "addon.mod_data.resetsettings": "data",
+ "addon.mod_data.search": "data",
+ "addon.mod_data.selectedrequired": "data",
+ "addon.mod_data.single": "data",
+ "addon.mod_data.timeadded": "data",
+ "addon.mod_data.timemodified": "data",
+ "addon.mod_data.usedate": "data",
+ "addon.mod_feedback.analysis": "feedback",
+ "addon.mod_feedback.anonymous": "feedback",
+ "addon.mod_feedback.anonymous_entries": "feedback",
+ "addon.mod_feedback.average": "feedback",
+ "addon.mod_feedback.captchaofflinewarning": "local_moodlemobileapp",
+ "addon.mod_feedback.complete_the_form": "feedback",
+ "addon.mod_feedback.completed_feedbacks": "feedback",
+ "addon.mod_feedback.continue_the_form": "feedback",
+ "addon.mod_feedback.feedback_is_not_open": "feedback",
+ "addon.mod_feedback.feedback_submitted_offline": "local_moodlemobileapp",
+ "addon.mod_feedback.feedbackclose": "feedback",
+ "addon.mod_feedback.feedbackopen": "feedback",
+ "addon.mod_feedback.mapcourses": "feedback",
+ "addon.mod_feedback.mode": "feedback",
+ "addon.mod_feedback.modulenameplural": "feedback",
+ "addon.mod_feedback.next_page": "feedback",
+ "addon.mod_feedback.non_anonymous": "feedback",
+ "addon.mod_feedback.non_anonymous_entries": "feedback",
+ "addon.mod_feedback.non_respondents_students": "feedback",
+ "addon.mod_feedback.not_selected": "feedback",
+ "addon.mod_feedback.not_started": "feedback",
+ "addon.mod_feedback.numberoutofrange": "feedback",
+ "addon.mod_feedback.overview": "feedback",
+ "addon.mod_feedback.page_after_submit": "feedback",
+ "addon.mod_feedback.preview": "moodle",
+ "addon.mod_feedback.previous_page": "feedback",
+ "addon.mod_feedback.questions": "feedback",
+ "addon.mod_feedback.response_nr": "feedback",
+ "addon.mod_feedback.responses": "feedback",
+ "addon.mod_feedback.save_entries": "feedback",
+ "addon.mod_feedback.show_entries": "feedback",
+ "addon.mod_feedback.show_nonrespondents": "feedback",
+ "addon.mod_feedback.started": "feedback",
+ "addon.mod_feedback.this_feedback_is_already_submitted": "feedback",
+ "addon.mod_folder.emptyfilelist": "local_moodlemobileapp",
+ "addon.mod_folder.modulenameplural": "folder",
+ "addon.mod_forum.addanewdiscussion": "forum",
+ "addon.mod_forum.addanewquestion": "forum",
+ "addon.mod_forum.addanewtopic": "forum",
+ "addon.mod_forum.cannotadddiscussion": "forum",
+ "addon.mod_forum.cannotadddiscussionall": "forum",
+ "addon.mod_forum.cannotcreatediscussion": "forum",
+ "addon.mod_forum.couldnotadd": "forum",
+ "addon.mod_forum.discussion": "forum",
+ "addon.mod_forum.discussionlocked": "forum",
+ "addon.mod_forum.discussionpinned": "forum",
+ "addon.mod_forum.discussionsubscription": "forum",
+ "addon.mod_forum.edit": "forum",
+ "addon.mod_forum.erroremptymessage": "forum",
+ "addon.mod_forum.erroremptysubject": "forum",
+ "addon.mod_forum.errorgetforum": "local_moodlemobileapp",
+ "addon.mod_forum.errorgetgroups": "local_moodlemobileapp",
+ "addon.mod_forum.forumnodiscussionsyet": "local_moodlemobileapp",
+ "addon.mod_forum.group": "local_moodlemobileapp",
+ "addon.mod_forum.message": "forum",
+ "addon.mod_forum.modeflatnewestfirst": "forum",
+ "addon.mod_forum.modeflatoldestfirst": "forum",
+ "addon.mod_forum.modenested": "forum",
+ "addon.mod_forum.modulenameplural": "forum",
+ "addon.mod_forum.numdiscussions": "local_moodlemobileapp",
+ "addon.mod_forum.numreplies": "local_moodlemobileapp",
+ "addon.mod_forum.posttoforum": "forum",
+ "addon.mod_forum.re": "forum",
+ "addon.mod_forum.refreshdiscussions": "local_moodlemobileapp",
+ "addon.mod_forum.refreshposts": "local_moodlemobileapp",
+ "addon.mod_forum.reply": "forum",
+ "addon.mod_forum.subject": "forum",
+ "addon.mod_forum.unread": "forum",
+ "addon.mod_forum.unreadpostsnumber": "forum",
+ "addon.mod_glossary.addentry": "glossary",
+ "addon.mod_glossary.aliases": "glossary",
+ "addon.mod_glossary.attachment": "glossary",
+ "addon.mod_glossary.browsemode": "local_moodlemobileapp",
+ "addon.mod_glossary.byalphabet": "local_moodlemobileapp",
+ "addon.mod_glossary.byauthor": "local_moodlemobileapp",
+ "addon.mod_glossary.bycategory": "local_moodlemobileapp",
+ "addon.mod_glossary.bynewestfirst": "local_moodlemobileapp",
+ "addon.mod_glossary.byrecentlyupdated": "local_moodlemobileapp",
+ "addon.mod_glossary.bysearch": "local_moodlemobileapp",
+ "addon.mod_glossary.cannoteditentry": "local_moodlemobileapp",
+ "addon.mod_glossary.casesensitive": "glossary",
+ "addon.mod_glossary.categories": "glossary",
+ "addon.mod_glossary.concept": "glossary",
+ "addon.mod_glossary.definition": "glossary",
+ "addon.mod_glossary.entriestobesynced": "local_moodlemobileapp",
+ "addon.mod_glossary.entrypendingapproval": "local_moodlemobileapp",
+ "addon.mod_glossary.entryusedynalink": "glossary",
+ "addon.mod_glossary.errconceptalreadyexists": "glossary",
+ "addon.mod_glossary.errorloadingentries": "local_moodlemobileapp",
+ "addon.mod_glossary.errorloadingentry": "local_moodlemobileapp",
+ "addon.mod_glossary.errorloadingglossary": "local_moodlemobileapp",
+ "addon.mod_glossary.fillfields": "glossary",
+ "addon.mod_glossary.fullmatch": "glossary",
+ "addon.mod_glossary.linking": "glossary",
+ "addon.mod_glossary.modulenameplural": "glossary",
+ "addon.mod_glossary.noentriesfound": "local_moodlemobileapp",
+ "addon.mod_glossary.searchquery": "local_moodlemobileapp",
+ "addon.mod_imscp.deploymenterror": "imscp",
+ "addon.mod_imscp.modulenameplural": "imscp",
+ "addon.mod_imscp.showmoduledescription": "local_moodlemobileapp",
+ "addon.mod_lesson.answer": "lesson",
+ "addon.mod_lesson.attempt": "lesson",
+ "addon.mod_lesson.attemptheader": "lesson",
+ "addon.mod_lesson.attemptsremaining": "lesson",
+ "addon.mod_lesson.averagescore": "lesson",
+ "addon.mod_lesson.averagetime": "lesson",
+ "addon.mod_lesson.branchtable": "lesson",
+ "addon.mod_lesson.cannotfindattempt": "lesson",
+ "addon.mod_lesson.cannotfinduser": "lesson",
+ "addon.mod_lesson.clusterjump": "lesson",
+ "addon.mod_lesson.completed": "lesson",
+ "addon.mod_lesson.congratulations": "lesson",
+ "addon.mod_lesson.continue": "lesson",
+ "addon.mod_lesson.continuetonextpage": "lesson",
+ "addon.mod_lesson.defaultessayresponse": "lesson",
+ "addon.mod_lesson.detailedstats": "lesson",
+ "addon.mod_lesson.didnotanswerquestion": "lesson",
+ "addon.mod_lesson.displayofgrade": "lesson",
+ "addon.mod_lesson.displayscorewithessays": "lesson",
+ "addon.mod_lesson.displayscorewithoutessays": "lesson",
+ "addon.mod_lesson.emptypassword": "lesson",
+ "addon.mod_lesson.enterpassword": "lesson",
+ "addon.mod_lesson.eolstudentoutoftimenoanswers": "lesson",
+ "addon.mod_lesson.errorprefetchrandombranch": "local_moodlemobileapp",
+ "addon.mod_lesson.errorreviewretakenotlast": "local_moodlemobileapp",
+ "addon.mod_lesson.finish": "lesson",
+ "addon.mod_lesson.finishretakeoffline": "local_moodlemobileapp",
+ "addon.mod_lesson.firstwrong": "lesson",
+ "addon.mod_lesson.gotoendoflesson": "lesson",
+ "addon.mod_lesson.grade": "lesson",
+ "addon.mod_lesson.highscore": "lesson",
+ "addon.mod_lesson.hightime": "lesson",
+ "addon.mod_lesson.leftduringtimed": "lesson",
+ "addon.mod_lesson.leftduringtimednoretake": "lesson",
+ "addon.mod_lesson.lessonmenu": "lesson",
+ "addon.mod_lesson.lessonstats": "lesson",
+ "addon.mod_lesson.linkedmedia": "lesson",
+ "addon.mod_lesson.loginfail": "lesson",
+ "addon.mod_lesson.lowscore": "lesson",
+ "addon.mod_lesson.lowtime": "lesson",
+ "addon.mod_lesson.maximumnumberofattemptsreached": "lesson",
+ "addon.mod_lesson.modattemptsnoteacher": "lesson",
+ "addon.mod_lesson.modulenameplural": "lesson",
+ "addon.mod_lesson.noanswer": "lesson",
+ "addon.mod_lesson.nolessonattempts": "lesson",
+ "addon.mod_lesson.nolessonattemptsgroup": "lesson",
+ "addon.mod_lesson.notcompleted": "lesson",
+ "addon.mod_lesson.numberofcorrectanswers": "lesson",
+ "addon.mod_lesson.numberofpagesviewed": "lesson",
+ "addon.mod_lesson.numberofpagesviewednotice": "lesson",
+ "addon.mod_lesson.ongoingcustom": "lesson",
+ "addon.mod_lesson.ongoingnormal": "lesson",
+ "addon.mod_lesson.or": "lesson",
+ "addon.mod_lesson.overview": "lesson",
+ "addon.mod_lesson.preview": "lesson",
+ "addon.mod_lesson.progressbarteacherwarning2": "lesson",
+ "addon.mod_lesson.progresscompleted": "lesson",
+ "addon.mod_lesson.question": "lesson",
+ "addon.mod_lesson.rawgrade": "lesson",
+ "addon.mod_lesson.reports": "lesson",
+ "addon.mod_lesson.response": "lesson",
+ "addon.mod_lesson.retakefinishedinsync": "local_moodlemobileapp",
+ "addon.mod_lesson.retakelabelfull": "local_moodlemobileapp",
+ "addon.mod_lesson.retakelabelshort": "local_moodlemobileapp",
+ "addon.mod_lesson.review": "lesson",
+ "addon.mod_lesson.reviewlesson": "lesson",
+ "addon.mod_lesson.reviewquestionback": "lesson",
+ "addon.mod_lesson.reviewquestioncontinue": "lesson",
+ "addon.mod_lesson.secondpluswrong": "lesson",
+ "addon.mod_lesson.submit": "lesson",
+ "addon.mod_lesson.teacherjumpwarning": "lesson",
+ "addon.mod_lesson.teacherongoingwarning": "lesson",
+ "addon.mod_lesson.teachertimerwarning": "lesson",
+ "addon.mod_lesson.thatsthecorrectanswer": "lesson",
+ "addon.mod_lesson.thatsthewronganswer": "lesson",
+ "addon.mod_lesson.timeremaining": "lesson",
+ "addon.mod_lesson.timetaken": "lesson",
+ "addon.mod_lesson.unseenpageinbranch": "lesson",
+ "addon.mod_lesson.warningretakefinished": "local_moodlemobileapp",
+ "addon.mod_lesson.welldone": "lesson",
+ "addon.mod_lesson.youhaveseen": "lesson",
+ "addon.mod_lesson.youranswer": "lesson",
+ "addon.mod_lesson.yourcurrentgradeisoutof": "lesson",
+ "addon.mod_lesson.youshouldview": "lesson",
+ "addon.mod_lti.errorgetlti": "local_moodlemobileapp",
+ "addon.mod_lti.errorinvalidlaunchurl": "local_moodlemobileapp",
+ "addon.mod_lti.launchactivity": "local_moodlemobileapp",
+ "addon.mod_lti.modulenameplural": "lti",
+ "addon.mod_page.errorwhileloadingthepage": "local_moodlemobileapp",
+ "addon.mod_page.modulenameplural": "page",
+ "addon.mod_quiz.attemptfirst": "quiz",
+ "addon.mod_quiz.attemptlast": "quiz",
+ "addon.mod_quiz.attemptnumber": "quiz",
+ "addon.mod_quiz.attemptquiznow": "quiz",
+ "addon.mod_quiz.attemptstate": "quiz",
+ "addon.mod_quiz.cannotsubmitquizdueto": "local_moodlemobileapp",
+ "addon.mod_quiz.comment": "quiz",
+ "addon.mod_quiz.completedon": "quiz",
+ "addon.mod_quiz.confirmclose": "quiz",
+ "addon.mod_quiz.confirmcontinueoffline": "local_moodlemobileapp",
+ "addon.mod_quiz.confirmleavequizonerror": "local_moodlemobileapp",
+ "addon.mod_quiz.confirmstart": "quizaccess_timelimit",
+ "addon.mod_quiz.confirmstartheader": "quizaccess_timelimit",
+ "addon.mod_quiz.connectionerror": "quiz",
+ "addon.mod_quiz.continueattemptquiz": "quiz",
+ "addon.mod_quiz.continuepreview": "quiz",
+ "addon.mod_quiz.errorbehaviournotsupported": "local_moodlemobileapp",
+ "addon.mod_quiz.errordownloading": "local_moodlemobileapp",
+ "addon.mod_quiz.errorgetattempt": "local_moodlemobileapp",
+ "addon.mod_quiz.errorgetquestions": "local_moodlemobileapp",
+ "addon.mod_quiz.errorgetquiz": "local_moodlemobileapp",
+ "addon.mod_quiz.errorparsequestions": "local_moodlemobileapp",
+ "addon.mod_quiz.errorquestionsnotsupported": "local_moodlemobileapp",
+ "addon.mod_quiz.errorrulesnotsupported": "local_moodlemobileapp",
+ "addon.mod_quiz.errorsaveattempt": "local_moodlemobileapp",
+ "addon.mod_quiz.feedback": "quiz",
+ "addon.mod_quiz.finishattemptdots": "quiz",
+ "addon.mod_quiz.finishnotsynced": "local_moodlemobileapp",
+ "addon.mod_quiz.grade": "quiz",
+ "addon.mod_quiz.gradeaverage": "quiz",
+ "addon.mod_quiz.gradehighest": "quiz",
+ "addon.mod_quiz.grademethod": "quiz",
+ "addon.mod_quiz.gradesofar": "quiz",
+ "addon.mod_quiz.marks": "quiz",
+ "addon.mod_quiz.modulenameplural": "quiz",
+ "addon.mod_quiz.mustbesubmittedby": "quiz",
+ "addon.mod_quiz.noquestions": "quiz",
+ "addon.mod_quiz.noreviewattempt": "quiz",
+ "addon.mod_quiz.notyetgraded": "quiz",
+ "addon.mod_quiz.opentoc": "local_moodlemobileapp",
+ "addon.mod_quiz.outof": "quiz",
+ "addon.mod_quiz.outofpercent": "quiz",
+ "addon.mod_quiz.outofshort": "quiz",
+ "addon.mod_quiz.overallfeedback": "quiz",
+ "addon.mod_quiz.overdue": "quiz",
+ "addon.mod_quiz.overduemustbesubmittedby": "quiz",
+ "addon.mod_quiz.preview": "quiz",
+ "addon.mod_quiz.previewquiznow": "quiz",
+ "addon.mod_quiz.question": "quiz",
+ "addon.mod_quiz.quiznavigation": "quiz",
+ "addon.mod_quiz.quizpassword": "quizaccess_password",
+ "addon.mod_quiz.reattemptquiz": "quiz",
+ "addon.mod_quiz.requirepasswordmessage": "quizaccess_password",
+ "addon.mod_quiz.returnattempt": "quiz",
+ "addon.mod_quiz.review": "quiz",
+ "addon.mod_quiz.reviewofattempt": "quiz",
+ "addon.mod_quiz.reviewofpreview": "quiz",
+ "addon.mod_quiz.showall": "quiz",
+ "addon.mod_quiz.showeachpage": "quiz",
+ "addon.mod_quiz.startattempt": "quiz",
+ "addon.mod_quiz.startedon": "quiz",
+ "addon.mod_quiz.stateabandoned": "quiz",
+ "addon.mod_quiz.statefinished": "quiz",
+ "addon.mod_quiz.statefinisheddetails": "quiz",
+ "addon.mod_quiz.stateinprogress": "quiz",
+ "addon.mod_quiz.stateoverdue": "quiz",
+ "addon.mod_quiz.stateoverduedetails": "quiz",
+ "addon.mod_quiz.status": "quiz",
+ "addon.mod_quiz.submitallandfinish": "quiz",
+ "addon.mod_quiz.summaryofattempt": "quiz",
+ "addon.mod_quiz.summaryofattempts": "quiz",
+ "addon.mod_quiz.timeleft": "quiz",
+ "addon.mod_quiz.timetaken": "quiz",
+ "addon.mod_quiz.warningattemptfinished": "local_moodlemobileapp",
+ "addon.mod_quiz.warningdatadiscarded": "local_moodlemobileapp",
+ "addon.mod_quiz.warningdatadiscardedfromfinished": "local_moodlemobileapp",
+ "addon.mod_quiz.yourfinalgradeis": "quiz",
+ "addon.mod_resource.errorwhileloadingthecontent": "local_moodlemobileapp",
+ "addon.mod_resource.modifieddate": "resource",
+ "addon.mod_resource.modulenameplural": "resource",
+ "addon.mod_resource.openthefile": "local_moodlemobileapp",
+ "addon.mod_resource.uploadeddate": "resource",
+ "addon.mod_scorm.asset": "scorm",
+ "addon.mod_scorm.assetlaunched": "scorm",
+ "addon.mod_scorm.attempts": "scorm",
+ "addon.mod_scorm.averageattempt": "scorm",
+ "addon.mod_scorm.browse": "scorm",
+ "addon.mod_scorm.browsed": "scorm",
+ "addon.mod_scorm.browsemode": "scorm",
+ "addon.mod_scorm.cannotcalculategrade": "local_moodlemobileapp",
+ "addon.mod_scorm.completed": "scorm",
+ "addon.mod_scorm.contents": "scorm",
+ "addon.mod_scorm.dataattemptshown": "local_moodlemobileapp",
+ "addon.mod_scorm.enter": "scorm",
+ "addon.mod_scorm.errorcreateofflineattempt": "local_moodlemobileapp",
+ "addon.mod_scorm.errordownloadscorm": "local_moodlemobileapp",
+ "addon.mod_scorm.errorgetscorm": "local_moodlemobileapp",
+ "addon.mod_scorm.errorinvalidversion": "local_moodlemobileapp",
+ "addon.mod_scorm.errornotdownloadable": "local_moodlemobileapp",
+ "addon.mod_scorm.errornovalidsco": "local_moodlemobileapp",
+ "addon.mod_scorm.errorpackagefile": "local_moodlemobileapp",
+ "addon.mod_scorm.errorsyncscorm": "local_moodlemobileapp",
+ "addon.mod_scorm.exceededmaxattempts": "scorm",
+ "addon.mod_scorm.failed": "scorm",
+ "addon.mod_scorm.firstattempt": "scorm",
+ "addon.mod_scorm.gradeaverage": "scorm",
+ "addon.mod_scorm.gradeforattempt": "scorm",
+ "addon.mod_scorm.gradehighest": "scorm",
+ "addon.mod_scorm.grademethod": "scorm",
+ "addon.mod_scorm.gradereported": "scorm",
+ "addon.mod_scorm.gradescoes": "scorm",
+ "addon.mod_scorm.gradesum": "scorm",
+ "addon.mod_scorm.highestattempt": "scorm",
+ "addon.mod_scorm.incomplete": "scorm",
+ "addon.mod_scorm.lastattempt": "scorm",
+ "addon.mod_scorm.mode": "scorm",
+ "addon.mod_scorm.modulenameplural": "scorm",
+ "addon.mod_scorm.newattempt": "scorm",
+ "addon.mod_scorm.noattemptsallowed": "scorm",
+ "addon.mod_scorm.noattemptsmade": "scorm",
+ "addon.mod_scorm.normal": "scorm",
+ "addon.mod_scorm.notattempted": "scorm",
+ "addon.mod_scorm.offlineattemptnote": "local_moodlemobileapp",
+ "addon.mod_scorm.offlineattemptovermax": "local_moodlemobileapp",
+ "addon.mod_scorm.organizations": "scorm",
+ "addon.mod_scorm.passed": "scorm",
+ "addon.mod_scorm.reviewmode": "scorm",
+ "addon.mod_scorm.scormstatusnotdownloaded": "local_moodlemobileapp",
+ "addon.mod_scorm.scormstatusoutdated": "local_moodlemobileapp",
+ "addon.mod_scorm.suspended": "scorm",
+ "addon.mod_scorm.warningofflinedatadeleted": "local_moodlemobileapp",
+ "addon.mod_scorm.warningsynconlineincomplete": "local_moodlemobileapp",
+ "addon.mod_survey.cannotsubmitsurvey": "local_moodlemobileapp",
+ "addon.mod_survey.errorgetsurvey": "local_moodlemobileapp",
+ "addon.mod_survey.ifoundthat": "survey",
+ "addon.mod_survey.ipreferthat": "survey",
+ "addon.mod_survey.modulenameplural": "survey",
+ "addon.mod_survey.responses": "survey",
+ "addon.mod_survey.results": "local_moodlemobileapp",
+ "addon.mod_survey.surveycompletednograph": "survey",
+ "addon.mod_url.accessurl": "local_moodlemobileapp",
+ "addon.mod_url.modulenameplural": "url",
+ "addon.mod_url.pointingtourl": "local_moodlemobileapp",
+ "addon.mod_wiki.cannoteditpage": "wiki",
+ "addon.mod_wiki.createpage": "wiki",
+ "addon.mod_wiki.editingpage": "wiki",
+ "addon.mod_wiki.errorloadingpage": "local_moodlemobileapp",
+ "addon.mod_wiki.errornowikiavailable": "local_moodlemobileapp",
+ "addon.mod_wiki.gowikihome": "local_moodlemobileapp",
+ "addon.mod_wiki.map": "wiki",
+ "addon.mod_wiki.modulenameplural": "wiki",
+ "addon.mod_wiki.newpagehdr": "wiki",
+ "addon.mod_wiki.newpagetitle": "wiki",
+ "addon.mod_wiki.nocontent": "wiki",
+ "addon.mod_wiki.notingroup": "wiki",
+ "addon.mod_wiki.pageexists": "wiki",
+ "addon.mod_wiki.pagename": "wiki",
+ "addon.mod_wiki.subwiki": "local_moodlemobileapp",
+ "addon.mod_wiki.titleshouldnotbeempty": "local_moodlemobileapp",
+ "addon.mod_wiki.viewpage": "local_moodlemobileapp",
+ "addon.mod_wiki.wikipage": "local_moodlemobileapp",
+ "addon.mod_wiki.wrongversionlock": "wiki",
+ "addon.mod_workshop.alreadygraded": "workshop",
+ "addon.mod_workshop.areainstructauthors": "workshop",
+ "addon.mod_workshop.areainstructreviewers": "workshop",
+ "addon.mod_workshop.assess": "workshop",
+ "addon.mod_workshop.assessedsubmission": "workshop",
+ "addon.mod_workshop.assessmentform": "workshop",
+ "addon.mod_workshop.assessmentsettings": "workshop",
+ "addon.mod_workshop.assessmentstrategynotsupported": "local_moodlemobileapp",
+ "addon.mod_workshop.assessmentweight": "workshop",
+ "addon.mod_workshop.assignedassessments": "workshop",
+ "addon.mod_workshop.assignedassessmentsnone": "workshop",
+ "addon.mod_workshop.conclusion": "workshop",
+ "addon.mod_workshop.createsubmission": "workshop",
+ "addon.mod_workshop.deletesubmission": "workshop",
+ "addon.mod_workshop.editsubmission": "workshop",
+ "addon.mod_workshop.feedbackauthor": "workshop",
+ "addon.mod_workshop.feedbackby": "workshop",
+ "addon.mod_workshop.feedbackreviewer": "workshop",
+ "addon.mod_workshop.givengrades": "workshop",
+ "addon.mod_workshop.gradecalculated": "workshop",
+ "addon.mod_workshop.gradeinfo": "workshop",
+ "addon.mod_workshop.gradeover": "workshop",
+ "addon.mod_workshop.gradesreport": "workshop",
+ "addon.mod_workshop.gradinggrade": "workshop",
+ "addon.mod_workshop.gradinggradecalculated": "workshop",
+ "addon.mod_workshop.gradinggradeof": "workshop",
+ "addon.mod_workshop.gradinggradeover": "workshop",
+ "addon.mod_workshop.modulenameplural": "workshop",
+ "addon.mod_workshop.nogradeyet": "workshop",
+ "addon.mod_workshop.notassessed": "workshop",
+ "addon.mod_workshop.notoverridden": "workshop",
+ "addon.mod_workshop.noyoursubmission": "workshop",
+ "addon.mod_workshop.overallfeedback": "workshop",
+ "addon.mod_workshop.publishedsubmissions": "workshop",
+ "addon.mod_workshop.publishsubmission": "workshop",
+ "addon.mod_workshop.publishsubmission_help": "workshop",
+ "addon.mod_workshop.reassess": "workshop",
+ "addon.mod_workshop.receivedgrades": "workshop",
+ "addon.mod_workshop.submissionattachment": "workshop",
+ "addon.mod_workshop.submissioncontent": "workshop",
+ "addon.mod_workshop.submissiondeleteconfirm": "workshop",
+ "addon.mod_workshop.submissiongrade": "workshop",
+ "addon.mod_workshop.submissiongradeof": "workshop",
+ "addon.mod_workshop.submissionrequiredcontent": "workshop",
+ "addon.mod_workshop.submissionrequiredtitle": "local_moodlemobileapp",
+ "addon.mod_workshop.submissionsreport": "workshop",
+ "addon.mod_workshop.submissiontitle": "workshop",
+ "addon.mod_workshop.switchphase10": "workshop",
+ "addon.mod_workshop.switchphase20": "workshop",
+ "addon.mod_workshop.switchphase30": "workshop",
+ "addon.mod_workshop.switchphase40": "workshop",
+ "addon.mod_workshop.switchphase50": "workshop",
+ "addon.mod_workshop.userplan": "workshop",
+ "addon.mod_workshop.userplancurrentphase": "workshop",
+ "addon.mod_workshop.warningassessmentmodified": "local_moodlemobileapp",
+ "addon.mod_workshop.warningsubmissionmodified": "local_moodlemobileapp",
+ "addon.mod_workshop.weightinfo": "workshop",
+ "addon.mod_workshop.yourassessment": "workshop/assessmentbyyourself",
+ "addon.mod_workshop.yourassessmentfor": "workshop",
+ "addon.mod_workshop.yourgrades": "workshop",
+ "addon.mod_workshop.yoursubmission": "workshop",
+ "addon.mod_workshop_assessment_accumulative.dimensioncommentfor": "workshopform_accumulative",
+ "addon.mod_workshop_assessment_accumulative.dimensiongradefor": "workshopform_accumulative",
+ "addon.mod_workshop_assessment_accumulative.dimensionnumber": "workshopform_accumulative",
+ "addon.mod_workshop_assessment_accumulative.mustchoosegrade": "workshopform_accumulative",
+ "addon.mod_workshop_assessment_comments.dimensioncommentfor": "workshopform_comments",
+ "addon.mod_workshop_assessment_comments.dimensionnumber": "workshopform_comments",
+ "addon.mod_workshop_assessment_numerrors.dimensioncommentfor": "workshopform_numerrors",
+ "addon.mod_workshop_assessment_numerrors.dimensiongradefor": "workshopform_accumulative",
+ "addon.mod_workshop_assessment_numerrors.dimensionnumber": "workshopform_numerrors",
+ "addon.mod_workshop_assessment_rubric.dimensionnumber": "workshopform_rubric",
+ "addon.mod_workshop_assessment_rubric.mustchooseone": "workshopform_rubric",
+ "addon.notes.addnewnote": "notes",
+ "addon.notes.coursenotes": "notes",
+ "addon.notes.eventnotecreated": "notes",
+ "addon.notes.nonotes": "notes",
+ "addon.notes.note": "notes",
+ "addon.notes.notes": "notes",
+ "addon.notes.personalnotes": "notes",
+ "addon.notes.publishstate": "notes",
+ "addon.notes.sitenotes": "notes",
+ "addon.notes.userwithid": "local_moodlemobileapp",
+ "addon.notes.warningnotenotsent": "local_moodlemobileapp",
+ "addon.notifications.errorgetnotifications": "local_moodlemobileapp",
+ "addon.notifications.markallread": "moodle",
+ "addon.notifications.notificationpreferences": "message",
+ "addon.notifications.notifications": "local_moodlemobileapp",
+ "addon.notifications.playsound": "local_moodlemobileapp",
+ "addon.notifications.therearentnotificationsyet": "local_moodlemobileapp",
+ "assets.countries.AD": "countries",
+ "assets.countries.AE": "countries",
+ "assets.countries.AF": "countries",
+ "assets.countries.AG": "countries",
+ "assets.countries.AI": "countries",
+ "assets.countries.AL": "countries",
+ "assets.countries.AM": "countries",
+ "assets.countries.AO": "countries",
+ "assets.countries.AQ": "countries",
+ "assets.countries.AR": "countries",
+ "assets.countries.AS": "countries",
+ "assets.countries.AT": "countries",
+ "assets.countries.AU": "countries",
+ "assets.countries.AW": "countries",
+ "assets.countries.AX": "countries",
+ "assets.countries.AZ": "countries",
+ "assets.countries.BA": "countries",
+ "assets.countries.BB": "countries",
+ "assets.countries.BD": "countries",
+ "assets.countries.BE": "countries",
+ "assets.countries.BF": "countries",
+ "assets.countries.BG": "countries",
+ "assets.countries.BH": "countries",
+ "assets.countries.BI": "countries",
+ "assets.countries.BJ": "countries",
+ "assets.countries.BL": "countries",
+ "assets.countries.BM": "countries",
+ "assets.countries.BN": "countries",
+ "assets.countries.BO": "countries",
+ "assets.countries.BQ": "countries",
+ "assets.countries.BR": "countries",
+ "assets.countries.BS": "countries",
+ "assets.countries.BT": "countries",
+ "assets.countries.BV": "countries",
+ "assets.countries.BW": "countries",
+ "assets.countries.BY": "countries",
+ "assets.countries.BZ": "countries",
+ "assets.countries.CA": "countries",
+ "assets.countries.CC": "countries",
+ "assets.countries.CD": "countries",
+ "assets.countries.CF": "countries",
+ "assets.countries.CG": "countries",
+ "assets.countries.CH": "countries",
+ "assets.countries.CI": "countries",
+ "assets.countries.CK": "countries",
+ "assets.countries.CL": "countries",
+ "assets.countries.CM": "countries",
+ "assets.countries.CN": "countries",
+ "assets.countries.CO": "countries",
+ "assets.countries.CR": "countries",
+ "assets.countries.CU": "countries",
+ "assets.countries.CV": "countries",
+ "assets.countries.CW": "countries",
+ "assets.countries.CX": "countries",
+ "assets.countries.CY": "countries",
+ "assets.countries.CZ": "countries",
+ "assets.countries.DE": "countries",
+ "assets.countries.DJ": "countries",
+ "assets.countries.DK": "countries",
+ "assets.countries.DM": "countries",
+ "assets.countries.DO": "countries",
+ "assets.countries.DZ": "countries",
+ "assets.countries.EC": "countries",
+ "assets.countries.EE": "countries",
+ "assets.countries.EG": "countries",
+ "assets.countries.EH": "countries",
+ "assets.countries.ER": "countries",
+ "assets.countries.ES": "countries",
+ "assets.countries.ET": "countries",
+ "assets.countries.FI": "countries",
+ "assets.countries.FJ": "countries",
+ "assets.countries.FK": "countries",
+ "assets.countries.FM": "countries",
+ "assets.countries.FO": "countries",
+ "assets.countries.FR": "countries",
+ "assets.countries.GA": "countries",
+ "assets.countries.GB": "countries",
+ "assets.countries.GD": "countries",
+ "assets.countries.GE": "countries",
+ "assets.countries.GF": "countries",
+ "assets.countries.GG": "countries",
+ "assets.countries.GH": "countries",
+ "assets.countries.GI": "countries",
+ "assets.countries.GL": "countries",
+ "assets.countries.GM": "countries",
+ "assets.countries.GN": "countries",
+ "assets.countries.GP": "countries",
+ "assets.countries.GQ": "countries",
+ "assets.countries.GR": "countries",
+ "assets.countries.GS": "countries",
+ "assets.countries.GT": "countries",
+ "assets.countries.GU": "countries",
+ "assets.countries.GW": "countries",
+ "assets.countries.GY": "countries",
+ "assets.countries.HK": "countries",
+ "assets.countries.HM": "countries",
+ "assets.countries.HN": "countries",
+ "assets.countries.HR": "countries",
+ "assets.countries.HT": "countries",
+ "assets.countries.HU": "countries",
+ "assets.countries.ID": "countries",
+ "assets.countries.IE": "countries",
+ "assets.countries.IL": "countries",
+ "assets.countries.IM": "countries",
+ "assets.countries.IN": "countries",
+ "assets.countries.IO": "countries",
+ "assets.countries.IQ": "countries",
+ "assets.countries.IR": "countries",
+ "assets.countries.IS": "countries",
+ "assets.countries.IT": "countries",
+ "assets.countries.JE": "countries",
+ "assets.countries.JM": "countries",
+ "assets.countries.JO": "countries",
+ "assets.countries.JP": "countries",
+ "assets.countries.KE": "countries",
+ "assets.countries.KG": "countries",
+ "assets.countries.KH": "countries",
+ "assets.countries.KI": "countries",
+ "assets.countries.KM": "countries",
+ "assets.countries.KN": "countries",
+ "assets.countries.KP": "countries",
+ "assets.countries.KR": "countries",
+ "assets.countries.KW": "countries",
+ "assets.countries.KY": "countries",
+ "assets.countries.KZ": "countries",
+ "assets.countries.LA": "countries",
+ "assets.countries.LB": "countries",
+ "assets.countries.LC": "countries",
+ "assets.countries.LI": "countries",
+ "assets.countries.LK": "countries",
+ "assets.countries.LR": "countries",
+ "assets.countries.LS": "countries",
+ "assets.countries.LT": "countries",
+ "assets.countries.LU": "countries",
+ "assets.countries.LV": "countries",
+ "assets.countries.LY": "countries",
+ "assets.countries.MA": "countries",
+ "assets.countries.MC": "countries",
+ "assets.countries.MD": "countries",
+ "assets.countries.ME": "countries",
+ "assets.countries.MF": "countries",
+ "assets.countries.MG": "countries",
+ "assets.countries.MH": "countries",
+ "assets.countries.MK": "countries",
+ "assets.countries.ML": "countries",
+ "assets.countries.MM": "countries",
+ "assets.countries.MN": "countries",
+ "assets.countries.MO": "countries",
+ "assets.countries.MP": "countries",
+ "assets.countries.MQ": "countries",
+ "assets.countries.MR": "countries",
+ "assets.countries.MS": "countries",
+ "assets.countries.MT": "countries",
+ "assets.countries.MU": "countries",
+ "assets.countries.MV": "countries",
+ "assets.countries.MW": "countries",
+ "assets.countries.MX": "countries",
+ "assets.countries.MY": "countries",
+ "assets.countries.MZ": "countries",
+ "assets.countries.NA": "countries",
+ "assets.countries.NC": "countries",
+ "assets.countries.NE": "countries",
+ "assets.countries.NF": "countries",
+ "assets.countries.NG": "countries",
+ "assets.countries.NI": "countries",
+ "assets.countries.NL": "countries",
+ "assets.countries.NO": "countries",
+ "assets.countries.NP": "countries",
+ "assets.countries.NR": "countries",
+ "assets.countries.NU": "countries",
+ "assets.countries.NZ": "countries",
+ "assets.countries.OM": "countries",
+ "assets.countries.PA": "countries",
+ "assets.countries.PE": "countries",
+ "assets.countries.PF": "countries",
+ "assets.countries.PG": "countries",
+ "assets.countries.PH": "countries",
+ "assets.countries.PK": "countries",
+ "assets.countries.PL": "countries",
+ "assets.countries.PM": "countries",
+ "assets.countries.PN": "countries",
+ "assets.countries.PR": "countries",
+ "assets.countries.PS": "countries",
+ "assets.countries.PT": "countries",
+ "assets.countries.PW": "countries",
+ "assets.countries.PY": "countries",
+ "assets.countries.QA": "countries",
+ "assets.countries.RE": "countries",
+ "assets.countries.RO": "countries",
+ "assets.countries.RS": "countries",
+ "assets.countries.RU": "countries",
+ "assets.countries.RW": "countries",
+ "assets.countries.SA": "countries",
+ "assets.countries.SB": "countries",
+ "assets.countries.SC": "countries",
+ "assets.countries.SD": "countries",
+ "assets.countries.SE": "countries",
+ "assets.countries.SG": "countries",
+ "assets.countries.SH": "countries",
+ "assets.countries.SI": "countries",
+ "assets.countries.SJ": "countries",
+ "assets.countries.SK": "countries",
+ "assets.countries.SL": "countries",
+ "assets.countries.SM": "countries",
+ "assets.countries.SN": "countries",
+ "assets.countries.SO": "countries",
+ "assets.countries.SR": "countries",
+ "assets.countries.SS": "countries",
+ "assets.countries.ST": "countries",
+ "assets.countries.SV": "countries",
+ "assets.countries.SX": "countries",
+ "assets.countries.SY": "countries",
+ "assets.countries.SZ": "countries",
+ "assets.countries.TC": "countries",
+ "assets.countries.TD": "countries",
+ "assets.countries.TF": "countries",
+ "assets.countries.TG": "countries",
+ "assets.countries.TH": "countries",
+ "assets.countries.TJ": "countries",
+ "assets.countries.TK": "countries",
+ "assets.countries.TL": "countries",
+ "assets.countries.TM": "countries",
+ "assets.countries.TN": "countries",
+ "assets.countries.TO": "countries",
+ "assets.countries.TR": "countries",
+ "assets.countries.TT": "countries",
+ "assets.countries.TV": "countries",
+ "assets.countries.TW": "countries",
+ "assets.countries.TZ": "countries",
+ "assets.countries.UA": "countries",
+ "assets.countries.UG": "countries",
+ "assets.countries.UM": "countries",
+ "assets.countries.US": "countries",
+ "assets.countries.UY": "countries",
+ "assets.countries.UZ": "countries",
+ "assets.countries.VA": "countries",
+ "assets.countries.VC": "countries",
+ "assets.countries.VE": "countries",
+ "assets.countries.VG": "countries",
+ "assets.countries.VI": "countries",
+ "assets.countries.VN": "countries",
+ "assets.countries.VU": "countries",
+ "assets.countries.WF": "countries",
+ "assets.countries.WS": "countries",
+ "assets.countries.YE": "countries",
+ "assets.countries.YT": "countries",
+ "assets.countries.ZA": "countries",
+ "assets.countries.ZM": "countries",
+ "assets.countries.ZW": "countries",
+ "assets.mimetypes.application/epub_zip": "mimetypes",
+ "assets.mimetypes.application/msword": "mimetypes",
+ "assets.mimetypes.application/pdf": "mimetypes",
+ "assets.mimetypes.application/vnd.moodle.backup": "mimetypes",
+ "assets.mimetypes.application/vnd.ms-excel": "mimetypes",
+ "assets.mimetypes.application/vnd.ms-excel.sheet.macroEnabled.12": "mimetypes",
+ "assets.mimetypes.application/vnd.ms-powerpoint": "mimetypes",
+ "assets.mimetypes.application/vnd.oasis.opendocument.spreadsheet": "mimetypes",
+ "assets.mimetypes.application/vnd.oasis.opendocument.spreadsheet-template": "mimetypes",
+ "assets.mimetypes.application/vnd.oasis.opendocument.text": "mimetypes",
+ "assets.mimetypes.application/vnd.oasis.opendocument.text-template": "mimetypes",
+ "assets.mimetypes.application/vnd.oasis.opendocument.text-web": "mimetypes",
+ "assets.mimetypes.application/vnd.openxmlformats-officedocument.presentationml.presentation": "mimetypes",
+ "assets.mimetypes.application/vnd.openxmlformats-officedocument.presentationml.slideshow": "mimetypes",
+ "assets.mimetypes.application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "mimetypes",
+ "assets.mimetypes.application/vnd.openxmlformats-officedocument.spreadsheetml.template": "mimetypes",
+ "assets.mimetypes.application/vnd.openxmlformats-officedocument.wordprocessingml.document": "mimetypes",
+ "assets.mimetypes.application/x-iwork-keynote-sffkey": "mimetypes",
+ "assets.mimetypes.application/x-iwork-numbers-sffnumbers": "mimetypes",
+ "assets.mimetypes.application/x-iwork-pages-sffpages": "mimetypes",
+ "assets.mimetypes.application/x-javascript": "mimetypes",
+ "assets.mimetypes.application/x-mspublisher": "mimetypes",
+ "assets.mimetypes.application/x-shockwave-flash": "mimetypes",
+ "assets.mimetypes.application/xhtml_xml": "mimetypes",
+ "assets.mimetypes.archive": "mimetypes",
+ "assets.mimetypes.audio": "mimetypes",
+ "assets.mimetypes.default": "mimetypes",
+ "assets.mimetypes.document/unknown": "mimetypes",
+ "assets.mimetypes.group:archive": "mimetypes",
+ "assets.mimetypes.group:audio": "mimetypes",
+ "assets.mimetypes.group:document": "mimetypes",
+ "assets.mimetypes.group:html_audio": "mimetypes",
+ "assets.mimetypes.group:html_track": "mimetypes",
+ "assets.mimetypes.group:html_video": "mimetypes",
+ "assets.mimetypes.group:image": "mimetypes",
+ "assets.mimetypes.group:presentation": "mimetypes",
+ "assets.mimetypes.group:sourcecode": "mimetypes",
+ "assets.mimetypes.group:spreadsheet": "mimetypes",
+ "assets.mimetypes.group:video": "mimetypes",
+ "assets.mimetypes.group:web_audio": "mimetypes",
+ "assets.mimetypes.group:web_file": "mimetypes",
+ "assets.mimetypes.group:web_image": "mimetypes",
+ "assets.mimetypes.group:web_video": "mimetypes",
+ "assets.mimetypes.image": "mimetypes",
+ "assets.mimetypes.image/vnd.microsoft.icon": "mimetypes",
+ "assets.mimetypes.text/css": "mimetypes",
+ "assets.mimetypes.text/csv": "mimetypes",
+ "assets.mimetypes.text/html": "mimetypes",
+ "assets.mimetypes.text/plain": "mimetypes",
+ "assets.mimetypes.text/rtf": "mimetypes",
+ "assets.mimetypes.text/vtt": "mimetypes",
+ "assets.mimetypes.video": "mimetypes",
+ "core.accounts": "admin",
+ "core.add": "moodle",
+ "core.agelocationverification": "moodle",
+ "core.ago": "message",
+ "core.all": "moodle",
+ "core.allparticipants": "moodle",
+ "core.android": "local_moodlemobileapp",
+ "core.answer": "moodle",
+ "core.answered": "quiz",
+ "core.areyousure": "moodle",
+ "core.back": "moodle",
+ "core.cancel": "moodle",
+ "core.cannotconnect": "local_moodlemobileapp",
+ "core.cannotdownloadfiles": "local_moodlemobileapp",
+ "core.captureaudio": "local_moodlemobileapp",
+ "core.capturedimage": "local_moodlemobileapp",
+ "core.captureimage": "local_moodlemobileapp",
+ "core.capturevideo": "local_moodlemobileapp",
+ "core.category": "moodle",
+ "core.choose": "moodle",
+ "core.choosedots": "moodle",
+ "core.clearsearch": "local_moodlemobileapp",
+ "core.clicktohideshow": "moodle",
+ "core.clicktoseefull": "local_moodlemobileapp",
+ "core.close": "repository",
+ "core.comments": "moodle",
+ "core.commentscount": "moodle",
+ "core.commentsnotworking": "local_moodlemobileapp",
+ "core.completion-alt-auto-fail": "completion",
+ "core.completion-alt-auto-n": "completion",
+ "core.completion-alt-auto-n-override": "completion",
+ "core.completion-alt-auto-pass": "completion",
+ "core.completion-alt-auto-y": "completion",
+ "core.completion-alt-auto-y-override": "completion",
+ "core.completion-alt-manual-n": "completion",
+ "core.completion-alt-manual-n-override": "completion",
+ "core.completion-alt-manual-y": "completion",
+ "core.completion-alt-manual-y-override": "completion",
+ "core.confirmcanceledit": "local_moodlemobileapp",
+ "core.confirmdeletefile": "repository",
+ "core.confirmloss": "local_moodlemobileapp",
+ "core.confirmopeninbrowser": "local_moodlemobileapp",
+ "core.considereddigitalminor": "moodle",
+ "core.content": "moodle",
+ "core.contenteditingsynced": "local_moodlemobileapp",
+ "core.contentlinks.chooseaccount": "local_moodlemobileapp",
+ "core.contentlinks.chooseaccounttoopenlink": "local_moodlemobileapp",
+ "core.contentlinks.confirmurlothersite": "local_moodlemobileapp",
+ "core.contentlinks.errornoactions": "local_moodlemobileapp",
+ "core.contentlinks.errornosites": "local_moodlemobileapp",
+ "core.continue": "moodle",
+ "core.copiedtoclipboard": "local_moodlemobileapp",
+ "core.course": "moodle",
+ "core.course.activitydisabled": "local_moodlemobileapp",
+ "core.course.activitynotyetviewableremoteaddon": "local_moodlemobileapp",
+ "core.course.activitynotyetviewablesiteupgradeneeded": "local_moodlemobileapp",
+ "core.course.allsections": "local_moodlemobileapp",
+ "core.course.askadmintosupport": "local_moodlemobileapp",
+ "core.course.confirmdeletemodulefiles": "local_moodlemobileapp",
+ "core.course.confirmdownload": "local_moodlemobileapp",
+ "core.course.confirmdownloadunknownsize": "local_moodlemobileapp",
+ "core.course.confirmpartialdownloadsize": "local_moodlemobileapp",
+ "core.course.contents": "local_moodlemobileapp",
+ "core.course.couldnotloadsectioncontent": "local_moodlemobileapp",
+ "core.course.couldnotloadsections": "local_moodlemobileapp",
+ "core.course.coursesummary": "moodle",
+ "core.course.downloadcourse": "tool_mobile",
+ "core.course.errordownloadingcourse": "local_moodlemobileapp",
+ "core.course.errordownloadingsection": "local_moodlemobileapp",
+ "core.course.errorgetmodule": "local_moodlemobileapp",
+ "core.course.hiddenfromstudents": "moodle",
+ "core.course.hiddenoncoursepage": "moodle",
+ "core.course.manualcompletionnotsynced": "local_moodlemobileapp",
+ "core.course.nocontentavailable": "local_moodlemobileapp",
+ "core.course.overriddennotice": "grades",
+ "core.course.refreshcourse": "local_moodlemobileapp",
+ "core.course.sections": "moodle",
+ "core.course.useactivityonbrowser": "local_moodlemobileapp",
+ "core.course.warningmanualcompletionmodified": "local_moodlemobileapp",
+ "core.course.warningofflinemanualcompletiondeleted": "local_moodlemobileapp",
+ "core.coursedetails": "moodle",
+ "core.courses.addtofavourites": "block_myoverview",
+ "core.courses.allowguests": "enrol_guest",
+ "core.courses.availablecourses": "moodle",
+ "core.courses.cannotretrievemorecategories": "local_moodlemobileapp",
+ "core.courses.categories": "moodle",
+ "core.courses.confirmselfenrol": "local_moodlemobileapp",
+ "core.courses.courses": "moodle",
+ "core.courses.downloadcourses": "local_moodlemobileapp",
+ "core.courses.enrolme": "local_moodlemobileapp",
+ "core.courses.errorloadcategories": "local_moodlemobileapp",
+ "core.courses.errorloadcourses": "local_moodlemobileapp",
+ "core.courses.errorsearching": "local_moodlemobileapp",
+ "core.courses.errorselfenrol": "local_moodlemobileapp",
+ "core.courses.filtermycourses": "local_moodlemobileapp",
+ "core.courses.frontpage": "admin",
+ "core.courses.hidecourse": "block_myoverview",
+ "core.courses.mycourses": "moodle",
+ "core.courses.mymoodle": "admin",
+ "core.courses.nocourses": "my",
+ "core.courses.nocoursesyet": "moodle",
+ "core.courses.nosearchresults": "wiki",
+ "core.courses.notenroled": "completion",
+ "core.courses.notenrollable": "local_moodlemobileapp",
+ "core.courses.password": "local_moodlemobileapp",
+ "core.courses.paymentrequired": "moodle",
+ "core.courses.paypalaccepted": "enrol_paypal",
+ "core.courses.removefromfavourites": "block_myoverview",
+ "core.courses.search": "moodle",
+ "core.courses.searchcourses": "moodle",
+ "core.courses.searchcoursesadvice": "local_moodlemobileapp",
+ "core.courses.selfenrolment": "local_moodlemobileapp",
+ "core.courses.sendpaymentbutton": "enrol_paypal",
+ "core.courses.show": "block_myoverview",
+ "core.courses.totalcoursesearchresults": "local_moodlemobileapp",
+ "core.currentdevice": "local_moodlemobileapp",
+ "core.datastoredoffline": "local_moodlemobileapp",
+ "core.date": "moodle",
+ "core.day": "moodle",
+ "core.days": "moodle",
+ "core.decsep": "langconfig",
+ "core.defaultvalue": "tool_usertours",
+ "core.delete": "moodle",
+ "core.deletedoffline": "local_moodlemobileapp",
+ "core.deleting": "local_moodlemobileapp",
+ "core.description": "moodle",
+ "core.dfdaymonthyear": "local_moodlemobileapp",
+ "core.dfdayweekmonth": "local_moodlemobileapp",
+ "core.dffulldate": "local_moodlemobileapp",
+ "core.dflastweekdate": "local_moodlemobileapp",
+ "core.dfmediumdate": "local_moodlemobileapp",
+ "core.dftimedate": "local_moodlemobileapp",
+ "core.digitalminor": "moodle",
+ "core.digitalminor_desc": "moodle",
+ "core.discard": "local_moodlemobileapp",
+ "core.dismiss": "local_moodlemobileapp",
+ "core.done": "survey",
+ "core.download": "moodle",
+ "core.downloading": "local_moodlemobileapp",
+ "core.edit": "moodle",
+ "core.emptysplit": "local_moodlemobileapp",
+ "core.error": "moodle",
+ "core.errorchangecompletion": "local_moodlemobileapp",
+ "core.errordeletefile": "local_moodlemobileapp",
+ "core.errordownloading": "local_moodlemobileapp",
+ "core.errordownloadingsomefiles": "local_moodlemobileapp",
+ "core.errorfileexistssamename": "local_moodlemobileapp",
+ "core.errorinvalidform": "local_moodlemobileapp",
+ "core.errorinvalidresponse": "local_moodlemobileapp",
+ "core.errorloadingcontent": "local_moodlemobileapp",
+ "core.errorofflinedisabled": "local_moodlemobileapp",
+ "core.erroropenfilenoapp": "local_moodlemobileapp",
+ "core.erroropenfilenoextension": "local_moodlemobileapp",
+ "core.erroropenpopup": "local_moodlemobileapp",
+ "core.errorrenamefile": "local_moodlemobileapp",
+ "core.errorsync": "local_moodlemobileapp",
+ "core.errorsyncblocked": "local_moodlemobileapp",
+ "core.explanationdigitalminor": "moodle",
+ "core.favourites": "moodle",
+ "core.filename": "repository",
+ "core.filenameexist": "local_moodlemobileapp",
+ "core.fileuploader.addfiletext": "repository",
+ "core.fileuploader.audio": "local_moodlemobileapp",
+ "core.fileuploader.camera": "local_moodlemobileapp",
+ "core.fileuploader.confirmuploadfile": "local_moodlemobileapp",
+ "core.fileuploader.confirmuploadunknownsize": "local_moodlemobileapp",
+ "core.fileuploader.errorcapturingaudio": "local_moodlemobileapp",
+ "core.fileuploader.errorcapturingimage": "local_moodlemobileapp",
+ "core.fileuploader.errorcapturingvideo": "local_moodlemobileapp",
+ "core.fileuploader.errorgettingimagealbum": "local_moodlemobileapp",
+ "core.fileuploader.errormustbeonlinetoupload": "local_moodlemobileapp",
+ "core.fileuploader.errornoapp": "local_moodlemobileapp",
+ "core.fileuploader.errorreadingfile": "local_moodlemobileapp",
+ "core.fileuploader.errorwhileuploading": "local_moodlemobileapp",
+ "core.fileuploader.file": "local_moodlemobileapp",
+ "core.fileuploader.filesofthesetypes": "form",
+ "core.fileuploader.fileuploaded": "local_moodlemobileapp",
+ "core.fileuploader.invalidfiletype": "repository",
+ "core.fileuploader.maxbytesfile": "local_moodlemobileapp",
+ "core.fileuploader.more": "data",
+ "core.fileuploader.photoalbums": "local_moodlemobileapp",
+ "core.fileuploader.readingfile": "local_moodlemobileapp",
+ "core.fileuploader.readingfileperc": "local_moodlemobileapp",
+ "core.fileuploader.selectafile": "local_moodlemobileapp",
+ "core.fileuploader.uploadafile": "local_moodlemobileapp",
+ "core.fileuploader.uploading": "local_moodlemobileapp",
+ "core.fileuploader.uploadingperc": "local_moodlemobileapp",
+ "core.fileuploader.video": "local_moodlemobileapp",
+ "core.folder": "moodle",
+ "core.forcepasswordchangenotice": "moodle",
+ "core.fulllistofcourses": "moodle",
+ "core.fullnameandsitename": "local_moodlemobileapp",
+ "core.grades.average": "grades",
+ "core.grades.badgrade": "grades",
+ "core.grades.contributiontocoursetotal": "grades",
+ "core.grades.feedback": "grades",
+ "core.grades.grade": "grades",
+ "core.grades.gradeitem": "grades",
+ "core.grades.grades": "grades",
+ "core.grades.lettergrade": "grades",
+ "core.grades.nogradesreturned": "grades",
+ "core.grades.nooutcome": "grades",
+ "core.grades.percentage": "grades",
+ "core.grades.range": "grades",
+ "core.grades.rank": "grades",
+ "core.grades.weight": "grades",
+ "core.groupsseparate": "moodle",
+ "core.groupsvisible": "moodle",
+ "core.hasdatatosync": "local_moodlemobileapp",
+ "core.help": "moodle",
+ "core.hide": "moodle",
+ "core.hour": "moodle",
+ "core.hours": "moodle",
+ "core.humanreadablesize": "local_moodlemobileapp",
+ "core.image": "local_moodlemobileapp",
+ "core.imageviewer": "local_moodlemobileapp",
+ "core.info": "moodle",
+ "core.ios": "local_moodlemobileapp",
+ "core.labelsep": "langconfig",
+ "core.lastaccess": "moodle",
+ "core.lastdownloaded": "local_moodlemobileapp",
+ "core.lastmodified": "moodle",
+ "core.lastsync": "local_moodlemobileapp",
+ "core.layoutgrid": "workshopform_rubric",
+ "core.list": "moodle",
+ "core.listsep": "langconfig",
+ "core.loading": "moodle",
+ "core.loadmore": "local_moodlemobileapp",
+ "core.location": "moodle",
+ "core.login.auth_email": "auth_email/pluginname",
+ "core.login.authenticating": "local_moodlemobileapp",
+ "core.login.cancel": "moodle",
+ "core.login.checksiteversion": "local_moodlemobileapp",
+ "core.login.confirmdeletesite": "local_moodlemobileapp",
+ "core.login.connect": "local_moodlemobileapp",
+ "core.login.connecttomoodle": "local_moodlemobileapp",
+ "core.login.contactyouradministrator": "local_moodlemobileapp",
+ "core.login.contactyouradministratorissue": "local_moodlemobileapp",
+ "core.login.createaccount": "moodle",
+ "core.login.createuserandpass": "moodle",
+ "core.login.credentialsdescription": "local_moodlemobileapp",
+ "core.login.emailconfirmsent": "moodle",
+ "core.login.emailconfirmsentnoemail": "local_moodlemobileapp",
+ "core.login.emailconfirmsentsuccess": "moodle",
+ "core.login.emailnotmatch": "local_moodlemobileapp",
+ "core.login.enterthewordsabove": "auth",
+ "core.login.erroraccesscontrolalloworigin": "local_moodlemobileapp",
+ "core.login.errordeletesite": "local_moodlemobileapp",
+ "core.login.errorupdatesite": "local_moodlemobileapp",
+ "core.login.findyoursite": "local_moodlemobileapp",
+ "core.login.firsttime": "moodle",
+ "core.login.forgotten": "moodle",
+ "core.login.getanothercaptcha": "auth",
+ "core.login.help": "moodle",
+ "core.login.helpmelogin": "local_moodlemobileapp",
+ "core.login.instructions": "auth",
+ "core.login.invalidaccount": "local_moodlemobileapp",
+ "core.login.invaliddate": "calendar/errorinvaliddate",
+ "core.login.invalidemail": "moodle",
+ "core.login.invalidmoodleversion": "local_moodlemobileapp",
+ "core.login.invalidsite": "local_moodlemobileapp",
+ "core.login.invalidtime": "local_moodlemobileapp",
+ "core.login.invalidurl": "scorm",
+ "core.login.invalidvaluemax": "local_moodlemobileapp",
+ "core.login.invalidvaluemin": "local_moodlemobileapp",
+ "core.login.legacymoodleversion": "local_moodlemobileapp",
+ "core.login.legacymoodleversiondesktop": "local_moodlemobileapp",
+ "core.login.legacymoodleversiondesktopdownloadold": "local_moodlemobileapp",
+ "core.login.localmobileunexpectedresponse": "local_moodlemobileapp",
+ "core.login.loggedoutssodescription": "local_moodlemobileapp",
+ "core.login.login": "moodle",
+ "core.login.loginbutton": "local_moodlemobileapp",
+ "core.login.logininsiterequired": "local_moodlemobileapp",
+ "core.login.loginsteps": "moodle",
+ "core.login.missingemail": "moodle",
+ "core.login.missingfirstname": "moodle",
+ "core.login.missinglastname": "moodle",
+ "core.login.mobileservicesnotenabled": "local_moodlemobileapp",
+ "core.login.mustconfirm": "moodle",
+ "core.login.newaccount": "moodle",
+ "core.login.newsitedescription": "local_moodlemobileapp",
+ "core.login.notloggedin": "local_moodlemobileapp",
+ "core.login.password": "moodle",
+ "core.login.passwordforgotten": "moodle",
+ "core.login.passwordforgotteninstructions2": "moodle",
+ "core.login.passwordrequired": "local_moodlemobileapp",
+ "core.login.policyaccept": "moodle",
+ "core.login.policyagree": "moodle",
+ "core.login.policyagreement": "moodle",
+ "core.login.policyagreementclick": "moodle",
+ "core.login.potentialidps": "auth",
+ "core.login.problemconnectingerror": "local_moodlemobileapp",
+ "core.login.problemconnectingerrorcontinue": "local_moodlemobileapp",
+ "core.login.profileinvaliddata": "admin",
+ "core.login.recaptchachallengeimage": "local_moodlemobileapp",
+ "core.login.recaptchaexpired": "local_moodlemobileapp",
+ "core.login.recaptchaincorrect": "local_moodlemobileapp",
+ "core.login.reconnect": "local_moodlemobileapp",
+ "core.login.reconnectdescription": "local_moodlemobileapp",
+ "core.login.reconnectssodescription": "local_moodlemobileapp",
+ "core.login.resendemail": "moodle",
+ "core.login.searchby": "local_moodlemobileapp",
+ "core.login.security_question": "auth",
+ "core.login.selectacountry": "moodle",
+ "core.login.selectsite": "local_moodlemobileapp",
+ "core.login.signupplugindisabled": "local_moodlemobileapp",
+ "core.login.siteaddress": "local_moodlemobileapp",
+ "core.login.sitehasredirect": "local_moodlemobileapp",
+ "core.login.siteinmaintenance": "local_moodlemobileapp",
+ "core.login.sitepolicynotagreederror": "local_moodlemobileapp",
+ "core.login.siteurl": "local_moodlemobileapp",
+ "core.login.siteurlrequired": "local_moodlemobileapp",
+ "core.login.startsignup": "moodle",
+ "core.login.stillcantconnect": "local_moodlemobileapp",
+ "core.login.supplyinfo": "moodle",
+ "core.login.username": "moodle",
+ "core.login.usernameoremail": "moodle",
+ "core.login.usernamerequired": "local_moodlemobileapp",
+ "core.login.usernotaddederror": "error",
+ "core.login.visitchangepassword": "local_moodlemobileapp",
+ "core.login.webservicesnotenabled": "local_moodlemobileapp",
+ "core.lostconnection": "local_moodlemobileapp",
+ "core.mainmenu.appsettings": "local_moodlemobileapp",
+ "core.mainmenu.changesite": "local_moodlemobileapp",
+ "core.mainmenu.help": "moodle",
+ "core.mainmenu.logout": "moodle",
+ "core.mainmenu.website": "local_moodlemobileapp",
+ "core.maxsizeandattachments": "moodle",
+ "core.min": "moodle",
+ "core.mins": "moodle",
+ "core.mod_assign": "assign/pluginname",
+ "core.mod_assignment": "assignment/pluginname",
+ "core.mod_book": "book/pluginname",
+ "core.mod_chat": "chat/pluginname",
+ "core.mod_choice": "choice/pluginname",
+ "core.mod_data": "data/pluginname",
+ "core.mod_database": "data/pluginname",
+ "core.mod_external-tool": "lti/pluginname",
+ "core.mod_feedback": "feedback/pluginname",
+ "core.mod_file": "moodle/file",
+ "core.mod_folder": "folder/pluginname",
+ "core.mod_forum": "forum/pluginname",
+ "core.mod_glossary": "glossary/pluginname",
+ "core.mod_ims": "imscp/pluginname",
+ "core.mod_imscp": "imscp/pluginname",
+ "core.mod_label": "label/pluginname",
+ "core.mod_lesson": "lesson/pluginname",
+ "core.mod_lti": "lti/pluginname",
+ "core.mod_page": "page/pluginname",
+ "core.mod_quiz": "quiz/pluginname",
+ "core.mod_resource": "resource/pluginname",
+ "core.mod_scorm": "scorm/pluginname",
+ "core.mod_survey": "survey/pluginname",
+ "core.mod_url": "url/pluginname",
+ "core.mod_wiki": "wiki/pluginname",
+ "core.mod_workshop": "workshop/pluginname",
+ "core.moduleintro": "moodle",
+ "core.more": "moodle",
+ "core.mygroups": "group",
+ "core.name": "moodle",
+ "core.networkerroriframemsg": "local_moodlemobileapp",
+ "core.networkerrormsg": "local_moodlemobileapp",
+ "core.never": "moodle",
+ "core.next": "moodle",
+ "core.no": "moodle",
+ "core.nocomments": "moodle",
+ "core.nograde": "moodle",
+ "core.none": "moodle",
+ "core.nopasswordchangeforced": "local_moodlemobileapp",
+ "core.nopermissionerror": "local_moodlemobileapp",
+ "core.nopermissions": "error",
+ "core.noresults": "moodle",
+ "core.notapplicable": "local_moodlemobileapp",
+ "core.notice": "moodle",
+ "core.notsent": "local_moodlemobileapp",
+ "core.now": "moodle",
+ "core.numwords": "moodle",
+ "core.offline": "message",
+ "core.ok": "moodle",
+ "core.online": "message",
+ "core.openfullimage": "local_moodlemobileapp",
+ "core.openinbrowser": "local_moodlemobileapp",
+ "core.othergroups": "group",
+ "core.pagea": "moodle",
+ "core.parentlanguage": "langconfig",
+ "core.paymentinstant": "moodle",
+ "core.percentagenumber": "local_moodlemobileapp",
+ "core.phone": "moodle",
+ "core.pictureof": "moodle",
+ "core.previous": "moodle",
+ "core.proceed": "moodle",
+ "core.pulltorefresh": "local_moodlemobileapp",
+ "core.question.answer": "question",
+ "core.question.answersaved": "question",
+ "core.question.cannotdeterminestatus": "local_moodlemobileapp",
+ "core.question.certainty": "qbehaviour_deferredcbm",
+ "core.question.complete": "question",
+ "core.question.correct": "question",
+ "core.question.errorattachmentsnotsupported": "local_moodlemobileapp",
+ "core.question.errorinlinefilesnotsupported": "local_moodlemobileapp",
+ "core.question.errorquestionnotsupported": "local_moodlemobileapp",
+ "core.question.feedback": "question",
+ "core.question.howtodraganddrop": "local_moodlemobileapp",
+ "core.question.incorrect": "question",
+ "core.question.information": "question",
+ "core.question.invalidanswer": "question",
+ "core.question.notanswered": "question",
+ "core.question.notyetanswered": "question",
+ "core.question.partiallycorrect": "question",
+ "core.question.questionmessage": "local_moodlemobileapp",
+ "core.question.questionno": "question",
+ "core.question.requiresgrading": "question",
+ "core.quotausage": "moodle",
+ "core.redirectingtosite": "local_moodlemobileapp",
+ "core.refresh": "moodle",
+ "core.remove": "moodle",
+ "core.required": "moodle",
+ "core.requireduserdatamissing": "local_moodlemobileapp",
+ "core.resources": "moodle",
+ "core.restore": "moodle",
+ "core.retry": "local_moodlemobileapp",
+ "core.save": "moodle",
+ "core.search": "moodle",
+ "core.searching": "local_moodlemobileapp",
+ "core.searchresults": "moodle",
+ "core.sec": "moodle",
+ "core.secs": "moodle",
+ "core.seemoredetail": "survey",
+ "core.send": "message",
+ "core.sending": "chat",
+ "core.serverconnection": "error",
+ "core.settings.about": "local_moodlemobileapp",
+ "core.settings.appready": "local_moodlemobileapp",
+ "core.settings.cannotsyncoffline": "local_moodlemobileapp",
+ "core.settings.cannotsyncwithoutwifi": "local_moodlemobileapp",
+ "core.settings.compilationinfo": "local_moodlemobileapp",
+ "core.settings.cordovadevicemodel": "local_moodlemobileapp",
+ "core.settings.cordovadeviceosversion": "local_moodlemobileapp",
+ "core.settings.cordovadeviceplatform": "local_moodlemobileapp",
+ "core.settings.cordovadeviceuuid": "local_moodlemobileapp",
+ "core.settings.cordovaversion": "local_moodlemobileapp",
+ "core.settings.currentlanguage": "moodle",
+ "core.settings.debugdisplay": "admin",
+ "core.settings.debugdisplaydescription": "local_moodlemobileapp",
+ "core.settings.deletesitefiles": "local_moodlemobileapp",
+ "core.settings.deletesitefilestitle": "local_moodlemobileapp",
+ "core.settings.deviceinfo": "local_moodlemobileapp",
+ "core.settings.deviceos": "local_moodlemobileapp",
+ "core.settings.devicewebworkers": "local_moodlemobileapp",
+ "core.settings.disableall": "message",
+ "core.settings.disabled": "lesson",
+ "core.settings.displayformat": "local_moodlemobileapp",
+ "core.settings.enabledownloadsection": "local_moodlemobileapp",
+ "core.settings.enablerichtexteditor": "local_moodlemobileapp",
+ "core.settings.enablerichtexteditordescription": "local_moodlemobileapp",
+ "core.settings.enablesyncwifi": "local_moodlemobileapp",
+ "core.settings.errordeletesitefiles": "local_moodlemobileapp",
+ "core.settings.errorsyncsite": "local_moodlemobileapp",
+ "core.settings.estimatedfreespace": "local_moodlemobileapp",
+ "core.settings.filesystemroot": "local_moodlemobileapp",
+ "core.settings.general": "moodle",
+ "core.settings.language": "moodle",
+ "core.settings.license": "moodle",
+ "core.settings.localnotifavailable": "local_moodlemobileapp",
+ "core.settings.locationhref": "local_moodlemobileapp",
+ "core.settings.locked": "admin",
+ "core.settings.loggedin": "message",
+ "core.settings.loggedoff": "message",
+ "core.settings.navigatorlanguage": "local_moodlemobileapp",
+ "core.settings.navigatoruseragent": "local_moodlemobileapp",
+ "core.settings.networkstatus": "local_moodlemobileapp",
+ "core.settings.privacypolicy": "local_moodlemobileapp",
+ "core.settings.reportinbackground": "local_moodlemobileapp",
+ "core.settings.settings": "moodle",
+ "core.settings.showdownloadoptions": "local_moodlemobileapp",
+ "core.settings.sites": "moodle",
+ "core.settings.spaceusage": "local_moodlemobileapp",
+ "core.settings.synchronization": "local_moodlemobileapp",
+ "core.settings.synchronizenow": "local_moodlemobileapp",
+ "core.settings.syncsettings": "local_moodlemobileapp",
+ "core.settings.total": "moodle",
+ "core.settings.versioncode": "local_moodlemobileapp",
+ "core.settings.versionname": "local_moodlemobileapp",
+ "core.settings.wificonnection": "local_moodlemobileapp",
+ "core.sharedfiles.chooseaccountstorefile": "local_moodlemobileapp",
+ "core.sharedfiles.chooseactionrepeatedfile": "local_moodlemobileapp",
+ "core.sharedfiles.errorreceivefilenosites": "local_moodlemobileapp",
+ "core.sharedfiles.nosharedfiles": "local_moodlemobileapp",
+ "core.sharedfiles.nosharedfilestoupload": "local_moodlemobileapp",
+ "core.sharedfiles.rename": "local_moodlemobileapp",
+ "core.sharedfiles.replace": "local_moodlemobileapp",
+ "core.sharedfiles.sharedfiles": "local_moodlemobileapp",
+ "core.sharedfiles.successstorefile": "local_moodlemobileapp",
+ "core.show": "moodle",
+ "core.showmore": "form",
+ "core.site": "moodle",
+ "core.sitehome.sitehome": "moodle",
+ "core.sitehome.sitenews": "moodle",
+ "core.sitemaintenance": "admin",
+ "core.sizeb": "moodle",
+ "core.sizegb": "moodle",
+ "core.sizekb": "moodle",
+ "core.sizemb": "moodle",
+ "core.sizetb": "local_moodlemobileapp",
+ "core.sorry": "local_moodlemobileapp",
+ "core.sortby": "moodle",
+ "core.start": "grouptool",
+ "core.strftimedate": "langconfig",
+ "core.strftimedatefullshort": "langconfig",
+ "core.strftimedateshort": "langconfig",
+ "core.strftimedatetime": "langconfig",
+ "core.strftimedatetimeshort": "langconfig",
+ "core.strftimedaydate": "langconfig",
+ "core.strftimedaydatetime": "langconfig",
+ "core.strftimedayshort": "langconfig",
+ "core.strftimedaytime": "langconfig",
+ "core.strftimemonthyear": "langconfig",
+ "core.strftimerecent": "langconfig",
+ "core.strftimerecentfull": "langconfig",
+ "core.strftimetime": "langconfig",
+ "core.strftimetime12": "langconfig",
+ "core.strftimetime24": "langconfig",
+ "core.submit": "moodle",
+ "core.success": "moodle",
+ "core.tablet": "local_moodlemobileapp",
+ "core.teachers": "moodle",
+ "core.thereisdatatosync": "local_moodlemobileapp",
+ "core.thisdirection": "langconfig",
+ "core.time": "moodle",
+ "core.timesup": "quiz",
+ "core.today": "moodle",
+ "core.tryagain": "local_moodlemobileapp",
+ "core.twoparagraphs": "local_moodlemobileapp",
+ "core.uhoh": "local_moodlemobileapp",
+ "core.unexpectederror": "local_moodlemobileapp",
+ "core.unicodenotsupported": "local_moodlemobileapp",
+ "core.unicodenotsupportedcleanerror": "local_moodlemobileapp",
+ "core.unknown": "local_moodlemobileapp",
+ "core.unlimited": "moodle",
+ "core.unzipping": "local_moodlemobileapp",
+ "core.upgraderunning": "error",
+ "core.user.address": "moodle",
+ "core.user.city": "moodle",
+ "core.user.contact": "local_moodlemobileapp",
+ "core.user.country": "moodle",
+ "core.user.description": "moodle",
+ "core.user.details": "report_security",
+ "core.user.detailsnotavailable": "local_moodlemobileapp",
+ "core.user.editingteacher": "moodle/defaultcourseteacher",
+ "core.user.email": "moodle",
+ "core.user.emailagain": "moodle",
+ "core.user.errorloaduser": "local_moodlemobileapp",
+ "core.user.firstname": "moodle",
+ "core.user.interests": "moodle",
+ "core.user.lastname": "moodle",
+ "core.user.manager": "role",
+ "core.user.newpicture": "moodle",
+ "core.user.noparticipants": "error",
+ "core.user.participants": "moodle",
+ "core.user.phone1": "moodle",
+ "core.user.phone2": "moodle",
+ "core.user.roles": "moodle",
+ "core.user.sendemail": "local_moodlemobileapp",
+ "core.user.student": "moodle/defaultcoursestudent",
+ "core.user.teacher": "moodle/noneditingteacher",
+ "core.user.webpage": "moodle",
+ "core.userdeleted": "moodle",
+ "core.userdetails": "moodle",
+ "core.usernotfullysetup": "error",
+ "core.users": "moodle",
+ "core.view": "moodle",
+ "core.viewcode": "local_moodlemobileapp",
+ "core.vieweditor": "local_moodlemobileapp",
+ "core.viewembeddedcontent": "local_moodlemobileapp",
+ "core.viewprofile": "moodle",
+ "core.warningofflinedatadeleted": "local_moodlemobileapp",
+ "core.whatisyourage": "moodle",
+ "core.wheredoyoulive": "moodle",
+ "core.whoops": "local_moodlemobileapp",
+ "core.whyisthishappening": "local_moodlemobileapp",
+ "core.whyisthisrequired": "moodle",
+ "core.windowsphone": "local_moodlemobileapp",
+ "core.wsfunctionnotavailable": "local_moodlemobileapp",
+ "core.year": "moodle",
+ "core.years": "moodle",
+ "core.yes": "moodle"
+}
diff --git a/scripts/moodle_to_json.php b/scripts/moodle_to_json.php
new file mode 100644
index 000000000..2eccc8c1d
--- /dev/null
+++ b/scripts/moodle_to_json.php
@@ -0,0 +1,388 @@
+.
+
+/**
+ * Script for converting moodle strings to json.
+ */
+
+// Check we are in CLI.
+if (isset($_SERVER['REMOTE_ADDR'])) {
+ exit(1);
+}
+define('MOODLE_INTERNAL', 1);
+define('LANGPACKSFOLDER', '../../moodle-langpacks');
+define('ASSETSPATH', '../src/assets/lang/');
+define('CONFIG', '../src/config.json');
+
+$config = file_get_contents(CONFIG);
+$config = (array) json_decode($config);
+$config_langs = array_keys(get_object_vars($config['languages']));
+
+// Set languages to do. If script is called using a language it will be used as unique.
+if (isset($argv[1]) && !empty($argv[1])) {
+ $forcedetect = false;
+ $languages = explode(',', $argv[1]);
+} else {
+ $forcedetect = true;
+ $languages = $config_langs;
+}
+
+// Process the index file, just once.
+$keys = file_get_contents('langindex.json');
+$keys = (array) json_decode($keys);
+
+foreach ($keys as $key => $value) {
+ $map = new StdClass();
+ if ($value == 'local_moodlemobileapp') {
+ $map->file = $value;
+ $map->string = $key;
+ } else {
+ $exp = explode('/', $value, 2);
+ $map->file = $exp[0];
+ if (count($exp) == 2) {
+ $map->string = $exp[1];
+ } else {
+ $exp = explode('.', $key, 3);
+
+ if (count($exp) == 3) {
+ $map->string = $exp[2];
+ } else {
+ $map->string = $exp[1];
+ }
+ }
+ }
+
+ $keys[$key] = $map;
+}
+$total = count ($keys);
+
+echo "Total strings to translate $total\n";
+
+$add_langs = array();
+// Process the languages.
+foreach ($languages as $lang) {
+ $ok = build_lang($lang, $keys, $total);
+ if ($ok) {
+ $add_langs[$lang] = $lang;
+ }
+}
+
+if ($forcedetect) {
+ echo "\n\n\n";
+
+ $all_languages = glob(LANGPACKSFOLDER.'/*' , GLOB_ONLYDIR);
+ function get_lang_from_dir($dir) {
+ return str_replace('_', '-', explode('/', $dir)[3]);
+ }
+ $all_languages = array_map('get_lang_from_dir', $all_languages);
+ $detect_lang = array_diff($all_languages, $languages);
+ $new_langs = array();
+ foreach ($detect_lang as $lang) {
+ $new = detect_lang($lang, $keys, $total);
+ if ($new) {
+ $new_langs[$lang] = $lang;
+ }
+ }
+
+ if (!empty($new_langs)) {
+ echo "\n\n\nThe following languages are going to be added\n\n\n";
+ foreach ($new_langs as $lang) {
+ $ok = build_lang($lang, $keys, $total);
+ if ($ok) {
+ $add_langs[$lang] = $lang;
+ }
+ }
+ add_langs_to_config($add_langs, $config);
+ }
+} else {
+ add_langs_to_config($add_langs, $config);
+}
+
+function add_langs_to_config($langs, $config) {
+ $changed = false;
+ $config_langs = get_object_vars($config['languages']);
+ foreach ($langs as $lang) {
+ if (!isset($config_langs[$lang])) {
+ $langfoldername = str_replace('-', '_', $lang);
+
+ $string = [];
+ include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
+ $config['languages']->$lang = $string['thislanguage'];
+ $changed = true;
+ }
+ }
+
+ if ($changed) {
+ // Sort languages by key.
+ $config['languages'] = json_decode( json_encode( $config['languages'] ), true );
+ ksort($config['languages']);
+ $config['languages'] = json_decode( json_encode( $config['languages'] ), false );
+ file_put_contents(CONFIG, json_encode($config, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
+ }
+}
+
+function build_lang($lang, $keys, $total) {
+ $local = 0;
+ $langFile = false;
+ $translations = [];
+ $langfoldername = str_replace('-', '_', $lang);
+
+ if (!is_dir(LANGPACKSFOLDER.'/'.$langfoldername) || !is_file(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php')) {
+ echo "Cannot translate $langfoldername, folder not found";
+ return false;
+ }
+
+ $string = [];
+ include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
+ $parent = isset($string['parentlanguage']) ? $string['parentlanguage'] : "";
+
+ echo "Processing $lang";
+ if ($parent != "" && $parent != $lang) {
+ echo "($parent)";
+ }
+
+
+ // Add the translation to the array.
+ foreach ($keys as $key => $value) {
+ $file = LANGPACKSFOLDER.'/'.$langfoldername.'/'.$value->file.'.php';
+ // Apply translations.
+ if (!file_exists($file)) {
+ continue;
+ }
+
+ $string = [];
+ include($file);
+
+ if (!isset($string[$value->string])) {
+ // Not yet translated. Do not override.
+ if (!$langFile) {
+ // Load lang fils just once.
+ $langFile = file_get_contents(ASSETSPATH.$lang.'.json');
+ $langFile = (array) json_decode($langFile);
+ }
+ if (is_array($langFile) && isset($langFile[$key])) {
+ $translations[$key] = $langFile[$key];
+ $local++;
+ }
+ continue;
+ } else {
+ $text = $string[$value->string];
+ }
+
+ if ($value->file != 'local_moodlemobileapp') {
+ $text = str_replace('$a->', '$a.', $text);
+ $text = str_replace('{$a', '{{$a', $text);
+ $text = str_replace('}', '}}', $text);
+ // Prevent double.
+ $text = str_replace(array('{{{', '}}}'), array('{{', '}}'), $text);
+ } else {
+ $local++;
+ }
+
+ $translations[$key] = html_entity_decode($text);
+ }
+
+ // Sort and save.
+ ksort($translations);
+ file_put_contents(ASSETSPATH.$lang.'.json', str_replace('\/', '/', json_encode($translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)));
+
+ $success = count($translations);
+ $percentage = floor($success/$total *100);
+ echo "\t\t$success of $total -> $percentage% ($local local)\n";
+
+ if ($lang == 'en') {
+ generate_local_moodlemobileapp($keys, $translations);
+ override_component_lang_files($keys, $translations);
+ }
+
+ return true;
+}
+
+function detect_lang($lang, $keys, $total) {
+ $success = 0;
+ $local = 0;
+ $langfoldername = str_replace('-', '_', $lang);
+
+ if (!is_dir(LANGPACKSFOLDER.'/'.$langfoldername) || !is_file(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php')) {
+ echo "Cannot translate $langfoldername, folder not found";
+ return false;
+ }
+
+ $string = [];
+ include(LANGPACKSFOLDER.'/'.$langfoldername.'/langconfig.php');
+ $parent = isset($string['parentlanguage']) ? $string['parentlanguage'] : "";
+ if (!isset($string['thislanguage'])) {
+ echo "Cannot translate $langfoldername, name not found";
+ return false;
+ }
+
+ echo "Checking $lang";
+ if ($parent != "" && $parent != $lang) {
+ echo "($parent)";
+ }
+ $langname = $string['thislanguage'];
+ echo " ".$langname." -D";
+
+ // Add the translation to the array.
+ foreach ($keys as $key => $value) {
+ $file = LANGPACKSFOLDER.'/'.$langfoldername.'/'.$value->file.'.php';
+ // Apply translations.
+ if (!file_exists($file)) {
+ continue;
+ }
+
+ $string = [];
+ include($file);
+
+ if (!isset($string[$value->string])) {
+ continue;
+ } else {
+ $text = $string[$value->string];
+ }
+
+ if ($value->file == 'local_moodlemobileapp') {
+ $local++;
+ }
+
+ $success++;
+ }
+
+ $percentage = floor($success/$total *100);
+ echo "\t\t$success of $total -> $percentage% ($local local)";
+ if (($percentage > 75 && $local > 50) || ($percentage > 50 && $local > 75)) {
+ echo " \t DETECTED\n";
+ return true;
+ }
+ echo "\n";
+
+ return false;
+}
+
+function save_key($key, $value, $path) {
+ $filePath = $path . '/en.json';
+
+ $file = file_get_contents($filePath);
+ $file = (array) json_decode($file);
+ $value = html_entity_decode($value);
+ if ($file[$key] != $value) {
+ $file[$key] = $value;
+ ksort($file);
+ file_put_contents($filePath, str_replace('\/', '/', json_encode($file, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)));
+ }
+}
+
+function override_component_lang_files($keys, $translations) {
+ echo "Override component lang files.\n";
+ foreach ($translations as $key => $value) {
+ $path = '../src/';
+ $exp = explode('.', $key, 3);
+
+ $type = $exp[0];
+ if (count($exp) == 3) {
+ $component = $exp[1];
+ $plainid = $exp[2];
+ } else {
+ $component = 'moodle';
+ $plainid = $exp[1];
+ }
+ switch($type) {
+ case 'core':
+ case 'addon':
+ switch($component) {
+ case 'moodle':
+ $path .= 'lang';
+ break;
+ default:
+ $path .= $type.'/'.str_replace('_', '/', $component).'/lang';
+ break;
+ }
+ break;
+ case 'assets':
+ $path .= $type.'/'.$component;
+ break;
+
+ }
+
+ if (is_file($path.'/en.json')) {
+ save_key($plainid, $value, $path);
+ }
+ }
+}
+
+/**
+ * Generates local moodle mobile app file to update languages in AMOS.
+ *
+ * @param [array] $keys Translation keys.
+ * @param [array] $translations English translations.
+ */
+function generate_local_moodlemobileapp($keys, $translations) {
+ echo "Generate local_moodlemobileapp.\n";
+ $string = '.
+
+/**
+ * Version details.
+ *
+ * @package local
+ * @subpackage moodlemobileapp
+ * @copyright 2014 Juan Leyva
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$string[\'appstoredescription\'] = \'NOTE: This official Moodle Mobile app will ONLY work with Moodle sites that have been set up to allow it. Please talk to your Moodle administrator if you have any problems connecting.
+
+If your Moodle site has been configured correctly, you can use this app to:
+
+- browse the content of your courses, even when offline
+- receive instant notifications of messages and other events
+- quickly find and contact other people in your courses
+- upload images, audio, videos and other files from your mobile device
+- view your course grades
+- and more!
+
+Please see http://docs.moodle.org/en/Mobile_app for all the latest information.
+
+We’d really appreciate any good reviews about the functionality so far, and your suggestions on what else you want this app to do!
+
+The app requires the following permissions:
+Record audio - For recording audio to upload to Moodle
+Read and modify the contents of your SD card - Contents are downloaded to the SD Card so you can see them offline
+Network access - To be able to connect with your Moodle site and check if you are connected or not to switch to offline mode
+Run at startup - So you receive local notifications even when the app is running in the background
+Prevent phone from sleeping - So you can receive push notifications anytime\';'."\n";
+ foreach ($keys as $key => $value) {
+ if (isset($translations[$key]) && $value->file == 'local_moodlemobileapp') {
+ $string .= '$string[\''.$key.'\'] = \''.str_replace("'", "\'", $translations[$key]).'\';'."\n";
+ }
+ }
+ $string .= '$string[\'pluginname\'] = \'Moodle Mobile language strings\';'."\n";
+
+ file_put_contents('../../moodle-local_moodlemobileapp/lang/en/local_moodlemobileapp.php', $string."\n");
+}
+
diff --git a/src/addon/badges/lang/ar.json b/src/addon/badges/lang/ar.json
deleted file mode 100755
index edc0b0d08..000000000
--- a/src/addon/badges/lang/ar.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "badges": "شارات",
- "expired": "عذراً، تم إغلاق هذا النشاط في {{$a}} وهو غير متوفر الآن."
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/bg.json b/src/addon/badges/lang/bg.json
deleted file mode 100755
index 4f6540a4a..000000000
--- a/src/addon/badges/lang/bg.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "badgedetails": "Елементи на значката",
- "badges": "Значки",
- "contact": "Контакт",
- "expired": "За съжаление тази дейност е затворена от {{$a}} и вече не е достъпна",
- "expirydate": "Дата на изтичане",
- "issuancedetails": "Срок на значката",
- "issuerdetails": "Данни за връчващия",
- "issuername": "Име на връчващия",
- "nobadges": "Няма налични значки."
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/ca.json b/src/addon/badges/lang/ca.json
deleted file mode 100755
index 4dd96b8a1..000000000
--- a/src/addon/badges/lang/ca.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalls de la insígnia",
- "badges": "Insígnies",
- "contact": "Contacte",
- "dateawarded": "Data publicada",
- "expired": "Aquesta activitat es va tancar el dia {{$a}} i ja no està disponible.",
- "expirydate": "Data d'expiració",
- "issuancedetails": "Expiració de la insígnia",
- "issuerdetails": "Detalls de l'atorgador",
- "issuername": "Nom de l'atorgador",
- "nobadges": "No hi ha insígnies disponibles.",
- "recipientdetails": "Detalls del receptor"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/cs.json b/src/addon/badges/lang/cs.json
deleted file mode 100755
index 95347f65d..000000000
--- a/src/addon/badges/lang/cs.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detaily odznaku",
- "badges": "Odznaky",
- "contact": "Kontakt",
- "dateawarded": "Datum udělení",
- "expired": "Je nám líto, tato činnost byla uzavřena {{$a}} a není nadále dostupná",
- "expirydate": "Datum vypršení platnosti",
- "issuancedetails": "Vypršení platnosti odznaku",
- "issuerdetails": "Podrobnosti o vydavateli",
- "issuername": "Jméno vydavatele",
- "nobadges": "Žádné odznaky nejsou k dispozici.",
- "recipientdetails": "Podrobnosti o příjemci"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/da.json b/src/addon/badges/lang/da.json
deleted file mode 100755
index 5693c0af2..000000000
--- a/src/addon/badges/lang/da.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Badgedetaljer",
- "badges": "Badges",
- "contact": "Kontakt",
- "dateawarded": "Udstedelsesdato",
- "expired": "Beklager, denne aktivitet er lukket d. {{$a}} og er ikke længere tilgængelig",
- "expirydate": "Udløbsdato",
- "issuancedetails": "Badge-udløb",
- "issuerdetails": "Udstederdata",
- "issuername": "Udsteders navn",
- "nobadges": "Der er ingen tilgængelige badges.",
- "recipientdetails": "Modtagerdata"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/de-du.json b/src/addon/badges/lang/de-du.json
deleted file mode 100755
index 14bde8d8e..000000000
--- a/src/addon/badges/lang/de-du.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Grundeinstellungen",
- "badges": "Auszeichnungen",
- "contact": "Kontakt",
- "dateawarded": "Verleihdatum",
- "expired": "Diese Abstimmung ist seit {{$a}} beendet. Eine Auswahl ist nicht mehr möglich.",
- "expirydate": "Ablaufdatum",
- "issuancedetails": "Ablauf festlegen",
- "issuerdetails": "Verleiher",
- "issuername": "Verleiher",
- "nobadges": "Keine Auszeichnungen verfügbar",
- "recipientdetails": "Empfängerdetails"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/de.json b/src/addon/badges/lang/de.json
deleted file mode 100755
index 14bde8d8e..000000000
--- a/src/addon/badges/lang/de.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Grundeinstellungen",
- "badges": "Auszeichnungen",
- "contact": "Kontakt",
- "dateawarded": "Verleihdatum",
- "expired": "Diese Abstimmung ist seit {{$a}} beendet. Eine Auswahl ist nicht mehr möglich.",
- "expirydate": "Ablaufdatum",
- "issuancedetails": "Ablauf festlegen",
- "issuerdetails": "Verleiher",
- "issuername": "Verleiher",
- "nobadges": "Keine Auszeichnungen verfügbar",
- "recipientdetails": "Empfängerdetails"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/el.json b/src/addon/badges/lang/el.json
deleted file mode 100755
index 41294c41e..000000000
--- a/src/addon/badges/lang/el.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "badges": "Βραβεία",
- "expired": "Η δραστηριότητα αυτή έκλεισε στις {{$a}} και δεν είναι πλέον διαθέσιμη"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/en.json b/src/addon/badges/lang/en.json
index 4443773c4..71a943904 100644
--- a/src/addon/badges/lang/en.json
+++ b/src/addon/badges/lang/en.json
@@ -1,13 +1,29 @@
{
+ "alignment": "Competency",
"badgedetails": "Badge details",
"badges": "Badges",
+ "bendorsement": "Endorsement",
+ "claimcomment": "Endorsement comment",
+ "claimid": "Claim URL",
"contact": "Contact",
"dateawarded": "Date issued",
"expired": "Expired",
"expirydate": "Expiry date",
+ "imageauthoremail": "Image author's email",
+ "imageauthorname": "Image author's name",
+ "imageauthorurl": "Image author's URL",
+ "imagecaption": "Image caption",
"issuancedetails": "Badge expiry",
"issuerdetails": "Issuer details",
+ "issueremail": "Email",
"issuername": "Issuer name",
+ "issuerurl": "Issuer URL",
+ "language": "Language",
+ "noalignment": "This badge does not have any competencies specified.",
"nobadges": "There are no badges available.",
- "recipientdetails": "Recipient details"
-}
+ "norelated": "This badge does not have any related badges.",
+ "recipientdetails": "Recipient details",
+ "relatedbages": "Related badges",
+ "version": "Version",
+ "warnexpired": "(This badge has expired!)"
+}
\ No newline at end of file
diff --git a/src/addon/badges/lang/es-mx.json b/src/addon/badges/lang/es-mx.json
deleted file mode 100755
index fbddeff83..000000000
--- a/src/addon/badges/lang/es-mx.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalles de insignia",
- "badges": "Insignias",
- "contact": "Contacto",
- "dateawarded": "Fecha de emisión",
- "expired": "Lo sentimos, esta actividad se cerró el {{$a}} y ya no está disponible",
- "expirydate": "Fecha de caducidad",
- "issuancedetails": "Caducidad de insignia",
- "issuerdetails": "Detalles del emisor",
- "issuername": "Nombre del emisor",
- "nobadges": "No hay insignias disponibles.",
- "recipientdetails": "Detalles de receptores"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/es.json b/src/addon/badges/lang/es.json
deleted file mode 100755
index bf84b0d2b..000000000
--- a/src/addon/badges/lang/es.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalles de la insignia",
- "badges": "Insignias",
- "contact": "Contacto",
- "dateawarded": "Fecha de la emisión",
- "expired": "Lo sentimos, esta actividad se cerró el {{$a}} y ya no está disponible",
- "expirydate": "Fecha de expiración",
- "issuancedetails": "Caducidad de la insignia",
- "issuerdetails": "Detalles del emisor",
- "issuername": "Nombre del emisor",
- "nobadges": "No hay insignias disponibles",
- "recipientdetails": "Detalles del destinatario"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/eu.json b/src/addon/badges/lang/eu.json
deleted file mode 100755
index 600530dd8..000000000
--- a/src/addon/badges/lang/eu.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Dominaren xehetasunak",
- "badges": "Dominak",
- "contact": "Kontaktua",
- "dateawarded": "Emate-data",
- "expired": "Sentitzen dugu, jarduera hau {{$a}}(e)an itxi zen eta dagoeneko ez dago eskuragarri.",
- "expirydate": "Epemugaren data",
- "issuancedetails": "Dominaren iraungitzea",
- "issuerdetails": "Emailearen xehetasunak",
- "issuername": "Emailearen izena",
- "nobadges": "Ez dago dominarik eskura.",
- "recipientdetails": "Jasotzailearen zehaztasunak"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/fa.json b/src/addon/badges/lang/fa.json
deleted file mode 100755
index 12d37d7a4..000000000
--- a/src/addon/badges/lang/fa.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "مشخصات مدال",
- "badges": "مدالها",
- "contact": "تماس",
- "dateawarded": "تاریخ صدور",
- "expired": "با عرض پوزش، این فعالیت در {{$a}} بسته شد و دیگر در دسترس نیست",
- "expirydate": "تاریخ انقضا",
- "issuancedetails": "انقضای مدال",
- "issuerdetails": "مشخصات صادرکننده",
- "issuername": "نام صادرکننده",
- "nobadges": "مدالی موجود نیست.",
- "recipientdetails": "مشخصات دریافتکننده"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/fi.json b/src/addon/badges/lang/fi.json
deleted file mode 100755
index b38f0f9a3..000000000
--- a/src/addon/badges/lang/fi.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Osaamismerkin tiedot",
- "badges": "Osaamismerkit",
- "contact": "Yhteystieto",
- "dateawarded": "Myöntämispäivä",
- "expired": "Tämä aktiviteeti on suljettu {{$a}} eikä ole enää käytettävissä.",
- "expirydate": "Vanhenemispäivä",
- "issuancedetails": "Osaamismerkin vanhentuminen",
- "issuerdetails": "Osaamismerkin myöntäjän tiedot",
- "issuername": "Osaamismerkin myöntäjän nimi",
- "nobadges": "Yhtään osaamismerkkiä ei ole tarjolla",
- "recipientdetails": "Vastaanottajan tiedot"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/fr.json b/src/addon/badges/lang/fr.json
deleted file mode 100755
index c3194b478..000000000
--- a/src/addon/badges/lang/fr.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Description du badge",
- "badges": "Badges",
- "contact": "Contact",
- "dateawarded": "Date de remise",
- "expired": "Désolé, cette activité s'est terminée le {{$a}} et n'est plus disponible",
- "expirydate": "Date d'échéance",
- "issuancedetails": "Échéance du badge",
- "issuerdetails": "Détail de l'émetteur",
- "issuername": "Nom de l'émetteur",
- "nobadges": "Il n'y a pas de badge disponible.",
- "recipientdetails": "Infos détenteur"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/he.json b/src/addon/badges/lang/he.json
deleted file mode 100755
index 53e1eb6b7..000000000
--- a/src/addon/badges/lang/he.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "פרטי ההישג",
- "badges": "הישגים",
- "contact": "ליצירת קשר",
- "dateawarded": "תאריך הקבלה",
- "expired": "מצטערים, פעילות זו נסגרה על {{$a}} והיא איננה זמינה יותר",
- "expirydate": "תאריך תפוגה",
- "issuancedetails": "מועד תפוגת ההישג",
- "issuerdetails": "פרטי הגורם אשר העניק את ההישג",
- "issuername": "שם מעניק ההישג",
- "nobadges": "אין הישגים זמינים.",
- "recipientdetails": "פרטי המכותב"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/hr.json b/src/addon/badges/lang/hr.json
deleted file mode 100755
index 6cfa7c095..000000000
--- a/src/addon/badges/lang/hr.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalji značke",
- "badges": "Značke",
- "contact": "Kontakt",
- "dateawarded": "Datum izdavanja",
- "expired": "Nažalost, ova aktivnost je zatvorena od {{$a}} i nije više dostupna",
- "expirydate": "Datum isteka",
- "issuancedetails": "Istek značke",
- "issuerdetails": "Detalji o izdavaču",
- "issuername": "Ime izdavača",
- "nobadges": "Nema dostupnih značaka.",
- "recipientdetails": "Podaci o dobitniku"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/hu.json b/src/addon/badges/lang/hu.json
deleted file mode 100755
index 7ce39e4cb..000000000
--- a/src/addon/badges/lang/hu.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Részletek",
- "badges": "Kitűzők",
- "contact": "Kapcsolat",
- "dateawarded": "Kiadás dátuma",
- "expired": "Ez a tevékenység {{$a}} időpontban lezárult és már nem érhető el",
- "expirydate": "Lejárat időpontja",
- "issuancedetails": "A kitűző lejárata",
- "issuerdetails": "Az adományozó adatai",
- "issuername": "Az adományozó neve",
- "nobadges": "Nincs elérhető kitűző.",
- "recipientdetails": "A megjutalmazott adatai"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/it.json b/src/addon/badges/lang/it.json
deleted file mode 100755
index b1694dc48..000000000
--- a/src/addon/badges/lang/it.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Dettagli badge",
- "badges": "Badge",
- "contact": "Contatto",
- "dateawarded": "Data di rilascio",
- "expired": "Spiacente, questa attività è stata chiusa il {{$a}} e non è più disponibile",
- "expirydate": "Data di scadenza",
- "issuancedetails": "Scadenza badge",
- "issuerdetails": "Dettagli di chi rilascia il badge",
- "issuername": "Nome di chi rilascia il badge",
- "nobadges": "Non sono presenti badge.",
- "recipientdetails": "Dettagli destinatario"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/ja.json b/src/addon/badges/lang/ja.json
deleted file mode 100755
index 9a8239a43..000000000
--- a/src/addon/badges/lang/ja.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "バッジ詳細",
- "badges": "バッジ",
- "contact": "連絡先",
- "dateawarded": "発効日",
- "expired": "申し訳ございません、この活動は {{$a}} に終了しているため、これ以上利用することはできません。",
- "expirydate": "有効期限",
- "issuancedetails": "バッジ有効期限",
- "issuerdetails": "発行者詳細",
- "issuername": "発行者名",
- "nobadges": "利用できるバッジはありません。",
- "recipientdetails": "取得者詳細"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/ko.json b/src/addon/badges/lang/ko.json
deleted file mode 100755
index 9e30623e4..000000000
--- a/src/addon/badges/lang/ko.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "뱃지 세부사항",
- "badges": "뱃지",
- "contact": "연락처",
- "dateawarded": "발행일",
- "expired": "죄송합니다. 이 활동은 {{$a}} 에 종료되어서 더 이상 사용할 수 없습니다.",
- "expirydate": "만료일",
- "issuancedetails": "뱃지 만료기한",
- "issuerdetails": "발행자 세부정보",
- "issuername": "발행자 이름",
- "nobadges": "사용가능한 뱃지가 없습니다.",
- "recipientdetails": "수신자 세부사항"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/lt.json b/src/addon/badges/lang/lt.json
deleted file mode 100755
index 2434a9c03..000000000
--- a/src/addon/badges/lang/lt.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Pasiekimo detalės",
- "badges": "Pasiekimai",
- "contact": "Kontaktas",
- "dateawarded": "Suteikimo data",
- "expired": "Atsiprašome, veikla uždaryta {{$a}} ir nebegalima",
- "expirydate": "Galiojimo laikas",
- "issuancedetails": "Pasiekimo galiojimas",
- "issuerdetails": "Suteikėjo detalesnė informacija",
- "issuername": "Suteikėjo vardas",
- "nobadges": "Nėra sukurtų pasiekimų.",
- "recipientdetails": "Informacija apie gavėją"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/mr.json b/src/addon/badges/lang/mr.json
deleted file mode 100755
index 2b37db102..000000000
--- a/src/addon/badges/lang/mr.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "expired": "संपलेला"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/nl.json b/src/addon/badges/lang/nl.json
deleted file mode 100755
index 24e5430f2..000000000
--- a/src/addon/badges/lang/nl.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Badgedetails",
- "badges": "Badges",
- "contact": "Contact",
- "dateawarded": "Uitgavedatum",
- "expired": "Sorry, deze activiteit is afgesloten op {{$a}} en is niet meer beschikbaar",
- "expirydate": "Vervaldatum",
- "issuancedetails": "Badge verloopt",
- "issuerdetails": "Details uitgever",
- "issuername": "Naam uitgever",
- "nobadges": "Er zijn geen badges beschikbaar.",
- "recipientdetails": "Details ontvanger"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/no.json b/src/addon/badges/lang/no.json
deleted file mode 100755
index 6a48ea344..000000000
--- a/src/addon/badges/lang/no.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Utmerkelsesdetaljer",
- "badges": "Utmerkelser",
- "contact": "Kontakt",
- "dateawarded": "Dato tildelt",
- "expired": "Beklager, denne aktiviteten ble stengt {{$a}} og er ikke tilgjengelig lenger.",
- "expirydate": "Utløpsdato",
- "issuancedetails": "Utløpsdato på utmerkelse",
- "issuerdetails": "Utstederdetaljer",
- "issuername": "Navn på utsteder",
- "nobadges": "Det er ingen tilgjengelige utmerkelser.",
- "recipientdetails": "Mottakerdetaljer"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/pl.json b/src/addon/badges/lang/pl.json
deleted file mode 100755
index cdbe2ea38..000000000
--- a/src/addon/badges/lang/pl.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Szczegóły odznaki",
- "badges": "Odznaki",
- "contact": "Kontakt",
- "dateawarded": "Data wydania",
- "expired": "Niestety ta aktywność została zamknięta {{$a}} i nie jest już dostępna.",
- "expirydate": "Data ważności",
- "issuancedetails": "Wygaśnięcie odznaki",
- "issuerdetails": "Dane wystawcy",
- "issuername": "Nazwa wydawcy",
- "nobadges": "Brak dostępnych odznak",
- "recipientdetails": "Dane odbiorcy"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/pt-br.json b/src/addon/badges/lang/pt-br.json
deleted file mode 100755
index f58e81ab7..000000000
--- a/src/addon/badges/lang/pt-br.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalhes do emblema",
- "badges": "Emblemas",
- "contact": "Contato",
- "dateawarded": "Data de emissão",
- "expired": "Esta atividade está encerrada desde {{$a}}",
- "expirydate": "Data de validade",
- "issuancedetails": "Expiração do emblema",
- "issuerdetails": "Detalhes do emissor",
- "issuername": "Nome do emissor",
- "nobadges": "Não há emblemas disponíveis.",
- "recipientdetails": "Detalhes do usuário a receber o emblema"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/pt.json b/src/addon/badges/lang/pt.json
deleted file mode 100755
index 25537f644..000000000
--- a/src/addon/badges/lang/pt.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalhes da Medalha",
- "badges": "Medalhas",
- "contact": "Contacto",
- "dateawarded": "Data de emissão",
- "expired": "Esta atividade terminou em {{$a}} e já não está disponível",
- "expirydate": "Data de validade",
- "issuancedetails": "Data de validade da Medalha",
- "issuerdetails": "Detalhes do emissor",
- "issuername": "Nome do emissor",
- "nobadges": "Não existem Medalhas disponíveis.",
- "recipientdetails": "Detalhes do condecorado"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/ro.json b/src/addon/badges/lang/ro.json
deleted file mode 100755
index f419fdda1..000000000
--- a/src/addon/badges/lang/ro.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Detalii ecuson",
- "badges": "Ecusoane",
- "contact": "Contact",
- "dateawarded": "Data emiterii",
- "expired": "Ne pare rău, această activitate s-a închis la {{$a}} şi nu mai este disponibilă",
- "expirydate": "Dată de expirare",
- "issuancedetails": "Expirare ecuson",
- "issuerdetails": "Detalii emitent",
- "issuername": "Nume emitent",
- "nobadges": "Nu există ecusoane disponibile",
- "recipientdetails": "Detalii recipient"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/ru.json b/src/addon/badges/lang/ru.json
deleted file mode 100755
index 0b3622229..000000000
--- a/src/addon/badges/lang/ru.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Подробнее о значке",
- "badges": "Значки",
- "contact": "Контакты",
- "dateawarded": "Дата выдачи",
- "expired": "Извините, этот элемент курса закрыт {{$a}} и более недоступен",
- "expirydate": "Дата окончания срока действия",
- "issuancedetails": "Срок действия значка",
- "issuerdetails": "Сведения об эмитенте",
- "issuername": "Наименование эмитента",
- "nobadges": "Нет доступных значков.",
- "recipientdetails": "Сведения о получателе"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/sr-cr.json b/src/addon/badges/lang/sr-cr.json
deleted file mode 100755
index dde1e8526..000000000
--- a/src/addon/badges/lang/sr-cr.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "badgedetails": "Подаци о беџу",
- "badges": "Беџеви",
- "contact": "Контакт",
- "dateawarded": "Датум издавања",
- "expirydate": "Датум истека",
- "issuancedetails": "Беџ истиче",
- "issuerdetails": "Подаци о издавачу",
- "issuername": "Име/назив издавача беџа",
- "nobadges": "Нема доступних беџева",
- "recipientdetails": "Детаљи о примаоцу"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/sr-lt.json b/src/addon/badges/lang/sr-lt.json
deleted file mode 100755
index 7c2a996f0..000000000
--- a/src/addon/badges/lang/sr-lt.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "badgedetails": "Podaci o bedžu",
- "badges": "Bedževi",
- "contact": "Kontakt",
- "dateawarded": "Datum izdavanja",
- "expirydate": "Datum isteka",
- "issuancedetails": "Bedž ističe",
- "issuerdetails": "Podaci o izdavaču",
- "issuername": "Ime/naziv izdavača bedža",
- "nobadges": "Nema dostupnih bedževa",
- "recipientdetails": "Detalji o primaocu"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/sv.json b/src/addon/badges/lang/sv.json
deleted file mode 100755
index d533b8a4a..000000000
--- a/src/addon/badges/lang/sv.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "badgedetails": "Detaljer för märke",
- "badges": "Märken",
- "contact": "Kontakt",
- "dateawarded": "Utfärdandedatum",
- "expired": "Den här aktiviteten är stängd på {{$a}} och den är inte längre tillgänglig.",
- "expirydate": "Förfallodatum",
- "issuancedetails": "Förfallande av märke",
- "issuerdetails": "Utfärdarens detaljer",
- "issuername": "Utfärdarens namn",
- "nobadges": "Det finns inga märken tillgängliga."
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/tg.json b/src/addon/badges/lang/tg.json
deleted file mode 100755
index f0e3481e5..000000000
--- a/src/addon/badges/lang/tg.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "badges": "Бейҷҳо",
- "expired": "Бубахшед,ин фаъолият маҳкам карда шудааст {{$a}} ва акнун дастрас нест"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/tr.json b/src/addon/badges/lang/tr.json
deleted file mode 100755
index 86adcba8c..000000000
--- a/src/addon/badges/lang/tr.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Nişan ayrıntıları",
- "badges": "Nişanlar",
- "contact": "İletişim",
- "dateawarded": "Verilen tarih",
- "expired": "Üzgünüz, bu etkinlik {{$a}} tarihinde kapandı ve bu etkinliğe artık ulaşılamaz",
- "expirydate": "Bitiş Tarihi",
- "issuancedetails": "Rozet sona erme",
- "issuerdetails": "çıkaran ayrıntıları",
- "issuername": "Çıkaranın adı",
- "nobadges": "Uygun nişan bulunmuyor.",
- "recipientdetails": "Alıcı bilgileri"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/uk.json b/src/addon/badges/lang/uk.json
deleted file mode 100755
index 88c5bf62b..000000000
--- a/src/addon/badges/lang/uk.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "badgedetails": "Детальніше про відзнаку",
- "badges": "Відзнаки",
- "contact": "Контакт",
- "dateawarded": "Дата отримання",
- "expired": "На жаль, ця діяльність закрита для {{$a}} та більше недоступна",
- "expirydate": "Дата завершення",
- "issuancedetails": "Відзнака не актуальна",
- "issuerdetails": "Деталі присудження",
- "issuername": "Ім’я видавця",
- "nobadges": "Немає доступних відзнак.",
- "recipientdetails": "Деталі отримувача"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/zh-cn.json b/src/addon/badges/lang/zh-cn.json
deleted file mode 100755
index 241dd1a26..000000000
--- a/src/addon/badges/lang/zh-cn.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "badgedetails": "勋章详情",
- "badges": "勋章",
- "contact": "联系",
- "dateawarded": "授予日期",
- "expirydate": "过期时间",
- "issuancedetails": "有效期",
- "issuerdetails": "授勋机构详情",
- "issuername": "授勋机构名称",
- "nobadges": "没有可用的勋章",
- "recipientdetails": "获得者详情"
-}
\ No newline at end of file
diff --git a/src/addon/badges/lang/zh-tw.json b/src/addon/badges/lang/zh-tw.json
deleted file mode 100755
index 6f523313b..000000000
--- a/src/addon/badges/lang/zh-tw.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "badgedetails": "獎章細節",
- "badges": "獎章",
- "contact": "聯絡",
- "dateawarded": "頒發的日期",
- "expirydate": "失效日期",
- "issuancedetails": "獎章到期",
- "issuerdetails": "頒授者細節",
- "issuername": "頒授者的姓名",
- "nobadges": "這裡沒有可用的獎章",
- "recipientdetails": "收件者細節"
-}
\ No newline at end of file
diff --git a/src/addon/badges/pages/issued-badge/issued-badge.html b/src/addon/badges/pages/issued-badge/issued-badge.html
index 65491218d..111cc8a8f 100644
--- a/src/addon/badges/pages/issued-badge/issued-badge.html
+++ b/src/addon/badges/pages/issued-badge/issued-badge.html
@@ -19,7 +19,7 @@
-
+
{{ 'addon.badges.recipientdetails' | translate}}
@@ -31,7 +31,7 @@
-
+
{{ 'addon.badges.issuerdetails' | translate}}
@@ -42,19 +42,27 @@
{{ 'addon.badges.contact' | translate}}
-
-
-
+
+
+
-
+
{{ 'addon.badges.badgedetails' | translate}}
{{ 'core.name' | translate}}
- {{badge.name}}
+ {{ badge.name }}
+
+
+ {{ 'addon.badges.version' | translate}}
+ {{ badge.version }}
+
+
+ {{ 'addon.badges.language' | translate}}
+ {{ badge.language }}
{{ 'core.description' | translate}}
@@ -62,25 +70,117 @@
+
+ {{ 'addon.badges.imageauthorname' | translate}}
+ {{ badge.imageauthorname }}
+
+
+ {{ 'addon.badges.imageauthoremail' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.imageauthorurl' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.imagecaption' | translate}}
+
+
{{ 'core.course' | translate}}
+
-
+
{{ 'addon.badges.issuancedetails' | translate}}
{{ 'addon.badges.dateawarded' | translate}}
- {{badge.dateissued | coreToLocaleString }}
+ {{badge.dateissued * 1000 | coreFormatDate }}
{{ 'addon.badges.expirydate' | translate}}
- {{badge.dateexpire | coreToLocaleString }}
+
+ {{ badge.dateexpire * 1000 | coreFormatDate }}
+ = badge.dateexpire">
+ {{ 'addon.badges.warnexpired' | translate }}
+
+
+
+
+
+
+
+
+
+ {{ 'addon.badges.bendorsement' | translate}}
+
+
+ {{ 'addon.badges.issuername' | translate}}
+ {{ badge.endorsement.issuername }}
+
+
+ {{ 'addon.badges.issueremail' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.issuerurl' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.dateawarded' | translate}}
+ {{ badge.endorsement.dateissued * 1000 | coreFormatDate }}
+
+
+ {{ 'addon.badges.claimid' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.claimcomment' | translate}}
+
+
+
+
+
+
+
+
+
+ {{ 'addon.badges.relatedbages' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.norelated' | translate}}
+
+
+
+
+
+
+ {{ 'addon.badges.alignment' | translate}}
+
+
+
+
+
+ {{ 'addon.badges.noalignment' | translate}}
diff --git a/src/addon/badges/pages/issued-badge/issued-badge.ts b/src/addon/badges/pages/issued-badge/issued-badge.ts
index 62c38f98d..ff79f7841 100644
--- a/src/addon/badges/pages/issued-badge/issued-badge.ts
+++ b/src/addon/badges/pages/issued-badge/issued-badge.ts
@@ -14,12 +14,12 @@
import { Component, ViewChild } from '@angular/core';
import { IonicPage, Content, NavParams } from 'ionic-angular';
-import { AddonBadgesProvider } from '../../providers/badges';
import { CoreTimeUtilsProvider } from '@providers/utils/time';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreSitesProvider } from '@providers/sites';
import { CoreUserProvider } from '@core/user/providers/user';
import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { AddonBadgesProvider } from '../../providers/badges';
/**
* Page that displays the list of calendar events.
@@ -32,9 +32,10 @@ import { CoreCoursesProvider } from '@core/courses/providers/courses';
export class AddonBadgesIssuedBadgePage {
@ViewChild(Content) content: Content;
- courseId: number;
- userId: number;
- badgeHash: string;
+ protected badgeHash: string;
+ protected userId: number;
+ protected courseId: number;
+
user: any = {};
course: any = {};
badge: any = {};
@@ -70,29 +71,29 @@ export class AddonBadgesIssuedBadgePage {
const promises = [];
this.currentTime = this.timeUtils.timestamp();
- let promise = this.userProvider.getProfile(this.userId, this.courseId, true).then((user) => {
+ promises.push(this.userProvider.getProfile(this.userId, this.courseId, true).then((user) => {
this.user = user;
- });
- promises.push(promise);
+ }));
- promise = this.badgesProvider.getUserBadges(this.courseId, this.userId).then((badges) => {
- badges.forEach((badge) => {
- if (this.badgeHash == badge.uniquehash) {
- this.badge = badge;
- if (badge.courseid) {
- return this.coursesProvider.getUserCourse(badge.courseid, true).then((course) => {
- this.course = course;
- }).catch(() => {
- // Maybe an old deleted course.
- this.course = null;
- });
- }
- }
+ promises.push(this.badgesProvider.getUserBadges(this.courseId, this.userId).then((badges) => {
+ const badge = badges.find((badge) => {
+ return this.badgeHash == badge.uniquehash;
});
+
+ if (badge) {
+ this.badge = badge;
+ if (badge.courseid) {
+ return this.coursesProvider.getUserCourse(badge.courseid, true).then((course) => {
+ this.course = course;
+ }).catch(() => {
+ // Maybe an old deleted course.
+ this.course = null;
+ });
+ }
+ }
}).catch((message) => {
this.domUtils.showErrorModalDefault(message, 'Error getting badge data.');
- });
- promises.push(promise);
+ }));
return Promise.all(promises);
}
diff --git a/src/addon/badges/pages/user-badges/user-badges.html b/src/addon/badges/pages/user-badges/user-badges.html
index 5bcdc3e32..6a2a33a24 100644
--- a/src/addon/badges/pages/user-badges/user-badges.html
+++ b/src/addon/badges/pages/user-badges/user-badges.html
@@ -18,7 +18,7 @@
- {{ badge.dateissued | coreToLocaleString }}
+ {{ badge.dateissued * 1000 | coreFormatDate :'strftimedatetimeshort' }}
= badge.dateexpire">
{{ 'addon.badges.expired' | translate }}
diff --git a/src/addon/block/activitymodules/activitymodules.module.ts b/src/addon/block/activitymodules/activitymodules.module.ts
new file mode 100644
index 000000000..88fbb6e06
--- /dev/null
+++ b/src/addon/block/activitymodules/activitymodules.module.ts
@@ -0,0 +1,44 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { AddonBlockActivityModulesComponentsModule } from './components/components.module';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockActivityModulesHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ AddonBlockActivityModulesComponentsModule,
+ TranslateModule.forChild()
+ ],
+ exports: [
+ ],
+ providers: [
+ AddonBlockActivityModulesHandler
+ ]
+})
+export class AddonBlockActivityModulesModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockActivityModulesHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/activitymodules/components/activitymodules/activitymodules.scss b/src/addon/block/activitymodules/components/activitymodules/activitymodules.scss
new file mode 100644
index 000000000..cc70ceb22
--- /dev/null
+++ b/src/addon/block/activitymodules/components/activitymodules/activitymodules.scss
@@ -0,0 +1,26 @@
+ion-app.app-root.md addon-block-activitymodules {
+ .core-module-icon {
+ margin-top: $label-md-margin-top;
+ margin-bottom: $label-md-margin-bottom;
+ width: 24px;
+ height: 24px;
+ }
+}
+
+ion-app.app-root.ios addon-block-activitymodules {
+ .core-module-icon {
+ margin-top: $label-ios-margin-top;
+ margin-bottom: $label-ios-margin-bottom;
+ width: 24px;
+ height: 24px;
+ }
+}
+
+ion-app.app-root.wp addon-block-activitymodules {
+ .core-module-icon {
+ margin-top: $item-wp-padding-top;
+ margin-bottom: $item-wp-padding-bottom;
+ width: 24px;
+ height: 24px;
+ }
+}
diff --git a/src/addon/block/activitymodules/components/activitymodules/activitymodules.ts b/src/addon/block/activitymodules/components/activitymodules/activitymodules.ts
new file mode 100644
index 000000000..69a0122bb
--- /dev/null
+++ b/src/addon/block/activitymodules/components/activitymodules/activitymodules.ts
@@ -0,0 +1,126 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, Injector, Input } from '@angular/core';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+import { CoreCourseProvider } from '@core/course/providers/course';
+import { CoreCourseModuleDelegate } from '@core/course/providers/module-delegate';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+import { CoreConstants } from '@core/constants';
+import { TranslateService } from '@ngx-translate/core';
+
+/**
+ * Component to render an "activity modules" block.
+ */
+@Component({
+ selector: 'addon-block-activitymodules',
+ templateUrl: 'addon-block-activitymodules.html'
+})
+export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent implements OnInit {
+ @Input() block: any; // The block to render.
+ @Input() contextLevel: string; // The context where the block will be used.
+ @Input() instanceId: number; // The instance ID associated with the context level.
+
+ entries: any[] = [];
+
+ protected fetchContentDefaultError = 'Error getting activity modules data.';
+
+ constructor(injector: Injector, protected utils: CoreUtilsProvider, protected courseProvider: CoreCourseProvider,
+ protected translate: TranslateService, protected moduleDelegate: CoreCourseModuleDelegate) {
+
+ super(injector, 'AddonBlockActivityModulesComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ super.ngOnInit();
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ return this.courseProvider.invalidateSections(this.instanceId);
+ }
+
+ /**
+ * Fetch the data to render the block.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.courseProvider.getSections(this.instanceId, false, true).then((sections) => {
+
+ this.entries = [];
+
+ const archetypes = {},
+ modIcons = {};
+ let modFullNames = {};
+
+ sections.forEach((section) => {
+ if (!section.modules) {
+ return;
+ }
+
+ section.modules.forEach((mod) => {
+ if (mod.uservisible === false || !this.courseProvider.moduleHasView(mod) ||
+ typeof modFullNames[mod.modname] != 'undefined') {
+ // Ignore this module.
+ return;
+ }
+
+ // Get the archetype of the module type.
+ if (typeof archetypes[mod.modname] == 'undefined') {
+ archetypes[mod.modname] = this.moduleDelegate.supportsFeature(mod.modname,
+ CoreConstants.FEATURE_MOD_ARCHETYPE, CoreConstants.MOD_ARCHETYPE_OTHER);
+ }
+
+ // Get the full name of the module type.
+ if (archetypes[mod.modname] == CoreConstants.MOD_ARCHETYPE_RESOURCE) {
+ // All resources are gathered in a single "Resources" option.
+ if (!modFullNames['resources']) {
+ modFullNames['resources'] = this.translate.instant('core.resources');
+ }
+ } else {
+ modFullNames[mod.modname] = mod.modplural;
+ }
+ modIcons[mod.modname] = mod.modicon;
+ });
+ });
+
+ // Sort the modnames alphabetically.
+ modFullNames = this.utils.sortValues(modFullNames);
+
+ for (const modName in modFullNames) {
+ let icon;
+
+ if (modName === 'resources') {
+ icon = this.courseProvider.getModuleIconSrc('page', modIcons['page']);
+ } else {
+ icon = this.moduleDelegate.getModuleIconSrc(modName, modIcons[modName]);
+ }
+
+ this.entries.push({
+ icon: icon,
+ name: modFullNames[modName],
+ modName: modName
+ });
+ }
+ });
+ }
+}
diff --git a/src/addon/block/activitymodules/components/activitymodules/addon-block-activitymodules.html b/src/addon/block/activitymodules/components/activitymodules/addon-block-activitymodules.html
new file mode 100644
index 000000000..7711b65f6
--- /dev/null
+++ b/src/addon/block/activitymodules/components/activitymodules/addon-block-activitymodules.html
@@ -0,0 +1,9 @@
+
+ {{ 'addon.block_activitymodules.pluginname' | translate }}
+
+
+
+
+
+
+
diff --git a/src/addon/block/activitymodules/components/components.module.ts b/src/addon/block/activitymodules/components/components.module.ts
new file mode 100644
index 000000000..5cbc4cfd4
--- /dev/null
+++ b/src/addon/block/activitymodules/components/components.module.ts
@@ -0,0 +1,45 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockActivityModulesComponent } from './activitymodules/activitymodules';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCourseComponentsModule } from '@core/course/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockActivityModulesComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCourseComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockActivityModulesComponent
+ ],
+ entryComponents: [
+ AddonBlockActivityModulesComponent
+ ]
+})
+export class AddonBlockActivityModulesComponentsModule {}
diff --git a/src/addon/block/activitymodules/lang/en.json b/src/addon/block/activitymodules/lang/en.json
new file mode 100644
index 000000000..7f1c7ab21
--- /dev/null
+++ b/src/addon/block/activitymodules/lang/en.json
@@ -0,0 +1,3 @@
+{
+ "pluginname": "Activities"
+}
diff --git a/src/addon/block/activitymodules/providers/block-handler.ts b/src/addon/block/activitymodules/providers/block-handler.ts
new file mode 100644
index 000000000..0024324c9
--- /dev/null
+++ b/src/addon/block/activitymodules/providers/block-handler.ts
@@ -0,0 +1,50 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { AddonBlockActivityModulesComponent } from '../components/activitymodules/activitymodules';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockActivityModulesHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockActivityModules';
+ blockName = 'activity_modules';
+
+ constructor() {
+ super();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_activitymodules.pluginname',
+ class: 'addon-block-activitymodules',
+ component: AddonBlockActivityModulesComponent
+ };
+ }
+}
diff --git a/src/addon/block/myoverview/components/components.module.ts b/src/addon/block/myoverview/components/components.module.ts
new file mode 100644
index 000000000..45930cb01
--- /dev/null
+++ b/src/addon/block/myoverview/components/components.module.ts
@@ -0,0 +1,47 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreCoursesComponentsModule } from '@core/courses/components/components.module';
+import { AddonBlockMyOverviewComponent } from './myoverview/myoverview';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCourseComponentsModule } from '@core/course/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockMyOverviewComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCoursesComponentsModule,
+ CoreCourseComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockMyOverviewComponent
+ ],
+ entryComponents: [
+ AddonBlockMyOverviewComponent
+ ]
+})
+export class AddonBlockMyOverviewComponentsModule {}
diff --git a/src/addon/block/myoverview/components/myoverview/addon-block-myoverview.html b/src/addon/block/myoverview/components/myoverview/addon-block-myoverview.html
new file mode 100644
index 000000000..9b3cfa183
--- /dev/null
+++ b/src/addon/block/myoverview/components/myoverview/addon-block-myoverview.html
@@ -0,0 +1,44 @@
+
+ {{ 'addon.block_myoverview.pluginname' | translate }}
+
+ 1 && !showFilter" class="core-button-spinner" item-end>
+
+
+
+ {{prefetchCoursesData[selectedFilter].badge}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'addon.block_myoverview.all' | translate }} ∫
+ {{ 'addon.block_myoverview.inprogress' | translate }}
+ {{ 'addon.block_myoverview.future' | translate }}
+ {{ 'addon.block_myoverview.past' | translate }}
+ {{ 'addon.block_myoverview.favourites' | translate }}
+ {{ 'addon.block_myoverview.hiddencourses' | translate }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/addon/block/myoverview/components/myoverview/myoverview.ts b/src/addon/block/myoverview/components/myoverview/myoverview.ts
new file mode 100644
index 000000000..e577c5161
--- /dev/null
+++ b/src/addon/block/myoverview/components/myoverview/myoverview.ts
@@ -0,0 +1,341 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, Input, OnDestroy, ViewChild, Injector } from '@angular/core';
+import { Searchbar } from 'ionic-angular';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+import { CoreTimeUtilsProvider } from '@providers/utils/time';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { CoreCoursesHelperProvider } from '@core/courses/providers/helper';
+import { CoreCourseHelperProvider } from '@core/course/providers/helper';
+import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate';
+import { AddonCourseCompletionProvider } from '@addon/coursecompletion/providers/coursecompletion';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+
+/**
+ * Component to render a my overview block.
+ */
+@Component({
+ selector: 'addon-block-myoverview',
+ templateUrl: 'addon-block-myoverview.html'
+})
+export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy {
+ @ViewChild('searchbar') searchbar: Searchbar;
+ @Input() downloadEnabled: boolean;
+
+ courses = {
+ filter: '',
+ all: [],
+ past: [],
+ inprogress: [],
+ future: [],
+ favourite: [],
+ hidden: []
+ };
+ selectedFilter = 'inprogress';
+ sort = 'fullname';
+ currentSite: any;
+ filteredCourses: any[];
+ prefetchCoursesData = {
+ all: {},
+ inprogress: {},
+ past: {},
+ future: {},
+ favourite: {},
+ hidden: {}
+ };
+ showFilter = false;
+ showFavourite = false;
+ showHidden = false;
+ showSelectorFilter = false;
+ showSortFilter = false;
+
+ protected prefetchIconsInitialized = false;
+ protected isDestroyed;
+ protected downloadButtonObserver;
+ protected coursesObserver;
+ protected courseIds = [];
+ protected fetchContentDefaultError = 'Error getting my overview data.';
+
+ constructor(injector: Injector, private coursesProvider: CoreCoursesProvider,
+ private courseCompletionProvider: AddonCourseCompletionProvider, private eventsProvider: CoreEventsProvider,
+ private courseHelper: CoreCourseHelperProvider, private utils: CoreUtilsProvider,
+ private courseOptionsDelegate: CoreCourseOptionsDelegate, private coursesHelper: CoreCoursesHelperProvider,
+ private sitesProvider: CoreSitesProvider, private timeUtils: CoreTimeUtilsProvider) {
+
+ super(injector, 'AddonBlockMyOverviewComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ // Refresh the enabled flags if enabled.
+ this.downloadButtonObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_DASHBOARD_DOWNLOAD_ENABLED_CHANGED,
+ (data) => {
+ const wasEnabled = this.downloadEnabled;
+
+ this.downloadEnabled = data.enabled;
+
+ if (!wasEnabled && this.downloadEnabled && this.loaded) {
+ // Download all courses is enabled now, initialize it.
+ this.initPrefetchCoursesIcons();
+ }
+ });
+
+ this.coursesObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, () => {
+ this.refreshContent();
+ }, this.sitesProvider.getCurrentSiteId());
+
+ this.currentSite = this.sitesProvider.getCurrentSite();
+
+ const promises = [];
+ promises.push(this.currentSite.getLocalSiteConfig('AddonBlockMyOverviewSort', this.sort).then((value) => {
+ this.sort = value;
+ }));
+ promises.push(this.currentSite.getLocalSiteConfig('AddonBlockMyOverviewFilter', this.selectedFilter).then((value) => {
+ this.selectedFilter = typeof this.courses[value] == 'undefined' ? 'inprogress' : value;
+ }));
+
+ Promise.all(promises).finally(() => {
+ super.ngOnInit();
+ });
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ const promises = [];
+
+ promises.push(this.coursesProvider.invalidateUserCourses().finally(() => {
+ // Invalidate course completion data.
+ promises.push(this.coursesProvider.invalidateUserCourses().finally(() => {
+ // Invalidate course completion data.
+ return this.utils.allPromises(this.courseIds.map((courseId) => {
+ return this.courseCompletionProvider.invalidateCourseCompletion(courseId);
+ }));
+ }));
+ }));
+
+ promises.push(this.courseOptionsDelegate.clearAndInvalidateCoursesOptions());
+ if (this.courseIds.length > 0) {
+ promises.push(this.coursesProvider.invalidateCoursesByField('ids', this.courseIds.join(',')));
+ }
+
+ return this.utils.allPromises(promises).finally(() => {
+ this.prefetchIconsInitialized = false;
+ });
+ }
+
+ /**
+ * Fetch the courses for my overview.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.coursesHelper.getUserCoursesWithOptions(this.sort).then((courses) => {
+ this.courseIds = courses.map((course) => {
+ return course.id;
+ });
+
+ this.showSortFilter = courses.length > 0 && typeof courses[0].lastaccess != 'undefined';
+
+ this.initCourseFilters(courses);
+
+ this.courses.filter = '';
+ this.showFilter = false;
+ this.showSelectorFilter = courses.length > 0 && (this.courses.past.length > 0 || this.courses.future.length > 0 ||
+ typeof courses[0].enddate != 'undefined');
+ this.showHidden = this.showSelectorFilter && typeof courses[0].hidden != 'undefined';
+ this.showFavourite = this.showSelectorFilter && typeof courses[0].isfavourite != 'undefined';
+ if (!this.showSelectorFilter) {
+ // No selector, show all.
+ this.selectedFilter = 'all';
+ }
+ this.filteredCourses = this.courses[this.selectedFilter];
+
+ this.initPrefetchCoursesIcons();
+ });
+ }
+
+ /**
+ * The filter has changed.
+ *
+ * @param {any} Received Event.
+ */
+ filterChanged(event: any): void {
+ const newValue = event.target.value && event.target.value.trim().toLowerCase();
+ if (!newValue || !this.courses['all']) {
+ this.filteredCourses = this.courses['all'];
+ } else {
+ // Use displayname if avalaible, or fullname if not.
+ if (this.courses['all'].length > 0 &&
+ typeof this.courses['all'][0].displayname != 'undefined') {
+ this.filteredCourses = this.courses['all'].filter((course) => {
+ return course.displayname.toLowerCase().indexOf(newValue) > -1;
+ });
+ } else {
+ this.filteredCourses = this.courses['all'].filter((course) => {
+ return course.fullname.toLowerCase().indexOf(newValue) > -1;
+ });
+ }
+ }
+ }
+
+ /**
+ * Initialize the prefetch icon for selected courses.
+ */
+ protected initPrefetchCoursesIcons(): void {
+ if (this.prefetchIconsInitialized || !this.downloadEnabled) {
+ // Already initialized.
+ return;
+ }
+
+ this.prefetchIconsInitialized = true;
+
+ Object.keys(this.prefetchCoursesData).forEach((filter) => {
+ this.courseHelper.initPrefetchCoursesIcons(this.courses[filter], this.prefetchCoursesData[filter]).then((prefetch) => {
+ this.prefetchCoursesData[filter] = prefetch;
+ });
+ });
+ }
+
+ /**
+ * Prefetch all the shown courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ prefetchCourses(): Promise {
+ const selected = this.selectedFilter,
+ initialIcon = this.prefetchCoursesData[selected].icon;
+
+ return this.courseHelper.prefetchCourses(this.courses[selected], this.prefetchCoursesData[selected]).catch((error) => {
+ if (!this.isDestroyed) {
+ this.domUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true);
+ this.prefetchCoursesData[selected].icon = initialIcon;
+ }
+ });
+ }
+
+ /**
+ * The selected courses filter have changed.
+ */
+ selectedChanged(): void {
+ this.currentSite.setLocalSiteConfig('AddonBlockMyOverviewFilter', this.selectedFilter);
+ this.filteredCourses = this.courses[this.selectedFilter];
+ }
+
+ /**
+ * Init courses filters.
+ *
+ * @param {any[]} courses Courses to filter.
+ */
+ initCourseFilters(courses: any[]): void {
+ if (this.showSortFilter) {
+ if (this.sort == 'lastaccess') {
+ courses.sort((a, b) => {
+ return b.lastaccess - a.lastaccess;
+ });
+ } else if (this.sort == 'fullname') {
+ courses.sort((a, b) => {
+ const compareA = a.fullname.toLowerCase(),
+ compareB = b.fullname.toLowerCase();
+
+ return compareA.localeCompare(compareB);
+ });
+ }
+ }
+
+ this.courses.all = [];
+ this.courses.past = [];
+ this.courses.inprogress = [];
+ this.courses.future = [];
+ this.courses.favourite = [];
+ this.courses.hidden = [];
+
+ const today = this.timeUtils.timestamp();
+ courses.forEach((course) => {
+ if (course.hidden) {
+ this.courses.hidden.push(course);
+ } else {
+ this.courses.all.push(course);
+
+ if ((course.enddate && course.enddate < today) || course.completed) {
+ // Courses that have already ended.
+ this.courses.past.push(course);
+ } else if (course.startdate > today) {
+ // Courses that have not started yet.
+ this.courses.future.push(course);
+ } else {
+ // Courses still in progress.
+ this.courses.inprogress.push(course);
+ }
+
+ if (course.isfavourite) {
+ this.courses.favourite.push(course);
+ }
+ }
+ });
+
+ this.filteredCourses = this.courses[this.selectedFilter];
+ }
+
+ /**
+ * The selected courses sort filter have changed.
+ *
+ * @param {string} sort New sorting.
+ */
+ switchSort(sort: string): void {
+ this.sort = sort;
+ this.currentSite.setLocalSiteConfig('AddonBlockMyOverviewSort', this.sort);
+ this.initCourseFilters(this.courses.all.concat(this.courses.hidden));
+ }
+
+ /**
+ * Show or hide the filter.
+ */
+ switchFilter(): void {
+ this.showFilter = !this.showFilter;
+ this.courses.filter = '';
+ this.filteredCourses = this.courses[this.showFilter ? 'all' : this.selectedFilter];
+ if (this.showFilter) {
+ setTimeout(() => {
+ this.searchbar.setFocus();
+ }, 500);
+ }
+ }
+
+ /**
+ * If switch button that enables the filter input is shown or not.
+ *
+ * @return {boolean} If switch button that enables the filter input is shown or not.
+ */
+ showFilterSwitchButton(): boolean {
+ return this.loaded && this.courses['all'] && this.courses['all'].length > 5;
+ }
+
+ /**
+ * Component being destroyed.
+ */
+ ngOnDestroy(): void {
+ this.isDestroyed = true;
+ this.coursesObserver && this.coursesObserver.off();
+ this.downloadButtonObserver && this.downloadButtonObserver.off();
+ }
+}
diff --git a/src/addon/block/myoverview/lang/en.json b/src/addon/block/myoverview/lang/en.json
new file mode 100644
index 000000000..e914935f0
--- /dev/null
+++ b/src/addon/block/myoverview/lang/en.json
@@ -0,0 +1,13 @@
+{
+ "all": "All",
+ "future": "Future",
+ "inprogress": "In progress",
+ "favourites" : "Starred",
+ "hiddencourses": "Hidden",
+ "lastaccessed": "Last accessed",
+ "morecourses": "More courses",
+ "nocourses": "No courses",
+ "past": "Past",
+ "pluginname": "Course overview",
+ "title": "Title"
+}
\ No newline at end of file
diff --git a/src/addon/block/myoverview/myoverview.module.ts b/src/addon/block/myoverview/myoverview.module.ts
new file mode 100644
index 000000000..91e854546
--- /dev/null
+++ b/src/addon/block/myoverview/myoverview.module.ts
@@ -0,0 +1,40 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockMyOverviewComponentsModule } from './components/components.module';
+import { AddonBlockMyOverviewHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ AddonBlockMyOverviewComponentsModule,
+ TranslateModule.forChild()
+ ],
+ exports: [
+ ],
+ providers: [
+ AddonBlockMyOverviewHandler
+ ]
+})
+export class AddonBlockMyOverviewModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockMyOverviewHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/myoverview/providers/block-handler.ts b/src/addon/block/myoverview/providers/block-handler.ts
new file mode 100644
index 000000000..5f723467c
--- /dev/null
+++ b/src/addon/block/myoverview/providers/block-handler.ts
@@ -0,0 +1,62 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { AddonBlockMyOverviewComponent } from '../components/myoverview/myoverview';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockMyOverviewHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockMyOverview';
+ blockName = 'myoverview';
+
+ constructor(private coursesProvider: CoreCoursesProvider, private sitesProvider: CoreSitesProvider) {
+ super();
+ }
+
+ /**
+ * Check if the handler is enabled on a site level.
+ *
+ * @return {boolean} Whether or not the handler is enabled on a site level.
+ */
+ isEnabled(): boolean | Promise {
+ return this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6') ||
+ !this.coursesProvider.isMyCoursesDisabledInSite();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_myoverview.pluginname',
+ class: 'addon-block-myoverview',
+ component: AddonBlockMyOverviewComponent
+ };
+ }
+}
diff --git a/src/addon/block/recentlyaccessedcourses/components/components.module.ts b/src/addon/block/recentlyaccessedcourses/components/components.module.ts
new file mode 100644
index 000000000..dde98101c
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/components/components.module.ts
@@ -0,0 +1,45 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockRecentlyAccessedCoursesComponent } from './recentlyaccessedcourses/recentlyaccessedcourses';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCoursesComponentsModule } from '@core/courses/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockRecentlyAccessedCoursesComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCoursesComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockRecentlyAccessedCoursesComponent
+ ],
+ entryComponents: [
+ AddonBlockRecentlyAccessedCoursesComponent
+ ]
+})
+export class AddonBlockRecentlyAccessedCoursesComponentsModule {}
diff --git a/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html b/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html
new file mode 100644
index 000000000..0d83e5a7e
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html
@@ -0,0 +1,21 @@
+
+ {{ 'addon.block_recentlyaccessedcourses.pluginname' | translate }}
+ 1" class="core-button-spinner" item-end>
+
+
+
+ {{prefetchCoursesData.badge}}
+
+
+
+
+
+
+
+
diff --git a/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts b/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts
new file mode 100644
index 000000000..2d962d17c
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts
@@ -0,0 +1,160 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, OnDestroy, Injector, Input } from '@angular/core';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { CoreCoursesHelperProvider } from '@core/courses/providers/helper';
+import { CoreCourseHelperProvider } from '@core/course/providers/helper';
+import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate';
+import { AddonCourseCompletionProvider } from '@addon/coursecompletion/providers/coursecompletion';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+
+/**
+ * Component to render a recent courses block.
+ */
+@Component({
+ selector: 'addon-block-recentlyaccessedcourses',
+ templateUrl: 'addon-block-recentlyaccessedcourses.html'
+})
+export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy {
+ @Input() downloadEnabled: boolean;
+
+ courses = [];
+ prefetchCoursesData = {
+ icon: '',
+ badge: ''
+ };
+
+ protected prefetchIconsInitialized = false;
+ protected isDestroyed;
+ protected downloadButtonObserver;
+ protected coursesObserver;
+ protected courseIds = [];
+ protected fetchContentDefaultError = 'Error getting recent courses data.';
+
+ constructor(injector: Injector, private coursesProvider: CoreCoursesProvider,
+ private courseCompletionProvider: AddonCourseCompletionProvider, private eventsProvider: CoreEventsProvider,
+ private courseHelper: CoreCourseHelperProvider, private utils: CoreUtilsProvider,
+ private courseOptionsDelegate: CoreCourseOptionsDelegate, private coursesHelper: CoreCoursesHelperProvider,
+ private sitesProvider: CoreSitesProvider) {
+
+ super(injector, 'AddonBlockRecentlyAccessedCoursesComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ // Refresh the enabled flags if enabled.
+ this.downloadButtonObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_DASHBOARD_DOWNLOAD_ENABLED_CHANGED,
+ (data) => {
+ const wasEnabled = this.downloadEnabled;
+
+ this.downloadEnabled = data.enabled;
+
+ if (!wasEnabled && this.downloadEnabled && this.loaded) {
+ // Download all courses is enabled now, initialize it.
+ this.initPrefetchCoursesIcons();
+ }
+ });
+
+ this.coursesObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, () => {
+ this.refreshContent();
+ }, this.sitesProvider.getCurrentSiteId());
+
+ super.ngOnInit();
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ const promises = [];
+
+ promises.push(this.coursesProvider.invalidateUserCourses().finally(() => {
+ // Invalidate course completion data.
+ return this.utils.allPromises(this.courseIds.map((courseId) => {
+ return this.courseCompletionProvider.invalidateCourseCompletion(courseId);
+ }));
+ }));
+
+ promises.push(this.courseOptionsDelegate.clearAndInvalidateCoursesOptions());
+ if (this.courseIds.length > 0) {
+ promises.push(this.coursesProvider.invalidateCoursesByField('ids', this.courseIds.join(',')));
+ }
+
+ return this.utils.allPromises(promises).finally(() => {
+ this.prefetchIconsInitialized = false;
+ });
+ }
+
+ /**
+ * Fetch the courses for recent courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.coursesHelper.getUserCoursesWithOptions('lastaccess', 10).then((courses) => {
+ this.courses = courses;
+
+ this.initPrefetchCoursesIcons();
+ });
+ }
+
+ /**
+ * Initialize the prefetch icon for selected courses.
+ */
+ protected initPrefetchCoursesIcons(): void {
+ if (this.prefetchIconsInitialized || !this.downloadEnabled) {
+ // Already initialized.
+ return;
+ }
+
+ this.prefetchIconsInitialized = true;
+
+ this.courseHelper.initPrefetchCoursesIcons(this.courses, this.prefetchCoursesData).then((prefetch) => {
+ this.prefetchCoursesData = prefetch;
+ });
+ }
+
+ /**
+ * Prefetch all the shown courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ prefetchCourses(): Promise {
+ const initialIcon = this.prefetchCoursesData.icon;
+
+ return this.courseHelper.prefetchCourses(this.courses, this.prefetchCoursesData).catch((error) => {
+ if (!this.isDestroyed) {
+ this.domUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true);
+ this.prefetchCoursesData.icon = initialIcon;
+ }
+ });
+ }
+
+ /**
+ * Component being destroyed.
+ */
+ ngOnDestroy(): void {
+ this.isDestroyed = true;
+ this.coursesObserver && this.coursesObserver.off();
+ this.downloadButtonObserver && this.downloadButtonObserver.off();
+ }
+}
diff --git a/src/addon/block/recentlyaccessedcourses/lang/en.json b/src/addon/block/recentlyaccessedcourses/lang/en.json
new file mode 100644
index 000000000..e87006df7
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/lang/en.json
@@ -0,0 +1,4 @@
+{
+ "nocourses": "No recent courses",
+ "pluginname": "Recently accessed courses"
+}
diff --git a/src/addon/block/recentlyaccessedcourses/providers/block-handler.ts b/src/addon/block/recentlyaccessedcourses/providers/block-handler.ts
new file mode 100644
index 000000000..a1117bd5d
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/providers/block-handler.ts
@@ -0,0 +1,50 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { AddonBlockRecentlyAccessedCoursesComponent } from '../components/recentlyaccessedcourses/recentlyaccessedcourses';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockRecentlyAccessedCoursesHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockRecentlyAccessedCourses';
+ blockName = 'recentlyaccessedcourses';
+
+ constructor() {
+ super();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_recentlyaccessedcourses.pluginname',
+ class: 'addon-block-recentlyaccessedcourses',
+ component: AddonBlockRecentlyAccessedCoursesComponent
+ };
+ }
+}
diff --git a/src/addon/block/recentlyaccessedcourses/recentlyaccessedcourses.module.ts b/src/addon/block/recentlyaccessedcourses/recentlyaccessedcourses.module.ts
new file mode 100644
index 000000000..99a9ad3fd
--- /dev/null
+++ b/src/addon/block/recentlyaccessedcourses/recentlyaccessedcourses.module.ts
@@ -0,0 +1,40 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockRecentlyAccessedCoursesComponentsModule } from './components/components.module';
+import { AddonBlockRecentlyAccessedCoursesHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ CoreComponentsModule,
+ AddonBlockRecentlyAccessedCoursesComponentsModule,
+ TranslateModule.forChild()
+ ],
+ providers: [
+ AddonBlockRecentlyAccessedCoursesHandler
+ ]
+})
+export class AddonBlockRecentlyAccessedCoursesModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockRecentlyAccessedCoursesHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/recentlyaccesseditems/components/components.module.ts b/src/addon/block/recentlyaccesseditems/components/components.module.ts
new file mode 100644
index 000000000..1ce6d5557
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/components/components.module.ts
@@ -0,0 +1,45 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockRecentlyAccessedItemsComponent } from './recentlyaccesseditems/recentlyaccesseditems';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCourseComponentsModule } from '@core/course/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockRecentlyAccessedItemsComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCourseComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockRecentlyAccessedItemsComponent
+ ],
+ entryComponents: [
+ AddonBlockRecentlyAccessedItemsComponent
+ ]
+})
+export class AddonBlockRecentlyAccessedItemsComponentsModule {}
diff --git a/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html
new file mode 100644
index 000000000..f3538163d
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html
@@ -0,0 +1,19 @@
+
+ {{ 'addon.block_recentlyaccesseditems.pluginname' | translate }}
+
+
+
+
+
+
+
diff --git a/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss
new file mode 100644
index 000000000..83c2695ce
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss
@@ -0,0 +1,3 @@
+ion-app.app-root addon-block-recentlyaccesseditems .core-horizontal-scroll > div {
+ @include horizontal_scroll_item(80%, 250px, 300px);
+}
\ No newline at end of file
diff --git a/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts
new file mode 100644
index 000000000..e1c9bf372
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts
@@ -0,0 +1,90 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, Injector, Optional } from '@angular/core';
+import { NavController } from 'ionic-angular';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+import { AddonBlockRecentlyAccessedItemsProvider } from '../../providers/recentlyaccesseditems';
+import { CoreTextUtilsProvider } from '@providers/utils/text';
+import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper';
+
+/**
+ * Component to render a recently accessed items block.
+ */
+@Component({
+ selector: 'addon-block-recentlyaccesseditems',
+ templateUrl: 'addon-block-recentlyaccesseditems.html'
+})
+export class AddonBlockRecentlyAccessedItemsComponent extends CoreBlockBaseComponent implements OnInit {
+ items = [];
+
+ protected fetchContentDefaultError = 'Error getting recently accessed items data.';
+
+ constructor(injector: Injector, @Optional() private navCtrl: NavController,
+ private sitesProvider: CoreSitesProvider, private textUtils: CoreTextUtilsProvider,
+ private recentItemsProvider: AddonBlockRecentlyAccessedItemsProvider,
+ private contentLinksHelper: CoreContentLinksHelperProvider) {
+
+ super(injector, 'AddonBlockRecentlyAccessedItemsComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ super.ngOnInit();
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ return this.recentItemsProvider.invalidateRecentItems();
+ }
+
+ /**
+ * Fetch the data to render the block.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.recentItemsProvider.getRecentItems().then((items) => {
+ this.items = items;
+ });
+ }
+
+ /**
+ * Event clicked.
+ *
+ * @param {Event} e Click event.
+ * @param {any} item Activity item info.
+ */
+ action(e: Event, item: any): void {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const url = this.textUtils.decodeHTMLEntities(item.viewurl);
+ const modal = this.domUtils.showModalLoading();
+ this.contentLinksHelper.handleLink(url, undefined, this.navCtrl).then((treated) => {
+ if (!treated) {
+ return this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(url);
+ }
+ }).finally(() => {
+ modal.dismiss();
+ });
+ }
+}
diff --git a/src/addon/block/recentlyaccesseditems/lang/en.json b/src/addon/block/recentlyaccesseditems/lang/en.json
new file mode 100644
index 000000000..47311d281
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/lang/en.json
@@ -0,0 +1,4 @@
+{
+ "noitems": "No recent items",
+ "pluginname": "Recently accessed items"
+}
diff --git a/src/addon/block/recentlyaccesseditems/providers/block-handler.ts b/src/addon/block/recentlyaccesseditems/providers/block-handler.ts
new file mode 100644
index 000000000..2963017e8
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/providers/block-handler.ts
@@ -0,0 +1,50 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { AddonBlockRecentlyAccessedItemsComponent } from '../components/recentlyaccesseditems/recentlyaccesseditems';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockRecentlyAccessedItemsHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockRecentlyAccessedItems';
+ blockName = 'recentlyaccesseditems';
+
+ constructor() {
+ super();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_recentlyaccesseditems.pluginname',
+ class: 'addon-block-recentlyaccesseditems',
+ component: AddonBlockRecentlyAccessedItemsComponent
+ };
+ }
+}
diff --git a/src/addon/block/recentlyaccesseditems/providers/recentlyaccesseditems.ts b/src/addon/block/recentlyaccesseditems/providers/recentlyaccesseditems.ts
new file mode 100644
index 000000000..f07f386d5
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/providers/recentlyaccesseditems.ts
@@ -0,0 +1,74 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable } from '@angular/core';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCourseProvider } from '@core/course/providers/course';
+import { CoreDomUtilsProvider } from '@providers/utils/dom';
+
+/**
+ * Service that provides some features regarding recently accessed items.
+ */
+@Injectable()
+export class AddonBlockRecentlyAccessedItemsProvider {
+ protected ROOT_CACHE_KEY = 'AddonBlockRecentlyAccessedItems:';
+
+ constructor(private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider,
+ private domUtils: CoreDomUtilsProvider) { }
+
+ /**
+ * Get cache key for get last accessed items value WS call.
+ *
+ * @return {string} Cache key.
+ */
+ protected getRecentItemsCacheKey(): string {
+ return this.ROOT_CACHE_KEY + ':recentitems';
+ }
+
+ /**
+ * Get last accessed items.
+ *
+ * @param {string} [siteId] Site ID. If not defined, use current site.
+ * @return {Promise} Promise resolved when the info is retrieved.
+ */
+ getRecentItems(siteId?: string): Promise {
+
+ return this.sitesProvider.getSite(siteId).then((site) => {
+ const preSets = {
+ cacheKey: this.getRecentItemsCacheKey()
+ };
+
+ return site.read('block_recentlyaccesseditems_get_recent_items', undefined, preSets).then((items) => {
+ return items.map((item) => {
+ const modicon = item.icon && this.domUtils.getHTMLElementAttribute(item.icon, 'src');
+ item.iconUrl = this.courseProvider.getModuleIconSrc(item.modname, modicon);
+
+ return item;
+ });
+ });
+ });
+ }
+
+ /**
+ * Invalidates get last accessed items WS call.
+ *
+ * @param {string} [siteId] Site ID to invalidate. If not defined, use current site.
+ * @return {Promise} Promise resolved when the data is invalidated.
+ */
+ invalidateRecentItems(siteId?: string): Promise {
+ return this.sitesProvider.getSite(siteId).then((site) => {
+ return site.invalidateWsCacheForKey(this.getRecentItemsCacheKey());
+ });
+ }
+}
diff --git a/src/addon/block/recentlyaccesseditems/recentlyaccesseditems.module.ts b/src/addon/block/recentlyaccesseditems/recentlyaccesseditems.module.ts
new file mode 100644
index 000000000..5df77fe5f
--- /dev/null
+++ b/src/addon/block/recentlyaccesseditems/recentlyaccesseditems.module.ts
@@ -0,0 +1,42 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockRecentlyAccessedItemsComponentsModule } from './components/components.module';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockRecentlyAccessedItemsHandler } from './providers/block-handler';
+import { AddonBlockRecentlyAccessedItemsProvider } from './providers/recentlyaccesseditems';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ AddonBlockRecentlyAccessedItemsComponentsModule,
+ TranslateModule.forChild()
+ ],
+ exports: [
+ ],
+ providers: [
+ AddonBlockRecentlyAccessedItemsHandler,
+ AddonBlockRecentlyAccessedItemsProvider
+ ]
+})
+export class AddonBlockRecentlyAccessedItemsModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockRecentlyAccessedItemsHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/sitemainmenu/components/components.module.ts b/src/addon/block/sitemainmenu/components/components.module.ts
new file mode 100644
index 000000000..a121183a5
--- /dev/null
+++ b/src/addon/block/sitemainmenu/components/components.module.ts
@@ -0,0 +1,45 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockSiteMainMenuComponent } from './sitemainmenu/sitemainmenu';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCourseComponentsModule } from '@core/course/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockSiteMainMenuComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCourseComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockSiteMainMenuComponent
+ ],
+ entryComponents: [
+ AddonBlockSiteMainMenuComponent
+ ]
+})
+export class AddonBlockSiteMainMenuComponentsModule {}
diff --git a/src/addon/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html b/src/addon/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html
new file mode 100644
index 000000000..e1a3c10a5
--- /dev/null
+++ b/src/addon/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html
@@ -0,0 +1,10 @@
+
+ {{ 'addon.block_sitemainmenu.pluginname' | translate }}
+
+
+
+
+
+
+
+
diff --git a/src/addon/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts b/src/addon/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts
new file mode 100644
index 000000000..02c044771
--- /dev/null
+++ b/src/addon/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts
@@ -0,0 +1,114 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, Injector } from '@angular/core';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCourseProvider } from '@core/course/providers/course';
+import { CoreCourseHelperProvider } from '@core/course/providers/helper';
+import { CoreSiteHomeProvider } from '@core/sitehome/providers/sitehome';
+import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+
+/**
+ * Component to render a site main menu block.
+ */
+@Component({
+ selector: 'addon-block-sitemainmenu',
+ templateUrl: 'addon-block-sitemainmenu.html'
+})
+export class AddonBlockSiteMainMenuComponent extends CoreBlockBaseComponent implements OnInit {
+ block: any;
+ siteHomeId: number;
+
+ protected fetchContentDefaultError = 'Error getting main menu data.';
+
+ constructor(injector: Injector, protected sitesProvider: CoreSitesProvider, protected courseProvider: CoreCourseProvider,
+ protected courseHelper: CoreCourseHelperProvider, protected siteHomeProvider: CoreSiteHomeProvider,
+ protected prefetchDelegate: CoreCourseModulePrefetchDelegate) {
+
+ super(injector, 'AddonBlockSiteMainMenuComponent');
+
+ this.siteHomeId = sitesProvider.getCurrentSite().getSiteHomeId();
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ super.ngOnInit();
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ const promises = [];
+
+ promises.push(this.courseProvider.invalidateSections(this.siteHomeId));
+ promises.push(this.siteHomeProvider.invalidateNewsForum(this.siteHomeId));
+
+ if (this.block && this.block.modules) {
+ // Invalidate modules prefetch data.
+ promises.push(this.prefetchDelegate.invalidateModules(this.block.modules, this.siteHomeId));
+ }
+
+ return Promise.all(promises);
+ }
+
+ /**
+ * Fetch the data to render the block.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.courseProvider.getSections(this.siteHomeId, false, true).then((sections) => {
+ this.block = sections[0];
+
+ if (this.block) {
+ this.block.hasContent = this.courseHelper.sectionHasContent(this.block);
+ this.courseHelper.addHandlerDataForModules([this.block], this.siteHomeId);
+
+ // Check if Site Home displays announcements. If so, remove it from the main menu block.
+ const currentSite = this.sitesProvider.getCurrentSite(),
+ config = currentSite ? currentSite.getStoredConfig() || {} : {};
+ let hasNewsItem = false;
+
+ if (config.frontpageloggedin) {
+ const items = config.frontpageloggedin.split(',');
+
+ hasNewsItem = items.find((item) => { return item == '0'; });
+ }
+
+ if (hasNewsItem && this.block.modules) {
+ // Remove forum activity (news one only) from the main menu block to prevent duplicates.
+ return this.siteHomeProvider.getNewsForum(this.siteHomeId).then((forum) => {
+ // Search the module that belongs to site news.
+ for (let i = 0; i < this.block.modules.length; i++) {
+ const module = this.block.modules[i];
+
+ if (module.modname == 'forum' && module.instance == forum.id) {
+ this.block.modules.splice(i, 1);
+ break;
+ }
+ }
+ }).catch(() => {
+ // Ignore errors.
+ });
+ }
+ }
+ });
+ }
+}
diff --git a/src/addon/block/sitemainmenu/lang/en.json b/src/addon/block/sitemainmenu/lang/en.json
new file mode 100644
index 000000000..0f3aca2ff
--- /dev/null
+++ b/src/addon/block/sitemainmenu/lang/en.json
@@ -0,0 +1,3 @@
+{
+ "pluginname": "Main menu"
+}
diff --git a/src/addon/block/sitemainmenu/providers/block-handler.ts b/src/addon/block/sitemainmenu/providers/block-handler.ts
new file mode 100644
index 000000000..8c699aff0
--- /dev/null
+++ b/src/addon/block/sitemainmenu/providers/block-handler.ts
@@ -0,0 +1,50 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { AddonBlockSiteMainMenuComponent } from '../components/sitemainmenu/sitemainmenu';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockSiteMainMenuHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockSiteMainMenu';
+ blockName = 'site_main_menu';
+
+ constructor() {
+ super();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_sitemainmenu.pluginname',
+ class: 'addon-block-sitemainmenu',
+ component: AddonBlockSiteMainMenuComponent
+ };
+ }
+}
diff --git a/src/addon/block/sitemainmenu/sitemainmenu.module.ts b/src/addon/block/sitemainmenu/sitemainmenu.module.ts
new file mode 100644
index 000000000..ace9f339e
--- /dev/null
+++ b/src/addon/block/sitemainmenu/sitemainmenu.module.ts
@@ -0,0 +1,44 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { AddonBlockSiteMainMenuComponentsModule } from './components/components.module';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockSiteMainMenuHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ AddonBlockSiteMainMenuComponentsModule,
+ TranslateModule.forChild()
+ ],
+ exports: [
+ ],
+ providers: [
+ AddonBlockSiteMainMenuHandler
+ ]
+})
+export class AddonBlockSiteMainMenuModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockSiteMainMenuHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/starredcourses/components/components.module.ts b/src/addon/block/starredcourses/components/components.module.ts
new file mode 100644
index 000000000..f24aff329
--- /dev/null
+++ b/src/addon/block/starredcourses/components/components.module.ts
@@ -0,0 +1,45 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonBlockStarredCoursesComponent } from './starredcourses/starredcourses';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreCoursesComponentsModule } from '@core/courses/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockStarredCoursesComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CoreCoursesComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockStarredCoursesComponent
+ ],
+ entryComponents: [
+ AddonBlockStarredCoursesComponent
+ ]
+})
+export class AddonBlockStarredCoursesComponentsModule {}
diff --git a/src/addon/block/starredcourses/components/starredcourses/addon-block-starredcourses.html b/src/addon/block/starredcourses/components/starredcourses/addon-block-starredcourses.html
new file mode 100644
index 000000000..a900b1f0f
--- /dev/null
+++ b/src/addon/block/starredcourses/components/starredcourses/addon-block-starredcourses.html
@@ -0,0 +1,21 @@
+
+ {{ 'addon.block_starredcourses.pluginname' | translate }}
+ 1" class="core-button-spinner" item-end>
+
+
+
+ {{prefetchCoursesData.badge}}
+
+
+
+
+
+
+
+
diff --git a/src/addon/block/starredcourses/components/starredcourses/starredcourses.ts b/src/addon/block/starredcourses/components/starredcourses/starredcourses.ts
new file mode 100644
index 000000000..ffa235134
--- /dev/null
+++ b/src/addon/block/starredcourses/components/starredcourses/starredcourses.ts
@@ -0,0 +1,160 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, OnDestroy, Injector, Input } from '@angular/core';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { CoreCoursesHelperProvider } from '@core/courses/providers/helper';
+import { CoreCourseHelperProvider } from '@core/course/providers/helper';
+import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate';
+import { AddonCourseCompletionProvider } from '@addon/coursecompletion/providers/coursecompletion';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+
+/**
+ * Component to render a starred courses block.
+ */
+@Component({
+ selector: 'addon-block-starredcourses',
+ templateUrl: 'addon-block-starredcourses.html'
+})
+export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy {
+ @Input() downloadEnabled: boolean;
+
+ courses = [];
+ prefetchCoursesData = {
+ icon: '',
+ badge: ''
+ };
+
+ protected prefetchIconsInitialized = false;
+ protected isDestroyed;
+ protected downloadButtonObserver;
+ protected coursesObserver;
+ protected courseIds = [];
+ protected fetchContentDefaultError = 'Error getting starred courses data.';
+
+ constructor(injector: Injector, private coursesProvider: CoreCoursesProvider,
+ private courseCompletionProvider: AddonCourseCompletionProvider, private eventsProvider: CoreEventsProvider,
+ private courseHelper: CoreCourseHelperProvider, private utils: CoreUtilsProvider,
+ private courseOptionsDelegate: CoreCourseOptionsDelegate, private coursesHelper: CoreCoursesHelperProvider,
+ private sitesProvider: CoreSitesProvider) {
+
+ super(injector, 'AddonBlockStarredCoursesComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ // Refresh the enabled flags if enabled.
+ this.downloadButtonObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_DASHBOARD_DOWNLOAD_ENABLED_CHANGED,
+ (data) => {
+ const wasEnabled = this.downloadEnabled;
+
+ this.downloadEnabled = data.enabled;
+
+ if (!wasEnabled && this.downloadEnabled && this.loaded) {
+ // Download all courses is enabled now, initialize it.
+ this.initPrefetchCoursesIcons();
+ }
+ });
+
+ this.coursesObserver = this.eventsProvider.on(CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, () => {
+ this.refreshContent();
+ }, this.sitesProvider.getCurrentSiteId());
+
+ super.ngOnInit();
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ const promises = [];
+
+ promises.push(this.coursesProvider.invalidateUserCourses().finally(() => {
+ // Invalidate course completion data.
+ return this.utils.allPromises(this.courseIds.map((courseId) => {
+ return this.courseCompletionProvider.invalidateCourseCompletion(courseId);
+ }));
+ }));
+
+ promises.push(this.courseOptionsDelegate.clearAndInvalidateCoursesOptions());
+ if (this.courseIds.length > 0) {
+ promises.push(this.coursesProvider.invalidateCoursesByField('ids', this.courseIds.join(',')));
+ }
+
+ return this.utils.allPromises(promises).finally(() => {
+ this.prefetchIconsInitialized = false;
+ });
+ }
+
+ /**
+ * Fetch the courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ return this.coursesHelper.getUserCoursesWithOptions('timemodified', 0, 'isfavourite').then((courses) => {
+ this.courses = courses;
+
+ this.initPrefetchCoursesIcons();
+ });
+ }
+
+ /**
+ * Initialize the prefetch icon for selected courses.
+ */
+ protected initPrefetchCoursesIcons(): void {
+ if (this.prefetchIconsInitialized || !this.downloadEnabled) {
+ // Already initialized.
+ return;
+ }
+
+ this.prefetchIconsInitialized = true;
+
+ this.courseHelper.initPrefetchCoursesIcons(this.courses, this.prefetchCoursesData).then((prefetch) => {
+ this.prefetchCoursesData = prefetch;
+ });
+ }
+
+ /**
+ * Prefetch all the shown courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ prefetchCourses(): Promise {
+ const initialIcon = this.prefetchCoursesData.icon;
+
+ return this.courseHelper.prefetchCourses(this.courses, this.prefetchCoursesData).catch((error) => {
+ if (!this.isDestroyed) {
+ this.domUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true);
+ this.prefetchCoursesData.icon = initialIcon;
+ }
+ });
+ }
+
+ /**
+ * Component being destroyed.
+ */
+ ngOnDestroy(): void {
+ this.isDestroyed = true;
+ this.coursesObserver && this.coursesObserver.off();
+ this.downloadButtonObserver && this.downloadButtonObserver.off();
+ }
+}
diff --git a/src/addon/block/starredcourses/lang/en.json b/src/addon/block/starredcourses/lang/en.json
new file mode 100644
index 000000000..cc3dd03c7
--- /dev/null
+++ b/src/addon/block/starredcourses/lang/en.json
@@ -0,0 +1,4 @@
+{
+ "nocourses": "No starred courses",
+ "pluginname": "Starred courses"
+}
diff --git a/src/addon/block/starredcourses/providers/block-handler.ts b/src/addon/block/starredcourses/providers/block-handler.ts
new file mode 100644
index 000000000..7675876b1
--- /dev/null
+++ b/src/addon/block/starredcourses/providers/block-handler.ts
@@ -0,0 +1,50 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { AddonBlockStarredCoursesComponent } from '../components/starredcourses/starredcourses';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockStarredCoursesHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockStarredCourses';
+ blockName = 'starredcourses';
+
+ constructor() {
+ super();
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.starredcourses.pluginname',
+ class: 'addon-block-starredcourses',
+ component: AddonBlockStarredCoursesComponent
+ };
+ }
+}
diff --git a/src/addon/block/starredcourses/starredcourses.module.ts b/src/addon/block/starredcourses/starredcourses.module.ts
new file mode 100644
index 000000000..3d363ec79
--- /dev/null
+++ b/src/addon/block/starredcourses/starredcourses.module.ts
@@ -0,0 +1,40 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockStarredCoursesComponentsModule } from './components/components.module';
+import { AddonBlockStarredCoursesHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ CoreComponentsModule,
+ AddonBlockStarredCoursesComponentsModule,
+ TranslateModule.forChild()
+ ],
+ providers: [
+ AddonBlockStarredCoursesHandler
+ ]
+})
+export class AddonBlockStarredCoursesModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockStarredCoursesHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/block/timeline/components/components.module.ts b/src/addon/block/timeline/components/components.module.ts
new file mode 100644
index 000000000..c408138ef
--- /dev/null
+++ b/src/addon/block/timeline/components/components.module.ts
@@ -0,0 +1,53 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CorePipesModule } from '@pipes/pipes.module';
+import { CoreCoursesComponentsModule } from '@core/courses/components/components.module';
+import { AddonBlockTimelineComponent } from './timeline/timeline';
+import { AddonBlockTimelineEventsComponent } from './events/events';
+import { CoreCourseComponentsModule } from '@core/course/components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonBlockTimelineComponent,
+ AddonBlockTimelineEventsComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CorePipesModule,
+ CoreCoursesComponentsModule,
+ CoreCourseComponentsModule
+ ],
+ providers: [
+ ],
+ exports: [
+ AddonBlockTimelineComponent,
+ AddonBlockTimelineEventsComponent
+ ],
+ entryComponents: [
+ AddonBlockTimelineComponent,
+ AddonBlockTimelineEventsComponent
+ ]
+})
+export class AddonBlockTimelineComponentsModule {}
diff --git a/src/addon/block/timeline/components/events/addon-block-timeline-events.html b/src/addon/block/timeline/components/events/addon-block-timeline-events.html
new file mode 100644
index 000000000..1cebcecc1
--- /dev/null
+++ b/src/addon/block/timeline/components/events/addon-block-timeline-events.html
@@ -0,0 +1,36 @@
+
+
+ {{ dayEvents.dayTimestamp * 1000 | coreFormatDate:"strftimedayshort" }}
+
+
+
+
+
+
+
+
+
+
+ {{event.action.name}}
+ {{event.action.itemcount}}
+
+
+ {{event.timesort * 1000 | coreFormatDate:"strftimetime24" }}
+
+
+ {{event.action.name}}
+ {{event.action.itemcount}}
+
+
+
+
+
+
+
+
+ {{ 'core.loadmore' | translate }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/addon/block/timeline/components/events/events.scss b/src/addon/block/timeline/components/events/events.scss
new file mode 100644
index 000000000..76da48072
--- /dev/null
+++ b/src/addon/block/timeline/components/events/events.scss
@@ -0,0 +1,16 @@
+ion-app.app-root core-courses-course-progress {
+
+ .core-course-module-handler.item {
+ @include core-items();
+ }
+
+ .core-course-module-handler.item .item-heading:first-child {
+ margin-top: 0;
+ }
+}
+
+ion-app.app-root addon-block-timeline-events {
+ a button {
+ pointer-events: auto;
+ }
+}
diff --git a/src/core/courses/components/overview-events/overview-events.ts b/src/addon/block/timeline/components/events/events.ts
similarity index 64%
rename from src/core/courses/components/overview-events/overview-events.ts
rename to src/addon/block/timeline/components/events/events.ts
index c7d7d6e14..a4f50e96a 100644
--- a/src/core/courses/components/overview-events/overview-events.ts
+++ b/src/addon/block/timeline/components/events/events.ts
@@ -17,6 +17,7 @@ import { NavController } from 'ionic-angular';
import { CoreSitesProvider } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreTextUtilsProvider } from '@providers/utils/text';
+import { CoreTimeUtilsProvider } from '@providers/utils/time';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper';
@@ -26,27 +27,25 @@ import * as moment from 'moment';
* Directive to render a list of events in course overview.
*/
@Component({
- selector: 'core-courses-overview-events',
- templateUrl: 'core-courses-overview-events.html'
+ selector: 'addon-block-timeline-events',
+ templateUrl: 'addon-block-timeline-events.html'
})
-export class CoreCoursesOverviewEventsComponent implements OnChanges {
- @Input() events: any[]; // The events to render.
+export class AddonBlockTimelineEventsComponent implements OnChanges {
+ @Input() events = []; // The events to render.
@Input() showCourse?: boolean | string; // Whether to show the course name.
+ @Input() from: number; // Number of days from today to offset the events.
+ @Input() to?: number; // Number of days from today to limit the events to. If not defined, no limit.
@Input() canLoadMore?: boolean; // Whether more events can be loaded.
@Output() loadMore: EventEmitter; // Notify that more events should be loaded.
empty: boolean;
loadingMore: boolean;
- recentlyOverdue: any[] = [];
- today: any[] = [];
- next7Days: any[] = [];
- next30Days: any[] = [];
- future: any[] = [];
+ filteredEvents = [];
constructor(@Optional() private navCtrl: NavController, private utils: CoreUtilsProvider,
private textUtils: CoreTextUtilsProvider, private domUtils: CoreDomUtilsProvider,
private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider,
- private contentLinksHelper: CoreContentLinksHelperProvider) {
+ private contentLinksHelper: CoreContentLinksHelperProvider, private timeUtils: CoreTimeUtilsProvider) {
this.loadMore = new EventEmitter();
}
@@ -56,8 +55,34 @@ export class CoreCoursesOverviewEventsComponent implements OnChanges {
ngOnChanges(changes: {[name: string]: SimpleChange}): void {
this.showCourse = this.utils.isTrueOrOne(this.showCourse);
- if (changes.events) {
- this.updateEvents();
+ if (changes.events || changes.from || changes.to) {
+ if (this.events && this.events.length > 0) {
+ const filteredEvents = this.filterEventsByTime(this.from, this.to);
+ this.empty = !filteredEvents || filteredEvents.length <= 0;
+
+ const eventsByDay = {};
+ filteredEvents.forEach((event) => {
+ const dayTimestamp = this.timeUtils.getMidnightForTimestamp(event.timesort);
+ if (eventsByDay[dayTimestamp]) {
+ eventsByDay[dayTimestamp].push(event);
+ } else {
+ eventsByDay[dayTimestamp] = [event];
+ }
+ });
+
+ const todaysMidnight = this.timeUtils.getMidnightForTimestamp();
+ this.filteredEvents = [];
+ Object.keys(eventsByDay).forEach((key) => {
+ const dayTimestamp = parseInt(key);
+ this.filteredEvents.push({
+ color: dayTimestamp < todaysMidnight ? 'danger' : 'light',
+ dayTimestamp: dayTimestamp,
+ events: eventsByDay[dayTimestamp]
+ });
+ });
+ } else {
+ this.empty = true;
+ }
}
}
@@ -69,8 +94,8 @@ export class CoreCoursesOverviewEventsComponent implements OnChanges {
* @return {any[]} Filtered events.
*/
protected filterEventsByTime(start: number, end?: number): any[] {
- start = moment().add(start, 'days').unix();
- end = typeof end != 'undefined' ? moment().add(end, 'days').unix() : end;
+ start = moment().add(start, 'days').startOf('day').unix();
+ end = typeof end != 'undefined' ? moment().add(end, 'days').startOf('day').unix() : end;
return this.events.filter((event) => {
if (end) {
@@ -85,20 +110,6 @@ export class CoreCoursesOverviewEventsComponent implements OnChanges {
});
}
- /**
- * Update the events displayed.
- */
- protected updateEvents(): void {
- this.empty = !this.events || this.events.length <= 0;
- if (!this.empty) {
- this.recentlyOverdue = this.filterEventsByTime(-14, 0);
- this.today = this.filterEventsByTime(0, 1);
- this.next7Days = this.filterEventsByTime(1, 7);
- this.next30Days = this.filterEventsByTime(7, 30);
- this.future = this.filterEventsByTime(30);
- }
- }
-
/**
* Load more events clicked.
*/
@@ -110,8 +121,8 @@ export class CoreCoursesOverviewEventsComponent implements OnChanges {
/**
* Action clicked.
*
- * @param {Event} e Click event.
- * @param {string} url Url of the action.
+ * @param {Event} e Click event.
+ * @param {string} url Url of the action.
*/
action(e: Event, url: string): void {
e.preventDefault();
diff --git a/src/addon/block/timeline/components/timeline/addon-block-timeline.html b/src/addon/block/timeline/components/timeline/addon-block-timeline.html
new file mode 100644
index 000000000..0e160fdf0
--- /dev/null
+++ b/src/addon/block/timeline/components/timeline/addon-block-timeline.html
@@ -0,0 +1,37 @@
+
+ {{ 'addon.block_timeline.pluginname' | translate }}
+
+
+
+
+
+
+
+
+ {{ 'core.all' | translate }}
+ {{ 'addon.block_timeline.overdue' | translate }}
+ {{ 'addon.block_timeline.duedate' | translate }}
+ {{ 'addon.block_timeline.next7days' | translate }}
+ {{ 'addon.block_timeline.next30days' | translate }}
+ {{ 'addon.block_timeline.next3months' | translate }}
+ {{ 'addon.block_timeline.next6months' | translate }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/addon/block/timeline/components/timeline/timeline.ts b/src/addon/block/timeline/components/timeline/timeline.ts
new file mode 100644
index 000000000..20976cc5b
--- /dev/null
+++ b/src/addon/block/timeline/components/timeline/timeline.ts
@@ -0,0 +1,224 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit, Injector } from '@angular/core';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+import { CoreTimeUtilsProvider } from '@providers/utils/time';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { CoreCoursesHelperProvider } from '@core/courses/providers/helper';
+import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate';
+import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component';
+import { AddonBlockTimelineProvider } from '../../providers/timeline';
+
+/**
+ * Component to render a timeline block.
+ */
+@Component({
+ selector: 'addon-block-timeline',
+ templateUrl: 'addon-block-timeline.html'
+})
+export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implements OnInit {
+ sort = 'sortbydates';
+ filter = 'next30days';
+ currentSite: any;
+ timeline = {
+ events: [],
+ loaded: false,
+ canLoadMore: undefined
+ };
+ timelineCourses = {
+ courses: [],
+ loaded: false,
+ canLoadMore: false
+ };
+ dataFrom: number;
+ dataTo: number;
+
+ protected courseIds = [];
+ protected fetchContentDefaultError = 'Error getting timeline data.';
+
+ constructor(injector: Injector, private coursesProvider: CoreCoursesProvider, private utils: CoreUtilsProvider,
+ private timelineProvider: AddonBlockTimelineProvider, private courseOptionsDelegate: CoreCourseOptionsDelegate,
+ private coursesHelper: CoreCoursesHelperProvider, private sitesProvider: CoreSitesProvider,
+ private timeUtils: CoreTimeUtilsProvider) {
+
+ super(injector, 'AddonBlockTimelineComponent');
+ }
+
+ /**
+ * Component being initialized.
+ */
+ ngOnInit(): void {
+ this.currentSite = this.sitesProvider.getCurrentSite();
+ this.currentSite.getLocalSiteConfig('AddonBlockTimelineFilter', this.filter).then((value) => {
+ this.filter = value;
+ this.switchFilter();
+ });
+ this.currentSite.getLocalSiteConfig('AddonBlockTimelineSort', this.sort).then((value) => {
+ this.sort = value;
+ super.ngOnInit();
+ });
+ }
+
+ /**
+ * Perform the invalidate content function.
+ *
+ * @return {Promise} Resolved when done.
+ */
+ protected invalidateContent(): Promise {
+ const promises = [];
+
+ promises.push(this.timelineProvider.invalidateActionEventsByTimesort());
+ promises.push(this.timelineProvider.invalidateActionEventsByCourses());
+ promises.push(this.coursesProvider.invalidateUserCourses());
+ promises.push(this.courseOptionsDelegate.clearAndInvalidateCoursesOptions());
+ if (this.courseIds.length > 0) {
+ promises.push(this.coursesProvider.invalidateCoursesByField('ids', this.courseIds.join(',')));
+ }
+
+ return this.utils.allPromises(promises);
+ }
+
+ /**
+ * Fetch the courses for my overview.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchContent(): Promise {
+ if (this.sort == 'sortbydates') {
+ return this.fetchMyOverviewTimeline().finally(() => {
+ this.timeline.loaded = true;
+ });
+ } else if (this.sort == 'sortbycourses') {
+ return this.fetchMyOverviewTimelineByCourses().finally(() => {
+ this.timelineCourses.loaded = true;
+ });
+ }
+ }
+
+ /**
+ * Load more events.
+ */
+ loadMoreTimeline(): Promise {
+ return this.fetchMyOverviewTimeline(this.timeline.canLoadMore).catch((error) => {
+ this.domUtils.showErrorModalDefault(error, this.fetchContentDefaultError);
+ });
+ }
+
+ /**
+ * Load more events.
+ *
+ * @param {any} course Course.
+ * @return {Promise} Promise resolved when done.
+ */
+ loadMoreCourse(course: any): Promise {
+ return this.timelineProvider.getActionEventsByCourse(course.id, course.canLoadMore).then((courseEvents) => {
+ course.events = course.events.concat(courseEvents.events);
+ course.canLoadMore = courseEvents.canLoadMore;
+ }).catch((error) => {
+ this.domUtils.showErrorModalDefault(error, this.fetchContentDefaultError);
+ });
+ }
+
+ /**
+ * Fetch the timeline.
+ *
+ * @param {number} [afterEventId] The last event id.
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchMyOverviewTimeline(afterEventId?: number): Promise {
+ return this.timelineProvider.getActionEventsByTimesort(afterEventId).then((events) => {
+ this.timeline.events = events.events;
+ this.timeline.canLoadMore = events.canLoadMore;
+ });
+ }
+
+ /**
+ * Fetch the timeline by courses.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchMyOverviewTimelineByCourses(): Promise {
+ return this.coursesHelper.getUserCoursesWithOptions().then((courses) => {
+ const today = this.timeUtils.timestamp();
+ courses = courses.filter((course) => {
+ return course.startdate <= today && (!course.enddate || course.enddate >= today);
+ });
+
+ this.timelineCourses.courses = courses;
+ if (courses.length > 0) {
+ this.courseIds = courses.map((course) => {
+ return course.id;
+ });
+
+ return this.timelineProvider.getActionEventsByCourses(this.courseIds).then((courseEvents) => {
+ this.timelineCourses.courses.forEach((course) => {
+ course.events = courseEvents[course.id].events;
+ course.canLoadMore = courseEvents[course.id].canLoadMore;
+ });
+ });
+ }
+ });
+ }
+
+ /**
+ * Change timeline filter being viewed.
+ */
+ switchFilter(): void {
+ this.currentSite.setLocalSiteConfig('AddonBlockTimelineFilter', this.filter);
+ switch (this.filter) {
+ case 'overdue':
+ this.dataFrom = -14;
+ this.dataTo = 0;
+ break;
+ case 'next7days':
+ this.dataFrom = 0;
+ this.dataTo = 7;
+ break;
+ case 'next30days':
+ this.dataFrom = 0;
+ this.dataTo = 30;
+ break;
+ case 'next3months':
+ this.dataFrom = 0;
+ this.dataTo = 90;
+ break;
+ case 'next6months':
+ this.dataFrom = 0;
+ this.dataTo = 180;
+ break;
+ default:
+ case 'all':
+ this.dataFrom = -14;
+ this.dataTo = undefined;
+ break;
+ }
+ }
+
+ /**
+ * Change timeline sort being viewed.
+ *
+ * @param {string} sort New sorting.
+ */
+ switchSort(sort: string): void {
+ this.sort = sort;
+ this.currentSite.setLocalSiteConfig('AddonBlockTimelineSort', this.sort);
+ if (!this.timeline.loaded && this.sort == 'sortbydates') {
+ this.fetchContent();
+ } else if (!this.timelineCourses.loaded && this.sort == 'sortbycourses') {
+ this.fetchContent();
+ }
+ }
+}
diff --git a/src/addon/block/timeline/lang/en.json b/src/addon/block/timeline/lang/en.json
new file mode 100644
index 000000000..a9460e4d7
--- /dev/null
+++ b/src/addon/block/timeline/lang/en.json
@@ -0,0 +1,13 @@
+{
+ "duedate": "Due date",
+ "next30days": "Next 30 days",
+ "next3months": "Next 3 months",
+ "next6months": "Next 6 months",
+ "next7days": "Next 7 days",
+ "nocoursesinprogress": "No in progress courses",
+ "noevents": "No upcoming activities due",
+ "overdue": "Overdue",
+ "pluginname": "Timeline",
+ "sortbycourses": "Sort by courses",
+ "sortbydates": "Sort by dates"
+}
\ No newline at end of file
diff --git a/src/addon/block/timeline/providers/block-handler.ts b/src/addon/block/timeline/providers/block-handler.ts
new file mode 100644
index 000000000..2e89d60fb
--- /dev/null
+++ b/src/addon/block/timeline/providers/block-handler.ts
@@ -0,0 +1,67 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Injectable, Injector } from '@angular/core';
+import { CoreSitesProvider } from '@providers/sites';
+import { CoreBlockHandlerData } from '@core/block/providers/delegate';
+import { CoreCoursesProvider } from '@core/courses/providers/courses';
+import { AddonBlockTimelineProvider } from '@addon/block/timeline/providers/timeline';
+import { AddonBlockTimelineComponent } from '../components/timeline/timeline';
+import { CoreBlockBaseHandler } from '@core/block/classes/base-block-handler';
+
+/**
+ * Block handler.
+ */
+@Injectable()
+export class AddonBlockTimelineHandler extends CoreBlockBaseHandler {
+ name = 'AddonBlockTimeline';
+ blockName = 'timeline';
+
+ constructor(private timelineProvider: AddonBlockTimelineProvider, private coursesProvider: CoreCoursesProvider,
+ private sitesProvider: CoreSitesProvider) {
+
+ super();
+ }
+
+ /**
+ * Check if the handler is enabled on a site level.
+ *
+ * @return {boolean} Whether or not the handler is enabled on a site level.
+ */
+ isEnabled(): boolean | Promise {
+ return this.timelineProvider.isAvailable().then((enabled) => {
+ return enabled && (this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6') ||
+ !this.coursesProvider.isMyCoursesDisabledInSite());
+ });
+ }
+
+ /**
+ * Returns the data needed to render the block.
+ *
+ * @param {Injector} injector Injector.
+ * @param {any} block The block to render.
+ * @param {string} contextLevel The context where the block will be used.
+ * @param {number} instanceId The instance ID associated with the context level.
+ * @return {CoreBlockHandlerData|Promise} Data or promise resolved with the data.
+ */
+ getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number)
+ : CoreBlockHandlerData | Promise {
+
+ return {
+ title: 'addon.block_timeline.pluginname',
+ class: 'addon-block-timeline',
+ component: AddonBlockTimelineComponent
+ };
+ }
+}
diff --git a/src/core/courses/providers/my-overview.ts b/src/addon/block/timeline/providers/timeline.ts
similarity index 87%
rename from src/core/courses/providers/my-overview.ts
rename to src/addon/block/timeline/providers/timeline.ts
index d64d0dbca..942ba4ba5 100644
--- a/src/core/courses/providers/my-overview.ts
+++ b/src/addon/block/timeline/providers/timeline.ts
@@ -14,16 +14,16 @@
import { Injectable } from '@angular/core';
import { CoreSitesProvider } from '@providers/sites';
-import { CoreSite } from '@classes/site';
import * as moment from 'moment';
/**
* Service that provides some features regarding course overview.
*/
@Injectable()
-export class CoreCoursesMyOverviewProvider {
+export class AddonBlockTimelineProvider {
static EVENTS_LIMIT = 20;
static EVENTS_LIMIT_PER_COURSE = 10;
+ // Cache key was maintained when moving the functions to this file. It comes from core myoverview.
protected ROOT_CACHE_KEY = 'myoverview:';
constructor(private sitesProvider: CoreSitesProvider) { }
@@ -44,7 +44,7 @@ export class CoreCoursesMyOverviewProvider {
data: any = {
timesortfrom: time,
courseid: courseId,
- limitnum: CoreCoursesMyOverviewProvider.EVENTS_LIMIT_PER_COURSE
+ limitnum: AddonBlockTimelineProvider.EVENTS_LIMIT_PER_COURSE
},
preSets = {
cacheKey: this.getActionEventsByCourseCacheKey(courseId)
@@ -88,7 +88,7 @@ export class CoreCoursesMyOverviewProvider {
data = {
timesortfrom: time,
courseids: courseIds,
- limitnum: CoreCoursesMyOverviewProvider.EVENTS_LIMIT_PER_COURSE
+ limitnum: AddonBlockTimelineProvider.EVENTS_LIMIT_PER_COURSE
},
preSets = {
cacheKey: this.getActionEventsByCoursesCacheKey()
@@ -131,7 +131,7 @@ export class CoreCoursesMyOverviewProvider {
const time = moment().subtract(14, 'days').unix(), // Check two weeks ago.
data: any = {
timesortfrom: time,
- limitnum: CoreCoursesMyOverviewProvider.EVENTS_LIMIT
+ limitnum: AddonBlockTimelineProvider.EVENTS_LIMIT
},
preSets = {
cacheKey: this.getActionEventsByTimesortCacheKey(afterEventId, data.limitnum),
@@ -218,37 +218,11 @@ export class CoreCoursesMyOverviewProvider {
*/
isAvailable(siteId?: string): Promise {
return this.sitesProvider.getSite(siteId).then((site) => {
- return site.wsAvailable('core_calendar_get_action_events_by_courses');
+ return site.wsAvailable('core_calendar_get_action_events_by_courses') &&
+ site.wsAvailable('core_calendar_get_action_events_by_timesort');
});
}
- /**
- * Check if My Overview is disabled in a certain site.
- *
- * @param {CoreSite} [site] Site. If not defined, use current site.
- * @return {boolean} Whether it's disabled.
- */
- isDisabledInSite(site?: CoreSite): boolean {
- site = site || this.sitesProvider.getCurrentSite();
-
- return site.isFeatureDisabled('CoreMainMenuDelegate_CoreCourses');
- }
-
- /**
- * Check if My Overview is available and not disabled.
- *
- * @return {Promise} Promise resolved with true if enabled, resolved with false otherwise.
- */
- isEnabled(): Promise {
- if (!this.isDisabledInSite()) {
- return this.isAvailable().catch(() => {
- return false;
- });
- }
-
- return Promise.resolve(false);
- }
-
/**
* Handles course events, filtering and treating if more can be loaded.
*
@@ -258,7 +232,7 @@ export class CoreCoursesMyOverviewProvider {
*/
protected treatCourseEvents(course: any, timeFrom: number): { events: any[], canLoadMore: number } {
const canLoadMore: number =
- course.events.length >= CoreCoursesMyOverviewProvider.EVENTS_LIMIT_PER_COURSE ? course.lastid : undefined;
+ course.events.length >= AddonBlockTimelineProvider.EVENTS_LIMIT_PER_COURSE ? course.lastid : undefined;
// Filter events by time in case it uses cache.
course.events = course.events.filter((element) => {
diff --git a/src/addon/block/timeline/timeline.module.ts b/src/addon/block/timeline/timeline.module.ts
new file mode 100644
index 000000000..92ed2cefc
--- /dev/null
+++ b/src/addon/block/timeline/timeline.module.ts
@@ -0,0 +1,42 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreBlockDelegate } from '@core/block/providers/delegate';
+import { AddonBlockTimelineComponentsModule } from './components/components.module';
+import { AddonBlockTimelineProvider } from './providers/timeline';
+import { AddonBlockTimelineHandler } from './providers/block-handler';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ IonicModule,
+ AddonBlockTimelineComponentsModule,
+ TranslateModule.forChild()
+ ],
+ exports: [
+ ],
+ providers: [
+ AddonBlockTimelineProvider,
+ AddonBlockTimelineHandler
+ ]
+})
+export class AddonBlockTimelineModule {
+ constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockTimelineHandler) {
+ blockDelegate.registerHandler(blockHandler);
+ }
+}
diff --git a/src/addon/calendar/lang/ar.json b/src/addon/calendar/lang/ar.json
deleted file mode 100755
index 23e2ee91b..000000000
--- a/src/addon/calendar/lang/ar.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "أحداث التقويم",
- "errorloadevent": "خطأ في تحميل الحدث",
- "errorloadevents": "خطأ في تحميل الأحداث",
- "noevents": "لا يوجد أي أحداث",
- "notifications": "الإشعارات"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/bg.json b/src/addon/calendar/lang/bg.json
deleted file mode 100755
index 33589385c..000000000
--- a/src/addon/calendar/lang/bg.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "Събития от календара",
- "errorloadevent": "Грешка при зареждането на събитие.",
- "errorloadevents": "Грешка при зареждането на събитията.",
- "noevents": "Няма предстоящи дейности",
- "notifications": "Уведомление"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/ca.json b/src/addon/calendar/lang/ca.json
deleted file mode 100755
index a2a8930c7..000000000
--- a/src/addon/calendar/lang/ca.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Esdeveniments del calendari",
- "defaultnotificationtime": "Hora de notificació per defecte",
- "errorloadevent": "S'ha produït un error carregant l'esdeveniment.",
- "errorloadevents": "S'ha produït un error carregant els esdeveniments.",
- "noevents": "Cap activitat venç properament",
- "notifications": "Notificacions"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/cs.json b/src/addon/calendar/lang/cs.json
deleted file mode 100755
index 5dca11fb0..000000000
--- a/src/addon/calendar/lang/cs.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalendář událostí",
- "defaultnotificationtime": "Výchozí čas oznámení",
- "errorloadevent": "Chyba při načítání události.",
- "errorloadevents": "Chyba při načítání událostí.",
- "noevents": "Žádné nadcházející činnosti",
- "notifications": "Informace"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/da.json b/src/addon/calendar/lang/da.json
deleted file mode 100755
index 9af5235a5..000000000
--- a/src/addon/calendar/lang/da.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "Kalenderbegivenheder",
- "errorloadevent": "Fejl ved indlæsning af begivenhed.",
- "errorloadevents": "Fejl ved indlæsning af begivenheder.",
- "noevents": "Ingen forestående aktiviteter",
- "notifications": "Beskeder"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/de-du.json b/src/addon/calendar/lang/de-du.json
deleted file mode 100755
index 7268e975f..000000000
--- a/src/addon/calendar/lang/de-du.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalender",
- "defaultnotificationtime": "Standardmäßige Benachrichtigungszeit",
- "errorloadevent": "Fehler beim Laden des Kalendereintrags",
- "errorloadevents": "Fehler beim Laden der Kalendereinträge",
- "noevents": "Keine anstehenden Aktivitäten fällig",
- "notifications": "Mitteilungen"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/de.json b/src/addon/calendar/lang/de.json
deleted file mode 100755
index 120feaec0..000000000
--- a/src/addon/calendar/lang/de.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalender",
- "defaultnotificationtime": "Standardmäßige Benachrichtigungszeit",
- "errorloadevent": "Fehler beim Laden des Kalendereintrags",
- "errorloadevents": "Fehler beim Laden der Kalendereinträge",
- "noevents": "Keine Kalendereinträge",
- "notifications": "Systemmitteilungen"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/el.json b/src/addon/calendar/lang/el.json
deleted file mode 100755
index 4a7590c2d..000000000
--- a/src/addon/calendar/lang/el.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Ημερολόγιο συμβάντων",
- "defaultnotificationtime": "Προεπιλεγμένος χρόνος ειδοποίησης",
- "errorloadevent": "Σφάλμα στην φόρτωση συμβάντου.",
- "errorloadevents": "Σφάλμα στην φόρτωση συμβάντων.",
- "noevents": "Καμία δραστηριότητα προσεχώς",
- "notifications": "Ειδοποιήσεις"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/en.json b/src/addon/calendar/lang/en.json
index 63e4b17ec..3342aaeeb 100644
--- a/src/addon/calendar/lang/en.json
+++ b/src/addon/calendar/lang/en.json
@@ -6,6 +6,7 @@
"errorloadevents": "Error loading events.",
"eventendtime": "End time",
"eventstarttime": "Start time",
+ "gotoactivity": "Go to activity",
"noevents": "There are no events",
"notifications": "Notifications",
"typeclose": "Close event",
diff --git a/src/addon/calendar/lang/es-mx.json b/src/addon/calendar/lang/es-mx.json
deleted file mode 100755
index d4be495ef..000000000
--- a/src/addon/calendar/lang/es-mx.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Eventos del calendario",
- "defaultnotificationtime": "Hora de notificación por defecto",
- "errorloadevent": "Error al cargar evento.",
- "errorloadevents": "Error al cargar eventos.",
- "noevents": "No hay actividades próximas pendientes",
- "notifications": "Avisos"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/es.json b/src/addon/calendar/lang/es.json
deleted file mode 100755
index 8149bc574..000000000
--- a/src/addon/calendar/lang/es.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Eventos de calendario",
- "defaultnotificationtime": "Tiempo de notificación por defecto",
- "errorloadevent": "Error cargando el evento.",
- "errorloadevents": "Error cargando los eventos.",
- "noevents": "No hay actividades próximas pendientes",
- "notifications": "Avisos"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/eu.json b/src/addon/calendar/lang/eu.json
deleted file mode 100755
index 1158b9cd1..000000000
--- a/src/addon/calendar/lang/eu.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Egutegiko gertakariak",
- "defaultnotificationtime": "Berezko jakinarazpen-ordua",
- "errorloadevent": "Errorea gertakaria kargatzean.",
- "errorloadevents": "Errorea gertakariak kargatzean.",
- "noevents": "Ez dago ekitaldirik",
- "notifications": "Jakinarazpenak"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/fa.json b/src/addon/calendar/lang/fa.json
deleted file mode 100755
index 76813733c..000000000
--- a/src/addon/calendar/lang/fa.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "رویدادهای تقویم",
- "defaultnotificationtime": "زمان پیشفرض اطلاعرسانی",
- "errorloadevent": "خطا در بارگیری رویداد.",
- "errorloadevents": "خطا در بارگیری رویدادها.",
- "noevents": "هیچ مهلتی برای فعالیتهای آتی وجود ندارد",
- "notifications": "تذکرات"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/fi.json b/src/addon/calendar/lang/fi.json
deleted file mode 100755
index 39534c661..000000000
--- a/src/addon/calendar/lang/fi.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalenteritapahtumat",
- "defaultnotificationtime": "Oletusilmoitusaika",
- "errorloadevent": "Ladattaessa tapahtumaa tapahtui virhe.",
- "errorloadevents": "Ladattaessa tapahtumia tapahtui virhe.",
- "noevents": "Ei tulevia aktiviteettien määräaikoja",
- "notifications": "Ilmoitukset"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/fr.json b/src/addon/calendar/lang/fr.json
deleted file mode 100755
index 9281fbdab..000000000
--- a/src/addon/calendar/lang/fr.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Événements du calendrier",
- "defaultnotificationtime": "Heure de notification par défaut",
- "errorloadevent": "Erreur de chargement de l'événement",
- "errorloadevents": "Erreur de chargement des événements",
- "noevents": "Aucune activité",
- "notifications": "Notifications"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/he.json b/src/addon/calendar/lang/he.json
deleted file mode 100755
index 3702664d6..000000000
--- a/src/addon/calendar/lang/he.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "אירועי לוח שנה",
- "errorloadevent": "שגיאה בטעינת האירוע.",
- "errorloadevents": "שגיאה בטעינת האירועים.",
- "noevents": "לא קיימות פעילויות עתידיות להן מועד הגשה",
- "notifications": "עדכונים והודעות"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/hr.json b/src/addon/calendar/lang/hr.json
deleted file mode 100755
index c60dbbe4c..000000000
--- a/src/addon/calendar/lang/hr.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "calendarevents": "Događaji u kalendaru",
- "noevents": "Nema zakazanih budućih aktivnosti",
- "notifications": "Obavijesti"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/hu.json b/src/addon/calendar/lang/hu.json
deleted file mode 100755
index c353b4458..000000000
--- a/src/addon/calendar/lang/hu.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "noevents": "Nincs esedékes tevékenység",
- "notifications": "Értesítések"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/it.json b/src/addon/calendar/lang/it.json
deleted file mode 100755
index a156f75ad..000000000
--- a/src/addon/calendar/lang/it.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Eventi nel calendario",
- "defaultnotificationtime": "Orario di notifica di default",
- "errorloadevent": "Si è verificato un errore durante il caricamento degli eventi.",
- "errorloadevents": "Si è verificato un errore durante il caricamento degli eventi.",
- "noevents": "Non ci sono attività con date di svolgimento e/o di scadenza programmate in questo periodo.",
- "notifications": "Notifiche"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/ja.json b/src/addon/calendar/lang/ja.json
deleted file mode 100755
index 8bdfec3c2..000000000
--- a/src/addon/calendar/lang/ja.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "カレンダーイベント",
- "defaultnotificationtime": "デフォルト通知時間",
- "errorloadevent": "イベントの読み込み時にエラーがありました。",
- "errorloadevents": "イベントの読み込み時にエラーがありました。",
- "noevents": "到来する活動期限はありません。",
- "notifications": "通知"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/ko.json b/src/addon/calendar/lang/ko.json
deleted file mode 100755
index eaf06b122..000000000
--- a/src/addon/calendar/lang/ko.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "달력 일정",
- "defaultnotificationtime": "기본 알림 시간",
- "errorloadevent": "이벤트 올리기 오류",
- "errorloadevents": "이벤트 올리기 오류",
- "noevents": "이벤트 없음",
- "notifications": "시스템공지"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/lt.json b/src/addon/calendar/lang/lt.json
deleted file mode 100755
index 38fab7b87..000000000
--- a/src/addon/calendar/lang/lt.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "Renginių kalendorius",
- "errorloadevent": "Klaida įkeliant renginį.",
- "errorloadevents": "Klaida įkeliant renginius.",
- "noevents": "Nėra numatytų artėjančių veiklų",
- "notifications": "Pranešimai"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/mr.json b/src/addon/calendar/lang/mr.json
deleted file mode 100755
index 9406719e9..000000000
--- a/src/addon/calendar/lang/mr.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "दिनदर्शिका कार्यक्रम",
- "defaultnotificationtime": "सूचना वेळ",
- "errorloadevent": "कार्यक्रम लोड करताना त्रुटी.",
- "errorloadevents": "कार्यक्रम लोड करताना त्रुटी.",
- "noevents": "कोणतेही कार्यक्रम नाहीत",
- "notifications": "अधिसुचना"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/nl.json b/src/addon/calendar/lang/nl.json
deleted file mode 100755
index 16546e8a4..000000000
--- a/src/addon/calendar/lang/nl.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalendergebeurtenissen",
- "defaultnotificationtime": "Standaard notificatietijd",
- "errorloadevent": "Fout bij het laden van de gebeurtenis.",
- "errorloadevents": "Fout bij het laden van de gebeurtenissen.",
- "noevents": "Er zijn geen verwachte activiteiten",
- "notifications": "Meldingen"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/no.json b/src/addon/calendar/lang/no.json
deleted file mode 100755
index 802154285..000000000
--- a/src/addon/calendar/lang/no.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Kalenderhendelser",
- "defaultnotificationtime": "Standard varslingstid",
- "errorloadevent": "Feil ved lasting av hendelse",
- "errorloadevents": "Feil ved lasting av hendelser",
- "noevents": "Det er ingen aktiviteter som må gjøres i nærmeste fremtid.",
- "notifications": "Meldinger"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/pl.json b/src/addon/calendar/lang/pl.json
deleted file mode 100755
index 4f391781a..000000000
--- a/src/addon/calendar/lang/pl.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "noevents": "Brak nadchodzących terminów zadań",
- "notifications": "Powiadomienia"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/pt-br.json b/src/addon/calendar/lang/pt-br.json
deleted file mode 100755
index f66b11184..000000000
--- a/src/addon/calendar/lang/pt-br.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Eventos do calendário",
- "defaultnotificationtime": "Tempo de notificação padrão",
- "errorloadevent": "Erro ao carregar evento.",
- "errorloadevents": "Erro ao carregar eventos.",
- "noevents": "Não há atividades pendentes",
- "notifications": "Avisos"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/pt.json b/src/addon/calendar/lang/pt.json
deleted file mode 100755
index a65b11f46..000000000
--- a/src/addon/calendar/lang/pt.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Eventos do calendário",
- "defaultnotificationtime": "Hora de notificação predefinida",
- "errorloadevent": "Erro ao carregar evento.",
- "errorloadevents": "Erro ao carregar eventos.",
- "noevents": "Nenhuma atividade programada",
- "notifications": "Notificações"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/ro.json b/src/addon/calendar/lang/ro.json
deleted file mode 100755
index 93994c867..000000000
--- a/src/addon/calendar/lang/ro.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "Evenimente din calendar",
- "errorloadevent": "Eroare la încărcarea unui eveniment.",
- "errorloadevents": "Eroare la încărcarea unor evenimente.",
- "noevents": "Nu sunt evenimente noi",
- "notifications": "Notificări"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/ru.json b/src/addon/calendar/lang/ru.json
deleted file mode 100755
index 3a1b1bf3b..000000000
--- a/src/addon/calendar/lang/ru.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "События календаря",
- "defaultnotificationtime": "Время уведомлений по умолчанию",
- "errorloadevent": "Ошибка при загрузке события",
- "errorloadevents": "Ошибка при загрузке событий",
- "noevents": "Окончаний сроков сдачи элементов курса в ближайшее время нет.",
- "notifications": "Уведомления"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/sr-cr.json b/src/addon/calendar/lang/sr-cr.json
deleted file mode 100755
index dba4ebcd8..000000000
--- a/src/addon/calendar/lang/sr-cr.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Догађаји у календару",
- "defaultnotificationtime": "Подразумевано време за слање обавештења",
- "errorloadevent": "Грешка приликом учитавања догађаја.",
- "errorloadevents": "Грешка приликом учитавања догађаја.",
- "noevents": "Нема догађаја",
- "notifications": "Обавештења"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/sr-lt.json b/src/addon/calendar/lang/sr-lt.json
deleted file mode 100755
index 7db382ef5..000000000
--- a/src/addon/calendar/lang/sr-lt.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Događaji u kalendaru",
- "defaultnotificationtime": "Podrazumevano vreme za slanje obaveštenja",
- "errorloadevent": "Greška prilikom učitavanja događaja.",
- "errorloadevents": "Greška prilikom učitavanja događaja.",
- "noevents": "Nema događaja",
- "notifications": "Nema događaja"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/sv.json b/src/addon/calendar/lang/sv.json
deleted file mode 100755
index 28354a807..000000000
--- a/src/addon/calendar/lang/sv.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "Kalenderhändelser",
- "errorloadevent": "Fel vid inläsning av händelse.",
- "errorloadevents": "Fel vid inläsning av händelser",
- "noevents": "Inga deadlines för aktiviteter",
- "notifications": "Administration"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/tg.json b/src/addon/calendar/lang/tg.json
deleted file mode 100755
index 7e90c8337..000000000
--- a/src/addon/calendar/lang/tg.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "calendarevents": "Чорабиниҳои тақвимӣ",
- "noevents": "Ҳеҷ фаъолияти омадаистода нест",
- "notifications": "Огоҳиҳо"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/tr.json b/src/addon/calendar/lang/tr.json
deleted file mode 100755
index 56b4ccb35..000000000
--- a/src/addon/calendar/lang/tr.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "noevents": "Hiç bildiriminiz yok",
- "notifications": "Bildirimler"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/uk.json b/src/addon/calendar/lang/uk.json
deleted file mode 100755
index e0b616f24..000000000
--- a/src/addon/calendar/lang/uk.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "calendarevents": "Події календаря",
- "defaultnotificationtime": "Час сповіщень за-замовчуванням",
- "errorloadevent": "Помилка завантаження події.",
- "errorloadevents": "Помилка завантаження подій.",
- "noevents": "Наразі, заплановані активності відсутні",
- "notifications": "Повідомлення"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/zh-cn.json b/src/addon/calendar/lang/zh-cn.json
deleted file mode 100755
index 5fc1088f4..000000000
--- a/src/addon/calendar/lang/zh-cn.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "noevents": "没有事件",
- "notifications": "通知"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/lang/zh-tw.json b/src/addon/calendar/lang/zh-tw.json
deleted file mode 100755
index f880be3d5..000000000
--- a/src/addon/calendar/lang/zh-tw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "calendarevents": "行事曆",
- "errorloadevent": "載入事件時出現錯誤",
- "errorloadevents": "載入事件時出現錯誤",
- "noevents": "沒有事件",
- "notifications": "通知"
-}
\ No newline at end of file
diff --git a/src/addon/calendar/pages/event/event.html b/src/addon/calendar/pages/event/event.html
index 8f68f8c46..a9711f678 100644
--- a/src/addon/calendar/pages/event/event.html
+++ b/src/addon/calendar/pages/event/event.html
@@ -9,47 +9,62 @@
-
+
{{ 'addon.calendar.eventstarttime' | translate}}
- {{ event.timestart | coreToLocaleString }}
+ {{ event.timestart * 1000 | coreFormatDate }}
0">
{{ 'addon.calendar.eventendtime' | translate}}
- {{ (event.timestart + event.timeduration) | coreToLocaleString }}
+ {{ (event.timestart + event.timeduration) * 1000 | coreFormatDate }}
-
+
{{ 'core.course' | translate}}
-
+
+
+ {{ 'core.category' | translate}}
+
+
{{event.moduleName}}
-
-
+
+
+
+ {{ 'core.location' | translate}}
+
+
+
+
+
+
+
+ {{ 'addon.calendar.gotoactivity' | translate }}
+
-
+ currentTime">
{{ 'addon.calendar.notifications' | translate }}
-
- {{ 'core.defaultvalue' | translate :{$a: defaultTimeReadable} }}
+
+ currentTime">{{ 'core.defaultvalue' | translate :{$a: defaultTimeReadable} }}
{{ 'core.settings.disabled' | translate }}
{{ 600 | coreDuration }}
- {{ 1800 | coreDuration }}
- {{ 3600 | coreDuration }}
- {{ 7200 | coreDuration }}
- {{ 21600 | coreDuration }}
- {{ 43200 | coreDuration }}
- {{ 86400 | coreDuration }}
+ currentTime">{{ 1800 | coreDuration }}
+ currentTime">{{ 3600 | coreDuration }}
+ currentTime">{{ 7200 | coreDuration }}
+ currentTime">{{ 21600 | coreDuration }}
+ currentTime">{{ 43200 | coreDuration }}
+ currentTime">{{ 86400 | coreDuration }}
diff --git a/src/addon/calendar/pages/event/event.ts b/src/addon/calendar/pages/event/event.ts
index 274449cf7..e20a61877 100644
--- a/src/addon/calendar/pages/event/event.ts
+++ b/src/addon/calendar/pages/event/event.ts
@@ -19,6 +19,7 @@ import { AddonCalendarProvider } from '../../providers/calendar';
import { AddonCalendarHelperProvider } from '../../providers/helper';
import { CoreCoursesProvider } from '@core/courses/providers/courses';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
+import { CoreTextUtilsProvider } from '@providers/utils/text';
import { CoreSitesProvider } from '@providers/sites';
import { CoreLocalNotificationsProvider } from '@providers/local-notifications';
import { CoreCourseProvider } from '@core/course/providers/course';
@@ -43,12 +44,18 @@ export class AddonCalendarEventPage {
event: any = {};
title: string;
courseName: string;
+ courseUrl = '';
notificationsEnabled = false;
+ moduleUrl = '';
+ categoryPath = '';
+ currentTime: number;
+ defaultTime: number;
constructor(private translate: TranslateService, private calendarProvider: AddonCalendarProvider, navParams: NavParams,
- private domUtils: CoreDomUtilsProvider, private coursesProvider: CoreCoursesProvider, timeUtils: CoreTimeUtilsProvider,
- private calendarHelper: AddonCalendarHelperProvider, sitesProvider: CoreSitesProvider,
- localNotificationsProvider: CoreLocalNotificationsProvider, private courseProvider: CoreCourseProvider) {
+ private domUtils: CoreDomUtilsProvider, private coursesProvider: CoreCoursesProvider,
+ private calendarHelper: AddonCalendarHelperProvider, private sitesProvider: CoreSitesProvider,
+ localNotificationsProvider: CoreLocalNotificationsProvider, private courseProvider: CoreCourseProvider,
+ private textUtils: CoreTextUtilsProvider, private timeUtils: CoreTimeUtilsProvider) {
this.eventId = navParams.get('id');
this.notificationsEnabled = localNotificationsProvider.isAvailable();
@@ -56,9 +63,12 @@ export class AddonCalendarEventPage {
if (this.notificationsEnabled) {
this.calendarProvider.getEventNotificationTimeOption(this.eventId).then((notificationTime) => {
this.notificationTime = notificationTime;
+ this.loadNotificationTime();
});
this.calendarProvider.getDefaultNotificationTime().then((defaultTime) => {
+ this.defaultTime = defaultTime * 60;
+ this.loadNotificationTime();
if (defaultTime === 0) {
// Disabled by default.
this.defaultTimeReadable = this.translate.instant('core.settings.disabled');
@@ -90,10 +100,31 @@ export class AddonCalendarEventPage {
* @return {Promise} Promise resolved when done.
*/
fetchEvent(): Promise {
- return this.calendarProvider.getEvent(this.eventId).then((event) => {
+ const currentSite = this.sitesProvider.getCurrentSite(),
+ canGetById = this.calendarProvider.isGetEventByIdAvailable();
+ let promise;
+
+ if (canGetById) {
+ promise = this.calendarProvider.getEventById(this.eventId);
+ } else {
+ promise = this.calendarProvider.getEvent(this.eventId);
+ }
+
+ return promise.then((event) => {
+ const promises = [];
+
this.calendarHelper.formatEventData(event);
this.event = event;
+ this.currentTime = this.timeUtils.timestamp();
+ this.loadNotificationTime();
+
+ // Reset some of the calculated data.
+ this.categoryPath = '';
+ this.courseName = '';
+ this.courseUrl = '';
+ this.moduleUrl = '';
+
// Guess event title.
let title = this.translate.instant('addon.calendar.type' + event.eventtype);
if (event.moduleIcon) {
@@ -102,6 +133,8 @@ export class AddonCalendarEventPage {
if (name.indexOf('core.mod_') === -1) {
event.moduleName = name;
}
+
+ // Calculate the title of the page;
if (title == 'addon.calendar.type' + event.eventtype) {
title = this.translate.instant('core.mod_' + event.modulename + '.' + event.eventtype);
@@ -109,24 +142,63 @@ export class AddonCalendarEventPage {
title = name;
}
}
+
+ // Get the module URL.
+ if (canGetById) {
+ this.moduleUrl = event.url;
+ }
} else {
if (title == 'addon.calendar.type' + event.eventtype) {
title = event.name;
}
}
+
this.title = title;
- if (event.courseid && event.courseid != this.siteHomeId) {
- // It's a course event, retrieve the course name.
- return this.coursesProvider.getUserCourse(event.courseid, true).then((course) => {
+ // If the event belongs to a course, get the course name and the URL to view it.
+ if (canGetById && event.course) {
+ this.courseName = event.course.fullname;
+ this.courseUrl = event.course.viewurl;
+ } else if (event.courseid && event.courseid != this.siteHomeId) {
+ // Retrieve the course.
+ promises.push(this.coursesProvider.getUserCourse(event.courseid, true).then((course) => {
this.courseName = course.fullname;
- });
+ this.courseUrl = currentSite ? this.textUtils.concatenatePaths(currentSite.siteUrl,
+ '/course/view.php?id=' + event.courseid) : '';
+ }).catch(() => {
+ // Error getting course, just don't show the course name.
+ }));
}
+
+ if (canGetById && event.iscategoryevent) {
+ this.categoryPath = event.category.nestedname;
+ }
+
+ if (event.location) {
+ // Build a link to open the address in maps.
+ event.location = this.textUtils.decodeHTML(event.location);
+ event.encodedLocation = this.textUtils.buildAddressURL(event.location);
+ }
+
+ return Promise.all(promises);
}).catch((error) => {
this.domUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevent', true);
});
}
+ /**
+ * Loads notification time by discarding options not in the list.
+ */
+ loadNotificationTime(): void {
+ if (typeof this.notificationTime != 'undefined') {
+ if (this.notificationTime > 0 && this.event.timestart - this.notificationTime * 60 < this.currentTime) {
+ this.notificationTime = 0;
+ } else if (this.notificationTime < 0 && this.event.timestart - this.defaultTime < this.currentTime) {
+ this.notificationTime = 0;
+ }
+ }
+ }
+
/**
* Refresh the event.
*
diff --git a/src/addon/calendar/pages/list/list.html b/src/addon/calendar/pages/list/list.html
index 5b8dfd808..e5cdc3eb0 100644
--- a/src/addon/calendar/pages/list/list.html
+++ b/src/addon/calendar/pages/list/list.html
@@ -21,17 +21,24 @@
-
-
-
-
- {{ event.timestart | coreToLocaleString }}
-
+
+
+ {{ event.timestart * 1000 | coreFormatDate: "strftimedayshort" }}
+
+
+
+
+
+
+ {{ event.timestart * 1000 | coreFormatDate: "strftimetime" }}
+ - {{ (event.timestart + event.timeduration) * 1000 | coreFormatDate: "strftimetime" }}
+ - {{ (event.timestart + event.timeduration) * 1000 | coreFormatDate: "strftimedatetimeshort" }}
+
+
+
-
-
-
+
\ No newline at end of file
diff --git a/src/addon/calendar/pages/list/list.ts b/src/addon/calendar/pages/list/list.ts
index 324d4b76f..cd8523d90 100644
--- a/src/addon/calendar/pages/list/list.ts
+++ b/src/addon/calendar/pages/list/list.ts
@@ -26,6 +26,7 @@ import { CoreCoursePickerMenuPopoverComponent } from '@components/course-picker-
import { CoreEventsProvider } from '@providers/events';
import { CoreAppProvider } from '@providers/app';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
+import * as moment from 'moment';
/**
* Page that displays the list of calendar events.
@@ -59,6 +60,7 @@ export class AddonCalendarListPage implements OnDestroy {
notificationsEnabled = false;
filteredEvents = [];
canLoadMore = false;
+ loadMoreError = false;
filter = {
course: this.allCourses
};
@@ -127,6 +129,8 @@ export class AddonCalendarListPage implements OnDestroy {
* @return {Promise} Promise resolved when done.
*/
fetchEvents(refresh: boolean = false): Promise {
+ this.loadMoreError = false;
+
return this.calendarProvider.getEventsList(this.daysLoaded, AddonCalendarProvider.DAYS_INTERVAL).then((events) => {
this.daysLoaded += AddonCalendarProvider.DAYS_INTERVAL;
if (events.length === 0) {
@@ -144,6 +148,10 @@ export class AddonCalendarListPage implements OnDestroy {
} else {
// Sort the events by timestart, they're ordered by id.
events.sort((a, b) => {
+ if (a.timestart == b.timestart) {
+ return a.timeduration - b.timeduration;
+ }
+
return a.timestart - b.timestart;
});
@@ -157,6 +165,12 @@ export class AddonCalendarListPage implements OnDestroy {
this.events = this.utils.mergeArraysWithoutDuplicates(this.events, events, 'id');
}
this.filteredEvents = this.getFilteredEvents();
+
+ // Calculate which evemts need to display the date.
+ this.filteredEvents.forEach((event, index): any => {
+ event.showDate = this.showDate(event, this.filteredEvents[index - 1]);
+ event.endsSameDay = this.endsSameDay(event);
+ });
this.canLoadMore = true;
// Schedule notifications for the events retrieved (might have new events).
@@ -168,7 +182,7 @@ export class AddonCalendarListPage implements OnDestroy {
this.content.resize();
}).catch((error) => {
this.domUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true);
- this.canLoadMore = false; // Set to false to prevent infinite calls with infinite-loading.
+ this.loadMoreError = true; // Set to prevent infinite calls with infinite-loading.
}).then(() => {
// Success retrieving events. Get categories if needed.
if (this.getCategories) {
@@ -179,6 +193,18 @@ export class AddonCalendarListPage implements OnDestroy {
});
}
+ /**
+ * Function to load more events.
+ *
+ * @param {any} [infiniteComplete] Infinite scroll complete function. Only used from core-infinite-loading.
+ * @return {Promise} Resolved when done.
+ */
+ loadMoreEvents(infiniteComplete?: any): Promise {
+ return this.fetchEvents().finally(() => {
+ infiniteComplete && infiniteComplete();
+ });
+ }
+
/**
* Get filtered events.
*
@@ -279,7 +305,7 @@ export class AddonCalendarListPage implements OnDestroy {
refreshEvents(refresher: any): void {
const promises = [];
- promises.push(this.calendarProvider.invalidateEventsList(this.courses));
+ promises.push(this.calendarProvider.invalidateEventsList());
if (this.categoriesRetrieved) {
promises.push(this.coursesProvider.invalidateCategories(0, true));
@@ -293,6 +319,40 @@ export class AddonCalendarListPage implements OnDestroy {
});
}
+ /**
+ * Check date should be shown on event list for the current event.
+ * If date has changed from previous to current event it should be shown.
+ *
+ * @param {any} event Current event where to show the date.
+ * @param {any} [prevEvent] Previous event where to compare the date with.
+ * @return {boolean} If date has changed and should be shown.
+ */
+ protected showDate(event: any, prevEvent?: any): boolean {
+ if (!prevEvent) {
+ // First event, show it.
+ return true;
+ }
+
+ // Check if day has changed.
+ return !moment(event.timestart * 1000).isSame(prevEvent.timestart * 1000, 'day');
+ }
+
+ /**
+ * Check if event ends the same date or not.
+ *
+ * @param {any} event Event info.
+ * @return {boolean} If date has changed and should be shown.
+ */
+ protected endsSameDay(event: any): boolean {
+ if (!event.timeduration) {
+ // No duration.
+ return true;
+ }
+
+ // Check if day has changed.
+ return moment(event.timestart * 1000).isSame((event.timestart + event.timeduration) * 1000, 'day');
+ }
+
/**
* Show the context menu.
*
diff --git a/src/addon/calendar/pages/settings/settings.html b/src/addon/calendar/pages/settings/settings.html
index 87a7996da..095708be3 100644
--- a/src/addon/calendar/pages/settings/settings.html
+++ b/src/addon/calendar/pages/settings/settings.html
@@ -7,7 +7,7 @@
{{ 'addon.calendar.defaultnotificationtime' | translate }}
-
+
{{ 'core.settings.disabled' | translate }}
{{ 600 | coreDuration }}
{{ 1800 | coreDuration }}
diff --git a/src/addon/calendar/providers/calendar.ts b/src/addon/calendar/providers/calendar.ts
index 914726cb7..b02765ed0 100644
--- a/src/addon/calendar/providers/calendar.ts
+++ b/src/addon/calendar/providers/calendar.ts
@@ -138,6 +138,37 @@ export class AddonCalendarProvider {
this.sitesProvider.createTablesFromSchema(this.tablesSchema);
}
+ /**
+ * Removes expired events from local DB.
+ *
+ * @param {string} [siteId] ID of the site the event belongs to. If not defined, use current site.
+ * @return {Promise} Promise resolved when done.
+ */
+ cleanExpiredEvents(siteId?: string): Promise {
+ return this.sitesProvider.getSite(siteId).then((site) => {
+ let promise;
+
+ // Cancel expired events notifications first.
+ if (this.localNotificationsProvider.isAvailable()) {
+ promise = site.getDb().getRecordsSelect(AddonCalendarProvider.EVENTS_TABLE, 'timestart < ?',
+ [this.timeUtils.timestamp()]).then((events) => {
+ events.forEach((event) => {
+ return this.localNotificationsProvider.cancel(event.id, AddonCalendarProvider.COMPONENT, site.getId());
+ });
+ }).catch(() => {
+ // Ignore errors.
+ });
+ } else {
+ promise = Promise.resolve();
+ }
+
+ return promise.then(() => {
+ return site.getDb().deleteRecordsSelect(AddonCalendarProvider.EVENTS_TABLE, 'timestart < ?',
+ [this.timeUtils.timestamp()]);
+ });
+ });
+ }
+
/**
* Get all calendar events from local Db.
*
@@ -200,6 +231,30 @@ export class AddonCalendarProvider {
});
}
+ /**
+ * Get a calendar event by ID. This function returns more data than getEvent, but it isn't available in all Moodles.
+ *
+ * @param {number} id Event ID.
+ * @param {boolean} [refresh] True when we should update the event data.
+ * @param {string} [siteId] ID of the site. If not defined, use current site.
+ * @return {Promise} Promise resolved when the event data is retrieved.
+ * @since 3.4
+ */
+ getEventById(id: number, siteId?: string): Promise {
+ return this.sitesProvider.getSite(siteId).then((site) => {
+ const preSets = {
+ cacheKey: this.getEventCacheKey(id)
+ },
+ data = {
+ eventid: id
+ };
+
+ return site.read('core_calendar_get_calendar_event_by_id', data, preSets).then((response) => {
+ return response.event;
+ });
+ });
+ }
+
/**
* Get cache key for a single event WS call.
*
@@ -273,46 +328,51 @@ export class AddonCalendarProvider {
: Promise {
return this.sitesProvider.getSite(siteId).then((site) => {
siteId = site.getId();
+ const promises = [];
+ let courses, groups;
- return this.coursesProvider.getUserCourses(false, siteId).then((courses) => {
+ promises.push(this.coursesProvider.getUserCourses(false, siteId).then((data) => {
+ courses = data;
courses.push({ id: site.getSiteHomeId() }); // Add front page.
+ }));
+ promises.push(this.groupsProvider.getAllUserGroups(siteId).then((data) => {
+ groups = data;
+ }));
- return this.groupsProvider.getUserGroups(courses, siteId).then((groups) => {
- const now = this.timeUtils.timestamp(),
- start = now + (CoreConstants.SECONDS_DAY * daysToStart),
- end = start + (CoreConstants.SECONDS_DAY * daysInterval),
- data = {
- options: {
- userevents: 1,
- siteevents: 1,
- timestart: start,
- timeend: end
- },
- events: {
- courseids: [],
- groupids: []
- }
- };
-
- courses.forEach((course, index) => {
- data.events.courseids[index] = course.id;
- });
-
- groups.forEach((group, index) => {
- data.events.groupids[index] = group.id;
- });
-
- // We need to retrieve cached data using cache key because we have timestamp in the params.
- const preSets = {
- cacheKey: this.getEventsListCacheKey(daysToStart, daysInterval),
- getCacheUsingCacheKey: true
+ return Promise.all(promises).then(() => {
+ const now = this.timeUtils.timestamp(),
+ start = now + (CoreConstants.SECONDS_DAY * daysToStart),
+ end = start + (CoreConstants.SECONDS_DAY * daysInterval),
+ data = {
+ options: {
+ userevents: 1,
+ siteevents: 1,
+ timestart: start,
+ timeend: end
+ },
+ events: {
+ courseids: [],
+ groupids: []
+ }
};
- return site.read('core_calendar_get_calendar_events', data, preSets).then((response) => {
- this.storeEventsInLocalDB(response.events, siteId);
+ data.events.courseids = courses.map((course) => {
+ return course.id;
+ });
+ data.events.groupids = groups.map((group) => {
+ return group.id;
+ });
- return response.events;
- });
+ // We need to retrieve cached data using cache key because we have timestamp in the params.
+ const preSets = {
+ cacheKey: this.getEventsListCacheKey(daysToStart, daysInterval),
+ getCacheUsingCacheKey: true
+ };
+
+ return site.read('core_calendar_get_calendar_events', data, preSets).then((response) => {
+ this.storeEventsInLocalDB(response.events, siteId);
+
+ return response.events;
});
});
});
@@ -341,18 +401,17 @@ export class AddonCalendarProvider {
/**
* Invalidates events list and all the single events and related info.
*
- * @param {any[]} courses List of courses or course ids.
* @param {string} [siteId] Site Id. If not defined, use current site.
* @return {Promise} Promise resolved when the list is invalidated.
*/
- invalidateEventsList(courses: any[], siteId?: string): Promise {
+ invalidateEventsList(siteId?: string): Promise {
return this.sitesProvider.getSite(siteId).then((site) => {
siteId = site.getId();
const promises = [];
promises.push(this.coursesProvider.invalidateUserCourses(siteId));
- promises.push(this.groupsProvider.invalidateUserGroups(courses, siteId));
+ promises.push(this.groupsProvider.invalidateAllUserGroups(siteId));
promises.push(site.invalidateWsCacheForKeyStartingWith(this.getEventsListPrefixCacheKey()));
return Promise.all(promises);
@@ -396,6 +455,16 @@ export class AddonCalendarProvider {
});
}
+ /**
+ * Check if the get event by ID WS is available.
+ *
+ * @return {boolean} Whether it's available.
+ * @since 3.4
+ */
+ isGetEventByIdAvailable(): boolean {
+ return this.sitesProvider.wsAvailableInCurrentSite('core_calendar_get_calendar_event_by_id');
+ }
+
/**
* Get the next events for all the sites and schedules their notifications.
* If an event notification time is 0, cancel its scheduled notification (if any).
@@ -404,27 +473,29 @@ export class AddonCalendarProvider {
* @return {Promise} Promise resolved when all the notifications have been scheduled.
*/
scheduleAllSitesEventsNotifications(): Promise {
- if (this.localNotificationsProvider.isAvailable()) {
- return this.sitesProvider.getSitesIds().then((siteIds) => {
- const promises = [];
+ const notificationsEnabled = this.localNotificationsProvider.isAvailable();
- siteIds.forEach((siteId) => {
- // Check if calendar is disabled for the site.
- promises.push(this.isDisabled(siteId).then((disabled) => {
- if (!disabled) {
- // Get first events.
- return this.getEventsList(undefined, undefined, siteId).then((events) => {
- return this.scheduleEventsNotifications(events, siteId);
- });
- }
- }));
- });
+ return this.sitesProvider.getSitesIds().then((siteIds) => {
+ const promises = [];
- return Promise.all(promises);
+ siteIds.forEach((siteId) => {
+ promises.push(this.cleanExpiredEvents(siteId).then(() => {
+ if (notificationsEnabled) {
+ // Check if calendar is disabled for the site.
+ return this.isDisabled(siteId).then((disabled) => {
+ if (!disabled) {
+ // Get first events.
+ return this.getEventsList(undefined, undefined, siteId).then((events) => {
+ return this.scheduleEventsNotifications(events, siteId);
+ });
+ }
+ });
+ }
+ }));
});
- } else {
- return Promise.resolve([]);
- }
+
+ return Promise.all(promises);
+ });
}
/**
@@ -456,11 +527,10 @@ export class AddonCalendarProvider {
}
const dateTriggered = new Date((event.timestart - (time * 60)) * 1000),
- startDate = new Date(event.timestart * 1000),
notification = {
id: event.id,
title: event.name,
- text: startDate.toLocaleString(),
+ text: this.timeUtils.userDate(event.timestart * 1000, 'core.strftimedaydatetime', true),
at: dateTriggered,
channelParams: {
channelID: 'notifications',
diff --git a/src/addon/competency/components/course/addon-competency-course.html b/src/addon/competency/components/course/addon-competency-course.html
index 320ea502c..c8636ff41 100644
--- a/src/addon/competency/components/course/addon-competency-course.html
+++ b/src/addon/competency/components/course/addon-competency-course.html
@@ -28,12 +28,7 @@
0">{{ 'addon.competency.competencies' | translate }}
-
-
-
-
-
-
+
@@ -50,7 +45,7 @@
-
{{ 'addon.competency.path' | translate }} :
+
{{ 'addon.competency.path' | translate }}
{{ competency.comppath.framework.name }}
/ {{ ancestor.name }}
@@ -61,7 +56,7 @@
{{ 'addon.competency.noactivities' | translate }}
-
+
diff --git a/src/addon/competency/lang/ar.json b/src/addon/competency/lang/ar.json
deleted file mode 100755
index 5952485e9..000000000
--- a/src/addon/competency/lang/ar.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "activities": "الأنشطة",
- "duedate": "تاريخ تقديم مهمة",
- "errornocompetenciesfound": "لا يوجد أي قدرات موجودة",
- "myplans": "خططي للتعلم",
- "nocompetencies": "لا يوجد أي قدرات",
- "path": "مسار",
- "progress": "تقدّم الطالب",
- "status": "الحالة",
- "template": "قالب"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/bg.json b/src/addon/competency/lang/bg.json
deleted file mode 100755
index 5b003195a..000000000
--- a/src/addon/competency/lang/bg.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "activities": "Дейности",
- "competencies": "Компетенции",
- "coursecompetencies": "Компетенции на курса",
- "duedate": "Краен срок",
- "learningplans": "Учебни планове",
- "myplans": "Моите учебни планове",
- "noplanswerecreated": "Не бяха създадени учебни планове.",
- "path": "Път",
- "planstatusactive": "Активен",
- "planstatuscomplete": "Завършен",
- "planstatusdraft": "Чернова",
- "status": "Състояние",
- "template": "Шаблон",
- "userplans": "Учебни планове"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/ca.json b/src/addon/competency/lang/ca.json
deleted file mode 100755
index 93bcee24b..000000000
--- a/src/addon/competency/lang/ca.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- "activities": "Activitats",
- "competencies": "Competències",
- "competenciesmostoftennotproficientincourse": "Competències que més sovint no s'assoleixen en aquest curs",
- "coursecompetencies": "Competències del curs",
- "crossreferencedcompetencies": "Competències referenciades",
- "duedate": "Data de venciment",
- "errornocompetenciesfound": "No s'han trobat competències",
- "evidence": "Evidència",
- "evidence_competencyrule": "La regla de competència s'ha satisfet.",
- "evidence_coursecompleted": "S'ha completat el curs '{{$a}}'.",
- "evidence_coursemodulecompleted": "S'ha completat l'activitat '{{$a}}'.",
- "evidence_courserestored": "La qualificació ha estat restaurada juntament amb el curs «{{$a}}».",
- "evidence_evidenceofpriorlearninglinked": "S'ha enllaçat l'evidència de l'aprenentatge previ «{{$a}}».",
- "evidence_evidenceofpriorlearningunlinked": "S'ha desenllaçat l'evidència de l'aprenentatge previ «{{$a}}».",
- "evidence_manualoverride": "S'ha configurat de forma manual la qualificació de la competència.",
- "evidence_manualoverrideincourse": "S'ha configurat de forma manual la qualificació de la competència al curs «{{$a}}».",
- "evidence_manualoverrideinplan": "S'ha configurat de forma manual la qualificació de la competència al pla d'aprenentatge «{{$a}}».",
- "learningplancompetencies": "Competències del pla d'aprenentatge",
- "learningplans": "Plans d'aprenentatge",
- "myplans": "Els meus plans d'aprenentatge",
- "noactivities": "Cap activitat",
- "nocompetencies": "No s'han creat competències en aquest marc.",
- "nocrossreferencedcompetencies": "No hi ha competències amb referències a aquesta.",
- "noevidence": "Cap evidència",
- "noplanswerecreated": "No s'ha creat cap pla d'aprenentatge.",
- "path": "Ruta:",
- "planstatusactive": "Activa",
- "planstatuscomplete": "Completat",
- "planstatusdraft": "Esborrany",
- "planstatusinreview": "En revisió",
- "planstatuswaitingforreview": "S'està esperant la revisió",
- "proficient": "Superada",
- "progress": "Progrés",
- "rating": "Qualificació",
- "reviewstatus": "Estat de la revisió",
- "status": "Estat",
- "template": "Plantilla de pla d'aprenentatge",
- "usercompetencystatus_idle": "Inactiu",
- "usercompetencystatus_inreview": "En revisió",
- "usercompetencystatus_waitingforreview": "Esperant a ser revisat",
- "userplans": "Plans d'aprenentatge",
- "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competències superades",
- "xcompetenciesproficientoutofyincourse": "Heu superat {{$a.x}} de {{$a.y}} competències en aquest curs."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/cs.json b/src/addon/competency/lang/cs.json
deleted file mode 100755
index 471bc29a7..000000000
--- a/src/addon/competency/lang/cs.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Činnosti",
- "competencies": "Kompetence",
- "competenciesmostoftennotproficientincourse": "Kompetence v tomto kurzu často nejsou dosaženy",
- "coursecompetencies": "Kompetence kurzu",
- "coursecompetencyratingsarenotpushedtouserplans": "Hodnocení kompetencí v tomto kurzu nemají vliv na studijní plány.",
- "coursecompetencyratingsarepushedtouserplans": "Hodnocení kompetencí v tomto kurzu jsou okamžitě aktualizovány v studijních plánech.",
- "crossreferencedcompetencies": "Průřezové kompetence",
- "duedate": "Termín odevzdání",
- "errornocompetenciesfound": "Nebyly nalezeny žádné kompetence",
- "evidence": "Evidence",
- "evidence_competencyrule": "Bylo splněno pravidlo kompetence.",
- "evidence_coursecompleted": "Kurz \"{{$a}}\" byl dokončen.",
- "evidence_coursemodulecompleted": "Byla dokončena aktivita \"{{$a}}\".",
- "evidence_courserestored": "Hodnocení bylo obnoveno spolu s \"{{$a}}\".",
- "evidence_evidenceofpriorlearninglinked": "Evidence předchozího studia \"{{$a}}\" byla připojena.",
- "evidence_evidenceofpriorlearningunlinked": "Evidence předchozího studia \"{{$a}}\" byla odpojena.",
- "evidence_manualoverride": "Hodnocení kompetence bylo nastaveno manuálně.",
- "evidence_manualoverrideincourse": "Hodnocení kompetence bylo nastaveno manuálně v kurzu \"{{$a}}\".",
- "evidence_manualoverrideinplan": "Hodnocení kompetence bylo nastaveno manuálně ve studijním plánu \"{{$a}}\".",
- "learningplancompetencies": "Kompetence studijního plánu",
- "learningplans": "Studijní plány",
- "myplans": "Mé studijní plány",
- "noactivities": "Žádné činnosti",
- "nocompetencies": "V tomto rámci nebyly vytvořeny žádné kompetence.",
- "nocrossreferencedcompetencies": "K této kompetenci nebyly spojeny další průřezové kompetence.",
- "noevidence": "Bez záznamu",
- "noplanswerecreated": "Nebyly vytvořeny žádné studijní plány.",
- "path": "Cesta:",
- "planstatusactive": "Aktivní",
- "planstatuscomplete": "Dokončeno",
- "planstatusdraft": "Návrh",
- "planstatusinreview": "V revizi",
- "planstatuswaitingforreview": "Čekání na revizi",
- "proficient": "Splněno",
- "progress": "Pokrok",
- "rating": "Hodnocení",
- "reviewstatus": "Stav revize",
- "status": "Stav",
- "template": "Šablona studijního plánu",
- "usercompetencystatus_idle": "Nečinný",
- "usercompetencystatus_inreview": "V revizi",
- "usercompetencystatus_waitingforreview": "Čekání na revizi",
- "userplans": "Studijní plány",
- "xcompetenciesproficientoutofy": "máte splněno {{$a.x}} z {{$a.y}} kompetencí",
- "xcompetenciesproficientoutofyincourse": "V tomto kurzu máte splněno {{$a.x}} z {{$a.y}} kompetencí."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/da.json b/src/addon/competency/lang/da.json
deleted file mode 100755
index f595f9ae9..000000000
--- a/src/addon/competency/lang/da.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Aktiviteter",
- "competencies": "Kompetencer",
- "competenciesmostoftennotproficientincourse": "Kompetencer der ofte \"halter\" på dette kursus",
- "coursecompetencies": "Kursuskompetencer",
- "coursecompetencyratingsarenotpushedtouserplans": "Kompetencebedømmelser på dette kursus påvirker ikke læringsplaner.",
- "coursecompetencyratingsarepushedtouserplans": "Kompetencebedømmelser på dette kursus opdateres straks i læringsplaner.",
- "crossreferencedcompetencies": "Kryds-refererede kompetencer",
- "duedate": "Afleveringsdato",
- "errornocompetenciesfound": "Ingen kompetencer fundet",
- "evidence": "Vidnesbyrd",
- "evidence_competencyrule": "Kompetencereglen blev opfyldt.",
- "evidence_coursecompleted": "Kurset \"{{$a}}\" var fuldført.",
- "evidence_coursemodulecompleted": "Aktiviteten \"{{$a}}\" var fuldført.",
- "evidence_courserestored": "Vurderingen blev gendannet sammen med kurset \"{{$a}}\".",
- "evidence_evidenceofpriorlearninglinked": "Vidnesbyrd om forudgående læring \"{{$a}}\" var linket.",
- "evidence_evidenceofpriorlearningunlinked": "Link til vidnesbyrd om forudgående læring \"{{$a}}\" var fjernet.",
- "evidence_manualoverride": "Kompetencevurderingen blev foretaget manuelt.",
- "evidence_manualoverrideincourse": "Kompetencevurderingen blev foretaget manuelt på kurset \"{{$a}}\".",
- "evidence_manualoverrideinplan": "Kompetencevurderingen blev foretaget manuelt i læringsplanen \"{{$a}}\".",
- "learningplancompetencies": "Læringsplankompetencer",
- "learningplans": "Læringsplaner",
- "myplans": "Mine læringsplaner",
- "noactivities": "Ingen aktiviteter",
- "nocompetencies": "Ingen kompetencer er oprettet i denne ramme.",
- "nocrossreferencedcompetencies": "Ingen andre kompetencer er krydsrefereret til denne kompetence.",
- "noevidence": "Ingen vidnesbyrd",
- "noplanswerecreated": "Der blev ikke oprettet nogen læringsplaner.",
- "path": "Sti:",
- "planstatusactive": "Aktiv",
- "planstatuscomplete": "Fuldført",
- "planstatusdraft": "Kladde",
- "planstatusinreview": "I gennemsyn",
- "planstatuswaitingforreview": "Venter på gennemsyn",
- "proficient": "Færdighedsniveau",
- "progress": "Progression",
- "rating": "Bedømmelse",
- "reviewstatus": "Status på gennemsyn",
- "status": "Status",
- "template": "Læringsplanskabelon",
- "usercompetencystatus_idle": "Tom",
- "usercompetencystatus_inreview": "I gennemsyn",
- "usercompetencystatus_waitingforreview": "Afventer gennemsyn",
- "userplans": "Læringsplaner",
- "xcompetenciesproficientoutofy": "{{$a.x}} ud af {{$a.y}} kompetencer er på færdighedsniveau",
- "xcompetenciesproficientoutofyincourse": "Du har opnået færdighedsniveau {{$a.x}} ud af {{$a.y}} kompetencer på dette kursus."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/de-du.json b/src/addon/competency/lang/de-du.json
deleted file mode 100755
index eeb5102e8..000000000
--- a/src/addon/competency/lang/de-du.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Aktivitäten",
- "competencies": "Kompetenzen",
- "competenciesmostoftennotproficientincourse": "Meist ungeübte Kompetenzen in diesem Kurs",
- "coursecompetencies": "Kurskompetenzen",
- "coursecompetencyratingsarenotpushedtouserplans": "Kompetenzbewertungen in diesem Kurs beeinflussen keine Lernpläne.",
- "coursecompetencyratingsarepushedtouserplans": "Kompetenzbewertungen in diesem Kurs werden sofort in den Lernplänen aktualisiert.",
- "crossreferencedcompetencies": "Querverwiesene Kompetenzen",
- "duedate": "Fälligkeitsdatum",
- "errornocompetenciesfound": "Keine Kompetenzen gefunden",
- "evidence": "Beleg",
- "evidence_competencyrule": "Die Kompetenzregel wurde erfüllt.",
- "evidence_coursecompleted": "Der Kurs '{{$a}}' wurde abgeschlossen.",
- "evidence_coursemodulecompleted": "Die Aktivität '{{$a}}' wurde abgeschlossen.",
- "evidence_courserestored": "Die Bewertung wurde zusammen mit dem Kurs '{{$a}}' wiederhergestellt.",
- "evidence_evidenceofpriorlearninglinked": "Der Beleg über Vorkenntnisse '{{$a}}' wurde verlinkt.",
- "evidence_evidenceofpriorlearningunlinked": "Der Beleg über Vorkenntnisse '{{$a}}' wurde freigegeben.",
- "evidence_manualoverride": "Die Kompetenzbewertung wurde manuell vergeben.",
- "evidence_manualoverrideincourse": "Die Kompetenzbewertung wurde manuell im Kurs '{{$a}}' vorgenommen.",
- "evidence_manualoverrideinplan": "Die Kompetenzbewertung wurde manuell im Lernplan '{{$a}}' vorgenommen.",
- "learningplancompetencies": "Kompetenzen des Lernplans",
- "learningplans": "Lernpläne",
- "myplans": "Meine Lernpläne",
- "noactivities": "Keine Aktivitäten",
- "nocompetencies": "Für diesen Kompetenzrahmen wurden keine Kompetenzen angelegt.",
- "nocrossreferencedcompetencies": "Keine anderen Kompetenzen wurden zu dieser Kompetenz referiert.",
- "noevidence": "Keine Belege",
- "noplanswerecreated": "Bisher sind keine Lernpläne angelegt.",
- "path": "Pfad:",
- "planstatusactive": "Aktiv",
- "planstatuscomplete": "Vollständig",
- "planstatusdraft": "Entwurf",
- "planstatusinreview": "Überprüfung läuft",
- "planstatuswaitingforreview": "Überprüfung abwarten",
- "proficient": "Erfahren",
- "progress": "Fortschritt",
- "rating": "Wertung",
- "reviewstatus": "Überprüfungsstatus",
- "status": "Status",
- "template": "Lernplanvorlage",
- "usercompetencystatus_idle": "Abwarten",
- "usercompetencystatus_inreview": "Überprüfung läuft",
- "usercompetencystatus_waitingforreview": "Überprüfung abwarten",
- "userplans": "Lernpläne",
- "xcompetenciesproficientoutofy": "{{$a.x}} von {{$a.y}} Kompetenzen sind eingeübt",
- "xcompetenciesproficientoutofyincourse": "Sie sind in {{$a.x}} von {{$a.y}} Kompetenzen geübt."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/de.json b/src/addon/competency/lang/de.json
deleted file mode 100755
index 2fbe029fe..000000000
--- a/src/addon/competency/lang/de.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Aktivitäten",
- "competencies": "Kompetenzen",
- "competenciesmostoftennotproficientincourse": "Meist ungeübte Kompetenzen in diesem Kurs",
- "coursecompetencies": "Kurskompetenzen",
- "coursecompetencyratingsarenotpushedtouserplans": "Kompetenzbewertungen in diesem Kurs beeinflussen keine Lernpläne.",
- "coursecompetencyratingsarepushedtouserplans": "Kompetenzbewertungen in diesem Kurs werden sofort in den Lernplänen aktualisiert.",
- "crossreferencedcompetencies": "Querverwiesene Kompetenzen",
- "duedate": "Fälligkeitsdatum",
- "errornocompetenciesfound": "Keine Kompetenzen gefunden",
- "evidence": "Beleg",
- "evidence_competencyrule": "Die Kompetenzregel wurde erfüllt.",
- "evidence_coursecompleted": "Der Kurs '{{$a}}' wurde abgeschlossen.",
- "evidence_coursemodulecompleted": "Die Aktivität '{{$a}}' wurde abgeschlossen.",
- "evidence_courserestored": "Die Bewertung wurde zusammen mit dem Kurs '{{$a}}' wiederhergestellt.",
- "evidence_evidenceofpriorlearninglinked": "Der Beleg über Vorkenntnisse '{{$a}}' wurde verlinkt.",
- "evidence_evidenceofpriorlearningunlinked": "Der Beleg über Vorkenntnisse '{{$a}}' wurde freigegeben.",
- "evidence_manualoverride": "Die Kompetenzbewertung wurde manuell vergeben.",
- "evidence_manualoverrideincourse": "Die Kompetenzbewertung wurde manuell im Kurs '{{$a}}' vorgenommen.",
- "evidence_manualoverrideinplan": "Die Kompetenzbewertung wurde manuell im Lernplan '{{$a}}' vorgenommen.",
- "learningplancompetencies": "Kompetenzen des Lernplans",
- "learningplans": "Lernpläne",
- "myplans": "Meine Lernpläne",
- "noactivities": "Keine Aktivitäten",
- "nocompetencies": "Keine Kompetenzen",
- "nocrossreferencedcompetencies": "Keine anderen Kompetenzen wurden zu dieser Kompetenz referiert.",
- "noevidence": "Keine Belege",
- "noplanswerecreated": "Bisher sind keine Lernpläne angelegt.",
- "path": "Pfad:",
- "planstatusactive": "Aktiv",
- "planstatuscomplete": "Vollständig",
- "planstatusdraft": "Entwurf",
- "planstatusinreview": "Überprüfung läuft",
- "planstatuswaitingforreview": "Überprüfung abwarten",
- "proficient": "Erfahren",
- "progress": "Fortschritt",
- "rating": "Wertung",
- "reviewstatus": "Überprüfungsstatus",
- "status": "Status",
- "template": "Lernplanvorlage",
- "usercompetencystatus_idle": "Abwarten",
- "usercompetencystatus_inreview": "Überprüfung läuft",
- "usercompetencystatus_waitingforreview": "Überprüfung abwarten",
- "userplans": "Lernpläne",
- "xcompetenciesproficientoutofy": "{{$a.x}} von {{$a.y}} Kompetenzen sind eingeübt",
- "xcompetenciesproficientoutofyincourse": "Sie sind in {{$a.x}} von {{$a.y}} Kompetenzen geübt."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/el.json b/src/addon/competency/lang/el.json
deleted file mode 100755
index ccc76e104..000000000
--- a/src/addon/competency/lang/el.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "activities": "Δραστηριότητες",
- "duedate": "Καταληκτική ημερομηνία",
- "errornocompetenciesfound": "Δεν βρέθηκαν ικανότητες",
- "nocompetencies": "Δεν βρέθηκαν ικανότητες",
- "path": "Διαδρομή",
- "progress": "Πρόοδος μαθητών",
- "status": "Επιτρέπεται η πρόσβαση στους επισκέπτες",
- "template": "Πρότυπο"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/es-mx.json b/src/addon/competency/lang/es-mx.json
deleted file mode 100755
index e3cf26a96..000000000
--- a/src/addon/competency/lang/es-mx.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Actividades",
- "competencies": "Competencias",
- "competenciesmostoftennotproficientincourse": "Las competencias que con más frecuencia no están dominadas en este curso",
- "coursecompetencies": "Competencias del curso",
- "coursecompetencyratingsarenotpushedtouserplans": "Las valoraciones de competencia en este curso no afectan a los planes de aprendizaje.",
- "coursecompetencyratingsarepushedtouserplans": "Las valoraciones de competencia en este curso son actualizadas inmediatamente dentro de planes de aprendizaje.",
- "crossreferencedcompetencies": "Competencias con referencias-cruzadas",
- "duedate": "Fecha de entrega",
- "errornocompetenciesfound": "No se encontraron competencias",
- "evidence": "Evidencia",
- "evidence_competencyrule": "Se cumplió la regla de la competencia.",
- "evidence_coursecompleted": "El curso '{{$a}}' fue completado.",
- "evidence_coursemodulecompleted": "La actividad '{{$a}}' fue completada.",
- "evidence_courserestored": "La valoración fue restaurada junto con el curso '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "La evidencia de aprendizaje previo '{{$a}}' fue enlazada.",
- "evidence_evidenceofpriorlearningunlinked": "La evidencia de aprendizaje previo '{{$a}}' fue des-enlazada.",
- "evidence_manualoverride": "La valoración de competencia fue configurada manualmente.",
- "evidence_manualoverrideincourse": "La valoración de competencia fue configurada manualmente en el curso '{{$a}}'.",
- "evidence_manualoverrideinplan": "La valoración de competencia fue configurada manualmente en el plan de aprendizaje '{{$a}}'.",
- "learningplancompetencies": "Competencias del plan de aprendizaje",
- "learningplans": "Planes de aprendizaje",
- "myplans": "Mis planes de aprendizaje",
- "noactivities": "Sin actividades",
- "nocompetencies": "No se han creado competencias en esta estructura.",
- "nocrossreferencedcompetencies": "No se han referenciado cruzadamente otras competencias con esta competencia.",
- "noevidence": "Sin evidencia",
- "noplanswerecreated": "No se crearon planes de aprendizaje.",
- "path": "Ruta:",
- "planstatusactive": "Activa/o",
- "planstatuscomplete": "Completo",
- "planstatusdraft": "Borrador",
- "planstatusinreview": "En revisión",
- "planstatuswaitingforreview": "Esperando para revisión",
- "proficient": "Dominio/pericia",
- "progress": "Progreso",
- "rating": "Valoración",
- "reviewstatus": "Revisar estatus",
- "status": "Estatus",
- "template": "Plantilla de plan de aprendizaje",
- "usercompetencystatus_idle": "desocupado",
- "usercompetencystatus_inreview": "En revisión",
- "usercompetencystatus_waitingforreview": "Esperando para revisión",
- "userplans": "Planes de aprendizaje",
- "xcompetenciesproficientoutofy": "{{$a.x}} de un total de {{$a.y}} competencias se tienen dominadas",
- "xcompetenciesproficientoutofyincourse": "Usted es capaz/perito/experto en {{$a.x}} de un total de {{$a.y}} competencias en este curso."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/es.json b/src/addon/competency/lang/es.json
deleted file mode 100755
index 53b3162fa..000000000
--- a/src/addon/competency/lang/es.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "activities": "Actividades",
- "competencies": "Competencias",
- "competenciesmostoftennotproficientincourse": "Competencias que más a menudo no se superan en este curso",
- "coursecompetencies": "Competencias del curso",
- "coursecompetencyratingsarenotpushedtouserplans": "Las calificaciones de competencias de este curso no afectan los planes de aprendizaje.",
- "coursecompetencyratingsarepushedtouserplans": "Las calificaciones de competencias en este curso actualizan de inmediato los planes de aprendizaje.",
- "crossreferencedcompetencies": "Competencias referenciadas",
- "duedate": "Fecha de entrega",
- "errornocompetenciesfound": "No se encontraron competencias",
- "evidence": "Evidencia",
- "evidence_coursecompleted": "El curso '{{$a}}' ha sido completado.",
- "evidence_coursemodulecompleted": "La actividad '{{$a}}' ha sido completada.",
- "learningplancompetencies": "Competencias del plan de aprendizaje",
- "learningplans": "Planes de aprendizaje",
- "myplans": "Mis planes de aprendizaje",
- "noactivities": "Sin actividades",
- "nocompetencies": "No se han creado competencias para este marco.",
- "nocrossreferencedcompetencies": "No se han referenciado otras competencias a esta competencia.",
- "noevidence": "Sin evidencias",
- "path": "Ruta",
- "planstatusactive": "Activo",
- "planstatuscomplete": "Completado",
- "planstatusdraft": "Borrador",
- "planstatusinreview": "En revisión",
- "planstatuswaitingforreview": "Esperando revisión",
- "proficient": "Superada",
- "progress": "Avance",
- "rating": "Calificación",
- "reviewstatus": "Estado de la revisión",
- "status": "Estado",
- "template": "Plantilla",
- "usercompetencystatus_idle": "No activo",
- "usercompetencystatus_inreview": "En revision",
- "usercompetencystatus_waitingforreview": "Esperando revisión",
- "userplans": "Planes de aprendizaje",
- "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competencias superadas",
- "xcompetenciesproficientoutofyincourse": "Has superado {{$a.x}} de las {{$a.y}} competencias del curso."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/eu.json b/src/addon/competency/lang/eu.json
deleted file mode 100755
index b17c66ef8..000000000
--- a/src/addon/competency/lang/eu.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Jarduerak",
- "competencies": "Gaitasunak",
- "competenciesmostoftennotproficientincourse": "Ikastaro honetan sarriago ez-gai diren gaitasunak",
- "coursecompetencies": "Ikastaroko gaitasunak",
- "coursecompetencyratingsarenotpushedtouserplans": "Ikastaro honetako gaitasunen kalifikazioek ez dute ikasketa-planean eragiten.",
- "coursecompetencyratingsarepushedtouserplans": "Ikastaro honetan gaitasunen kalifikazioek ikasketa-planak berehala eguneratzen dituzte.",
- "crossreferencedcompetencies": "Erreferentzia gurutzatuko gaitasunak",
- "duedate": "Entregatze-data",
- "errornocompetenciesfound": "Ez da gaitasunik aurkitu",
- "evidence": "Ebidentzia",
- "evidence_competencyrule": "Gaitasun-araua bete da.",
- "evidence_coursecompleted": "'{{$a}}' ikastaroa osatu da.",
- "evidence_coursemodulecompleted": "'{{$a}}' jarduera osatu da.",
- "evidence_courserestored": "Puntuazioak '{{$a}}' ikastaroarekin batera berreskuratu ziren.",
- "evidence_evidenceofpriorlearninglinked": "Aurretik ikasitakoaren '{{$a}}' ebidentzia estekatu da.",
- "evidence_evidenceofpriorlearningunlinked": "Aurretik ikasitakoaren '{{$a}}' ebidentziaren esteka kendu da.",
- "evidence_manualoverride": "Gaitasunen puntuazioa eskuz ezarri da.",
- "evidence_manualoverrideincourse": "Gaitasunen puntuazioa eskuz ezarri da '{{$a}}' ikastaroan.",
- "evidence_manualoverrideinplan": "Gaitasunen puntuazioa eskuz ezarri da '{{$a}}' ikasketa-planean.",
- "learningplancompetencies": "Ikasketa-planaren gaitasunak",
- "learningplans": "Ikasketa-planak",
- "myplans": "Nire ikasketa-planak",
- "noactivities": "Ez dago jarduerarik",
- "nocompetencies": "Gaitasunik ez",
- "nocrossreferencedcompetencies": "Ez dago gaitasun honekiko erreferentzia gurutzatua duen beste gaitasunik.",
- "noevidence": "Ez dago ebidentziarik",
- "noplanswerecreated": "Ez da ikasketa-planik sortu.",
- "path": "Bidea:",
- "planstatusactive": "Aktiboa",
- "planstatuscomplete": "Osatu",
- "planstatusdraft": "Zirriborroa",
- "planstatusinreview": "Berrikusten",
- "planstatuswaitingforreview": "Berrikusketaren zain",
- "proficient": "Gai",
- "progress": "Aurrerapena",
- "rating": "Puntuazioa",
- "reviewstatus": "Berrikusi egora",
- "status": "Egoera",
- "template": "Ikasketa-planerako txantiloia",
- "usercompetencystatus_idle": "Ez dago aktiboa",
- "usercompetencystatus_inreview": "Berrikusten",
- "usercompetencystatus_waitingforreview": "Berrikusketaren zain",
- "userplans": "Ikasketa-planak",
- "xcompetenciesproficientoutofy": "{{$a.y}} gaitasunetik {{$a.x}} gai dira",
- "xcompetenciesproficientoutofyincourse": "Ikastaro honetako {{$a.y}} gaitasunetik {{$a.x}}-tan zara gai."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/fa.json b/src/addon/competency/lang/fa.json
deleted file mode 100755
index 1ae776420..000000000
--- a/src/addon/competency/lang/fa.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "activities": "فعالیتها",
- "competencies": "شایستگیها",
- "coursecompetencies": "شایستگیهای درس",
- "coursecompetencyratingsarenotpushedtouserplans": "امتیازهای شایستگیها در این درس تاثیری در برنامههای یادگیری ندارند.",
- "coursecompetencyratingsarepushedtouserplans": "امتیازهای شایستگیها در این درس بلافاصله در برنامههای یادگیری بهروز میشوند.",
- "crossreferencedcompetencies": "شایستگیهای دارای ارجاع متقابل",
- "duedate": "مهلت تحویل",
- "errornocompetenciesfound": "هیچ شایستگیای پیدا نشد",
- "evidence": "مدرک",
- "evidence_competencyrule": "شرط شایستگی برقرار شد.",
- "evidence_coursecompleted": "درس «{{$a}}» کامل شد.",
- "evidence_coursemodulecompleted": "فعالیت «{{$a}}» کامل شد.",
- "evidence_courserestored": "امتیاز همراه با درس «{{$a}}» بازیابی شد.",
- "evidence_evidenceofpriorlearninglinked": "مدرک یادگیری قبلی «{{$a}}» متصل شد.",
- "evidence_evidenceofpriorlearningunlinked": "مدرک یادگیری قبلی «{{$a}}» قطع اتصال شد.",
- "evidence_manualoverride": "امتیاز شایستگی بهطور دستی تعیین شد.",
- "evidence_manualoverrideincourse": "امتیاز شایستگی بهطور دستی در درس «{{$a}}» تعیین شد.",
- "evidence_manualoverrideinplan": "امتیاز شایستگی بهطور دستی در برنامهٔ یادگیری «{{$a}}» تعیین شد.",
- "learningplancompetencies": "شایستگیهای برنامه یادگیری",
- "learningplans": "برنامههای آزموشی",
- "myplans": "برنامههای یادگیری من",
- "nocrossreferencedcompetencies": "هیچ شایستگی دیگری به این شایستگی بهطور متقابل ارجاع داده نشده است.",
- "noevidence": "بدون مدرک",
- "noplanswerecreated": "هیچ برنامهٔ یادگیریای ساخته نشده است.",
- "path": "مسیر:",
- "planstatusactive": "فعال",
- "planstatuscomplete": "کامل",
- "planstatusdraft": "پیشنویس",
- "planstatusinreview": "درحال بازبینی",
- "planstatuswaitingforreview": "در انتظار بازبینی",
- "proficient": "کسب مهارت",
- "progress": "پیشروی",
- "rating": "امتیاز",
- "reviewstatus": "بازبینی وضعیت",
- "status": "وضعیت",
- "template": "الگوی برنامه یادگیری",
- "usercompetencystatus_idle": "بی کار",
- "usercompetencystatus_inreview": "درحال بازبینی",
- "usercompetencystatus_waitingforreview": "در انتظار بازبینی",
- "userplans": "برنامههای یادگیری",
- "xcompetenciesproficientoutofy": "در {{$a.x}} شایستگی از مجموع {{$a.y}} شایستگی مهارت کسب شده است",
- "xcompetenciesproficientoutofyincourse": "شما در {{$a.x}} شایستگی از {{$a.y}} شایستگی ماهر هستید."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/fi.json b/src/addon/competency/lang/fi.json
deleted file mode 100755
index c98434dbb..000000000
--- a/src/addon/competency/lang/fi.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "activities": "Aktiviteetit",
- "competencies": "Pätevyydet",
- "competenciesmostoftennotproficientincourse": "Seuraavia pätevyyksiä on saavutettu tällä kurssilla vähiten.",
- "coursecompetencies": "Kurssin pätevyydet",
- "coursecompetencyratingsarenotpushedtouserplans": "Tämän kurssin pätevyyksien arvioinnit eivät vaikuta opintosuunnitelmiin.",
- "coursecompetencyratingsarepushedtouserplans": "Tämän kurssin pätevyyksien arvioinnit päivitetään heti opintosuunnitelmiin.",
- "crossreferencedcompetencies": "Ristiviitatut pätevyydet",
- "duedate": "Määräpäivä",
- "errornocompetenciesfound": "Pätevyyksiä ei löytynyt",
- "evidence": "Todiste",
- "evidence_competencyrule": "Osaamissääntökriteerit täytetty.",
- "evidence_coursecompleted": "Kurssi '{{$a}}' suoritettiin",
- "evidence_coursemodulecompleted": "Aktiviteetti '{{$a}}' suoritettiin",
- "evidence_courserestored": "Osaamisenarviointi palautettiin kurssin '{{$a}}' palautuksen mukana.",
- "evidence_evidenceofpriorlearninglinked": "Todiste aiemmasta osaamisesta '{{$a}}' on nyt linkitetty",
- "evidence_evidenceofpriorlearningunlinked": "Aiemman osaamisen '{{$a}} linkitys on nyt purettu",
- "evidence_manualoverride": "Pätevyys arvioitiin manuaalisesti",
- "evidence_manualoverrideincourse": "Osaamisen arviointi asetettiin manuaalisesti kurssille '{{$a}}'.",
- "evidence_manualoverrideinplan": "Osaamisen arviointi asetettiin manuaalisesti opintosuunnitelmassa '{{$a}}'.",
- "learningplancompetencies": "Opintosuunnitelman pätevyydet",
- "learningplans": "Opintosuunnitelmat",
- "myplans": "Omat opintosuunnitelmani",
- "noactivities": "Ei aktiviteetteja",
- "nocompetencies": "Ei pätevyyksiä",
- "nocrossreferencedcompetencies": "Muita pätevyyksiä ei ole ristiviitattu tähän pätevyyteen.",
- "noevidence": "Ei todistetta",
- "noplanswerecreated": "Yhtään opintosuunnitelmaa ei luotu.",
- "path": "Polku",
- "planstatusactive": "Aktiivinen",
- "planstatuscomplete": "Valmis",
- "planstatusdraft": "Luonnos",
- "planstatusinreview": "Arvioitavana",
- "planstatuswaitingforreview": "Odottaa arviointia",
- "proficient": "Pätevä",
- "progress": "Eteneminen",
- "rating": "Arviointi",
- "status": "Osaamismerkin status",
- "template": "Opintosuunnitelman viitekehys",
- "usercompetencystatus_idle": "Turha",
- "usercompetencystatus_inreview": "Arvioitavana",
- "usercompetencystatus_waitingforreview": "Odottaa arviointia",
- "userplans": "Opintosuunnitelmat",
- "xcompetenciesproficientoutofy": "{{$a.x}} kaikkiaan {{$a.y}}:sta pätevyydestä on suoritettu",
- "xcompetenciesproficientoutofyincourse": "Olet suorittanut {{$a.x}} kaikkiaan {{$a.y}}:sta pätevyydestä tällä kurssilla."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/fr.json b/src/addon/competency/lang/fr.json
deleted file mode 100755
index 7e23c4763..000000000
--- a/src/addon/competency/lang/fr.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Activités",
- "competencies": "Compétences",
- "competenciesmostoftennotproficientincourse": "Compétences non atteintes le plus souvent dans ce cours",
- "coursecompetencies": "Compétences du cours",
- "coursecompetencyratingsarenotpushedtouserplans": "Les évaluations de compétences de ce cours n'ont pas d'influence sur les plans de formation.",
- "coursecompetencyratingsarepushedtouserplans": "Les évaluations de compétences de ce cours sont immédiatement reportées dans les plans de formation.",
- "crossreferencedcompetencies": "Compétences transversales",
- "duedate": "Délai d'achèvement",
- "errornocompetenciesfound": "Aucune compétence trouvée",
- "evidence": "Preuve",
- "evidence_competencyrule": "La règle pour la compétence a été atteinte.",
- "evidence_coursecompleted": "Le cours « {{$a}} » a été achevé.",
- "evidence_coursemodulecompleted": "L'activité « {{$a}} » a été achevée.",
- "evidence_courserestored": "L'évaluation a été restaurée avec le cours « {{$a}} ».",
- "evidence_evidenceofpriorlearninglinked": "La preuve d'acquis « {{$a}} » a été liée.",
- "evidence_evidenceofpriorlearningunlinked": "La preuve d'acquis « {{$a}} » a été déliée.",
- "evidence_manualoverride": "L'évaluation de la compétence a été donnée manuellement.",
- "evidence_manualoverrideincourse": "L'évaluation de la compétence a été donnée manuellement dans le cours « {{$a}} ».",
- "evidence_manualoverrideinplan": "L'évaluation de la compétence a été donnée manuellement dans le plan « {{$a}} ».",
- "learningplancompetencies": "Compétences du plan de formation",
- "learningplans": "Plans de formation",
- "myplans": "Mes plans de formation",
- "noactivities": "Aucune activité",
- "nocompetencies": "Aucune compétence n'a été créée dans ce référentiel.",
- "nocrossreferencedcompetencies": "Aucune autre compétence n'est transversale pour cette compétence.",
- "noevidence": "Aucune preuve d'acquis",
- "noplanswerecreated": "Aucun plan de formation n'a été créé.",
- "path": "Chemin :",
- "planstatusactive": "Actif",
- "planstatuscomplete": "Achevé",
- "planstatusdraft": "Brouillon",
- "planstatusinreview": "En cours de validation",
- "planstatuswaitingforreview": "En attente de validation",
- "proficient": "Compétence acquise",
- "progress": "Progrès",
- "rating": "Évaluation",
- "reviewstatus": "Statut de validation",
- "status": "Statut",
- "template": "Modèle de plan de formation",
- "usercompetencystatus_idle": "En suspens",
- "usercompetencystatus_inreview": "En cours de validation",
- "usercompetencystatus_waitingforreview": "En attente de validation",
- "userplans": "Plans de formation",
- "xcompetenciesproficientoutofy": "{{$a.x}} compétences sur {{$a.y}} sont acquises",
- "xcompetenciesproficientoutofyincourse": "Vous avez acquis {{$a.x}} compétences sur {{$a.y}} dans ce cours."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/he.json b/src/addon/competency/lang/he.json
deleted file mode 100755
index 355d32bf0..000000000
--- a/src/addon/competency/lang/he.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "activities": "פעילויות",
- "competencies": "מיומנויות",
- "competenciesmostoftennotproficientincourse": "מיומנויות בהן אינכם בקיאים בקורס זה",
- "coursecompetencies": "מיומנויות הקורס",
- "coursecompetencyratingsarenotpushedtouserplans": "השלמת מיומנויות בקורס זה לא מתעדכנות בתוכניות־הלימוד",
- "coursecompetencyratingsarepushedtouserplans": "מצב רכישת מיומנות כתוצאה מהשלמת פעילות בקורס, מתעדכן באופן מידי בתוכניות־הלימוד.",
- "crossreferencedcompetencies": "מקושר למיומנויות",
- "duedate": "תאריך סופי",
- "evidence": "ראיה לבקיאות",
- "evidence_competencyrule": "תנאי המיומנות נענה",
- "evidence_coursecompleted": "הקורס '{{$a}}' הושלם.",
- "evidence_coursemodulecompleted": "הפעילות '{{$a}}' הושלמה.",
- "evidence_courserestored": "הניקוד שוחזר יחד עם הקורס '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "קישור לאישור על לימוד מקדים של '{{$a}}' צורף.",
- "evidence_evidenceofpriorlearningunlinked": "קישור לאישור על לימוד מקדים של '{{$a}}' הוסר.",
- "evidence_manualoverride": "מצב השלמת המיומנות עודכן באופן ידני.",
- "evidence_manualoverrideincourse": "מצב השלמת המיומנות עודכן באופן ידני בקורס '{{$a}}'.",
- "evidence_manualoverrideinplan": "מצב השלמת המיומנות עודכן באופן ידני בתוכנית־הלימוד '{{$a}}'.",
- "learningplancompetencies": "מיומנויות תוכנית־הלימוד",
- "learningplans": "תוכניות־לימוד",
- "myplans": "תוכניות הלימודים שלי",
- "noactivities": "לא מקושר לאף פעילות בקורס",
- "nocompetencies": "טרם נוצרה מיומנות כלשהי באוסף־מיומנויות זה.",
- "nocrossreferencedcompetencies": "אף מיומנות לא מקושרת למיומנות זו.",
- "noevidence": "טרם צורפה ראיה לבקיאות",
- "noplanswerecreated": "טרם נוצרו תוכניות־לימוד.",
- "path": "נתיב",
- "planstatusactive": "פעיל",
- "planstatuscomplete": "הושלם",
- "planstatusdraft": "טיוטה",
- "planstatusinreview": "בסקירה",
- "planstatuswaitingforreview": "מחכה לסקירה",
- "proficient": "בקיאות",
- "progress": "התקדמות",
- "rating": "דרוג",
- "reviewstatus": "סקירת מצב",
- "status": "מצב",
- "template": "תבנית תוכנית־לימוד",
- "usercompetencystatus_idle": "לא־פעיל",
- "usercompetencystatus_inreview": "בסקירה",
- "usercompetencystatus_waitingforreview": "מחכה לסקירה",
- "userplans": "תוכניות־לימוד",
- "xcompetenciesproficientoutofy": "בקיאות ב {{$a.x}} מיומנויות מתוך {{$a.y}}",
- "xcompetenciesproficientoutofyincourse": "רכשתם בקיאות ב {{$a.x}} מתוך {{$a.y}} המיומנויות בקורס זה."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/hr.json b/src/addon/competency/lang/hr.json
deleted file mode 100755
index 8c40a3b58..000000000
--- a/src/addon/competency/lang/hr.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "activities": "Aktivnosti",
- "competencies": "Kompetencije",
- "duedate": "Rok predaje",
- "evidence": "Dokaz",
- "evidence_coursecompleted": "Kolegij '{{$a}}' je dovršen.",
- "evidence_coursemodulecompleted": "Aktivnost '{{$a}}' je dovršena.",
- "path": "Putanja",
- "planstatusactive": "Aktivno",
- "planstatuscomplete": "Dovršeno",
- "planstatusdraft": "Nacrt",
- "progress": "Napredak studenta",
- "rating": "Ocjena",
- "status": "Status",
- "template": "Predložak"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/hu.json b/src/addon/competency/lang/hu.json
deleted file mode 100755
index 6af915532..000000000
--- a/src/addon/competency/lang/hu.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "activities": "Tevékenységek",
- "competencies": "Készségek",
- "competenciesmostoftennotproficientincourse": "A kurzusban leginkább eredménytelen készségek",
- "coursecompetencies": "Kurzuskészségek",
- "coursecompetencyratingsarenotpushedtouserplans": "A kurzus készségbesorolásai nem érintik a tanulási terveket.",
- "coursecompetencyratingsarepushedtouserplans": "A kurzus készségbesorolásai azonnal frissülnek a tanulási tervekben.",
- "crossreferencedcompetencies": "Kereszthivatkozott készségek",
- "duedate": "Esedékesség",
- "evidence": "Bizonyíték",
- "evidence_competencyrule": "A készséghez tartozó szabály teljesítve.",
- "evidence_coursecompleted": "'{{$a}}' kurzus teljesítve.",
- "evidence_coursemodulecompleted": "'{{$a}}' tevékenység teljesítve.",
- "evidence_courserestored": "A besorolás a(z) '{{$a}}' kurzussal együtt helyreállt..",
- "evidence_evidenceofpriorlearninglinked": "Előtanulmányok '{{$a}}' bizonyítéka összekapcsolva.",
- "evidence_evidenceofpriorlearningunlinked": "Előtanulmányok '{{$a}}' bizonyítéka szétválasztva.",
- "evidence_manualoverride": "Készségbesorolás kézzel beállítva.",
- "evidence_manualoverrideincourse": "Készségbesorolás '{{$a}}' kurzusban kézzel beállítva.",
- "evidence_manualoverrideinplan": "Készségbesorolás '{{$a}}' tanulási tervben kézzel beállítva.",
- "learningplancompetencies": "Tanulási tervhez tartozó készségek",
- "learningplans": "Tanulási tervek",
- "myplans": "Tanulási terveim",
- "noactivities": "Nincs tevékenység",
- "nocompetencies": "A keretben nem jött létre készség.",
- "nocrossreferencedcompetencies": "A készséghez kereszthivatkozással nem kapcsolódik más készség.",
- "noevidence": "Nincs bizonyíték",
- "noplanswerecreated": "Nem jött létre tanulási terv.",
- "path": "Útvonal:",
- "planstatusactive": "Aktív",
- "planstatuscomplete": "Kész",
- "planstatusdraft": "Vázlat",
- "planstatusinreview": "Ellenőrzés alatt",
- "planstatuswaitingforreview": "Ellenőrzésre vár",
- "proficient": "Sikeres",
- "progress": "Előmenetel",
- "rating": "Besorolás",
- "reviewstatus": "Ellenőrzés állapota",
- "status": "Állapot",
- "template": "Tanulási tervsablon",
- "usercompetencystatus_idle": "Inaktív",
- "usercompetencystatus_inreview": "Ellenőrzés alatt",
- "usercompetencystatus_waitingforreview": "Ellenőrzésre vár",
- "userplans": "Tanulási tervek",
- "xcompetenciesproficientoutofy": "{{$a.x}} / {{$a.y}} készség eredményes",
- "xcompetenciesproficientoutofyincourse": "Ön a kurzusban {{$a.y}} közül {{$a.x}} készség tekintetében eredményesnek bizonyul."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/it.json b/src/addon/competency/lang/it.json
deleted file mode 100755
index b48ee9ec1..000000000
--- a/src/addon/competency/lang/it.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Attività",
- "competencies": "Competenze",
- "competenciesmostoftennotproficientincourse": "Competenze del corso dove più frequentemente non sono stati raggiunti i livelli di esperto",
- "coursecompetencies": "Competenze del corso",
- "coursecompetencyratingsarenotpushedtouserplans": "Le valutazioni delle competenze nel corso non si riflettono nei piani di formazione.",
- "coursecompetencyratingsarepushedtouserplans": "Le valutazione delle competenze nel corso si riflettono immediatamente nei piani di formazione.",
- "crossreferencedcompetencies": "Competenze con riferimento incrociato",
- "duedate": "Termine consegne",
- "errornocompetenciesfound": "Non sono state trovate competenze",
- "evidence": "Attestazione",
- "evidence_competencyrule": "La regola della competenza è stata soddisfatta.",
- "evidence_coursecompleted": "Il corso '{{$a}}' è stato completato.",
- "evidence_coursemodulecompleted": "L'attività '{{$a}}' è stata completato.",
- "evidence_courserestored": "La valutazione è stata ripristinata assieme al corso '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "L'attestazione della formazione pregressa '{{$a}}' è stata collegata.",
- "evidence_evidenceofpriorlearningunlinked": "L'attestazione della formazione pregressa '{{$a}}' è stata scollegata.",
- "evidence_manualoverride": "La valutazione della competenza è stata data manualmente.",
- "evidence_manualoverrideincourse": "La valutazione della competenza nel corso '{{$a}}' è stata data manualmente.",
- "evidence_manualoverrideinplan": "La valutazione della competenza nel piano di formazione '{{$a}}' è stata data manualmente.",
- "learningplancompetencies": "Competenze del piano di formazione",
- "learningplans": "Piani di formazione",
- "myplans": "I miei piani di formazione",
- "noactivities": "Nessuna attività.",
- "nocompetencies": "Questo quadro non ha competenze",
- "nocrossreferencedcompetencies": "Non ci sono competenze con riferimenti incrociati a questa competenza",
- "noevidence": "Non sono presenti attestazioni.",
- "noplanswerecreated": "Non sono stati creati piani di formazione",
- "path": "Percorso:",
- "planstatusactive": "Attivo",
- "planstatuscomplete": "Raggiunta",
- "planstatusdraft": "Bozza",
- "planstatusinreview": "In revisione",
- "planstatuswaitingforreview": "In attesa di revisione",
- "proficient": "Esperto",
- "progress": "Avanzamento",
- "rating": "Valutazione",
- "reviewstatus": "Stato della revisione",
- "status": "Stato",
- "template": "Modello di piano di formazione",
- "usercompetencystatus_idle": "Non attiva",
- "usercompetencystatus_inreview": "In revisione",
- "usercompetencystatus_waitingforreview": "In attesa di revisione",
- "userplans": "Piani di formazione",
- "xcompetenciesproficientoutofy": "{{$a.x}} competenze su {{$a.y}} sono a livello di esperto",
- "xcompetenciesproficientoutofyincourse": "Possiedi un livello di esperto in {{$a.x}} competenze su {{$a.y}} competenze di questo corso."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/ja.json b/src/addon/competency/lang/ja.json
deleted file mode 100755
index d4109719e..000000000
--- a/src/addon/competency/lang/ja.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "活動",
- "competencies": "コンピテンシー",
- "competenciesmostoftennotproficientincourse": "このコース内でほとんど熟達していないコンピテンシー",
- "coursecompetencies": "コースコンピテンシー",
- "coursecompetencyratingsarenotpushedtouserplans": "このコース内でのコンピテンシー評定は学習プランに影響しません。",
- "coursecompetencyratingsarepushedtouserplans": "このコース内でのコンピテンシー評定は学習プラン内ですぐに更新されます。",
- "crossreferencedcompetencies": "クロスリファレンスコンピテンシー",
- "duedate": "期限",
- "errornocompetenciesfound": "コンピテンシーが見つかりません",
- "evidence": "エビデンス",
- "evidence_competencyrule": "コンピテンシールールが合致しません。",
- "evidence_coursecompleted": "コース「 {{$a}} 」が完了しました。",
- "evidence_coursemodulecompleted": "活動「 {{$a}} 」が完了しました。",
- "evidence_courserestored": "コース「 {{$a}} 」と共に評定がリストアされました。",
- "evidence_evidenceofpriorlearninglinked": "事前学習エビデンス「 {{$a}} 」がリンクされました。",
- "evidence_evidenceofpriorlearningunlinked": "事前学習エビデンス「 {{$a}} 」がリンク解除されました。",
- "evidence_manualoverride": "コンピテンシー評定は手動設定されました。",
- "evidence_manualoverrideincourse": "コンピテンシー評定はコース「 {{$a}} 」で手動設定されました。",
- "evidence_manualoverrideinplan": "コンピテンシー評定は学習プラン「 {{$a}} 」で手動設定されました。",
- "learningplancompetencies": "学習プランコンピテンシー",
- "learningplans": "学習プラン",
- "myplans": "マイ学習プラン",
- "noactivities": "活動なし",
- "nocompetencies": "このフレームワークにコンピテンシーは作成されていません。",
- "nocrossreferencedcompetencies": "このコンピテンシーに相互参照されている他のコンピテンシーはありません。",
- "noevidence": "エビデンスなし",
- "noplanswerecreated": "学習プランは作成されませんでした。",
- "path": "パス:",
- "planstatusactive": "アクティブ",
- "planstatuscomplete": "完了",
- "planstatusdraft": "下書き",
- "planstatusinreview": "レビュー中",
- "planstatuswaitingforreview": "レビュー待ち",
- "proficient": "熟達",
- "progress": "進捗",
- "rating": "評定",
- "reviewstatus": "レビューステータス",
- "status": "ステータス",
- "template": "学習プランテンプレート",
- "usercompetencystatus_idle": "待機",
- "usercompetencystatus_inreview": "レビュー中",
- "usercompetencystatus_waitingforreview": "レビュー待ち",
- "userplans": "学習プラン",
- "xcompetenciesproficientoutofy": "{{$a.x}} / {{$a.y}} のコンピテンシーで熟達しています。",
- "xcompetenciesproficientoutofyincourse": "あなたはこのコースに関して {{$a.x}} / {{$a.y}} のコンピテンシーで熟達しています。"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/ko.json b/src/addon/competency/lang/ko.json
deleted file mode 100755
index a8c01eef7..000000000
--- a/src/addon/competency/lang/ko.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "activities": "학습활동",
- "duedate": "마감 일시",
- "evidence": "증거",
- "path": "경로",
- "progress": "학생의 진도",
- "rating": "등급",
- "status": "상태",
- "template": "질문지"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/lt.json b/src/addon/competency/lang/lt.json
deleted file mode 100755
index 2fac9c0ec..000000000
--- a/src/addon/competency/lang/lt.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "activities": "Veikla",
- "competencies": "Kompetencijos",
- "coursecompetencies": "Kurso kompetencijos",
- "coursecompetencyratingsarenotpushedtouserplans": "Kompetencijų reitingai šiame kurse neturi įtakos mokymosi planams.",
- "crossreferencedcompetencies": "Kryžminės kompetencijos",
- "duedate": "Data pristatymui",
- "errornocompetenciesfound": "Kompetencijų nerasta",
- "evidence": "Įrodymas",
- "evidence_coursecompleted": "Kursas '{{$a}}' buvo užbaigtas.",
- "evidence_coursemodulecompleted": "Veikla '{{$a}}' buvo užbaigta.",
- "evidence_evidenceofpriorlearninglinked": "Ankstesnio mokymosi įrodymas '{{$a}}' buvo susietas.",
- "evidence_evidenceofpriorlearningunlinked": "Ankstesnio mokymosi įrodymas '{{$a}}' buvo atsietas.",
- "learningplancompetencies": "Mokymosi plano kompetencijos",
- "learningplans": "Mokymosi planai",
- "myplans": "Mano mokymosi planai",
- "noactivities": "Nėra veiklų",
- "nocompetencies": "Šioje sistemoje nebuvo sukurta kompetencijų.",
- "nocrossreferencedcompetencies": "Jokios kitos kompetencijos nebuvo susietos kryžmine nuoroda su šia kompetencija.",
- "noevidence": "Nėra įrodymų",
- "noplanswerecreated": "Nebuvo sukurta mokymosi planų.",
- "path": "Kelias",
- "planstatusactive": "Aktyvus",
- "planstatuscomplete": "Baigta",
- "planstatusdraft": "Juodraštis",
- "planstatusinreview": "Peržiūrima",
- "planstatuswaitingforreview": "Laukiama peržiūros",
- "proficient": "Įgūdis",
- "progress": "Besimokančiojo pažanga",
- "rating": "Reitingas",
- "reviewstatus": "Peržiūros būsena",
- "status": "Būsena",
- "template": "Mokymosi plano šablonas",
- "usercompetencystatus_idle": "Nenaudojamas",
- "usercompetencystatus_inreview": "Peržiūrima",
- "usercompetencystatus_waitingforreview": "Laukiama peržiūros",
- "userplans": "Mokymosi planai",
- "xcompetenciesproficientoutofyincourse": "Įgijote {{$a.x}} iš {{$a.y}} kompetenciją šiame kurse."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/mr.json b/src/addon/competency/lang/mr.json
deleted file mode 100755
index a31b331a8..000000000
--- a/src/addon/competency/lang/mr.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "activities": "क्रिया",
- "errornocompetenciesfound": "कोणतीही कौशल्यं आढळली नाहीत",
- "nocompetencies": "कोणतीही क्षमता नाहीत",
- "status": "स्थिती"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/nl.json b/src/addon/competency/lang/nl.json
deleted file mode 100755
index 755c15965..000000000
--- a/src/addon/competency/lang/nl.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Activiteiten",
- "competencies": "Competenties",
- "competenciesmostoftennotproficientincourse": "Meestal nog niet bekwaam voor competenties in deze cursus",
- "coursecompetencies": "Cursuscompetenties",
- "coursecompetencyratingsarenotpushedtouserplans": "Competentiebeoordelingen in deze cursus hebben geen invloed op studieplannnen.",
- "coursecompetencyratingsarepushedtouserplans": "Competentiebeoordelingen in deze cursus worden onmiddellijk aangepast in studieplannen.",
- "crossreferencedcompetencies": "Competenties met kruisverwijzingen",
- "duedate": "Uiterste inleverdatum",
- "errornocompetenciesfound": "Geen competenties gevonden",
- "evidence": "Bewijs",
- "evidence_competencyrule": "De competentieregel werd behaald.",
- "evidence_coursecompleted": "Cursus '{{$a}}' werd voltooid",
- "evidence_coursemodulecompleted": "Activiteit '{{$a}}' werd voltooid.",
- "evidence_courserestored": "De waardering was hersteld, samen met cursus '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "Bewijs van leren '{{$a}}' werd gelinkt.",
- "evidence_evidenceofpriorlearningunlinked": "Bewijs van leren '{{$a}}' link verwijderd",
- "evidence_manualoverride": "De competentiebeoordeling werd manueel ingesteld.",
- "evidence_manualoverrideincourse": "De competentiebeoordeling werd manueel ingesteld in cursus '{{$a}}'.",
- "evidence_manualoverrideinplan": "De competentiebeoordeling werd manueel ingesteld in leerplan '{{$a}}'.",
- "learningplancompetencies": "Studieplan competenties",
- "learningplans": "Studieplannen",
- "myplans": "Mijn studieplannen",
- "noactivities": "Geen activiteiten",
- "nocompetencies": "Er zijn nog geen competenties gemaakt in dit framework",
- "nocrossreferencedcompetencies": "Er zijn geen andere competenties met een kruisverwijzing naar deze competentie.",
- "noevidence": "Geen bewijs",
- "noplanswerecreated": "Er zijn nog geen studieplannen gemaakt",
- "path": "Pad:",
- "planstatusactive": "Actief",
- "planstatuscomplete": "Volledig",
- "planstatusdraft": "Klad",
- "planstatusinreview": "Wordt beoordeeld",
- "planstatuswaitingforreview": "Wacht op beoordeling",
- "proficient": "Geslaagd",
- "progress": "Vordering",
- "rating": "Beoordeling",
- "reviewstatus": "Beoordelingsstatus",
- "status": "Status",
- "template": "Studieplansjabloon",
- "usercompetencystatus_idle": "Niet aan het werk",
- "usercompetencystatus_inreview": "Wordt beoordeeld",
- "usercompetencystatus_waitingforreview": "Wacht op beoordeling",
- "userplans": "Leerplan",
- "xcompetenciesproficientoutofy": "{{$a.x}} van de {{$a.y}} competenties zijn bekwaam",
- "xcompetenciesproficientoutofyincourse": "Je bent bekwaam in {{$a.x}} van de {{$a.y}} competenties in deze cursus."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/no.json b/src/addon/competency/lang/no.json
deleted file mode 100755
index e75d67cb1..000000000
--- a/src/addon/competency/lang/no.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Aktiviteter",
- "competencies": "Kompetanser",
- "competenciesmostoftennotproficientincourse": "Læringsmål som sjeldnest er oppnådd i dette kurset",
- "coursecompetencies": "Kursets læringsmål",
- "coursecompetencyratingsarenotpushedtouserplans": "Læringsmålvurderinger i dette kurset har ingen innvirkning på opplæringsplaner.",
- "coursecompetencyratingsarepushedtouserplans": "Læringsmålvurderinger i dette kurset vil automatisk oppdatere opplæringsplaner.",
- "crossreferencedcompetencies": "Kryssrefererte læringsmål",
- "duedate": "Innleveringsfrist",
- "errornocompetenciesfound": "Ingen kompetansemål funnet",
- "evidence": "Bevis",
- "evidence_competencyrule": "Læringsmålregelen ble møtt",
- "evidence_coursecompleted": "Kurset '{{$a}}' ble fullført.",
- "evidence_coursemodulecompleted": "Aktiviteten '{{$a}}' ble fullført.",
- "evidence_courserestored": "Vurderingen ble gjenopprettet sammen med kurset '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "Beviset '{{$a}}' på tidligere læring ble lenket.",
- "evidence_evidenceofpriorlearningunlinked": "Lenken til beviset '{{$a}}' på tidligere læring ble fjernet.",
- "evidence_manualoverride": "Kompetansevurderingen ble satt manuelt.",
- "evidence_manualoverrideincourse": "Kompetansevurderingen ble satt manuelt i kurset '{{$a}}'.",
- "evidence_manualoverrideinplan": "Kompetansevurderingen ble satt manuelt i opplringsplanen '{{$a}}'.",
- "learningplancompetencies": "Opplæringsplanens læringsmål",
- "learningplans": "Opplæringsplaner",
- "myplans": "Mine opplæringsplaner",
- "noactivities": "Ingen aktiviteter",
- "nocompetencies": "Ingen læringsmål er lagt til i dette rammeverket.",
- "nocrossreferencedcompetencies": "Ingen andre læringsmål har en kryssreferanse til dette læringsmålet.",
- "noevidence": "Ingen bevis",
- "noplanswerecreated": "Ingen opplæringsplaner ble opprettet",
- "path": "Sti:",
- "planstatusactive": "Aktiv",
- "planstatuscomplete": "Fullført",
- "planstatusdraft": "Utkast",
- "planstatusinreview": "Under vurdering",
- "planstatuswaitingforreview": "Venter på vurdering",
- "proficient": "Dyktighet",
- "progress": "Fremdrift",
- "rating": "Vurdering",
- "reviewstatus": "Vurderingsstatus",
- "status": "Status",
- "template": "Opplæringsplanmal",
- "usercompetencystatus_idle": "Uvirksom",
- "usercompetencystatus_inreview": "Under vurdering",
- "usercompetencystatus_waitingforreview": "Venterpå vurdering",
- "userplans": "Opplæringsplaner",
- "xcompetenciesproficientoutofy": "{{$a.x}} av {{$a.y}} læringsmål er oppnådd",
- "xcompetenciesproficientoutofyincourse": "Du har oppnådd {{$a.x}} av {{$a.y}} læringsmål i dette kurset."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/pl.json b/src/addon/competency/lang/pl.json
deleted file mode 100755
index 9dcc2e6d8..000000000
--- a/src/addon/competency/lang/pl.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "activities": "Aktywności",
- "competencies": "Kompetencje",
- "coursecompetencies": "Kompetencje kursu",
- "duedate": "Termin",
- "evidence": "Dowód",
- "evidence_coursecompleted": "Kurs '{{$a}}' został ukończony.",
- "evidence_coursemodulecompleted": "Aktywność '{{$a}}' została ukończona.",
- "evidence_evidenceofpriorlearninglinked": "Dokumentacja wcześniejszej nauki '{{$a}}' została podłączona.",
- "evidence_evidenceofpriorlearningunlinked": "Dokumentacja wcześniejszej nauki '{{$a}}' została odłączona.",
- "learningplancompetencies": "Kompetencje planu nauczania",
- "learningplans": "Plany nauczania",
- "myplans": "Moje plany uczenia się.",
- "noactivities": "Brak aktywności",
- "nocompetencies": "Nie utworzono żadnych kompetencji w tych ramach kwalifikacji.",
- "noevidence": "Brak dowodów",
- "noplanswerecreated": "Nie utworzono planów uczenia się.",
- "path": "Ścieżka:",
- "planstatusactive": "Aktywne",
- "planstatuscomplete": "Ukończone",
- "planstatusdraft": "Szkic",
- "planstatusinreview": "W trakcie przeglądu",
- "planstatuswaitingforreview": "Oczekuje na przegląd",
- "progress": "Postęp",
- "rating": "Ocena",
- "reviewstatus": "Status przeglądu",
- "status": "Status",
- "template": "Szablon planu uczenia się.",
- "usercompetencystatus_idle": "Bezczynny",
- "usercompetencystatus_inreview": "W przeglądzie",
- "usercompetencystatus_waitingforreview": "Oczekuje na przegląd",
- "userplans": "Plany uczenia się"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/pt-br.json b/src/addon/competency/lang/pt-br.json
deleted file mode 100755
index 232ddc151..000000000
--- a/src/addon/competency/lang/pt-br.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Atividades",
- "competencies": "Competências",
- "competenciesmostoftennotproficientincourse": "Competências mais frequentemente improficiente neste curso",
- "coursecompetencies": "Competências do curso",
- "coursecompetencyratingsarenotpushedtouserplans": "Avaliações de competência neste curso não afetam os planos de aprendizagem.",
- "coursecompetencyratingsarepushedtouserplans": "Avaliações de competência neste curso são atualizadas imediatamente nos planos de aprendizagem.",
- "crossreferencedcompetencies": "Competências referenciadas",
- "duedate": "Data de entrega",
- "errornocompetenciesfound": "Nenhuma competência encontrada",
- "evidence": "Evidência",
- "evidence_competencyrule": "A regra da competência foi cumprida.",
- "evidence_coursecompleted": "O curso '{{$a}}' foi concluído.",
- "evidence_coursemodulecompleted": "A atividade '{{$a}}' foi concluída.",
- "evidence_courserestored": "A classificação foi restaurada juntamente com o curso '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "Evidência de aprendizagem prévia '{{$a}}' ativada.",
- "evidence_evidenceofpriorlearningunlinked": "Evidência de aprendizagem prévia '{{$a}}' desativada.",
- "evidence_manualoverride": "A classificação de competência foi definida manualmente.",
- "evidence_manualoverrideincourse": "A classificação de competência foi definida manualmente no curso '{{$a}}'.",
- "evidence_manualoverrideinplan": "A classificação de competência foi definida manualmente no plano de aprendizado '{{$a}}'.",
- "learningplancompetencies": "Competências do plano de aprendizagem",
- "learningplans": "Planos de aprendizagem",
- "myplans": "Meus planos de aprendizagem",
- "noactivities": "Sem atividades",
- "nocompetencies": "Nenhuma competência foi criada para esta estrutura.",
- "nocrossreferencedcompetencies": "Nenhuma outra competência foi referenciada a esta competência.",
- "noevidence": "Nenhuma evidência",
- "noplanswerecreated": "Nenhum plano de aprendizagem foi criado.",
- "path": "Caminho:",
- "planstatusactive": "Ativo",
- "planstatuscomplete": "Concluído",
- "planstatusdraft": "Rascunho",
- "planstatusinreview": "Em revisão",
- "planstatuswaitingforreview": "Aguardando revisão",
- "proficient": "Proficiente",
- "progress": "Progresso",
- "rating": "Avaliação",
- "reviewstatus": "Estado da revisão",
- "status": "Status",
- "template": "Modelo de plano de aprendizagem",
- "usercompetencystatus_idle": "inativo",
- "usercompetencystatus_inreview": "Em revisão",
- "usercompetencystatus_waitingforreview": "Esperando por revisão",
- "userplans": "Planos de aprendizado",
- "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competências são proficiêntes",
- "xcompetenciesproficientoutofyincourse": "Você é proficiente em {{$a.x}} de {{$a.y}} competências neste curso."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/pt.json b/src/addon/competency/lang/pt.json
deleted file mode 100755
index ef18f29e3..000000000
--- a/src/addon/competency/lang/pt.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Atividades",
- "competencies": "Competências",
- "competenciesmostoftennotproficientincourse": "Competências sem proficiência nesta disciplina",
- "coursecompetencies": "Competências da disciplina",
- "coursecompetencyratingsarenotpushedtouserplans": "As avaliações das competências nesta disciplina não afetam os planos de aprendizagem.",
- "coursecompetencyratingsarepushedtouserplans": "As avaliações das competências nesta disciplina são automaticamente atualizadas nos planos de aprendizagem.",
- "crossreferencedcompetencies": "Competências referenciadas",
- "duedate": "Data limite para submeter trabalhos",
- "errornocompetenciesfound": "Competências não encontradas",
- "evidence": "Comprovativo",
- "evidence_competencyrule": "A regra da competência foi cumprida.",
- "evidence_coursecompleted": "A disciplina '{{$a}}' está concluída.",
- "evidence_coursemodulecompleted": "A atividade '{{$a}}' está concluída.",
- "evidence_courserestored": "A avaliação foi restaurada em conjunto com a disciplina '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "O comprovativo de aprendizagem anterior '{{$a}}' foi associado à competência.",
- "evidence_evidenceofpriorlearningunlinked": "O comprovativo de aprendizagem anterior '{{$a}}' foi desassociado da competência.",
- "evidence_manualoverride": "A avaliação da competência foi configurada manualmente.",
- "evidence_manualoverrideincourse": "A avaliação da competência foi configurada manualmente na disciplina '{{$a}}'.",
- "evidence_manualoverrideinplan": "A avaliação da competência foi configurada manualmente no plano de aprendizagem '{{$a}}'.",
- "learningplancompetencies": "Competências do plano de aprendizagem",
- "learningplans": "Planos de aprendizagem",
- "myplans": "Os meus planos de aprendizagem",
- "noactivities": "Nenhuma atividade associada",
- "nocompetencies": "Ainda não foram criadas competências neste quadro.",
- "nocrossreferencedcompetencies": "Nenhuma competência foi referenciada a esta competência.",
- "noevidence": "Não foi adicionado nenhum comprovativo",
- "noplanswerecreated": "Nenhum plano de aprendizagem foi criado.",
- "path": "Localização:",
- "planstatusactive": "Ativo",
- "planstatuscomplete": "Concluído",
- "planstatusdraft": "Rascunho",
- "planstatusinreview": "Em revisão",
- "planstatuswaitingforreview": "À espera de revisão",
- "proficient": "Proficiente",
- "progress": "Progresso",
- "rating": "Avaliação",
- "reviewstatus": "Estado da revisão",
- "status": "Estado",
- "template": "Modelo de plano de aprendizagem",
- "usercompetencystatus_idle": "Parado",
- "usercompetencystatus_inreview": "Em revisão",
- "usercompetencystatus_waitingforreview": "À espera de revisão",
- "userplans": "Planos de aprendizagem",
- "xcompetenciesproficientoutofy": "Tem proficiência em {{$a.x}} de {{$a.y}} competências",
- "xcompetenciesproficientoutofyincourse": "Tem proficiência em {{$a.x}} de {{$a.y}} competências nesta disciplina"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/ro.json b/src/addon/competency/lang/ro.json
deleted file mode 100755
index 1c1c3bc4a..000000000
--- a/src/addon/competency/lang/ro.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "activities": "Activităţi",
- "competencies": "Competențe",
- "duedate": "Termen de predare",
- "evidence": "Evidență",
- "evidence_competencyrule": "Nu a fost îndeplinită regula competenței.",
- "evidence_coursecompleted": "Cursul '{{$a}}' a fost completat",
- "evidence_coursemodulecompleted": "Activitatea '{{$a}}' a fost completată",
- "learningplans": "Planuri de învățare",
- "myplans": "Planurile mele de învățare",
- "noactivities": "Nu sunt activități",
- "path": "Cale",
- "planstatusactive": "Activ",
- "planstatuscomplete": "Complet",
- "planstatusdraft": "Draft",
- "planstatusinreview": "În revizuire",
- "planstatuswaitingforreview": "Se așteaptă recenzia",
- "progress": "Progres student",
- "rating": "Rating",
- "status": "Status",
- "template": "Șablon",
- "usercompetencystatus_idle": "Pauză",
- "usercompetencystatus_inreview": "În revizuire",
- "usercompetencystatus_waitingforreview": "Se așteaptă revizuirea",
- "userplans": "Planuri de învățare"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/ru.json b/src/addon/competency/lang/ru.json
deleted file mode 100755
index bfadb904d..000000000
--- a/src/addon/competency/lang/ru.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Элементы курса",
- "competencies": "Компетенции",
- "competenciesmostoftennotproficientincourse": "Компетенции, которые чаще всего оказываются не освоенными в этом курсе",
- "coursecompetencies": "Компетенции курса",
- "coursecompetencyratingsarenotpushedtouserplans": "Рейтинги компетенций из этого курса не влияют на учебные планы.",
- "coursecompetencyratingsarepushedtouserplans": "Рейтинги компетенций из этого курса сразу же обновляются в учебных планах.",
- "crossreferencedcompetencies": "Перекрестные компетенции",
- "duedate": "Последний срок сдачи",
- "errornocompetenciesfound": "Компетенций не найдено",
- "evidence": "Доказательство",
- "evidence_competencyrule": "Выполнены требования правила компетенции.",
- "evidence_coursecompleted": "Курс «{{$a}}» завершен.",
- "evidence_coursemodulecompleted": "Элемент «{{$a}}» завершен.",
- "evidence_courserestored": "Рейтинг был восстановлен вместе с курсом «{{$a}}».",
- "evidence_evidenceofpriorlearninglinked": "Доказательство предыдущего обучения «{{$a}}» было привязано.",
- "evidence_evidenceofpriorlearningunlinked": "Отменена связь доказательства предыдущего обучения «{{$a}}».",
- "evidence_manualoverride": "Рейтинг компетенции был задан вручную.",
- "evidence_manualoverrideincourse": "Рейтинг компетенции был задан вручную для курса «{{$a}}».",
- "evidence_manualoverrideinplan": "Рейтинг компетенции был задан вручную для учебного плана «{{$a}}».",
- "learningplancompetencies": "Компетенции учебного плана",
- "learningplans": "Учебные планы",
- "myplans": "Мои учебные планы",
- "noactivities": "Нет элементов",
- "nocompetencies": "Нет компетенций, созданных в этом фреймворке.",
- "nocrossreferencedcompetencies": "Нет других компетенций, перекрестно ссылающихся на эту компетенцию.",
- "noevidence": "Нет доказательств",
- "noplanswerecreated": "Учебные планы не были созданы.",
- "path": "Путь:",
- "planstatusactive": "Активно",
- "planstatuscomplete": "Выполнено",
- "planstatusdraft": "Черновик",
- "planstatusinreview": "Проверяется",
- "planstatuswaitingforreview": "Ожидание отзыва",
- "proficient": "Освоено",
- "progress": "В процессе",
- "rating": "Рейтинг",
- "reviewstatus": "Статус пересмотра",
- "status": "Статус",
- "template": "Шаблон учебного плана",
- "usercompetencystatus_idle": "Не используется",
- "usercompetencystatus_inreview": "В процессе пересмотра",
- "usercompetencystatus_waitingforreview": "Ожидает пересмотра",
- "userplans": "Учебные планы",
- "xcompetenciesproficientoutofy": "{{$a.x}} из {{$a.y}} компетенций освоены",
- "xcompetenciesproficientoutofyincourse": "Вы освоили {{$a.x}} из {{$a.y}} компетенций в этом курсе."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/sr-cr.json b/src/addon/competency/lang/sr-cr.json
deleted file mode 100755
index d9f5a2c01..000000000
--- a/src/addon/competency/lang/sr-cr.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "activities": "Активности",
- "competenciesmostoftennotproficientincourse": "Компетенције које најчешће нису усавршене на овом курсу",
- "coursecompetencies": "Компетенције курса",
- "coursecompetencyratingsarenotpushedtouserplans": "Рангирање компетенција на овом курсу на утиче на планове учења.",
- "coursecompetencyratingsarepushedtouserplans": "Рангирање компетенција на овом курсу се аутоматски ажурира у плановима учења.",
- "crossreferencedcompetencies": "Унакрсно повезане компетенције",
- "duedate": "Крајњи рок",
- "errornocompetenciesfound": "Није пронађена ниједна компетенција",
- "evidence": "Доказ",
- "learningplancompetencies": "Компетенције плана учења",
- "learningplans": "Планови учења",
- "myplans": "Моји планови учења",
- "noactivities": "Нема активности",
- "nocompetencies": "Нема компетенција",
- "nocrossreferencedcompetencies": "Ниједна друга компетенција није унакрсно повезана са овом компетенцијом.",
- "noevidence": "Нема доказа",
- "noplanswerecreated": "Није креиран ниједан план учења.",
- "path": "Путања",
- "proficient": "Стручан",
- "progress": "Напредовање полазника",
- "rating": "Оцена",
- "reviewstatus": "Прегледај статус",
- "status": "Статус",
- "template": "Шаблон",
- "xcompetenciesproficientoutofy": "{{$a.x}} од {{$a.y}} компетенција су на највишем нивоу стручности",
- "xcompetenciesproficientoutofyincourse": "Стручни сте у {{$a.x}} од {{$a.y}} компетенција на овом курсу."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/sr-lt.json b/src/addon/competency/lang/sr-lt.json
deleted file mode 100755
index 2a3c17986..000000000
--- a/src/addon/competency/lang/sr-lt.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "activities": "Aktivnosti",
- "competenciesmostoftennotproficientincourse": "Kompetencije koje najčešće nisu usavršene na ovom kursu",
- "coursecompetencies": "Kompetencije kursa",
- "coursecompetencyratingsarenotpushedtouserplans": "Rangiranje kompetencija na ovom kursu na utiče na planove učenja.",
- "coursecompetencyratingsarepushedtouserplans": "Rangiranje kompetencija na ovom kursu se automatski ažurira u planovima učenja.",
- "crossreferencedcompetencies": "Unakrsno povezane kompetencije",
- "duedate": "Krajnji rok",
- "errornocompetenciesfound": "Nije pronađena nijedna kompetencija",
- "evidence": "Dokaz",
- "learningplancompetencies": "Kompetencije plana učenja",
- "learningplans": "Planovi učenja",
- "myplans": "Moji planovi učenja",
- "noactivities": "Nema aktivnosti",
- "nocompetencies": "Nema kompetencija",
- "nocrossreferencedcompetencies": "Nijedna druga kompetencija nije unakrsno povezana sa ovom kompetencijom.",
- "noevidence": "Nema dokaza",
- "noplanswerecreated": "Nije kreiran nijedan plan učenja.",
- "path": "Putanja",
- "proficient": "Stručan",
- "progress": "Napredovanje polaznika",
- "rating": "Ocena",
- "reviewstatus": "Pregledaj status",
- "status": "Status",
- "template": "Šablon",
- "xcompetenciesproficientoutofy": "{{$a.x}} od {{$a.y}} kompetencija su na najvišem nivou stručnosti",
- "xcompetenciesproficientoutofyincourse": "Stručni ste u {{$a.x}} od {{$a.y}} kompetencija na ovom kursu."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/sv.json b/src/addon/competency/lang/sv.json
deleted file mode 100755
index bd4f1f8b7..000000000
--- a/src/addon/competency/lang/sv.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "activities": "Aktiviteter",
- "competencies": "Kompetenser",
- "competenciesmostoftennotproficientincourse": "Kompetenser som oftast ej uppnåtts i denna kurs",
- "coursecompetencies": "Kurskompetenser",
- "coursecompetencyratingsarenotpushedtouserplans": "Bedömning av kompetenser i denna kurs kommer inte att påverka studieplaner.",
- "coursecompetencyratingsarepushedtouserplans": "Bedömning av kompetenser i denna kurs uppdateras omedelbart i studieplanerna.",
- "crossreferencedcompetencies": "Korsrefererade kompetenser.",
- "duedate": "Stoppdatum/tid",
- "evidence": "Verifiering",
- "evidence_competencyrule": "Regeln för kompetensen uppfylldes.",
- "evidence_coursecompleted": "Kursen '{{$a}}' genomfördes.",
- "evidence_coursemodulecompleted": "Aktiviteten '{{$a}}' genomfördes.",
- "evidence_courserestored": "Bedömningen återställdes jäms med kursen '{{$a}}'.",
- "evidence_evidenceofpriorlearninglinked": "Verifieringen av tidigare lärande '{{$a}}' länkades.",
- "evidence_evidenceofpriorlearningunlinked": "Verifieringen av tidigare lärande '{{$a}}' avlänkades.",
- "evidence_manualoverride": "Kompetensgraderingen sattes manuellt.",
- "evidence_manualoverrideincourse": "Kompetensgraderingen sattes manuellt i kursen '{{$a}}'.",
- "evidence_manualoverrideinplan": "Kompetensgraderingen sattes manuellt i studeplanen '{{$a}}'.",
- "learningplancompetencies": "Kompetenser i studieplaner",
- "learningplans": "Studieplaner",
- "myplans": "Mina studieplaner",
- "noactivities": "Inga aktiviteter",
- "nocompetencies": "Inga kompetenser har skapats för detta ramverk",
- "nocrossreferencedcompetencies": "Inga andra kompetenser har korsrefererats till denna kompetens.",
- "noevidence": "Inga verifieringar",
- "noplanswerecreated": "Inga studieplaner var skapade.",
- "path": "Sökväg:",
- "planstatusactive": "Aktiv",
- "planstatuscomplete": "Komplett",
- "planstatusdraft": "Utkast",
- "planstatusinreview": "Granskning pågår",
- "planstatuswaitingforreview": "Väntar på granskning",
- "proficient": "Kunnig",
- "progress": "Utveckling",
- "rating": "Bedömning",
- "reviewstatus": "Granska status",
- "status": "Status",
- "template": "Mall för studieplan",
- "usercompetencystatus_idle": "Overksam",
- "usercompetencystatus_inreview": "Bedömning pågår",
- "usercompetencystatus_waitingforreview": "Väntar på bedömning",
- "userplans": "Studieplaner",
- "xcompetenciesproficientoutofy": "{{$a.x}} av {{$a.y}} kompetenser är uppnådda",
- "xcompetenciesproficientoutofyincourse": "Du har uppnått {{$a.x}} av {{$a.y}} kompetenser i denna kurs.."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/tg.json b/src/addon/competency/lang/tg.json
deleted file mode 100755
index f1318e243..000000000
--- a/src/addon/competency/lang/tg.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "activities": "Унсурҳо",
- "duedate": "Мӯҳлати охирини супурдан",
- "path": "Роҳ",
- "progress": "Дастовардҳои донишҷӯ",
- "rating": "Рейтинг",
- "status": "Ҳолат"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/tr.json b/src/addon/competency/lang/tr.json
deleted file mode 100755
index d54aeeb73..000000000
--- a/src/addon/competency/lang/tr.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "activities": "Etkinlikler",
- "competencies": "Yetkinlikler",
- "competenciesmostoftennotproficientincourse": "Bu dersi alan en çok yeterli olmayan yetkinlikler",
- "coursecompetencies": "Ders yetkinlikleri",
- "coursecompetencyratingsarenotpushedtouserplans": "Bu dersin yetkinlik dereceleri öğrenme planlarını etkilemez.",
- "coursecompetencyratingsarepushedtouserplans": "Bu dersin yetkinlik dereceleri öğrenme planlarında anında güncellenir.",
- "crossreferencedcompetencies": "Çapraz referanslı yetkinlikler",
- "duedate": "Son teslim tarihi",
- "evidence": "Öğrenme kanıtı",
- "evidence_competencyrule": "Yetkinlik kuralı karşılandı.",
- "evidence_coursecompleted": "'{{$a}}' dersi tamamlandı.",
- "evidence_coursemodulecompleted": "'{{$a}}' etkinliği tamamlandı.",
- "evidence_courserestored": "Değerlendirme, '{{$a}}' dersiyle birlikte geri yüklendi.",
- "evidence_evidenceofpriorlearninglinked": "Önceki öğrenim '{{$a}}' ile ilgili kanıt bağlantılıydı.",
- "evidence_evidenceofpriorlearningunlinked": "'{{$a}}' adlı önceden öğrenilenlerin kanıtları birbirine bağlı değildi.",
- "evidence_manualoverride": "Yetkinlik derecesi elle ayarlandı.",
- "evidence_manualoverrideincourse": "Yetkinlik derecesi '{{$a}}' dersinde elle ayarlandı.",
- "evidence_manualoverrideinplan": "Yetkinlik derecesi '{{$a}}' öğrenme planında elle ayarlandı.",
- "learningplancompetencies": "Öğrenme planı yetkinlikleri",
- "learningplans": "Öğrenme planları",
- "myplans": "Benim öğrenme planlarım",
- "noactivities": "Etkinlikler yok",
- "nocompetencies": "Bu çerçevede hiçbir yetkinlik oluşturulmamıştır.",
- "nocrossreferencedcompetencies": "Bu yetkinliğe çapraz referanslı başka yetkinlik bulunmamaktadır.",
- "noevidence": "Öğrenme kanıtı yok",
- "noplanswerecreated": "Hiçbir öğrenme planı oluşturulmadı.",
- "path": "Yol:",
- "planstatusactive": "Aktif",
- "planstatuscomplete": "Tamamla",
- "planstatusdraft": "Taslak",
- "planstatusinreview": "İncelemede",
- "planstatuswaitingforreview": "İnceleme bekleniyor",
- "proficient": "Yeterli",
- "progress": "İlerleme",
- "rating": "Derecelendirme",
- "reviewstatus": "İnceleme durumu",
- "status": "Durum",
- "template": "Öğrenme planı şablonu",
- "usercompetencystatus_idle": "Kullanılmayan",
- "usercompetencystatus_inreview": "İncelemede",
- "usercompetencystatus_waitingforreview": "İnceleme bekleniyor",
- "userplans": "Öğrenme planları",
- "xcompetenciesproficientoutofy": "{{$a.y}} yetkinliğinden {{$a.x}} dışarıda yeterli",
- "xcompetenciesproficientoutofyincourse": "Bu derste {{$a.y}} yetkinliğin dışında {{$a.x}} yeterliliğe sahibisiniz."
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/uk.json b/src/addon/competency/lang/uk.json
deleted file mode 100755
index 8ba19bd44..000000000
--- a/src/addon/competency/lang/uk.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "activities": "Види діяльності",
- "competencies": "Компетентності",
- "competenciesmostoftennotproficientincourse": "Компетентності, які найчастіше не досягаються у цьому курсі",
- "coursecompetencies": "Компетентності курсу",
- "coursecompetencyratingsarenotpushedtouserplans": "Оцінювання компетентностей цього курсу не впливають на навчальні плани",
- "coursecompetencyratingsarepushedtouserplans": "Оцінювання компетентностей цього курсу будуть зразу передані в навчальні плани.",
- "crossreferencedcompetencies": "Пов'язані компетентності",
- "duedate": "Кінцевий термін здачі",
- "errornocompetenciesfound": "Не знайдено компетенції",
- "evidence": "Підтвердження",
- "evidence_competencyrule": "Правило для компетентності досягнуте",
- "evidence_coursecompleted": "Курс «{{$a}}» завершено.",
- "evidence_coursemodulecompleted": "Діяльність «{{$a}}» завершена.",
- "evidence_courserestored": "Оцінювання було відновлено з курсом «{{$a}}».",
- "evidence_evidenceofpriorlearninglinked": "Зв'язок підтвердження «{{$a}}» встановлено.",
- "evidence_evidenceofpriorlearningunlinked": "Зв'язок підтвердження «{{$a}}» видалено.",
- "evidence_manualoverride": "Оцінювання компетентності дане вручну.",
- "evidence_manualoverrideincourse": "Оцінювання компетентності дане вручну в курсі «{{$a}}».",
- "evidence_manualoverrideinplan": "Оцінювання компетентності дане вручну в плані «{{$a}}».",
- "learningplancompetencies": "Компетентності навчального плану",
- "learningplans": "Навчальний план",
- "myplans": "Мої навчальні плани",
- "noactivities": "Жодної діяльності",
- "nocompetencies": "Жодної компетентності не створено у цьому репозиторії",
- "nocrossreferencedcompetencies": "Жодна інша компетентність не пов'язана з даною",
- "noevidence": "Жодного підтвердження",
- "noplanswerecreated": "Жодного навчального плану не було створено",
- "path": "Шлях:",
- "planstatusactive": "Активний",
- "planstatuscomplete": "Завершений",
- "planstatusdraft": "Чернетка",
- "planstatusinreview": "В процесі підтвердження",
- "planstatuswaitingforreview": "В очікуванні підтвердження",
- "proficient": "Набута компетентність",
- "progress": "Прогрес",
- "rating": "Оцінювання",
- "reviewstatus": "Статус підтвердження",
- "status": "Статус",
- "template": "Шаблон навчального плану",
- "usercompetencystatus_idle": "В очікуванні",
- "usercompetencystatus_inreview": "В процесі підтвердження",
- "usercompetencystatus_waitingforreview": "В очікування підтвердження",
- "userplans": "Навчальний план",
- "xcompetenciesproficientoutofy": "{{$a.x}} компетентностей з {{$a.y}} набуті",
- "xcompetenciesproficientoutofyincourse": "Ви набули {{$a.x}} компетентностей з {{$a.y}} наявних у цьому курсі"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/zh-cn.json b/src/addon/competency/lang/zh-cn.json
deleted file mode 100755
index 48f9fe6ae..000000000
--- a/src/addon/competency/lang/zh-cn.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "activities": "活动",
- "competenciesmostoftennotproficientincourse": "在这门课程中你有太多不精通的能力",
- "coursecompetencies": "课程能力",
- "duedate": "截止日",
- "evidence": "凭据",
- "noactivities": "没有设置活动",
- "path": "路径",
- "proficient": "精通",
- "progress": "学生进度",
- "rating": "正在评分",
- "status": "勋章状态",
- "template": "学习计划模板",
- "xcompetenciesproficientoutofy": "{{$a.y}}个能力中的{{$a.x}}是精通的",
- "xcompetenciesproficientoutofyincourse": "你精通这门课程{{$a.y}}个能力中的{{$a.x}}个。"
-}
\ No newline at end of file
diff --git a/src/addon/competency/lang/zh-tw.json b/src/addon/competency/lang/zh-tw.json
deleted file mode 100755
index 9106adffc..000000000
--- a/src/addon/competency/lang/zh-tw.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "activities": "活動",
- "competenciesmostoftennotproficientincourse": "大多數人在這課程無法達到精熟的核心能力",
- "coursecompetencies": "課程核心能力",
- "coursecompetencyratingsarenotpushedtouserplans": "在這一課程的核心能力評等不會影響學習計畫",
- "coursecompetencyratingsarepushedtouserplans": "在這一課程的核心能力評等在學習計畫上會立即更新",
- "crossreferencedcompetencies": "交互參照的核心能力",
- "duedate": "到期日",
- "errornocompetenciesfound": "找不到能使用的功能",
- "evidence": "證據",
- "learningplancompetencies": "學習計畫核心能力",
- "learningplans": "學習計畫",
- "myplans": "我的學習計畫",
- "noactivities": "沒有活動",
- "nocompetencies": "沒有功能",
- "nocrossreferencedcompetencies": "沒有其他核心能力被交互參照這一核心能力",
- "noevidence": "沒有證據",
- "noplanswerecreated": "沒有學習計畫被建立",
- "path": "路徑:",
- "proficient": "精熟",
- "progress": "進度",
- "rating": "評等",
- "reviewstatus": "審查狀況",
- "status": "獎章狀態",
- "template": "學習計畫樣版",
- "xcompetenciesproficientoutofy": "在{{$a.y}}個核心能力中有{{$a.x}}個已經精熟",
- "xcompetenciesproficientoutofyincourse": "在此課程中有{{$a.y}}個核心能力,你已經精熟{{$a.x}}個。"
-}
\ No newline at end of file
diff --git a/src/addon/competency/pages/competency/competency.html b/src/addon/competency/pages/competency/competency.html
index e5fb5af37..34bf134cc 100644
--- a/src/addon/competency/pages/competency/competency.html
+++ b/src/addon/competency/pages/competency/competency.html
@@ -10,12 +10,7 @@
-
-
-
-
-
-
+
@@ -25,7 +20,7 @@
- {{ 'addon.competency.path' | translate }} :
+ {{ 'addon.competency.path' | translate }}
{{ competency.competency.comppath.framework.name }}
/ {{ ancestor.name }}
@@ -47,7 +42,7 @@
{{ 'addon.competency.noactivities' | translate }}
-
+
@@ -78,11 +73,9 @@
-
-
-
+
{{ evidence.actionuser.fullname }}
- {{ evidence.timemodified | coreToLocaleString }}
+ {{ evidence.timemodified * 1000 | coreFormatDate }}
{{ evidence.gradename }}
diff --git a/src/addon/competency/pages/competency/competency.ts b/src/addon/competency/pages/competency/competency.ts
index 0443a66d8..9552e75a6 100644
--- a/src/addon/competency/pages/competency/competency.ts
+++ b/src/addon/competency/pages/competency/competency.ts
@@ -19,6 +19,7 @@ import { CoreSitesProvider } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { AddonCompetencyProvider } from '../../providers/competency';
+import { AddonCompetencyHelperProvider } from '../../providers/helper';
/**
* Page that displays a learning plan.
@@ -41,7 +42,8 @@ export class AddonCompetencyCompetencyPage {
constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService,
private sitesProvider: CoreSitesProvider, private domUtils: CoreDomUtilsProvider,
- @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider) {
+ @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider,
+ private competencyHelperProvider: AddonCompetencyHelperProvider) {
this.competencyId = navParams.get('competencyId');
this.planId = navParams.get('planId');
this.courseId = navParams.get('courseId');
@@ -54,9 +56,14 @@ export class AddonCompetencyCompetencyPage {
ionViewDidLoad(): void {
this.fetchCompetency().then(() => {
if (this.planId) {
- this.competencyProvider.logCompetencyInPlanView(this.planId, this.competencyId, this.planStatus, this.userId);
+ this.competencyProvider.logCompetencyInPlanView(this.planId, this.competencyId, this.planStatus, this.userId)
+ .catch(() => {
+ // Ignore errors.
+ });
} else {
- this.competencyProvider.logCompetencyInCourseView(this.courseId, this.competencyId, this.userId);
+ this.competencyProvider.logCompetencyInCourseView(this.courseId, this.competencyId, this.userId).catch(() => {
+ // Ignore errors.
+ });
}
}).finally(() => {
this.competencyLoaded = true;
@@ -80,11 +87,14 @@ export class AddonCompetencyCompetencyPage {
}
return promise.then((competency) => {
+ competency.usercompetencysummary.usercompetency = competency.usercompetencysummary.usercompetencyplan ||
+ competency.usercompetencysummary.usercompetency;
this.competency = competency.usercompetencysummary;
if (this.planId) {
this.planStatus = competency.plan.status;
- this.competency.usercompetency.statusname = this.getStatusName(this.competency.usercompetency.status);
+ this.competency.usercompetency.statusname =
+ this.competencyHelperProvider.getCompetencyStatusName(this.competency.usercompetency.status);
} else {
this.competency.usercompetency = this.competency.usercompetencycourse;
this.coursemodules = competency.coursemodules;
@@ -108,32 +118,6 @@ export class AddonCompetencyCompetencyPage {
});
}
- /**
- * Convenience function to get the review status name translated.
- *
- * @param {number} status
- * @return {string}
- */
- protected getStatusName(status: number): string {
- let statusTranslateName;
- switch (status) {
- case AddonCompetencyProvider.REVIEW_STATUS_IDLE:
- statusTranslateName = 'idle';
- break;
- case AddonCompetencyProvider.REVIEW_STATUS_IN_REVIEW:
- statusTranslateName = 'inreview';
- break;
- case AddonCompetencyProvider.REVIEW_STATUS_WAITING_FOR_REVIEW:
- statusTranslateName = 'waitingforreview';
- break;
- default:
- // We can use the current status name.
- return String(status);
- }
-
- return this.translate.instant('addon.competency.usercompetencystatus_' + statusTranslateName);
- }
-
/**
* Refreshes the competency.
*
diff --git a/src/addon/competency/pages/competencysummary/competencysummary.html b/src/addon/competency/pages/competencysummary/competencysummary.html
index f05fed004..8df0e9bcc 100644
--- a/src/addon/competency/pages/competencysummary/competencysummary.html
+++ b/src/addon/competency/pages/competencysummary/competencysummary.html
@@ -13,7 +13,7 @@
- {{ 'addon.competency.path' | translate }} :
+ {{ 'addon.competency.path' | translate }}
{{ competency.comppath.framework.name }}
/ {{ ancestor.name }}
diff --git a/src/addon/competency/pages/competencysummary/competencysummary.ts b/src/addon/competency/pages/competencysummary/competencysummary.ts
index 8464d4312..3045f44f3 100644
--- a/src/addon/competency/pages/competencysummary/competencysummary.ts
+++ b/src/addon/competency/pages/competencysummary/competencysummary.ts
@@ -41,7 +41,9 @@ export class AddonCompetencyCompetencySummaryPage {
*/
ionViewDidLoad(): void {
this.fetchCompetency().then(() => {
- this.competencyProvider.logCompetencyView(this.competencyId);
+ this.competencyProvider.logCompetencyView(this.competencyId).catch(() => {
+ // Ignore errors.
+ });
}).finally(() => {
this.competencyLoaded = true;
});
diff --git a/src/addon/competency/pages/plan/plan.html b/src/addon/competency/pages/plan/plan.html
index ce74e7eea..f84bc276e 100644
--- a/src/addon/competency/pages/plan/plan.html
+++ b/src/addon/competency/pages/plan/plan.html
@@ -10,12 +10,7 @@
-
-
-
-
-
-
+
@@ -27,7 +22,7 @@
0">
{{ 'addon.competency.duedate' | translate }} :
- {{ plan.plan.duedate | coreToLocaleString }}
+ {{ plan.plan.duedate * 1000 | coreFormatDate }}
{{ 'addon.competency.template' | translate }} :
diff --git a/src/addon/competency/pages/plan/plan.ts b/src/addon/competency/pages/plan/plan.ts
index d82c46dcd..33a01c8b8 100644
--- a/src/addon/competency/pages/plan/plan.ts
+++ b/src/addon/competency/pages/plan/plan.ts
@@ -14,7 +14,6 @@
import { Component, Optional } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
-import { TranslateService } from '@ngx-translate/core';
import { CoreAppProvider } from '@providers/app';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
@@ -35,10 +34,9 @@ export class AddonCompetencyPlanPage {
plan: any;
user: any;
- constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService,
- private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider,
- @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider,
- private competencyHelperProvider: AddonCompetencyHelperProvider) {
+ constructor(private navCtrl: NavController, navParams: NavParams, private appProvider: CoreAppProvider,
+ private domUtils: CoreDomUtilsProvider, @Optional() private svComponent: CoreSplitViewComponent,
+ private competencyProvider: AddonCompetencyProvider, private competencyHelperProvider: AddonCompetencyHelperProvider) {
this.planId = navParams.get('planId');
}
@@ -58,11 +56,15 @@ export class AddonCompetencyPlanPage {
*/
protected fetchLearningPlan(): Promise {
return this.competencyProvider.getLearningPlan(this.planId).then((plan) => {
- plan.plan.statusname = this.getStatusName(plan.plan.status);
+ plan.plan.statusname = this.competencyHelperProvider.getPlanStatusName(plan.plan.status);
// Get the user profile image.
this.competencyHelperProvider.getProfile(plan.plan.userid).then((user) => {
this.user = user;
});
+
+ plan.competencies.forEach((competency) => {
+ competency.usercompetency = competency.usercompetencyplan || competency.usercompetency;
+ });
this.plan = plan;
}).catch((message) => {
this.domUtils.showErrorModalDefault(message, 'Error getting learning plan data.');
@@ -83,38 +85,6 @@ export class AddonCompetencyPlanPage {
}
}
- /**
- * Convenience function to get the status name translated.
- *
- * @param {number} status
- * @return {string}
- */
- protected getStatusName(status: number): string {
- let statusTranslateName;
- switch (status) {
- case AddonCompetencyProvider.STATUS_DRAFT:
- statusTranslateName = 'draft';
- break;
- case AddonCompetencyProvider.REVIEW_STATUS_IN_REVIEW:
- statusTranslateName = 'inreview';
- break;
- case AddonCompetencyProvider.REVIEW_STATUS_WAITING_FOR_REVIEW:
- statusTranslateName = 'waitingforreview';
- break;
- case AddonCompetencyProvider.STATUS_ACTIVE:
- statusTranslateName = 'active';
- break;
- case AddonCompetencyProvider.STATUS_COMPLETE:
- statusTranslateName = 'complete';
- break;
- default:
- // We can use the current status name.
- return String(status);
- }
-
- return this.translate.instant('addon.competency.planstatus' + statusTranslateName);
- }
-
/**
* Refreshes the learning plan.
*
diff --git a/src/addon/competency/pages/planlist/planlist.html b/src/addon/competency/pages/planlist/planlist.html
index f5d273ef7..9088d2cf6 100644
--- a/src/addon/competency/pages/planlist/planlist.html
+++ b/src/addon/competency/pages/planlist/planlist.html
@@ -14,7 +14,8 @@
0" no-margin>
{{ plan.name }}
- 0">{{ 'addon.competency.duedate' | translate }}: {{ plan.duedate | coreToLocaleString }}
+ 0">{{ 'addon.competency.duedate' | translate }}: {{ plan.duedate * 1000 | coreFormatDate :'strftimedatetimeshort' }}
+ {{ plan.statusname }}
diff --git a/src/addon/competency/pages/planlist/planlist.ts b/src/addon/competency/pages/planlist/planlist.ts
index 52168e7b5..6c05ab924 100644
--- a/src/addon/competency/pages/planlist/planlist.ts
+++ b/src/addon/competency/pages/planlist/planlist.ts
@@ -17,6 +17,7 @@ import { IonicPage, NavParams } from 'ionic-angular';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { AddonCompetencyProvider } from '../../providers/competency';
+import { AddonCompetencyHelperProvider } from '../../providers/helper';
/**
* Page that displays the list of learning plans.
@@ -34,7 +35,8 @@ export class AddonCompetencyPlanListPage {
plansLoaded = false;
plans = [];
- constructor(navParams: NavParams, private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider) {
+ constructor(navParams: NavParams, private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider,
+ private competencyHelperProvider: AddonCompetencyHelperProvider) {
this.userId = navParams.get('userId');
}
@@ -64,6 +66,20 @@ export class AddonCompetencyPlanListPage {
*/
protected fetchLearningPlans(): Promise {
return this.competencyProvider.getLearningPlans(this.userId).then((plans) => {
+ plans.forEach((plan) => {
+ plan.statusname = this.competencyHelperProvider.getPlanStatusName(plan.status);
+ switch (plan.status) {
+ case AddonCompetencyProvider.STATUS_ACTIVE:
+ plan.statuscolor = 'success';
+ break;
+ case AddonCompetencyProvider.STATUS_COMPLETE:
+ plan.statuscolor = 'danger';
+ break;
+ default:
+ plan.statuscolor = 'warning';
+ break;
+ }
+ });
this.plans = plans;
}).catch((message) => {
this.domUtils.showErrorModalDefault(message, 'Error getting learning plans data.');
diff --git a/src/addon/competency/providers/competency.ts b/src/addon/competency/providers/competency.ts
index 611f8b492..28fae6304 100644
--- a/src/addon/competency/providers/competency.ts
+++ b/src/addon/competency/providers/competency.ts
@@ -22,14 +22,18 @@ import { CoreSitesProvider } from '@providers/sites';
@Injectable()
export class AddonCompetencyProvider {
+ // Learning plan status.
static STATUS_DRAFT = 0;
static STATUS_ACTIVE = 1;
static STATUS_COMPLETE = 2;
- static STATUS_WAITIN_GFOR_REVIEW = 3;
+ static STATUS_WAITING_FOR_REVIEW = 3;
static STATUS_IN_REVIEW = 4;
+
+ // Competency status.
static REVIEW_STATUS_IDLE = 0;
static REVIEW_STATUS_WAITING_FOR_REVIEW = 1;
static REVIEW_STATUS_IN_REVIEW = 2;
+
protected ROOT_CACHE_KEY = 'mmaCompetency:';
protected logger;
@@ -216,9 +220,12 @@ export class AddonCompetencyProvider {
* @param {number} competencyId ID of the competency.
* @param {number} [userId] ID of the user. If not defined, current user.
* @param {string} [siteId] Site ID. If not defined, current site.
+ * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down).
* @return {Promise} Promise to be resolved when the plans are retrieved.
*/
- getCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise {
+ getCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string, ignoreCache?: boolean)
+ : Promise {
+
return this.sitesProvider.getSite(siteId).then((site) => {
userId = userId || site.getUserId();
@@ -229,10 +236,15 @@ export class AddonCompetencyProvider {
competencyid: competencyId,
userid: userId
},
- preSets = {
+ preSets: any = {
cacheKey: this.getCompetencyInCourseCacheKey(courseId, competencyId, userId)
};
+ if (ignoreCache) {
+ preSets.getFromCache = false;
+ preSets.emergencyCache = false;
+ }
+
return site.read('tool_lp_data_for_user_competency_summary_in_course', params, preSets).then((response) => {
if (response.usercompetencysummary) {
return response;
@@ -249,9 +261,10 @@ export class AddonCompetencyProvider {
* @param {number} competencyId ID of the competency.
* @param {number} [userId] ID of the user. If not defined, current user.
* @param {string} [siteId] Site ID. If not defined, current site.
+ * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down).
* @return {Promise} Promise to be resolved when the plans are retrieved.
*/
- getCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise {
+ getCompetencySummary(competencyId: number, userId?: number, siteId?: string, ignoreCache?: boolean): Promise {
return this.sitesProvider.getSite(siteId).then((site) => {
userId = userId || site.getUserId();
@@ -261,10 +274,15 @@ export class AddonCompetencyProvider {
competencyid: competencyId,
userid: userId
},
- preSets = {
+ preSets: any = {
cacheKey: this.getCompetencySummaryCacheKey(competencyId, userId)
};
+ if (ignoreCache) {
+ preSets.getFromCache = false;
+ preSets.emergencyCache = false;
+ }
+
return site.read('tool_lp_data_for_user_competency_summary', params, preSets).then((response) => {
if (response.competency) {
return response.competency;
@@ -281,9 +299,10 @@ export class AddonCompetencyProvider {
* @param {number} courseId ID of the course.
* @param {number} [userId] ID of the user.
* @param {string} [siteId] Site ID. If not defined, current site.
+ * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down).
* @return {Promise} Promise to be resolved when the course competencies are retrieved.
*/
- getCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise {
+ getCourseCompetencies(courseId: number, userId?: number, siteId?: string, ignoreCache?: boolean): Promise {
return this.sitesProvider.getSite(siteId).then((site) => {
this.logger.debug('Get course competencies for course ' + courseId);
@@ -291,10 +310,15 @@ export class AddonCompetencyProvider {
const params = {
courseid: courseId
},
- preSets = {
+ preSets: any = {
cacheKey: this.getCourseCompetenciesCacheKey(courseId)
};
+ if (ignoreCache) {
+ preSets.getFromCache = false;
+ preSets.emergencyCache = false;
+ }
+
return site.read('tool_lp_data_for_course_competencies_page', params, preSets).then((response) => {
if (response.competencies) {
return response;
diff --git a/src/addon/competency/providers/course-option-handler.ts b/src/addon/competency/providers/course-option-handler.ts
index 4aee5b3dc..f05219300 100644
--- a/src/addon/competency/providers/course-option-handler.ts
+++ b/src/addon/competency/providers/course-option-handler.ts
@@ -24,7 +24,7 @@ import { AddonCompetencyProvider } from '../providers/competency';
@Injectable()
export class AddonCompetencyCourseOptionHandler implements CoreCourseOptionsHandler {
name = 'AddonCompetency';
- priority = 700;
+ priority = 300;
constructor(private competencyProvider: AddonCompetencyProvider) {}
@@ -90,4 +90,30 @@ export class AddonCompetencyCourseOptionHandler implements CoreCourseOptionsHand
return this.competencyProvider.invalidateCourseCompetencies(courseId);
}
+
+ /**
+ * Called when a course is downloaded. It should prefetch all the data to be able to see the addon in offline.
+ *
+ * @param {any} course The course.
+ * @return {Promise} Promise resolved when done.
+ */
+ prefetch(course: any): Promise {
+ // Get the competencies in the course.
+ return this.competencyProvider.getCourseCompetencies(course.id, undefined, undefined, true).then((competencies) => {
+ const promises = [];
+
+ // Prefetch all the competencies.
+ if (competencies && competencies.competencies) {
+ competencies.competencies.forEach((competency) => {
+ promises.push(this.competencyProvider.getCompetencyInCourse(course.id, competency.competency.id, undefined,
+ undefined, true));
+
+ promises.push(this.competencyProvider.getCompetencySummary(competency.competency.id, undefined, undefined,
+ true));
+ });
+ }
+
+ return Promise.all(promises);
+ });
+ }
}
diff --git a/src/addon/competency/providers/helper.ts b/src/addon/competency/providers/helper.ts
index a742218eb..bf95bd3ac 100644
--- a/src/addon/competency/providers/helper.ts
+++ b/src/addon/competency/providers/helper.ts
@@ -13,8 +13,10 @@
// limitations under the License.
import { Injectable } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
import { CoreSitesProvider } from '@providers/sites';
import { CoreUserProvider } from '@core/user/providers/user';
+import { AddonCompetencyProvider } from './competency';
/**
* Service that provides some features regarding learning plans.
@@ -22,7 +24,8 @@ import { CoreUserProvider } from '@core/user/providers/user';
@Injectable()
export class AddonCompetencyHelperProvider {
- constructor(private sitesProvider: CoreSitesProvider, private userProvider: CoreUserProvider) {
+ constructor(private sitesProvider: CoreSitesProvider, private userProvider: CoreUserProvider,
+ private translate: TranslateService) {
}
/**
@@ -43,4 +46,62 @@ export class AddonCompetencyHelperProvider {
return user;
});
}
+
+ /**
+ * Get the review status name translated.
+ *
+ * @param {number} status
+ * @return {string}
+ */
+ getCompetencyStatusName(status: number): string {
+ let statusTranslateName;
+ switch (status) {
+ case AddonCompetencyProvider.REVIEW_STATUS_IDLE:
+ statusTranslateName = 'idle';
+ break;
+ case AddonCompetencyProvider.REVIEW_STATUS_IN_REVIEW:
+ statusTranslateName = 'inreview';
+ break;
+ case AddonCompetencyProvider.REVIEW_STATUS_WAITING_FOR_REVIEW:
+ statusTranslateName = 'waitingforreview';
+ break;
+ default:
+ // We can use the current status name.
+ return String(status);
+ }
+
+ return this.translate.instant('addon.competency.usercompetencystatus_' + statusTranslateName);
+ }
+
+ /**
+ * Get the status name translated.
+ *
+ * @param {number} status
+ * @return {string}
+ */
+ getPlanStatusName(status: number): string {
+ let statusTranslateName;
+ switch (status) {
+ case AddonCompetencyProvider.STATUS_DRAFT:
+ statusTranslateName = 'draft';
+ break;
+ case AddonCompetencyProvider.STATUS_ACTIVE:
+ statusTranslateName = 'active';
+ break;
+ case AddonCompetencyProvider.STATUS_COMPLETE:
+ statusTranslateName = 'complete';
+ break;
+ case AddonCompetencyProvider.STATUS_WAITING_FOR_REVIEW:
+ statusTranslateName = 'waitingforreview';
+ break;
+ case AddonCompetencyProvider.STATUS_IN_REVIEW:
+ statusTranslateName = 'inreview';
+ break;
+ default:
+ // We can use the current status name.
+ return String(status);
+ }
+
+ return this.translate.instant('addon.competency.planstatus' + statusTranslateName);
+ }
}
diff --git a/src/addon/coursecompletion/components/report/addon-course-completion-report.html b/src/addon/coursecompletion/components/report/addon-course-completion-report.html
index af292dc8e..b4a6a25eb 100644
--- a/src/addon/coursecompletion/components/report/addon-course-completion-report.html
+++ b/src/addon/coursecompletion/components/report/addon-course-completion-report.html
@@ -36,7 +36,7 @@
{{ criteria.status }}
- {{ criteria.timecompleted | coreToLocaleString }}
+ {{ criteria.timecompleted * 1000 | coreFormatDate :'strftimedatetimeshort' }}
diff --git a/src/addon/coursecompletion/lang/ar.json b/src/addon/coursecompletion/lang/ar.json
deleted file mode 100755
index 9069a17e6..000000000
--- a/src/addon/coursecompletion/lang/ar.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "كامل",
- "completecourse": "مقرر مكتمل",
- "completed": "تم",
- "completiondate": "تاريخ إكمال المقرر",
- "couldnotloadreport": "لا يمكن تحميل تقرير إكمال المقرر، الرجاء المحاولة في وقت آخر",
- "coursecompletion": "إكمال المقرر الدراسي",
- "criteria": "معايير",
- "criteriagroup": "مجموعة المعايير",
- "criteriarequiredall": "كل المعايير في الأسفل مطلوبة",
- "criteriarequiredany": "أي معيار في الأسفل مطلوب",
- "inprogress": "قيد التنفيذ",
- "manualselfcompletion": "إكمال يدوي ذاتي",
- "notyetstarted": "لم يبدأ بعد",
- "pending": "معلق",
- "required": "مفروض",
- "requiredcriteria": "المعايير المطلوبة",
- "requirement": "المتطلبات",
- "status": "الوضع",
- "viewcoursereport": "عرض تقرير المقرر"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/bg.json b/src/addon/coursecompletion/lang/bg.json
deleted file mode 100755
index 449302205..000000000
--- a/src/addon/coursecompletion/lang/bg.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "complete": "Завършен",
- "completed": "Завършено",
- "coursecompletion": "Завършване на курса",
- "criteria": "Критерии",
- "criteriagroup": "Група критерии",
- "criteriarequiredall": "Всички критерии по-долу са задължителни",
- "criteriarequiredany": "Някои критерии по-долу са задължителни",
- "inprogress": "В прогрес",
- "manualselfcompletion": "Ръчно самоотбелязване на завършването",
- "required": "Задължително",
- "status": "Състояние",
- "viewcoursereport": "Вижте отчет за курса"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/ca.json b/src/addon/coursecompletion/lang/ca.json
deleted file mode 100755
index 7958e6cea..000000000
--- a/src/addon/coursecompletion/lang/ca.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Completa",
- "completecourse": "Curs complet",
- "completed": "Completat",
- "completiondate": "Data de compleció",
- "couldnotloadreport": "No es pot carregar l'informe de compleció del curs, torneu a intentar-ho més tard.",
- "coursecompletion": "Compleció de curs",
- "criteria": "Criteris",
- "criteriagroup": "Grup de criteris",
- "criteriarequiredall": "Cal que es compleixin tots els criteris que es mostren a continuació",
- "criteriarequiredany": "Cal que es compleixi algun dels criteris que es mostren a continuació",
- "inprogress": "En progrés",
- "manualselfcompletion": "Auto-compleció manual",
- "notyetstarted": "No s'ha començat encara",
- "pending": "Pendent",
- "required": "Requerit",
- "requiredcriteria": "Criteri requerit",
- "requirement": "Requisit",
- "status": "Estat de la insígnia",
- "viewcoursereport": "Visualitza l'informe del curs"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/cs.json b/src/addon/coursecompletion/lang/cs.json
deleted file mode 100755
index e437ad93b..000000000
--- a/src/addon/coursecompletion/lang/cs.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Splněno",
- "completecourse": "Absolvovaný kurz",
- "completed": "Hotovo",
- "completiondate": "Datum ukončení",
- "couldnotloadreport": "Nelze načíst zprávu o absolvování kurzu. Zkuste to prosím později.",
- "coursecompletion": "Studenti musí absolvovat tento kurz",
- "criteria": "Podmínky",
- "criteriagroup": "Skupina podmínek",
- "criteriarequiredall": "Všechny podmínky musí být splněny",
- "criteriarequiredany": "Jakákoli z podmínek musí být splněna",
- "inprogress": "Probíhající",
- "manualselfcompletion": "Označení absolvování kurzu samotným studentem",
- "notyetstarted": "Zatím nezačalo",
- "pending": "Probíhající",
- "required": "Vyžadováno",
- "requiredcriteria": "Vyžadované podmínky",
- "requirement": "Požadavek",
- "status": "Stav",
- "viewcoursereport": "Zobrazit přehled kurzu"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/da.json b/src/addon/coursecompletion/lang/da.json
deleted file mode 100755
index 9f617cc8b..000000000
--- a/src/addon/coursecompletion/lang/da.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Færdiggør",
- "completecourse": "Fuldfør kursus",
- "completed": "Gennemført",
- "completiondate": "Afslutningsdato",
- "couldnotloadreport": "Kunne ikke indlæse rapporten vedrørende kursusfuldførelse, prøv igen senere.",
- "coursecompletion": "Kursusgennemførelse",
- "criteria": "Kriterie",
- "criteriagroup": "Kriteriegruppe",
- "criteriarequiredall": "Alle kriterier herunder er påkrævet",
- "criteriarequiredany": "Et af kriterierne herunder er påkrævet",
- "inprogress": "Igangværende",
- "manualselfcompletion": "Manuel selvregistrering af gennemførelse",
- "notyetstarted": "Ikke begyndt endnu",
- "pending": "Behandles",
- "required": "Påkrævet",
- "requiredcriteria": "Påkrævede kriterier",
- "requirement": "Krav",
- "status": "Badgestatus",
- "viewcoursereport": "Vis kursusrapport"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/de-du.json b/src/addon/coursecompletion/lang/de-du.json
deleted file mode 100755
index aea57098d..000000000
--- a/src/addon/coursecompletion/lang/de-du.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Fertig",
- "completecourse": "Kurs abschließen",
- "completed": "Abgeschlossen",
- "completiondate": "Abschlussdatum",
- "couldnotloadreport": "Fehler beim Laden des Abschlussberichts. Versuche es später noch einmal.",
- "coursecompletion": "Teilnehmer/innen müssen diesen Kurs abschließen.",
- "criteria": "Kriterien",
- "criteriagroup": "Kriteriengruppe",
- "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig",
- "criteriarequiredany": "Eine der nachfolgenden Kriterien ist notwendig",
- "inprogress": "In Bearbeitung",
- "manualselfcompletion": "Manueller eigener Abschluss",
- "notyetstarted": "Noch nicht begonnen",
- "pending": "Unerledigt",
- "required": "Erforderlich",
- "requiredcriteria": "Notwendiges Kriterium",
- "requirement": "Anforderung",
- "status": "Existierende Einschreibungen erlauben",
- "viewcoursereport": "Kursbericht ansehen"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/de.json b/src/addon/coursecompletion/lang/de.json
deleted file mode 100755
index 5634fde09..000000000
--- a/src/addon/coursecompletion/lang/de.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Abschließen",
- "completecourse": "Kurs abschließen",
- "completed": "Abgeschlossen",
- "completiondate": "Abschlussdatum",
- "couldnotloadreport": "Fehler beim Laden des Abschlussberichts. Versuchen Sie es später noch einmal.",
- "coursecompletion": "Kursabschluss",
- "criteria": "Kriterien",
- "criteriagroup": "Kriteriengruppe",
- "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig.",
- "criteriarequiredany": "Ein nachfolgendes Kriterium ist notwendig.",
- "inprogress": "In Arbeit",
- "manualselfcompletion": "Manueller Selbstabschluss",
- "notyetstarted": "Nicht begonnen",
- "pending": "Nicht erledigt",
- "required": "Notwendig",
- "requiredcriteria": "Notwendige Kriterien",
- "requirement": "Anforderung",
- "status": "Status",
- "viewcoursereport": "Kursbericht anzeigen"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/el.json b/src/addon/coursecompletion/lang/el.json
deleted file mode 100755
index 6c49a5c34..000000000
--- a/src/addon/coursecompletion/lang/el.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Ολοκλήρωση",
- "completecourse": "Ολοκλήρωση μαθήματος",
- "completed": "ολοκληρώθηκε",
- "completiondate": "Ημερομηνία ολοκλήρωσης",
- "couldnotloadreport": "Δεν ήταν δυνατή η φόρτωση της αναφοράς ολοκλήρωσης του μαθήματος, δοκιμάστε ξανά αργότερα.",
- "coursecompletion": "Ολοκλήρωση μαθήματος",
- "criteria": "Kριτήρια",
- "criteriagroup": "Ομάδα κριτηρίων",
- "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι απαραίτητα",
- "criteriarequiredany": "Τα παρακάτω κριτήρια είναι απαραίτητα",
- "inprogress": "Σε εξέλιξη",
- "manualselfcompletion": "Χειροκίνητη αυτό-ολοκλήρωση",
- "notyetstarted": "Δεν έχει ξεκινήσει ακόμα",
- "pending": "Σε εκκρεμότητα",
- "required": "Απαιτείται",
- "requiredcriteria": "Απαιτούμενα κριτήρια",
- "requirement": "Απαίτηση",
- "status": "Επιτρέπεται η πρόσβαση στους επισκέπτες",
- "viewcoursereport": "Προβολή αναφορά μαθήματος"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/en.json b/src/addon/coursecompletion/lang/en.json
index 1dd76f339..7607702c6 100644
--- a/src/addon/coursecompletion/lang/en.json
+++ b/src/addon/coursecompletion/lang/en.json
@@ -8,8 +8,8 @@
"coursecompletion": "Course completion",
"criteria": "Criteria",
"criteriagroup": "Criteria group",
- "criteriarequiredall": "All criteria below are required.",
- "criteriarequiredany": "Any criteria below are required.",
+ "criteriarequiredall": "All criteria below are required",
+ "criteriarequiredany": "Any criteria below are required",
"inprogress": "In progress",
"manualselfcompletion": "Manual self completion",
"notyetstarted": "Not yet started",
diff --git a/src/addon/coursecompletion/lang/es-mx.json b/src/addon/coursecompletion/lang/es-mx.json
deleted file mode 100755
index 68f9e01d8..000000000
--- a/src/addon/coursecompletion/lang/es-mx.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Completado",
- "completecourse": "Curso completo",
- "completed": "Finalizado",
- "completiondate": "Fecha de terminación",
- "couldnotloadreport": "No pudo cargarse el reporte de finalización del curso. Por favor inténtelo más tarde.",
- "coursecompletion": "Finalización de curso",
- "criteria": "Criterios",
- "criteriagroup": "Grupo de criterios",
- "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo",
- "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo",
- "inprogress": "En curso",
- "manualselfcompletion": "Auto-finalizar manualmente",
- "notyetstarted": "Aún no ha comenzado",
- "pending": "Pendiente",
- "required": "Obligatorio",
- "requiredcriteria": "Criterios necesarios",
- "requirement": "Requisito",
- "status": "Estatus de insignias",
- "viewcoursereport": "Ver reporte del curso"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/es.json b/src/addon/coursecompletion/lang/es.json
deleted file mode 100755
index a061fa035..000000000
--- a/src/addon/coursecompletion/lang/es.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Finalizado",
- "completecourse": "Curso completado",
- "completed": "completada",
- "completiondate": "Fecha de finalización",
- "couldnotloadreport": "No se puede cargar el informe de finalización del curso, por favor inténtalo de nuevo más tarde.",
- "coursecompletion": "Los usuarios deben finalizar este curso.",
- "criteria": "Criterios",
- "criteriagroup": "Grupo de criterios",
- "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo",
- "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo",
- "inprogress": "En progreso",
- "manualselfcompletion": "Autocompletar manualmente",
- "notyetstarted": "Aún no comenzado",
- "pending": "Pendiente",
- "required": "Obligatorio",
- "requiredcriteria": "Criterios necesarios",
- "requirement": "Requisito",
- "status": "Estado de la insignia",
- "viewcoursereport": "Ver informe del curso"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/eu.json b/src/addon/coursecompletion/lang/eu.json
deleted file mode 100755
index 952157424..000000000
--- a/src/addon/coursecompletion/lang/eu.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Osoa",
- "completecourse": "Ikastaroa osatu",
- "completed": "Osatuta",
- "completiondate": "Osaketa-data",
- "couldnotloadreport": "Ezin izan da ikastaro-osaketaren txostena kargatu. Mesedez saiatu beranduago.",
- "coursecompletion": "Ikastaro-osaketa",
- "criteria": "Irizpidea",
- "criteriagroup": "Irizpide-multzoa",
- "criteriarequiredall": "Beheko irizpide guztiak dira beharrezko.",
- "criteriarequiredany": "Beheko hainbat irizpide dira beharrezko.",
- "inprogress": "Ari da",
- "manualselfcompletion": "Norberak eskuz osatu",
- "notyetstarted": "Ez da hasi",
- "pending": "Egin gabe",
- "required": "Beharrezkoa",
- "requiredcriteria": "Irizpidea behar da",
- "requirement": "Eskakizuna",
- "status": "Egoera",
- "viewcoursereport": "Ikastaroaren txostena ikusi"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/fa.json b/src/addon/coursecompletion/lang/fa.json
deleted file mode 100755
index 451cd0c42..000000000
--- a/src/addon/coursecompletion/lang/fa.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "complete": "کامل",
- "completed": "تکمیلشده",
- "coursecompletion": "تکمیل درس",
- "criteria": "ضابطه",
- "criteriagroup": "گروه ضوابط",
- "criteriarequiredall": "تمام ضوابط زیر باید برآورده شوند",
- "criteriarequiredany": "حداقل یکی از ضوابط زیر برآورده شود",
- "inprogress": "در جریان",
- "manualselfcompletion": "علامت زدن به عنوان کامل توسط خود افراد",
- "notyetstarted": "هنوز شروع نشده است",
- "pending": "در حال بررسی",
- "required": "لازم است",
- "requiredcriteria": "ضوابط مورد نیاز",
- "status": "وضعیت مدال",
- "viewcoursereport": "مشاهده گزارش درس"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/fi.json b/src/addon/coursecompletion/lang/fi.json
deleted file mode 100755
index f06c6b664..000000000
--- a/src/addon/coursecompletion/lang/fi.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "complete": "Suoritettu loppuun",
- "completed": "valmis",
- "completiondate": "Suorituspäivämäärä",
- "couldnotloadreport": "Kurssin suoritusraporttia ei pystytty lataamaan. Ole hyvä ja yritä myöhemmin uudelleen.",
- "coursecompletion": "Kurssin lopetus",
- "criteria": "Kriteeri",
- "criteriagroup": "Kriteeriryhmä",
- "criteriarequiredall": "Kaikki alla olevat kriteerit vaaditaan",
- "criteriarequiredany": "Jokin alla olevista kriteereistä vaaditaan",
- "inprogress": "Kesken",
- "manualselfcompletion": "Opiskelijan itse hyväksymät suoritukset",
- "notyetstarted": "Ei vielä aloitettu",
- "pending": "Vireillä",
- "required": "Pakollinen",
- "requiredcriteria": "Vaaditut kriteerit",
- "requirement": "Vaatimus",
- "status": "Tilanne",
- "viewcoursereport": "Näytä kurssin raportti"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/fr.json b/src/addon/coursecompletion/lang/fr.json
deleted file mode 100755
index e0290d8a8..000000000
--- a/src/addon/coursecompletion/lang/fr.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Complet",
- "completecourse": "Terminer le cours",
- "completed": "Terminé",
- "completiondate": "Date d'achèvement",
- "couldnotloadreport": "Impossible de charger le rapport d'achèvement de cours. Veuillez essayer plus tard.",
- "coursecompletion": "Achèvement de cours",
- "criteria": "Critères",
- "criteriagroup": "Groupe de critères",
- "criteriarequiredall": "Tous les critères ci-dessous sont requis",
- "criteriarequiredany": "Un des critères ci-dessous est requis",
- "inprogress": "En cours",
- "manualselfcompletion": "Auto-achèvement manuel",
- "notyetstarted": "Pas encore commencé",
- "pending": "En suspens",
- "required": "Requis",
- "requiredcriteria": "Critères requis",
- "requirement": "Condition",
- "status": "Statut du badge",
- "viewcoursereport": "Consulter le rapport du cours"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/he.json b/src/addon/coursecompletion/lang/he.json
deleted file mode 100755
index 021aaa2b3..000000000
--- a/src/addon/coursecompletion/lang/he.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "complete": "הושלם",
- "completecourse": "השלמת קורס",
- "completed": "הושלם",
- "completiondate": "תאריך השלמה",
- "coursecompletion": "השלמת הקורס",
- "criteria": "תנאי",
- "criteriagroup": "קבוצת תנאים",
- "criteriarequiredall": "כל התנאים המצויינים מטה נדרשים",
- "criteriarequiredany": "לפחות אחד מהתנאים המצויינים מטה נדרשים",
- "inprogress": "בלמידה",
- "manualselfcompletion": "השלמה עצמאית ידנית",
- "notyetstarted": "עדיין לא התחיל",
- "pending": "בתהליך למידה",
- "required": "דרוש",
- "requiredcriteria": "תנאי נדרש",
- "requirement": "דרישה",
- "status": "סטטוס ההישג",
- "viewcoursereport": "צפיה בדוח הקורס"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/hr.json b/src/addon/coursecompletion/lang/hr.json
deleted file mode 100755
index 18d107012..000000000
--- a/src/addon/coursecompletion/lang/hr.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "complete": "Potpuno",
- "completed": "Završeno",
- "completiondate": "Datum dovršetka",
- "coursecompletion": "Dovršenost e-kolegija",
- "criteria": "Kriterij",
- "criteriagroup": "Grupa kriterija",
- "criteriarequiredall": "Potrebno je zadovoljenje svih doljnjih kriterija",
- "criteriarequiredany": "Potrebno je zadovoljenje bilo kojeg doljnjeg kriterija",
- "inprogress": "U tijeku",
- "manualselfcompletion": "Ručni dovršetak",
- "notyetstarted": "Nije još započelo",
- "pending": "Na čekanju",
- "required": "Obvezatno",
- "requiredcriteria": "Obvezatni kriterij",
- "requirement": "Uvjet",
- "status": "Status",
- "viewcoursereport": "Prikaz izvješća e-kolegija"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/hu.json b/src/addon/coursecompletion/lang/hu.json
deleted file mode 100755
index 634b44da7..000000000
--- a/src/addon/coursecompletion/lang/hu.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "complete": "Teljes",
- "completed": "Teljesítve",
- "coursecompletion": "Kurzus teljesítése",
- "criteria": "Követelmények",
- "criteriagroup": "Követelménycsoport",
- "criteriarequiredall": "Az összes alábbi követelmény teljesítendő",
- "criteriarequiredany": "Bármely alábbi követelmény teljesítendő",
- "inprogress": "Folyamatban lévő",
- "manualselfcompletion": "Saját teljesítés kézzel",
- "notyetstarted": "Még nem kezdődött el",
- "pending": "Függőben",
- "required": "Kitöltendő",
- "requiredcriteria": "Előírt követelmények",
- "status": "Állapot",
- "viewcoursereport": "Kurzusjelentés megtekintése"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/it.json b/src/addon/coursecompletion/lang/it.json
deleted file mode 100755
index 96e020ef8..000000000
--- a/src/addon/coursecompletion/lang/it.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Completo",
- "completecourse": "Corso completato",
- "completed": "Completata",
- "completiondate": "Data di completamento",
- "couldnotloadreport": "Non è stato possibile caricare il report di completamento del corso, per favore riprova più tardi.",
- "coursecompletion": "Completamento corso",
- "criteria": "Criteri",
- "criteriagroup": "Gruppo di criteri",
- "criteriarequiredall": "E' richiesto il soddisfacimento di tutti i criteri elencati",
- "criteriarequiredany": "E' richiesto il soddisfacimento di almeno uno dei criteri elencati",
- "inprogress": "In corso",
- "manualselfcompletion": "Conferma personale di completamento",
- "notyetstarted": "Non ancora iniziato",
- "pending": "In attesa",
- "required": "Obbligatorio",
- "requiredcriteria": "Criteri da soddisfare",
- "requirement": "Requisito",
- "status": "Stato badge",
- "viewcoursereport": "Visualizza il report del corso"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/ja.json b/src/addon/coursecompletion/lang/ja.json
deleted file mode 100755
index df8a2b863..000000000
--- a/src/addon/coursecompletion/lang/ja.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "詳細",
- "completecourse": "コース完了",
- "completed": "完了",
- "completiondate": "完了した日",
- "couldnotloadreport": "コース完了の読み込みができませんでした。後でもう一度試してください。",
- "coursecompletion": "ユーザはこのコースを完了する必要があります。",
- "criteria": "クライテリア",
- "criteriagroup": "クライテリアグループ",
- "criteriarequiredall": "下記のクライテリアすべてが必須である",
- "criteriarequiredany": "下記いくつかのクライテリアが必須である",
- "inprogress": "進行中",
- "manualselfcompletion": "手動による自己完了",
- "notyetstarted": "未開始",
- "pending": "保留",
- "required": "必須",
- "requiredcriteria": "必須クライテリア",
- "requirement": "要求",
- "status": "ステータス",
- "viewcoursereport": "コースレポートを表示する"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/ko.json b/src/addon/coursecompletion/lang/ko.json
deleted file mode 100755
index eae7220c2..000000000
--- a/src/addon/coursecompletion/lang/ko.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "완료",
- "completecourse": "강좌 완료",
- "completed": "완료됨",
- "completiondate": "완료일",
- "couldnotloadreport": "강좌 완료 보고서를 로드 할 수 없습니다. 나중에 다시 시도 해주십시오.",
- "coursecompletion": "강좌이수완료",
- "criteria": "기준",
- "criteriagroup": "기준 모둠",
- "criteriarequiredall": "아래의 모든 기준이 필요합니다.",
- "criteriarequiredany": "아래의 어떤 기준도 필요합니다,",
- "inprogress": "진행 중",
- "manualselfcompletion": "강좌이수 수동확인",
- "notyetstarted": "아직 시작 안했습니다.",
- "pending": "유예",
- "required": "필수사항",
- "requiredcriteria": "필수 기준",
- "requirement": "요구사항",
- "status": "뱃지 상태",
- "viewcoursereport": "강좌 보고서 보기"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/lt.json b/src/addon/coursecompletion/lang/lt.json
deleted file mode 100755
index e26747a5e..000000000
--- a/src/addon/coursecompletion/lang/lt.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Užbaigti",
- "completecourse": "Visa kursų medžiaga",
- "completed": "Baigtas",
- "completiondate": "Užbaigimo data",
- "couldnotloadreport": "Nepavyko įkelti kursų baigimo ataskaitos, prašome pabandyti vėliau.",
- "coursecompletion": "Kurso baigimas",
- "criteria": "Kriterijai",
- "criteriagroup": "Kriterijų grupė",
- "criteriarequiredall": "Visi žemiau pateikti kriterijai yra būtini",
- "criteriarequiredany": "Bet kuris žemiau pateiktas kriterijus yra būtinas",
- "inprogress": "Atliekama",
- "manualselfcompletion": "Savas užbaigimas neautomatiniu būdu",
- "notyetstarted": "Dar nepradėta",
- "pending": "Laukiama",
- "required": "Būtina",
- "requiredcriteria": "Būtini kriterijai",
- "requirement": "Būtina sąlyga",
- "status": "Pasiekimo būsena",
- "viewcoursereport": "Peržiūrėti kursų ataskaitą"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/mr.json b/src/addon/coursecompletion/lang/mr.json
deleted file mode 100755
index 0e0177653..000000000
--- a/src/addon/coursecompletion/lang/mr.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "पूर्ण",
- "completecourse": "पूर्ण अभ्यासक्रम",
- "completed": "पुर्ण झाली.",
- "completiondate": "Completion date",
- "couldnotloadreport": "अभ्यासक्रम पूर्ण केल्याचे अहवाल लोड करणे शक्य नाही, कृपया नंतर पुन्हा प्रयत्न करा.",
- "coursecompletion": "अभ्यासक्रम पूर्ण",
- "criteria": "निकष",
- "criteriagroup": "निकष गट",
- "criteriarequiredall": "खालील सर्व निकष आवश्यक आहेत",
- "criteriarequiredany": "खालीलपैकी कोणताही निकष आवश्यक आहेत",
- "inprogress": "प्रगतीपथावर",
- "manualselfcompletion": "स्वयं पूर्ण",
- "notyetstarted": "स्वतःच्या हाताने पूर्ण",
- "pending": "प्रलंबित",
- "required": "गरजेचे आहे.",
- "requiredcriteria": "आवश्यक निकष",
- "requirement": "आवश्यकता",
- "status": "दर्जा",
- "viewcoursereport": "अभ्यासक्रम अहवाल पहा"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/nl.json b/src/addon/coursecompletion/lang/nl.json
deleted file mode 100755
index e8fdb985c..000000000
--- a/src/addon/coursecompletion/lang/nl.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Voltooid",
- "completecourse": "Voltooi cursus",
- "completed": "Volledig",
- "completiondate": "Voltooiingsdatum",
- "couldnotloadreport": "Kon het voltooiingsrapport van de cursus niet laden. Probeer later opnieuw.",
- "coursecompletion": "Cursus voltooien",
- "criteria": "Criteria",
- "criteriagroup": "Criteria groep",
- "criteriarequiredall": "Alle onderstaande criteria zijn vereist",
- "criteriarequiredany": "Al onderstaande criteria zijn vereist",
- "inprogress": "Actief",
- "manualselfcompletion": "Manueel voltooien",
- "notyetstarted": "Nog niet begonnen",
- "pending": "Bezig",
- "required": "Verplicht",
- "requiredcriteria": "Vereiste criteria",
- "requirement": "Vereiste",
- "status": "Badge status",
- "viewcoursereport": "Bekijk cursusrapport"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/no.json b/src/addon/coursecompletion/lang/no.json
deleted file mode 100755
index a7d05911d..000000000
--- a/src/addon/coursecompletion/lang/no.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Fullført",
- "completecourse": "Fullfør kurs",
- "completed": "Fullført",
- "completiondate": "Fullført dato",
- "couldnotloadreport": "Kunne ikke laste kursets avslutningsrapport. Prøv igjen senere.",
- "coursecompletion": "Kursfullføring",
- "criteria": "Kriterie",
- "criteriagroup": "Kriteriegruppe",
- "criteriarequiredall": "Alle kriteriene under er obligatoriske",
- "criteriarequiredany": "Ethvert kriterium under er obligatorisk",
- "inprogress": "Pågår",
- "manualselfcompletion": "Manuell egenregistrering av fullføring",
- "notyetstarted": "Ikke startet ennå",
- "pending": "Behandles",
- "required": "Påkrevd",
- "requiredcriteria": "Påkrevde kriterier",
- "requirement": "Krav",
- "status": "Status for utmerkelse",
- "viewcoursereport": "Vis kursrapport"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/pl.json b/src/addon/coursecompletion/lang/pl.json
deleted file mode 100755
index a2dd43de3..000000000
--- a/src/addon/coursecompletion/lang/pl.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "complete": "Zakończone",
- "completed": "Ukończony",
- "coursecompletion": "Ukończenie kursu",
- "criteria": "Kryteria",
- "criteriagroup": "Grupa kryteriów",
- "criteriarequiredall": "Wszystkie poniższe kryteria są wymagane",
- "criteriarequiredany": "Wszystkie poniższe kryteria są wymagane",
- "inprogress": "Aktualne",
- "manualselfcompletion": "Samodzielne oznaczenie ukończenia",
- "notyetstarted": "Jeszcze nie rozpoczęto",
- "pending": "Oczekujący",
- "required": "Wymagane",
- "requiredcriteria": "Wymagane kryteria",
- "status": "Status",
- "viewcoursereport": "Zobacz raport kursu"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/pt-br.json b/src/addon/coursecompletion/lang/pt-br.json
deleted file mode 100755
index 6ffa2866e..000000000
--- a/src/addon/coursecompletion/lang/pt-br.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Completo",
- "completecourse": "Curso concluído",
- "completed": "Concluído",
- "completiondate": "Data de conclusão",
- "couldnotloadreport": "Não foi possível carregar o relatório de conclusão do curso, por favor tente novamente mais tarde.",
- "coursecompletion": "Andamento do curso",
- "criteria": "Critérios",
- "criteriagroup": "Grupo de critérios",
- "criteriarequiredall": "Todos os critérios abaixo são necessários",
- "criteriarequiredany": "Qualquer um dos critérios abaixo são necessários",
- "inprogress": "Em andamento",
- "manualselfcompletion": "Conclusão manual por si mesmo",
- "notyetstarted": "Não iniciado ainda",
- "pending": "Pendentes",
- "required": "Necessários",
- "requiredcriteria": "Critérios exigidos",
- "requirement": "Exigência",
- "status": "Status",
- "viewcoursereport": "Ver relatório do curso"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/pt.json b/src/addon/coursecompletion/lang/pt.json
deleted file mode 100755
index 47b608d60..000000000
--- a/src/addon/coursecompletion/lang/pt.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Completo",
- "completecourse": "Disciplina concluída",
- "completed": "Completou",
- "completiondate": "Data de conclusão",
- "couldnotloadreport": "Não foi possível carregar o relatório de conclusão da disciplina. Por favor, tente mais tarde.",
- "coursecompletion": "Os utilizadores têm de concluir esta disciplina",
- "criteria": "Critérios",
- "criteriagroup": "Grupo de critérios",
- "criteriarequiredall": "Todos os critérios abaixo são exigidos",
- "criteriarequiredany": "Qualquer dos critérios abaixo é necessário",
- "inprogress": "Em progresso",
- "manualselfcompletion": "Conclusão manual pelo próprio",
- "notyetstarted": "Ainda não iniciou",
- "pending": "Pendente",
- "required": "Obrigatório",
- "requiredcriteria": "Critério obrigatório",
- "requirement": "Requisito",
- "status": "Estado da Medalha",
- "viewcoursereport": "Ver relatório da disciplina"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/ro.json b/src/addon/coursecompletion/lang/ro.json
deleted file mode 100755
index 7a195f67c..000000000
--- a/src/addon/coursecompletion/lang/ro.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Finalizează",
- "completecourse": "Curs complet",
- "completed": "Finalizare",
- "completiondate": "Data limita până la completarea acțiunii",
- "couldnotloadreport": "Raportul cu privire la situația completării cursului nu se poate încărca, încercați mai târziu.",
- "coursecompletion": "Absolvire curs",
- "criteria": "Criterii",
- "criteriagroup": "Grup criterii",
- "criteriarequiredall": "Toate criteriile de mai jos sunt necesare",
- "criteriarequiredany": "Oricare dintre criteriile de mai jos sunt necesare",
- "inprogress": "În curs",
- "manualselfcompletion": "Auto-finalizare manuală",
- "notyetstarted": "Nu a fost încă început",
- "pending": "În așteptare",
- "required": "Necesar",
- "requiredcriteria": "Criteriu necesar",
- "requirement": "Cerințe",
- "status": "Status",
- "viewcoursereport": "Vezi raportul cursului"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/ru.json b/src/addon/coursecompletion/lang/ru.json
deleted file mode 100755
index 846562655..000000000
--- a/src/addon/coursecompletion/lang/ru.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Завершено",
- "completecourse": "Завершить курс",
- "completed": "Выполнено",
- "completiondate": "Дата завершения",
- "couldnotloadreport": "Невозможно загрузить отчёт о завершении курса. Пожалуйста, попробуйте ещё раз позже.",
- "coursecompletion": "Окончание курса",
- "criteria": "Критерий",
- "criteriagroup": "Группа критериев",
- "criteriarequiredall": "Требуются соответствие всем указанным ниже критериям",
- "criteriarequiredany": "Требуется соответствие любому из указанных ниже критериев",
- "inprogress": "В процессе",
- "manualselfcompletion": "Пользователь может сам поставить отметку о выполнении",
- "notyetstarted": "Еще не началось",
- "pending": "Ожидается",
- "required": "Необходимо заполнить",
- "requiredcriteria": "Необходимые критерии",
- "requirement": "Требование",
- "status": "Статус значка",
- "viewcoursereport": "Просмотреть отчет по курсу"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/sr-cr.json b/src/addon/coursecompletion/lang/sr-cr.json
deleted file mode 100755
index 610e78602..000000000
--- a/src/addon/coursecompletion/lang/sr-cr.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Заврши",
- "completecourse": "Заврши курс",
- "completed": "Завршено",
- "completiondate": "Датум завршетка",
- "couldnotloadreport": "Није могуће учитати извештај о завршетку курса. Молимо вас, покушајте поново касније.",
- "coursecompletion": "Завршетак курса",
- "criteria": "Критеријуми",
- "criteriagroup": "Група критеријума",
- "criteriarequiredall": "Сви доле наведени критеријуми су неопходни",
- "criteriarequiredany": "Било који од доле наведених критеријума је неопходан",
- "inprogress": "У току",
- "manualselfcompletion": "Ручни самостални завршетак",
- "notyetstarted": "Још није започето",
- "pending": "На чекању",
- "required": "Неопходно",
- "requiredcriteria": "Неопходни критеријуми",
- "requirement": "Услов",
- "status": "Статус",
- "viewcoursereport": "Прикажи извештај са курса"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/sr-lt.json b/src/addon/coursecompletion/lang/sr-lt.json
deleted file mode 100755
index 6553f9f39..000000000
--- a/src/addon/coursecompletion/lang/sr-lt.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Završi",
- "completecourse": "Završi kurs",
- "completed": "Završeno",
- "completiondate": "Datum završetka",
- "couldnotloadreport": "Nije moguće učitati izveštaj o završetku kursa. Molimo vas, pokušajte ponovo kasnije.",
- "coursecompletion": "Završetak kursa",
- "criteria": "Kriterijumi",
- "criteriagroup": "Grupa kriterijuma",
- "criteriarequiredall": "Svi dole navedeni kriterijumi su neophodni",
- "criteriarequiredany": "Bilo koji od dole navedenih kriterijuma je neophodan",
- "inprogress": "U toku",
- "manualselfcompletion": "Ručni samostalni završetak",
- "notyetstarted": "Još nije započeto",
- "pending": "Na čekanju",
- "required": "Neophodno",
- "requiredcriteria": "Neophodni kriterijumi",
- "requirement": "Uslov",
- "status": "Status",
- "viewcoursereport": "Prikaži izveštaj sa kursa"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/sv.json b/src/addon/coursecompletion/lang/sv.json
deleted file mode 100755
index df193278a..000000000
--- a/src/addon/coursecompletion/lang/sv.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Komplett",
- "completecourse": "",
- "completed": "Slutfört",
- "completiondate": "Datum för fullföljande",
- "couldnotloadreport": "Det gick inte att läsa in rapporten för fullföljande av kursen, vänligen försök igen senare .",
- "coursecompletion": "Fullgörande av kurs",
- "criteria": "Kriterier",
- "criteriagroup": "Kriterier för grupp",
- "criteriarequiredall": "Alla kriterier är obligatoriska",
- "criteriarequiredany": "Alla kriterier nedan är obligatoriska",
- "inprogress": "Pågår",
- "manualselfcompletion": "Studenten markerar själv som fullföljd",
- "notyetstarted": "Har ännu inte påbörjats",
- "pending": "Avvaktar",
- "required": "Obligatorisk",
- "requiredcriteria": "Obligatoriskt kriterium",
- "requirement": "Krav",
- "status": "Status för märke",
- "viewcoursereport": "Visa kursrapport"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/tg.json b/src/addon/coursecompletion/lang/tg.json
deleted file mode 100755
index b0174e59b..000000000
--- a/src/addon/coursecompletion/lang/tg.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "complete": "Иҷро шуд",
- "completed": "Анҷом ёфт",
- "coursecompletion": "Хатми курс",
- "criteria": "Меъёр",
- "criteriagroup": "Гурӯҳи меъёрҳо",
- "criteriarequiredall": "Мувофиқат ба ҳамаи меъёрҳои дар зер зикршуда талаб карда мешавад",
- "criteriarequiredany": "Мувофиқат ба ҳар яке аз меъёрҳои дар зер зикршуда талаб карда мешавад",
- "inprogress": "Дар ҳоли иҷро",
- "manualselfcompletion": "Истифодабаранда метавонад худаш оиди иҷрокунӣ қайд кунад",
- "notyetstarted": "Ҳанӯз сар нашудааст",
- "pending": "Дар ҳоли интизор",
- "required": "Ҳатмӣ аст",
- "requiredcriteria": "Меъёрҳои даркорӣ",
- "requirement": "Талаб",
- "status": "Вазъият",
- "viewcoursereport": "Ҳисобот оиди курс аз назар гузаронда шавад"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/tr.json b/src/addon/coursecompletion/lang/tr.json
deleted file mode 100755
index 89efac25b..000000000
--- a/src/addon/coursecompletion/lang/tr.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "complete": "Tamamlanmış",
- "completed": "Bitirmeli",
- "coursecompletion": "Ders tamamlama",
- "criteria": "Ölçüt",
- "criteriagroup": "Ölçüt Grubu",
- "criteriarequiredall": "Aşağıdaki ölçütlerin tümü gereklidir",
- "criteriarequiredany": "Aşağıdaki herhangi bir kriter gereklidir",
- "inprogress": "Devam ediyor",
- "manualselfcompletion": "Kendi kendine elle tamamlama",
- "notyetstarted": "Henüz başlamadı",
- "pending": "Bekliyor",
- "required": "Gerekli",
- "requiredcriteria": "Gerekli Ölçüt",
- "status": "Durum",
- "viewcoursereport": "Kurs raporunu görüntüle"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/uk.json b/src/addon/coursecompletion/lang/uk.json
deleted file mode 100755
index 8078ba36f..000000000
--- a/src/addon/coursecompletion/lang/uk.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "Завершено",
- "completecourse": "Завершити курсу",
- "completed": "Виконано",
- "completiondate": "Дата завершення",
- "couldnotloadreport": "Не вдалося завантажити звіт про закінчення курсу, будь ласка, спробуйте ще раз пізніше.",
- "coursecompletion": "Курс закінчено",
- "criteria": "Критерій",
- "criteriagroup": "Група критеріїв",
- "criteriarequiredall": "Потрібна відповідність всім вказаним критеріям",
- "criteriarequiredany": "Потрібна відповідність будь-якому критерію",
- "inprogress": "В процесі",
- "manualselfcompletion": "Самореєстрація завершення",
- "notyetstarted": "Ще не почато",
- "pending": "Очікується",
- "required": "Необхідні",
- "requiredcriteria": "Необхідний критерій",
- "requirement": "Вимога",
- "status": "Статус відзнаки",
- "viewcoursereport": "Переглянути звіт курсу"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/zh-cn.json b/src/addon/coursecompletion/lang/zh-cn.json
deleted file mode 100755
index eedfdd029..000000000
--- a/src/addon/coursecompletion/lang/zh-cn.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "complete": "完成",
- "completed": "已完成",
- "coursecompletion": "课程进度跟踪",
- "criteria": "条件",
- "criteriagroup": "条件组",
- "criteriarequiredall": "必须满足以下条件",
- "criteriarequiredany": "必须满足下列任一条件",
- "inprogress": "进行中",
- "manualselfcompletion": "手动自设完成",
- "notyetstarted": "还未开始",
- "pending": "待决",
- "required": "必须回答",
- "requiredcriteria": "必备条件",
- "status": "勋章状态",
- "viewcoursereport": "查看课程报告"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/lang/zh-tw.json b/src/addon/coursecompletion/lang/zh-tw.json
deleted file mode 100755
index 55f600fc3..000000000
--- a/src/addon/coursecompletion/lang/zh-tw.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "complete": "完成",
- "completecourse": "完成課程",
- "completed": "已完成",
- "completiondate": "完成日期",
- "couldnotloadreport": "無法載入課程完成報表,請稍後再試.",
- "coursecompletion": "課程完成度",
- "criteria": "條件",
- "criteriagroup": "條件群組",
- "criteriarequiredall": "以下所有的條件都為必填",
- "criteriarequiredany": "以下任何條件都為必須",
- "inprogress": "處理中",
- "manualselfcompletion": "手動自我完成",
- "notyetstarted": "還沒有開始",
- "pending": "暫緩",
- "required": "必須的",
- "requiredcriteria": "必須條件",
- "requirement": "需要",
- "status": "狀態",
- "viewcoursereport": "檢視課程報表"
-}
\ No newline at end of file
diff --git a/src/addon/coursecompletion/providers/course-option-handler.ts b/src/addon/coursecompletion/providers/course-option-handler.ts
index 0c61157fa..d6a08f6e9 100644
--- a/src/addon/coursecompletion/providers/course-option-handler.ts
+++ b/src/addon/coursecompletion/providers/course-option-handler.ts
@@ -86,4 +86,17 @@ export class AddonCourseCompletionCourseOptionHandler implements CoreCourseOptio
invalidateEnabledForCourse(courseId: number, navOptions?: any, admOptions?: any): Promise {
return this.courseCompletionProvider.invalidateCourseCompletion(courseId);
}
+
+ /**
+ * Called when a course is downloaded. It should prefetch all the data to be able to see the addon in offline.
+ *
+ * @param {any} course The course.
+ * @return {Promise} Promise resolved when done.
+ */
+ prefetch(course: any): Promise {
+ return this.courseCompletionProvider.getCompletion(course.id, undefined, {
+ getFromCache: false,
+ emergencyCache: false
+ });
+ }
}
diff --git a/src/addon/coursecompletion/providers/coursecompletion.ts b/src/addon/coursecompletion/providers/coursecompletion.ts
index a490f2b95..fba2e064d 100644
--- a/src/addon/coursecompletion/providers/coursecompletion.ts
+++ b/src/addon/coursecompletion/providers/coursecompletion.ts
@@ -165,7 +165,19 @@ export class AddonCourseCompletionProvider {
}
return this.coursesProvider.getUserCourse(courseId, preferCache).then((course) => {
- return !(course && typeof course.enablecompletion != 'undefined' && course.enablecompletion == 0);
+ if (course) {
+ if (typeof course.enablecompletion != 'undefined' && course.enablecompletion == 0) {
+ // Completion not enabled for the course.
+ return false;
+ }
+
+ if (typeof course.completionhascriteria != 'undefined' && course.completionhascriteria == 0) {
+ // No criteria, cannot view completion.
+ return false;
+ }
+ }
+
+ return true;
});
}
@@ -177,27 +189,50 @@ export class AddonCourseCompletionProvider {
* @return {Promise} Promise resolved with true if plugin is enabled, rejected or resolved with false otherwise.
*/
isPluginViewEnabledForUser(courseId: number, userId?: number): Promise {
- // Disable emergency cache to be able to detect that the plugin has been disabled (WS will fail).
- const preSets: any = {
- emergencyCache: 0
- };
+ // Check if user wants to view his own completion.
+ const currentUserId = this.sitesProvider.getCurrentSiteUserId();
+ let promise;
- return this.getCompletion(courseId, userId, preSets).then(() => {
- return true;
- }).catch((error) => {
- if (this.utils.isWebServiceError(error)) {
- // The WS returned an error, plugin is not enabled.
- return false;
- } else {
- // Not a WS error. Check if we have a cached value.
- preSets.omitExpires = true;
-
- return this.getCompletion(courseId, userId, preSets).then(() => {
+ if (!userId || userId == currentUserId) {
+ // Viewing own completion. Get the course to check if it has completion criteria.
+ promise = this.coursesProvider.getUserCourse(courseId, true).then((course): any => {
+ // If the site is returning the completionhascriteria then the user can view his own completion.
+ // We already checked the value in isPluginViewEnabledForCourse.
+ if (course && typeof course.completionhascriteria != 'undefined') {
return true;
- }).catch(() => {
+ }
+
+ return Promise.reject(null);
+ });
+ } else {
+ promise = Promise.reject(null);
+ }
+
+ return promise.catch(() => {
+ // User not viewing own completion or the site doesn't tell us if the course has criteria.
+ // The only way to know if completion can be viewed is to call the WS.
+ // Disable emergency cache to be able to detect that the plugin has been disabled (WS will fail).
+ const preSets: any = {
+ emergencyCache: 0
+ };
+
+ return this.getCompletion(courseId, userId, preSets).then(() => {
+ return true;
+ }).catch((error) => {
+ if (this.utils.isWebServiceError(error)) {
+ // The WS returned an error, plugin is not enabled.
return false;
- });
- }
+ } else {
+ // Not a WS error. Check if we have a cached value.
+ preSets.omitExpires = true;
+
+ return this.getCompletion(courseId, userId, preSets).then(() => {
+ return true;
+ }).catch(() => {
+ return false;
+ });
+ }
+ });
});
}
diff --git a/src/addon/files/lang/ar.json b/src/addon/files/lang/ar.json
deleted file mode 100755
index 2ab44cda4..000000000
--- a/src/addon/files/lang/ar.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "couldnotloadfiles": "لا يمكن تحميل قائمة الملفات",
- "emptyfilelist": "لا يوجد ملفات للعرض",
- "files": "ملفات",
- "privatefiles": "ملفات خاصة",
- "sitefiles": "ملفات الموقع",
- "uploadfiles": "إرسل ملفات التغذية الراجعة"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/bg.json b/src/addon/files/lang/bg.json
deleted file mode 100755
index 01ac698cc..000000000
--- a/src/addon/files/lang/bg.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "Моля забележете, че Вашият системен администратор е забранил изтеглянето на файлове. Може да разглеждате файловете, но не и да ги изтегляте.",
- "clicktoupload": "Натиснете бутона по-долу за да качите файловете в секция \"Вашите частни файлове\".",
- "couldnotloadfiles": "Списъкът с файлове не можа да бъде зареден.",
- "emptyfilelist": "Няма файлове, които да бъдат показани.",
- "files": "Файлове",
- "myprivatefilesdesc": "Файловете, които са налични във Вашата лична област на сайта.",
- "privatefiles": "Лични файлове",
- "sitefiles": "Файлове от сайта",
- "sitefilesdesc": "Други файлоне, които са достъпни за Вас на този Moodle сайт.",
- "uploadfiles": "Изпрати файлове с обратна връзка"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/ca.json b/src/addon/files/lang/ca.json
deleted file mode 100755
index 90887bf7b..000000000
--- a/src/addon/files/lang/ca.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Teniu en compte que l'administrador de Moodle ha desactivat la descàrrega d'arxius; podeu visualitzar els arxius, però no descarregar-los.",
- "clicktoupload": "Feu clic al botó del dessota per pujar arxius a l'àrea del vostres fitxers.",
- "couldnotloadfiles": "La llista d'arxius no s'ha pogut carregar.",
- "emptyfilelist": "No hi ha fitxers per mostrar",
- "erroruploadnotworking": "No es poden pujar fitxers al vostre lloc ara mateix.",
- "files": "Fitxers",
- "myprivatefilesdesc": "Els arxius que teniu disponibles a la vostra àrea privada en aquest lloc Moodle.",
- "privatefiles": "Fitxers privats",
- "sitefiles": "Fitxers del lloc",
- "sitefilesdesc": "Els altres arxius que es troben disponibles en aquest lloc Moodle.",
- "uploadfiles": "Envia fitxers de retroacció"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/cs.json b/src/addon/files/lang/cs.json
deleted file mode 100755
index 788a5df8a..000000000
--- a/src/addon/files/lang/cs.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Upozorňujeme, že správce Moodle zakázal stahování souborů. Soubory si můžete prohlížet, ale ne stáhnout.",
- "clicktoupload": "Kliknutím na tlačítko níže nahrát soubory do vašich osobních souborů.",
- "couldnotloadfiles": "Seznam souborů, které nelze načíst .",
- "emptyfilelist": "Žádný soubor k zobrazení",
- "erroruploadnotworking": "Bohužel v současné době není možné nahrávat na stránky vašeho Moodle.",
- "files": "Soubory",
- "myprivatefilesdesc": "Soubory, které jsou dostupné pouze pro vás.",
- "privatefiles": "Osobní soubory",
- "sitefiles": "Soubory stránek",
- "sitefilesdesc": "Další soubory, které jsou dostupné na těchto stránkách.",
- "uploadfiles": "Poslat zpětnovazební soubory"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/da.json b/src/addon/files/lang/da.json
deleted file mode 100755
index 5f9d7d54b..000000000
--- a/src/addon/files/lang/da.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Bemærk venligst at din Moodleadministrator har deaktiveret download af filer. Du kan se filerne men ikke downloade dem.",
- "clicktoupload": "Klik på knappen nedenfor for at uploade filer til dine private filer.",
- "couldnotloadfiles": "Fillisten kunne ikke hentes",
- "emptyfilelist": "Der er ingen filer at vise",
- "erroruploadnotworking": "Desværre er det p.t. ikke muligt at uploade filer til dit site.",
- "files": "Filer",
- "myprivatefilesdesc": "Filerne som er tilgængelige i dit private område på dette Moodlewebsted.",
- "privatefiles": "Private filer",
- "sitefiles": "Site filer",
- "sitefilesdesc": "De andre filer som er tilgængelige for dig på denne Moodlewebside.",
- "uploadfiles": "Send feedbackfiler"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/de-du.json b/src/addon/files/lang/de-du.json
deleted file mode 100755
index 4cc87c252..000000000
--- a/src/addon/files/lang/de-du.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Das Herunterladen von Dateien ist deaktiviert. Du kannst nur die Dateiliste sehen und nichts herunterladen.",
- "clicktoupload": "Tippe auf die Taste, um Dateien in den Bereich 'Meine Dateien' hochzuladen.",
- "couldnotloadfiles": "Die Liste der Dateien konnte nicht geladen werden.",
- "emptyfilelist": "Es liegen keine Dateien vor",
- "erroruploadnotworking": "Im Moment können keine Dateien zur Website hochgeladen werden.",
- "files": "Dateien",
- "myprivatefilesdesc": "Dateien, Auf die ausschließlich du zugreifen kannst.",
- "privatefiles": "Meine Dateien",
- "sitefiles": "Dateien der Website",
- "sitefilesdesc": "Weitere Dateien, die für dich auf dieser Website zugänglich sind.",
- "uploadfiles": "Feedbackdateien senden"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/de.json b/src/addon/files/lang/de.json
deleted file mode 100755
index 1f6e9fa90..000000000
--- a/src/addon/files/lang/de.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Das Herunterladen von Dateien ist deaktiviert. Sie können nur die Dateiliste sehen und nichts herunterladen.",
- "clicktoupload": "Tippen Sie auf die Taste, um Dateien in den Bereich 'Meine Dateien' hochzuladen.",
- "couldnotloadfiles": "Die Liste der Dateien konnte nicht geladen werden.",
- "emptyfilelist": "Keine Dateien",
- "erroruploadnotworking": "Im Moment können keine Dateien zur Website hochgeladen werden.",
- "files": "Dateien",
- "myprivatefilesdesc": "Dateien, auf die ausschließlich Sie zugreifen können.",
- "privatefiles": "Meine Dateien",
- "sitefiles": "Dateien der Website",
- "sitefilesdesc": "Weitere Dateien, die für Sie auf dieser Website zugänglich sind.",
- "uploadfiles": "Dateien hochladen"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/el.json b/src/addon/files/lang/el.json
deleted file mode 100755
index 105bb0c08..000000000
--- a/src/addon/files/lang/el.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Παρακαλω λάβετε υπόψιν ότι ο διαχειριστής του Moodle site σας απενεργοποίησε τις λήψεις αρχείων, μπορείτε να περιηγηθείτε μέσα στα αρχεία, αλλά όχι να τα κατεβάσετε.",
- "clicktoupload": "Κάντε κλικ στο παρακάτω κουμπί για να μεταφορτώσετε αρχεία στους προσωπικούς σας φακέλους.",
- "couldnotloadfiles": "Η λίστα των αρχείων δεν φορτώθηκε.",
- "emptyfilelist": "Δεν υπαρχουν αρχεία.",
- "erroruploadnotworking": "Δυστυχώς, προσωρινά δεν είναι δυνατό να ανεβάσετε τα αρχεία στο site σας.",
- "files": "Αρχεία",
- "myprivatefilesdesc": "Τα αρχεία που είναι διαθέσιμα στο προσωπικό χώρο σας σε αυτό το Moodle site.",
- "privatefiles": "Προσωπικά αρχεία",
- "sitefiles": "Αρχεία του ιστοχώρου",
- "sitefilesdesc": "Άλλα αρχεία που είναι στη διάθεσή σας σε αυτό το site Moodle.",
- "uploadfiles": "Αποστολή αρχείου ανατροφοδότησης"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/en.json b/src/addon/files/lang/en.json
index 6f0e863a2..b923f6141 100644
--- a/src/addon/files/lang/en.json
+++ b/src/addon/files/lang/en.json
@@ -2,7 +2,7 @@
"couldnotloadfiles": "The list of files could not be loaded.",
"emptyfilelist": "There are no files to show.",
"erroruploadnotworking": "Unfortunately it is currently not possible to upload files to your site.",
- "files": "My files",
+ "files": "Files",
"privatefiles": "Private files",
"sitefiles": "Site files"
}
\ No newline at end of file
diff --git a/src/addon/files/lang/es-mx.json b/src/addon/files/lang/es-mx.json
deleted file mode 100755
index 6a0a7e462..000000000
--- a/src/addon/files/lang/es-mx.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "El administrador del sitio ha deshabilitado las descargas de archivos; Usted puede ver los archivos pero no puede descargarlos.",
- "clicktoupload": "Haga click en el botón inferior para subir archivos a sus archivos privados.",
- "couldnotloadfiles": "La lista de archivos no pudo cargarse.",
- "emptyfilelist": "No hay archivos que mostrar",
- "erroruploadnotworking": "Desafortunadamente ahorita no es posible subir archivos a su sitio.",
- "files": "Archivos",
- "myprivatefilesdesc": "Archivos a los que solamente Usted puede acceder.",
- "privatefiles": "Archivos privados",
- "sitefiles": "Archivos del sitio",
- "sitefilesdesc": "Otros archivos que están disponibles para Usted en este sitio.",
- "uploadfiles": "Mandar archivos de retroalimentación"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/es.json b/src/addon/files/lang/es.json
deleted file mode 100755
index 19e672053..000000000
--- a/src/addon/files/lang/es.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Por favor tome nota de que su administrador de Moodle deshabilitó las descargas de archivos; Usted puede ojear los archivos pero no puede descargarlos.",
- "clicktoupload": "Clic en el botón inferior para subir archivos a su zona de archivos privados.",
- "couldnotloadfiles": "La lista de archivos no ha podido cargarse.",
- "emptyfilelist": "No hay archivos que mostrar",
- "erroruploadnotworking": "Desafortunadamente en estos momentos no es posible subir archivos al sitio.",
- "files": "Archivos",
- "myprivatefilesdesc": "Los archivos que están disponibles en su área privada en este sitio Moodle.",
- "privatefiles": "Ficheros privados",
- "sitefiles": "Archivos del sitio",
- "sitefilesdesc": "Los otros archivos que están disponibles para Usted en este sitio Moodle.",
- "uploadfiles": "Mandar archivos de retroalimentación"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/eu.json b/src/addon/files/lang/eu.json
deleted file mode 100755
index 71db9771a..000000000
--- a/src/addon/files/lang/eu.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Zure Moodle kudeatzaileak fitxategien jaitsiera ezgaitu du. Fitxategiak araka ditzakezu baina ezin dituzu jaitsi.",
- "clicktoupload": "Klik egin beheko botoian fitxategiak zure gune pribatura igotzeko.",
- "couldnotloadfiles": "Ezin izan da fitxategien zerrenda kargatu.",
- "emptyfilelist": "Ez dago fitxategirik erakusteko.",
- "erroruploadnotworking": "Zoritxarrez une honetan ezin dira fitxategiak zure gunera igo.",
- "files": "Fitxategiak",
- "myprivatefilesdesc": "Soilik zuk eskura ditzakezun fitxategiak.",
- "privatefiles": "Fitxategi pribatuak",
- "sitefiles": "Guneko fitxategiak",
- "sitefilesdesc": "Gune honetan eskuragarri dauden beste fitxategiak.",
- "uploadfiles": "Igo fitxategiak"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/fa.json b/src/addon/files/lang/fa.json
deleted file mode 100755
index 62c44d00e..000000000
--- a/src/addon/files/lang/fa.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "admindisableddownload": "لطفا در نظر داشته باشید که مدیر سایت شما دریافت فایلها را غیرفعال کرده است. شما میتوانید فایلها را مرور کنید، ولی نمیتوانید آنها را روی دستگاه خود دریافت کنید.",
- "files": "فایلها",
- "privatefiles": "فایلهای شخصی",
- "sitefiles": "فایلهای سایت",
- "uploadfiles": "ارسال فایلهای بازخورد"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/fi.json b/src/addon/files/lang/fi.json
deleted file mode 100755
index 14c205854..000000000
--- a/src/addon/files/lang/fi.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "Sivuston pääkäyttäjä on estänyt tiedostojen lataamisen. Voit ainoastaan selata tiedostoja, mutta et voi ladata niitä.",
- "clicktoupload": "Paina alapuolella olevaa painiketta ladataksesi tiedoston omiin yksityisiin tiedostoihisi.",
- "couldnotloadfiles": "Tiedostolistaa ei pystytty lataamaan.",
- "emptyfilelist": "Ei näytettäviä tiedostoja",
- "erroruploadnotworking": "Valitettavasti tiedostojen lataaminen järjestelmään ei tällä hetkellä onnistu.",
- "files": "Tiedostot",
- "myprivatefilesdesc": "Tiedostot, jotka ovat vain sinulle käytettävissä.",
- "privatefiles": "Yksityiset tiedostot",
- "sitefiles": "Sivuston tiedostot",
- "uploadfiles": "Lähetä palautetiedostot"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/fr.json b/src/addon/files/lang/fr.json
deleted file mode 100755
index d37cbd25a..000000000
--- a/src/addon/files/lang/fr.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "L'administrateur de votre Moodle a désactivé le téléchargement des fichiers. Vous pouvez les consulter, mais pas les télécharger.",
- "clicktoupload": "Cliquer sur le bouton ci-dessous pour déposer les fichiers dans vos fichiers personnels.",
- "couldnotloadfiles": "La liste des fichiers n'a pas pu être chargée.",
- "emptyfilelist": "Il n'y a pas de fichier à afficher",
- "erroruploadnotworking": "Il n'est actuellement pas possible de déposer des fichiers sur votre site.",
- "files": "Fichiers",
- "myprivatefilesdesc": "Fichiers auxquels vous seul avez accès.",
- "privatefiles": "Fichiers personnels",
- "sitefiles": "Fichiers du site",
- "sitefilesdesc": "Autres fichiers auxquels vous avez accès sur cette plateforme.",
- "uploadfiles": "Envoyer des fichiers de feedback"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/he.json b/src/addon/files/lang/he.json
deleted file mode 100755
index 6f612548a..000000000
--- a/src/addon/files/lang/he.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "יש לשים לב כי מנהל/ת אתר המוודל שלך, ביטל/ה את אפשרות להורדת הקבצים. באפשרותך לעיין בקבצים אך לא להורידם.",
- "clicktoupload": "להעלאת הקבצים לקבצים הפרטיים שלך, יש להקליק על הכפתור למטה.",
- "couldnotloadfiles": "לא ניתן לטעון את רשימת הקבצים.",
- "emptyfilelist": "אין קבצים להציג",
- "files": "קבצים",
- "myprivatefilesdesc": "הקבצים הזמינים לך באזור הפרטי באתר מוודל זה.",
- "privatefiles": "הקבצים שלי",
- "sitefiles": "קבצי האתר",
- "sitefilesdesc": "הקבצים האחרים הזמינים לך באתר מוודל זה.",
- "uploadfiles": "שליחת קובצי משוב"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/hr.json b/src/addon/files/lang/hr.json
deleted file mode 100755
index 01ff2272a..000000000
--- a/src/addon/files/lang/hr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "emptyfilelist": "Nema datoteka za prikaz",
- "files": "Datoteke",
- "privatefiles": "Osobne datoteke korisnika",
- "sitefiles": "Site files",
- "uploadfiles": "Pošalji datoteke s povratnom informacijom"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/hu.json b/src/addon/files/lang/hu.json
deleted file mode 100755
index a9b2a7edf..000000000
--- a/src/addon/files/lang/hu.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "emptyfilelist": "Nincs megjeleníthető állomány",
- "files": "Állományok",
- "privatefiles": "Saját állományaim",
- "sitefiles": "Portál állományai",
- "uploadfiles": "Visszajelzések elküldése"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/it.json b/src/addon/files/lang/it.json
deleted file mode 100755
index 935ee11cc..000000000
--- a/src/addon/files/lang/it.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "L'amministratore del sito Moodle ha disabilitato il download dei file. Puoi navigare tra i file ma non potrai scaricarli.",
- "clicktoupload": "Fai click sul pulsante sotto per caricare i file nei File personali",
- "couldnotloadfiles": "Non è stato possibile caricare l'elenco dei file.",
- "emptyfilelist": "Non ci sono file da visualizzare",
- "erroruploadnotworking": "Al momento non è possibile caricare file sul sito.",
- "files": "File",
- "myprivatefilesdesc": "I file memorizzati nei File personali",
- "privatefiles": "File personali",
- "sitefiles": "File del sito",
- "sitefilesdesc": "Altri file del sito ai quali puoi accedere.",
- "uploadfiles": "Invia file di commento"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/ja.json b/src/addon/files/lang/ja.json
deleted file mode 100755
index 648ed7d33..000000000
--- a/src/addon/files/lang/ja.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "あなたのMoodle管理者に、ファイルのダウンロードを無効にするよう知らせてください。そうすれば、ファイルをデバイスにダウンロードせず閲覧のみにすることができます。",
- "clicktoupload": "ファイルをあなたのプライベートファイル領域にアップロードするには、下のボタンをクリックしてください。",
- "couldnotloadfiles": "以下のファイルが読み込みできませんでした。",
- "emptyfilelist": "表示するファイルはありません。",
- "erroruploadnotworking": "残念ながら、現在、あなたのサイトにファイルをアップロードすることはできません。",
- "files": "ファイル",
- "myprivatefilesdesc": "ファイルはMoodleサイト上のあなたのプライベート領域にあります。",
- "privatefiles": "プライベートファイル",
- "sitefiles": "サイトファイル",
- "sitefilesdesc": "本Moodleサイトであなたが利用できる他のファイル",
- "uploadfiles": "フィードバックファイルを送信する"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/ko.json b/src/addon/files/lang/ko.json
deleted file mode 100755
index 1f4710a9c..000000000
--- a/src/addon/files/lang/ko.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "admindisableddownload": "사이트 관리자가 파일 다운로드를 비활성화 했습니다. 파일을 탐색 할 수는 있지만 다운로드 할 수는 없습니다.",
- "clicktoupload": "아래 버튼을 클릭하여 개인 파일에 파일을 업로드하십시오.",
- "emptyfilelist": "보여줄 파일이 없습니다.",
- "files": "파일",
- "myprivatefilesdesc": "나만 접근할 수 있는 파일",
- "sitefiles": "파일 창고",
- "sitefilesdesc": "이 사이트에서 당신에게 제공되는 기타 파일들",
- "uploadfiles": "피드백 파일 보내기"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/lt.json b/src/addon/files/lang/lt.json
deleted file mode 100755
index 1e5b2c5b2..000000000
--- a/src/addon/files/lang/lt.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Primename, kad Moodle administratorius panaikino galimybę parsisiųsti failus, failų atsisiųsti negalima, galite tik naršyti.",
- "clicktoupload": "Paspauskite mygtuką, esantį žemiau, kad galėtumėte atsisiųsti failus į privatų aplanką.",
- "couldnotloadfiles": "Negalima užkrauti failų sąrašo.",
- "emptyfilelist": "Nėra rodytinų failų",
- "erroruploadnotworking": "Deja, failo į pasirinktą svetainę įkelti negalima.",
- "files": "Failai",
- "myprivatefilesdesc": "Jūsų privatūs failai Moodle svetainėje.",
- "privatefiles": "Asmeniniai failai",
- "sitefiles": "Svetainės failai",
- "sitefilesdesc": "Kiti failai Moodle svetainėje",
- "uploadfiles": "Siųsti grįžtamojo ryšio failus"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/mr.json b/src/addon/files/lang/mr.json
deleted file mode 100755
index 1e3707a1c..000000000
--- a/src/addon/files/lang/mr.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "कृपया लक्षात घ्या की आपले मूडल प्रशासक फाइल डाउनलोड अक्षम करते, आपण फायली ब्राउझ करू शकता परंतु त्यांना डाउनलोड करू शकत नाही.",
- "clicktoupload": "आपल्या खाजगी फायलींवर फायली अपलोड करण्यासाठी खालील बटणावर क्लिक करा",
- "couldnotloadfiles": "फायलींची सूची लोड करणे शक्य नाही .",
- "emptyfilelist": "दर्शविण्यासाठी कोणतीही फाईल नाहीत.",
- "erroruploadnotworking": "दुर्दैवाने सध्या आपल्या साइटवर फायली अपलोड करणे शक्य नाही.",
- "files": "अनेक फाइल",
- "myprivatefilesdesc": "या मूडल साइटवर आपल्या खाजगी क्षेत्रामध्ये उपलब्ध असलेल्या फायली.",
- "sitefiles": "साईटवरील फाईल्स",
- "sitefilesdesc": "या मूडल साइटवर उपलब्ध असलेल्या इतर फाईल्स.",
- "uploadfiles": "फायली अपलोड करा"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/nl.json b/src/addon/files/lang/nl.json
deleted file mode 100755
index a6b05556b..000000000
--- a/src/addon/files/lang/nl.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Je Moodle beheerder heeft het downloaden van bestanden uitgeschakeld. Je kunt door de bestandenlijst bladeren, maar ze niet downloaden.",
- "clicktoupload": "Klik op onderstaande knop om bestanden naar je privé-bestanden te uploaden.",
- "couldnotloadfiles": "De bestandenlijst kon niet geladen worden.",
- "emptyfilelist": "Er zijn geen bestanden om te tonen",
- "erroruploadnotworking": "Jammer genoeg kun je op dit ogenblik geen bestanden uploaden naar de site.",
- "files": "Bestanden",
- "myprivatefilesdesc": "Bestanden die jij alleen kan zien.",
- "privatefiles": "Privébestanden",
- "sitefiles": "Sitebestanden",
- "sitefilesdesc": "Andere bestanden voor jou.",
- "uploadfiles": "Stuur feedbackbestanden"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/no.json b/src/addon/files/lang/no.json
deleted file mode 100755
index 0139ff8de..000000000
--- a/src/addon/files/lang/no.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Din Moodleadministrator har slått av nedlasting av filer. Du kan bla igjennom filene men ikke laste dem ned",
- "clicktoupload": "Klikk på knappen nedenfor for å laste opp filer til din private profil",
- "couldnotloadfiles": "Liste med filer kunne ikke vises",
- "emptyfilelist": "Det er ingen filer å vise",
- "erroruploadnotworking": "Det er for øyeblikket ikke mulig å laste opp filer til din Moodle-side",
- "files": "Filer",
- "myprivatefilesdesc": "Tilgjengelige filer på ditt private område på Moodle-siden",
- "privatefiles": "Private filer",
- "sitefiles": "Nettstedfiler",
- "sitefilesdesc": "Andre filer som er tilgjengelig på Moodle-siden",
- "uploadfiles": "Send tilbakemeldingsfiler"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/pl.json b/src/addon/files/lang/pl.json
deleted file mode 100755
index 43f2b4b7e..000000000
--- a/src/addon/files/lang/pl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "emptyfilelist": "Brak plików do wyświetlenia",
- "files": "Pliki",
- "privatefiles": "Prywatne pliki",
- "sitefiles": "Pliki serwisu",
- "uploadfiles": "Wyślij pliki informacji zwrotnej"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/pt-br.json b/src/addon/files/lang/pt-br.json
deleted file mode 100755
index 2c3c45d95..000000000
--- a/src/addon/files/lang/pt-br.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Por favor note que o administrador do Moodle desativou downloads de arquivos, você pode navegar através dos arquivos, mas não baixá-los.",
- "clicktoupload": "Clique no botão abaixo para enviar para seus arquivos privados.",
- "couldnotloadfiles": "A lista de arquivos não pode ser carregada.",
- "emptyfilelist": "Não há arquivos para exibir",
- "erroruploadnotworking": "Infelizmente é impossível enviar arquivos para o seu site.",
- "files": "Arquivos",
- "myprivatefilesdesc": "Os arquivos que estão disponíveis em sua área de arquivos privados nesse site Moodle.",
- "privatefiles": "Arquivos privados",
- "sitefiles": "Arquivos do site",
- "sitefilesdesc": "Os outros arquivos que estão disponíveis a você neste site Moodle.",
- "uploadfiles": "Enviar arquivos de feedback"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/pt.json b/src/addon/files/lang/pt.json
deleted file mode 100755
index 90ed68c00..000000000
--- a/src/addon/files/lang/pt.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "O administrador do Moodle desativou a opção de descarregar ficheiros. Poderá navegar nos ficheiros mas não conseguirá descarregá-los.",
- "clicktoupload": "Clique no botão abaixo para carregar ficheiros para os seus ficheiros privados.",
- "couldnotloadfiles": "Não foi possível carregar a lista de ficheiros",
- "emptyfilelist": "Este repositório está vazio",
- "erroruploadnotworking": "Infelizmente não é possível carregar ficheiros para o seu site.",
- "files": "Ficheiros",
- "myprivatefilesdesc": "Ficheiros privados.",
- "privatefiles": "Ficheiros privados",
- "sitefiles": "Ficheiros do site",
- "sitefilesdesc": "Os outros ficheiros que estão disponíveis para si neste site.",
- "uploadfiles": "Enviar ficheiros de feedback"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/ro.json b/src/addon/files/lang/ro.json
deleted file mode 100755
index 269b6780a..000000000
--- a/src/addon/files/lang/ro.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "Atenție! Administratorul platformei a dezactivat descărcarea de fișiere; puteți accesa fișierele dar nu le puteți descărca.",
- "clicktoupload": "Apăsați butonul de mai jos pentru a încarcă fișierele în contul dumneavoastră.",
- "couldnotloadfiles": "Lista fișierelor nu a putut fi încărcată.",
- "emptyfilelist": "Nu există fișiere",
- "files": "Fişiere",
- "myprivatefilesdesc": "Fișierele disponibile din zona personală, pe care o dețineți pe acest site.",
- "privatefiles": "Fișiere private",
- "sitefiles": "Fişiere site",
- "sitefilesdesc": "Alte fișiere disponibile pe acest site.",
- "uploadfiles": "Trimite fișiere de feedback"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/ru.json b/src/addon/files/lang/ru.json
deleted file mode 100755
index f45d371d9..000000000
--- a/src/addon/files/lang/ru.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Администратор Moodle отключил скачивание файлов. Вы можете просмотреть файлы, но не скачать их.",
- "clicktoupload": "Нажмите внизу кнопку для загрузки файлов в свои личные файлы.",
- "couldnotloadfiles": "Файлы из списка не могут быть загружены",
- "emptyfilelist": "Нет файлов для отображения",
- "erroruploadnotworking": "К сожалению, в данный момент невозможно загрузить файлы на ваш сайт.",
- "files": "Файлы",
- "myprivatefilesdesc": "Файлы, которые доступны только вам.",
- "privatefiles": "Личные файлы",
- "sitefiles": "Файлы сайта",
- "sitefilesdesc": "Другие файлы, которые доступны вам на этом сайте.",
- "uploadfiles": "Отправить файлы с отзывами"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/sr-cr.json b/src/addon/files/lang/sr-cr.json
deleted file mode 100755
index 7e6b55212..000000000
--- a/src/addon/files/lang/sr-cr.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Имајте у виду да је ваш Moodle администратор онемогућио преузимање датотека. Датотеке можете да прегледате, али не и да их преузмете.",
- "clicktoupload": "Кликните на доње дугме како бисте отпремили датотеке међу своје приватне датотеке.",
- "couldnotloadfiles": "Списак датотека не може бити учитан.",
- "emptyfilelist": "Нема датотека за приказ.",
- "erroruploadnotworking": "Нажалост, тренутно није могуће отпремити датотеке на ваш сајт.",
- "files": "Датотеке",
- "myprivatefilesdesc": "Датотеке које су доступне у вашем приватном простору на овом Moodle сајту.",
- "privatefiles": "Приватне датотеке",
- "sitefiles": "Датотеке сајта",
- "sitefilesdesc": "Остале датотеке које су доступне на овом Moodle сајту.",
- "uploadfiles": "Отпреми датотеке"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/sr-lt.json b/src/addon/files/lang/sr-lt.json
deleted file mode 100755
index 8779139ba..000000000
--- a/src/addon/files/lang/sr-lt.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Imajte u vidu da je vaš Moodle administrator onemogućio preuzimanje datoteka. Datoteke možete da pregledate, ali ne i da ih preuzmete.",
- "clicktoupload": "Kliknite na donje dugme kako biste otpremili datoteke među svoje privatne datoteke.",
- "couldnotloadfiles": "Spisak datoteka ne može biti učitan.",
- "emptyfilelist": "Nema datoteka za prikaz.",
- "erroruploadnotworking": "Nažalost, trenutno nije moguće otpremiti datoteke na vaš sajt.",
- "files": "Datoteke",
- "myprivatefilesdesc": "Datoteke koje su dostupne u vašem privatnom prostoru na ovom Moodle sajtu.",
- "privatefiles": "Privatne datoteke",
- "sitefiles": "Datoteke sajta",
- "sitefilesdesc": "Ostale datoteke koje su dostupne na ovom Moodle sajtu.",
- "uploadfiles": "Otpremi datoteke"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/sv.json b/src/addon/files/lang/sv.json
deleted file mode 100755
index f50a7bb03..000000000
--- a/src/addon/files/lang/sv.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "admindisableddownload": "Observera att din Moodle administratör inaktiverade nedladdningar av filer. Du kan bläddra igenom filerna men inte hämta dem.",
- "clicktoupload": "Klicka på knappen nedan för att ladda upp filer till dina privata filer.",
- "couldnotloadfiles": "Listan över filer kunde inte läsas in.",
- "emptyfilelist": "Det finns inga filer att visa.",
- "files": "Filer",
- "myprivatefilesdesc": "De filer som finns i din privata område på denna Moodle webbplats.",
- "privatefiles": "Privata filer",
- "sitefiles": "Webbplatsens filer",
- "sitefilesdesc": "De andra filer som är tillgängliga för dig på denna Moodle webbplats.",
- "uploadfiles": "Skicka återkopplingsfiler"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/tg.json b/src/addon/files/lang/tg.json
deleted file mode 100755
index 3fff1b878..000000000
--- a/src/addon/files/lang/tg.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "emptyfilelist": "Барои инъикос кардан файлҳо нестанд",
- "files": "Файлҳо",
- "privatefiles": "Файлҳои шахсӣ",
- "sitefiles": "Файлҳои сомона",
- "uploadfiles": "Ирсолкардани файлҳои тақриз"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/tr.json b/src/addon/files/lang/tr.json
deleted file mode 100755
index ec3b602ad..000000000
--- a/src/addon/files/lang/tr.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "files": "Dosyalar",
- "privatefiles": "Kişisel dosyalar",
- "sitefiles": "Site dosyaları",
- "uploadfiles": "Geribildirim dosyaları gönder"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/uk.json b/src/addon/files/lang/uk.json
deleted file mode 100755
index 4043adc39..000000000
--- a/src/addon/files/lang/uk.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "Зверніть увагу, що ваш адміністратор Moodle відключив завантаження файлів. Ви можете переглядати файли, але не завантажувати їх.",
- "clicktoupload": "Натисніть на кнопку нижче, щоб завантажити ваші особисті файли.",
- "couldnotloadfiles": "Список файлів не може бути завантажений.",
- "emptyfilelist": "Немає файлів для показу",
- "erroruploadnotworking": "На жаль, в даний час не представляється можливим завантажувати файли на ваш сайт.",
- "files": "Файли",
- "myprivatefilesdesc": "Файли, які доступні у приватній області на цьому сайті Moodle.",
- "privatefiles": "Особисті файли",
- "sitefiles": "Файли сайту",
- "sitefilesdesc": "Інші файли, які доступні для вас на цьому сайті Moodle.",
- "uploadfiles": "Надіслати файл-відгук(и)"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/zh-cn.json b/src/addon/files/lang/zh-cn.json
deleted file mode 100755
index 80e8e1c52..000000000
--- a/src/addon/files/lang/zh-cn.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "emptyfilelist": "没有可显示的文件",
- "files": "文件",
- "privatefiles": "私人文件",
- "sitefiles": "本站文件",
- "uploadfiles": "发送反馈文件"
-}
\ No newline at end of file
diff --git a/src/addon/files/lang/zh-tw.json b/src/addon/files/lang/zh-tw.json
deleted file mode 100755
index 78c6090ac..000000000
--- a/src/addon/files/lang/zh-tw.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "admindisableddownload": "請注意, 您的Moodle管理員禁止檔案下載, 您可以瀏覽檔案, 但不能下載它們.",
- "clicktoupload": "點選這個按鈕,將檔案上傳到你的個人檔案區",
- "couldnotloadfiles": "這些檔案是不能被載入的",
- "emptyfilelist": "沒有檔案可以顯示",
- "erroruploadnotworking": "很抱歉, 目前無法將檔案上傳到您的網站.",
- "files": "檔案",
- "myprivatefilesdesc": "在此Moodle網站上, 您的私有區域中有可用的文件",
- "privatefiles": "私人檔案",
- "sitefiles": "網站檔案",
- "sitefilesdesc": "您在此Moodle網站上有可用的其他文件.",
- "uploadfiles": "上傳檔案"
-}
\ No newline at end of file
diff --git a/src/addon/files/pages/list/list.html b/src/addon/files/pages/list/list.html
index 9bb3ee955..06fdce330 100644
--- a/src/addon/files/pages/list/list.html
+++ b/src/addon/files/pages/list/list.html
@@ -3,7 +3,7 @@
-
+
@@ -11,7 +11,7 @@
-
+
{{ 'addon.files.privatefiles' | translate }}
{{ 'addon.files.sitefiles' | translate }}
@@ -22,13 +22,13 @@
0">
-
+
@@ -36,7 +36,7 @@
-
+
diff --git a/src/addon/messageoutput/airnotifier/lang/ca.json b/src/addon/messageoutput/airnotifier/lang/ca.json
deleted file mode 100755
index 222e3c090..000000000
--- a/src/addon/messageoutput/airnotifier/lang/ca.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configura els dispositius"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/cs.json b/src/addon/messageoutput/airnotifier/lang/cs.json
deleted file mode 100755
index 916d80720..000000000
--- a/src/addon/messageoutput/airnotifier/lang/cs.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Konfigurovat zařízení"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/da.json b/src/addon/messageoutput/airnotifier/lang/da.json
deleted file mode 100755
index 892585f89..000000000
--- a/src/addon/messageoutput/airnotifier/lang/da.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Konfigurer enheder"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/de-du.json b/src/addon/messageoutput/airnotifier/lang/de-du.json
deleted file mode 100755
index 1bf617885..000000000
--- a/src/addon/messageoutput/airnotifier/lang/de-du.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Geräte konfigurieren"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/de.json b/src/addon/messageoutput/airnotifier/lang/de.json
deleted file mode 100755
index 1bf617885..000000000
--- a/src/addon/messageoutput/airnotifier/lang/de.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Geräte konfigurieren"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/el.json b/src/addon/messageoutput/airnotifier/lang/el.json
deleted file mode 100755
index c6845772a..000000000
--- a/src/addon/messageoutput/airnotifier/lang/el.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Διαμόρφωση συσκευών"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/es-mx.json b/src/addon/messageoutput/airnotifier/lang/es-mx.json
deleted file mode 100755
index fc41bc788..000000000
--- a/src/addon/messageoutput/airnotifier/lang/es-mx.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configurar dispositivos"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/es.json b/src/addon/messageoutput/airnotifier/lang/es.json
deleted file mode 100755
index fc41bc788..000000000
--- a/src/addon/messageoutput/airnotifier/lang/es.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configurar dispositivos"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/eu.json b/src/addon/messageoutput/airnotifier/lang/eu.json
deleted file mode 100755
index 93d8a9766..000000000
--- a/src/addon/messageoutput/airnotifier/lang/eu.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Gailuak konfiguratu"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/fa.json b/src/addon/messageoutput/airnotifier/lang/fa.json
deleted file mode 100755
index b5a9bf34d..000000000
--- a/src/addon/messageoutput/airnotifier/lang/fa.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "پیکربندی دستگاهها"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/fi.json b/src/addon/messageoutput/airnotifier/lang/fi.json
deleted file mode 100755
index 8eca99990..000000000
--- a/src/addon/messageoutput/airnotifier/lang/fi.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Määrittele laitteistot"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/fr.json b/src/addon/messageoutput/airnotifier/lang/fr.json
deleted file mode 100755
index f2ac92b5e..000000000
--- a/src/addon/messageoutput/airnotifier/lang/fr.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configurer les appareils"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/it.json b/src/addon/messageoutput/airnotifier/lang/it.json
deleted file mode 100755
index 0c65c6ef0..000000000
--- a/src/addon/messageoutput/airnotifier/lang/it.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configura dsipositivi"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/ja.json b/src/addon/messageoutput/airnotifier/lang/ja.json
deleted file mode 100755
index 3746717da..000000000
--- a/src/addon/messageoutput/airnotifier/lang/ja.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "デバイスの設定"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/ko.json b/src/addon/messageoutput/airnotifier/lang/ko.json
deleted file mode 100755
index fd7444963..000000000
--- a/src/addon/messageoutput/airnotifier/lang/ko.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "장치 구성"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/lt.json b/src/addon/messageoutput/airnotifier/lang/lt.json
deleted file mode 100755
index 44b2cc594..000000000
--- a/src/addon/messageoutput/airnotifier/lang/lt.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Prietaisų konfigūravimas"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/mr.json b/src/addon/messageoutput/airnotifier/lang/mr.json
deleted file mode 100755
index 5379ffa9a..000000000
--- a/src/addon/messageoutput/airnotifier/lang/mr.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "डिव्हाइसेस कॉन्फिगर करा"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/nl.json b/src/addon/messageoutput/airnotifier/lang/nl.json
deleted file mode 100755
index 14d640359..000000000
--- a/src/addon/messageoutput/airnotifier/lang/nl.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Apparaten configureren"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/no.json b/src/addon/messageoutput/airnotifier/lang/no.json
deleted file mode 100755
index 4f9905ce5..000000000
--- a/src/addon/messageoutput/airnotifier/lang/no.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Konfigurer enheter"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/pt-br.json b/src/addon/messageoutput/airnotifier/lang/pt-br.json
deleted file mode 100755
index fc41bc788..000000000
--- a/src/addon/messageoutput/airnotifier/lang/pt-br.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configurar dispositivos"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/pt.json b/src/addon/messageoutput/airnotifier/lang/pt.json
deleted file mode 100755
index fc41bc788..000000000
--- a/src/addon/messageoutput/airnotifier/lang/pt.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Configurar dispositivos"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/ru.json b/src/addon/messageoutput/airnotifier/lang/ru.json
deleted file mode 100755
index 4bfd031bb..000000000
--- a/src/addon/messageoutput/airnotifier/lang/ru.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Настроить устройства"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/sr-cr.json b/src/addon/messageoutput/airnotifier/lang/sr-cr.json
deleted file mode 100755
index fda693e8a..000000000
--- a/src/addon/messageoutput/airnotifier/lang/sr-cr.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Конфигуриши уређаје"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/sr-lt.json b/src/addon/messageoutput/airnotifier/lang/sr-lt.json
deleted file mode 100755
index 4419d93d8..000000000
--- a/src/addon/messageoutput/airnotifier/lang/sr-lt.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Komfiguriši uređaj"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/uk.json b/src/addon/messageoutput/airnotifier/lang/uk.json
deleted file mode 100755
index 4b6433984..000000000
--- a/src/addon/messageoutput/airnotifier/lang/uk.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "Конфігурація пристроїв"
-}
\ No newline at end of file
diff --git a/src/addon/messageoutput/airnotifier/lang/zh-tw.json b/src/addon/messageoutput/airnotifier/lang/zh-tw.json
deleted file mode 100755
index b009ae356..000000000
--- a/src/addon/messageoutput/airnotifier/lang/zh-tw.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "processorsettingsdesc": "設定裝置"
-}
\ No newline at end of file
diff --git a/src/addon/messages/components/components.module.ts b/src/addon/messages/components/components.module.ts
index 929d642f4..1c8091937 100644
--- a/src/addon/messages/components/components.module.ts
+++ b/src/addon/messages/components/components.module.ts
@@ -20,11 +20,15 @@ import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { CorePipesModule } from '@pipes/pipes.module';
import { AddonMessagesDiscussionsComponent } from '../components/discussions/discussions';
+import { AddonMessagesConfirmedContactsComponent } from '../components/confirmed-contacts/confirmed-contacts';
+import { AddonMessagesContactRequestsComponent } from '../components/contact-requests/contact-requests';
import { AddonMessagesContactsComponent } from '../components/contacts/contacts';
@NgModule({
declarations: [
AddonMessagesDiscussionsComponent,
+ AddonMessagesConfirmedContactsComponent,
+ AddonMessagesContactRequestsComponent,
AddonMessagesContactsComponent
],
imports: [
@@ -39,6 +43,8 @@ import { AddonMessagesContactsComponent } from '../components/contacts/contacts'
],
exports: [
AddonMessagesDiscussionsComponent,
+ AddonMessagesConfirmedContactsComponent,
+ AddonMessagesContactRequestsComponent,
AddonMessagesContactsComponent
]
})
diff --git a/src/addon/messages/components/confirmed-contacts/addon-messages-confirmed-contacts.html b/src/addon/messages/components/confirmed-contacts/addon-messages-confirmed-contacts.html
new file mode 100644
index 000000000..ccd7bd268
--- /dev/null
+++ b/src/addon/messages/components/confirmed-contacts/addon-messages-confirmed-contacts.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/addon/messages/components/confirmed-contacts/confirmed-contacts.ts b/src/addon/messages/components/confirmed-contacts/confirmed-contacts.ts
new file mode 100644
index 000000000..528b48a9a
--- /dev/null
+++ b/src/addon/messages/components/confirmed-contacts/confirmed-contacts.ts
@@ -0,0 +1,154 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
+import { Content } from 'ionic-angular';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreSitesProvider } from '@providers/sites';
+import { AddonMessagesProvider } from '../../providers/messages';
+import { CoreDomUtilsProvider } from '@providers/utils/dom';
+
+/**
+ * Component that displays the list of confirmed contacts.
+ */
+@Component({
+ selector: 'addon-messages-confirmed-contacts',
+ templateUrl: 'addon-messages-confirmed-contacts.html',
+})
+export class AddonMessagesConfirmedContactsComponent implements OnInit, OnDestroy {
+ @Output() onUserSelected = new EventEmitter<{userId: number, onInit?: boolean}>();
+ @ViewChild(Content) content: Content;
+
+ loaded = false;
+ canLoadMore = false;
+ loadMoreError = false;
+ contacts = [];
+ selectedUserId: number;
+
+ protected memberInfoObserver;
+
+ constructor(private domUtils: CoreDomUtilsProvider, eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider,
+ private messagesProvider: AddonMessagesProvider) {
+
+ this.onUserSelected = new EventEmitter();
+
+ // Update block status of a user.
+ this.memberInfoObserver = eventsProvider.on(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, (data) => {
+ if (data.userBlocked || data.userUnblocked) {
+ const user = this.contacts.find((user) => user.id == data.userId);
+ if (user) {
+ user.isblocked = data.userBlocked;
+ }
+ } else if (data.contactRemoved) {
+ const index = this.contacts.findIndex((contact) => contact.id == data.userId);
+ if (index >= 0) {
+ this.contacts.splice(index, 1);
+ }
+ } else if (data.contactRequestConfirmed) {
+ this.refreshData();
+ }
+ }, sitesProvider.getCurrentSiteId());
+ }
+
+ /**
+ * Component loaded.
+ */
+ ngOnInit(): void {
+ this.fetchData().then(() => {
+ if (this.contacts.length) {
+ this.selectUser(this.contacts[0].id, true);
+ }
+ }).finally(() => {
+ this.loaded = true;
+ });
+
+ // Workaround for infinite scrolling.
+ this.content.resize();
+ }
+
+ /**
+ * Fetch contacts.
+ *
+ * @param {boolean} [refresh=false] True if we are refreshing contacts, false if we are loading more.
+ * @return {Promise} Promise resolved when done.
+ */
+ fetchData(refresh: boolean = false): Promise {
+ this.loadMoreError = false;
+
+ const limitFrom = refresh ? 0 : this.contacts.length;
+ let promise;
+
+ if (limitFrom === 0) {
+ // Always try to get latest data from server.
+ promise = this.messagesProvider.invalidateUserContacts().catch(() => {
+ // Shouldn't happen.
+ });
+ } else {
+ promise = Promise.resolve();
+ }
+
+ return promise.then(() => {
+ return this.messagesProvider.getUserContacts(limitFrom);
+ }).then((result) => {
+ this.contacts = refresh ? result.contacts : this.contacts.concat(result.contacts);
+ this.canLoadMore = result.canLoadMore;
+ }).catch((error) => {
+ this.loadMoreError = true;
+ this.domUtils.showErrorModalDefault(error, 'addon.messages.errorwhileretrievingcontacts', true);
+ });
+ }
+
+ /**
+ * Refresh contacts.
+ *
+ * @param {any} [refresher] Refresher.
+ * @return {Promise} Promise resolved when done.
+ */
+ refreshData(refresher?: any): Promise {
+ // No need to invalidate contacts, we always try to get the latest.
+ return this.fetchData(true).finally(() => {
+ refresher && refresher.complete();
+ });
+ }
+
+ /**
+ * Load more contacts.
+ *
+ * @param {any} [infiniteComplete] Infinite scroll complete function. Only used from core-infinite-loading.
+ * @return {Promise} Resolved when done.
+ */
+ loadMore(infiniteComplete?: any): Promise {
+ return this.fetchData().finally(() => {
+ infiniteComplete && infiniteComplete();
+ });
+ }
+
+ /**
+ * Notify that a contact has been selected.
+ *
+ * @param {number} userId User id.
+ * @param {boolean} [onInit=false] Whether the contact is selected on initial load.
+ */
+ selectUser(userId: number, onInit: boolean = false): void {
+ this.selectedUserId = userId;
+ this.onUserSelected.emit({userId, onInit});
+ }
+
+ /**
+ * Component destroyed.
+ */
+ ngOnDestroy(): void {
+ this.memberInfoObserver && this.memberInfoObserver.off();
+ }
+}
diff --git a/src/addon/messages/components/contact-requests/addon-messages-contact-requests.html b/src/addon/messages/components/contact-requests/addon-messages-contact-requests.html
new file mode 100644
index 000000000..b3bffbf68
--- /dev/null
+++ b/src/addon/messages/components/contact-requests/addon-messages-contact-requests.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+ {{ 'addon.messages.wouldliketocontactyou' | translate }}
+
+
+
+
+
+
diff --git a/src/addon/messages/components/contact-requests/contact-requests.ts b/src/addon/messages/components/contact-requests/contact-requests.ts
new file mode 100644
index 000000000..4a77bfdd1
--- /dev/null
+++ b/src/addon/messages/components/contact-requests/contact-requests.ts
@@ -0,0 +1,148 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
+import { Content } from 'ionic-angular';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreSitesProvider } from '@providers/sites';
+import { AddonMessagesProvider } from '../../providers/messages';
+import { CoreDomUtilsProvider } from '@providers/utils/dom';
+
+/**
+ * Component that displays the list of contact requests.
+ */
+@Component({
+ selector: 'addon-messages-contact-requests',
+ templateUrl: 'addon-messages-contact-requests.html',
+})
+export class AddonMessagesContactRequestsComponent implements OnInit, OnDestroy {
+ @Output() onUserSelected = new EventEmitter<{userId: number, onInit?: boolean}>();
+ @ViewChild(Content) content: Content;
+
+ loaded = false;
+ canLoadMore = false;
+ loadMoreError = false;
+ requests = [];
+ selectedUserId: number;
+
+ protected memberInfoObserver;
+
+ constructor(private domUtils: CoreDomUtilsProvider, eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider,
+ private messagesProvider: AddonMessagesProvider) {
+
+ // Hide the "Would like to contact you" message when a contact request is confirmed.
+ this.memberInfoObserver = eventsProvider.on(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, (data) => {
+ if (data.contactRequestConfirmed || data.contactRequestDeclined) {
+ const index = this.requests.findIndex((request) => request.id == data.userId);
+ if (index >= 0) {
+ this.requests.splice(index, 1);
+ }
+ }
+ }, sitesProvider.getCurrentSiteId());
+ }
+
+ /**
+ * Component loaded.
+ */
+ ngOnInit(): void {
+ this.fetchData().then(() => {
+ if (this.requests.length) {
+ this.selectUser(this.requests[0].id, true);
+ }
+ }).finally(() => {
+ this.loaded = true;
+ });
+
+ // Workaround for infinite scrolling.
+ this.content.resize();
+ }
+
+ /**
+ * Fetch contact requests.
+ *
+ * @param {boolean} [refresh=false] True if we are refreshing contact requests, false if we are loading more.
+ * @return {Promise} Promise resolved when done.
+ */
+ fetchData(refresh: boolean = false): Promise {
+ this.loadMoreError = false;
+
+ const limitFrom = refresh ? 0 : this.requests.length;
+ let promise;
+
+ if (limitFrom === 0) {
+ // Always try to get latest data from server.
+ promise = this.messagesProvider.invalidateContactRequestsCache().catch(() => {
+ // Shouldn't happen.
+ });
+ } else {
+ promise = Promise.resolve();
+ }
+
+ return promise.then(() => {
+ return this.messagesProvider.getContactRequests(limitFrom);
+ }).then((result) => {
+ this.requests = refresh ? result.requests : this.requests.concat(result.requests);
+ this.canLoadMore = result.canLoadMore;
+ }).catch((error) => {
+ this.loadMoreError = true;
+ this.domUtils.showErrorModalDefault(error, 'addon.messages.errorwhileretrievingcontacts', true);
+ });
+ }
+
+ /**
+ * Refresh contact requests.
+ *
+ * @param {any} [refresher] Refresher.
+ * @return {Promise} Promise resolved when done.
+ */
+ refreshData(refresher?: any): Promise {
+ // Refresh the number of contacts requests to update badges.
+ this.messagesProvider.refreshContactRequestsCount();
+
+ // No need to invalidate contact requests, we always try to get the latest.
+ return this.fetchData(true).finally(() => {
+ refresher && refresher.complete();
+ });
+ }
+
+ /**
+ * Load more contact requests.
+ *
+ * @param {any} [infiniteComplete] Infinite scroll complete function. Only used from core-infinite-loading.
+ * @return {Promise} Resolved when done.
+ */
+ loadMore(infiniteComplete?: any): Promise {
+ return this.fetchData().finally(() => {
+ infiniteComplete && infiniteComplete();
+ });
+ }
+
+ /**
+ * Notify that a contact has been selected.
+ *
+ * @param {number} userId User id.
+ * @param {boolean} [onInit=false] Whether the contact is selected on initial load.
+ */
+ selectUser(userId: number, onInit: boolean = false): void {
+ this.selectedUserId = userId;
+ this.onUserSelected.emit({userId, onInit});
+ }
+
+ /**
+ * Component destroyed.
+ */
+ ngOnDestroy(): void {
+ this.memberInfoObserver && this.memberInfoObserver.off();
+ }
+}
diff --git a/src/addon/messages/components/contacts/addon-messages-contacts.html b/src/addon/messages/components/contacts/addon-messages-contacts.html
index a531c3391..4722b4d74 100644
--- a/src/addon/messages/components/contacts/addon-messages-contacts.html
+++ b/src/addon/messages/components/contacts/addon-messages-contacts.html
@@ -12,16 +12,14 @@
0 || contactType === searchType)">
-
+
{{ 'addon.messages.type_' + contactType | translate }}
{{ contacts[contactType].length }}
-
-
-
-
+
+
diff --git a/src/addon/messages/components/contacts/contacts.scss b/src/addon/messages/components/contacts/contacts.scss
deleted file mode 100644
index b675c4efc..000000000
--- a/src/addon/messages/components/contacts/contacts.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-ion-app.app-root addon-messages-discussions {
- h2 {
- display: flex;
- justify-content: space-between;
-
- .note {
- margin: 0;
- align-self: flex-end;
- display: inline-flex;
- }
- }
-}
\ No newline at end of file
diff --git a/src/addon/messages/components/contacts/contacts.ts b/src/addon/messages/components/contacts/contacts.ts
index 4a23cc2d7..8df67aabb 100644
--- a/src/addon/messages/components/contacts/contacts.ts
+++ b/src/addon/messages/components/contacts/contacts.ts
@@ -47,6 +47,8 @@ export class AddonMessagesContactsComponent {
};
searchString = '';
+ protected memberInfoObserver;
+
constructor(sitesProvider: CoreSitesProvider, translate: TranslateService, private appProvider: CoreAppProvider,
private messagesProvider: AddonMessagesProvider, private domUtils: CoreDomUtilsProvider, navParams: NavParams,
private eventsProvider: CoreEventsProvider) {
@@ -58,6 +60,13 @@ export class AddonMessagesContactsComponent {
this.loadingMessage = this.loadingMessages;
this.discussionUserId = navParams.get('discussionUserId') || false;
+
+ // Refresh the list when a contact request is confirmed.
+ this.memberInfoObserver = eventsProvider.on(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, (data) => {
+ if (data.contactRequestConfirmed) {
+ this.refreshData();
+ }
+ }, sitesProvider.getCurrentSiteId());
}
/**
@@ -217,4 +226,11 @@ export class AddonMessagesContactsComponent {
};
this.eventsProvider.trigger(AddonMessagesProvider.SPLIT_VIEW_LOAD_EVENT, params, this.siteId);
}
+
+ /**
+ * Component destroyed.
+ */
+ ngOnDestroy(): void {
+ this.memberInfoObserver && this.memberInfoObserver.off();
+ }
}
diff --git a/src/addon/messages/components/discussions/addon-messages-discussions.html b/src/addon/messages/components/discussions/addon-messages-discussions.html
index 5fcb5dfcc..23c9c6f34 100644
--- a/src/addon/messages/components/discussions/addon-messages-discussions.html
+++ b/src/addon/messages/components/discussions/addon-messages-discussions.html
@@ -7,38 +7,34 @@
-
-
-
-
-
+
{{ 'core.searchresults' | translate }}
{{ search.results.length }}
-
-
-
-
+
+
-
-
-
-
+
+
- 0 || discussion.unread">
-
- 0">{{discussion.message.timecreated / 1000 | coreDateDayOrTime}}
-
+ 0 || discussion.unread">
+
+ 0">{{discussion.message.timecreated / 1000 | coreDateDayOrTime}}
+
+
+
+
+
diff --git a/src/addon/messages/components/discussions/discussions.scss b/src/addon/messages/components/discussions/discussions.scss
deleted file mode 100644
index e6f7b9089..000000000
--- a/src/addon/messages/components/discussions/discussions.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-ion-app.app-root addon-messages-discussions {
- h2 {
- display: flex;
- justify-content: space-between;
-
- .note {
- margin: 0;
- align-self: flex-end;
- display: inline-flex;
- font-size: initial;
- }
- }
-}
\ No newline at end of file
diff --git a/src/addon/messages/components/discussions/discussions.ts b/src/addon/messages/components/discussions/discussions.ts
index a0241e2a1..bf3eb9f21 100644
--- a/src/addon/messages/components/discussions/discussions.ts
+++ b/src/addon/messages/components/discussions/discussions.ts
@@ -53,7 +53,7 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
constructor(private eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider, translate: TranslateService,
private messagesProvider: AddonMessagesProvider, private domUtils: CoreDomUtilsProvider, navParams: NavParams,
- private appProvider: CoreAppProvider, platform: Platform, utils: CoreUtilsProvider,
+ private appProvider: CoreAppProvider, platform: Platform, private utils: CoreUtilsProvider,
pushNotificationsDelegate: AddonPushNotificationsDelegate) {
this.search.loading = translate.instant('core.searching');
@@ -91,17 +91,13 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
// A discussion has been read reset counter.
discussion.unread = false;
- // Discussions changed, invalidate them.
- this.messagesProvider.invalidateDiscussionsCache();
+ // Conversations changed, invalidate them and refresh unread counts.
+ this.messagesProvider.invalidateConversations();
+ this.messagesProvider.refreshUnreadConversationCounts();
}
}
}, this.siteId);
- // Update discussions when cron read is executed.
- this.cronObserver = eventsProvider.on(AddonMessagesProvider.READ_CRON_EVENT, (data) => {
- this.refreshData();
- }, this.siteId);
-
// Refresh the view when the app is resumed.
this.appResumeSubscription = platform.resume.subscribe(() => {
if (!this.loaded) {
@@ -117,7 +113,8 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
this.pushObserver = pushNotificationsDelegate.on('receive').subscribe((notification) => {
// New message received. If it's from current site, refresh the data.
if (utils.isFalseOrZero(notification.notif) && notification.site == this.siteId) {
- this.refreshData();
+ // Don't refresh unread counts, it's refreshed from the main menu handler in this case.
+ this.refreshData(null, false);
}
});
}
@@ -143,14 +140,20 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
* Refresh the data.
*
* @param {any} [refresher] Refresher.
+ * @param {boolean} [refreshUnreadCounts=true] Whteher to refresh unread counts.
* @return {Promise} Promise resolved when done.
*/
- refreshData(refresher?: any): Promise {
- return this.messagesProvider.invalidateDiscussionsCache().then(() => {
+ refreshData(refresher?: any, refreshUnreadCounts: boolean = true): Promise {
+ const promises = [];
+ promises.push(this.messagesProvider.invalidateDiscussionsCache());
+
+ if (refreshUnreadCounts) {
+ promises.push(this.messagesProvider.invalidateUnreadConversationCounts());
+ }
+
+ return this.utils.allPromises(promises).finally(() => {
return this.fetchData().finally(() => {
if (refresher) {
- // Actions to take if refresh comes from the user.
- this.eventsProvider.trigger(AddonMessagesProvider.READ_CHANGED_EVENT, undefined, this.siteId);
refresher.complete();
}
});
@@ -166,7 +169,9 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
this.loadingMessage = this.loadingMessages;
this.search.enabled = this.messagesProvider.isSearchMessagesEnabled();
- return this.messagesProvider.getDiscussions().then((discussions) => {
+ const promises = [];
+
+ promises.push(this.messagesProvider.getDiscussions().then((discussions) => {
// Convert to an array for sorting.
const discussionsSorted = [];
for (const userId in discussions) {
@@ -177,7 +182,11 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
this.discussions = discussionsSorted.sort((a, b) => {
return b.message.timecreated - a.message.timecreated;
});
- }).catch((error) => {
+ }));
+
+ promises.push(this.messagesProvider.getUnreadConversationCounts());
+
+ return Promise.all(promises).catch((error) => {
this.domUtils.showErrorModalDefault(error, 'addon.messages.errorwhileretrievingdiscussions', true);
}).finally(() => {
this.loaded = true;
@@ -209,7 +218,7 @@ export class AddonMessagesDiscussionsComponent implements OnDestroy {
return this.messagesProvider.searchMessages(query).then((searchResults) => {
this.search.showResults = true;
- this.search.results = searchResults;
+ this.search.results = searchResults.messages;
}).catch((error) => {
this.domUtils.showErrorModalDefault(error, 'addon.messages.errorwhileretrievingmessages', true);
}).finally(() => {
diff --git a/src/addon/messages/lang/ar.json b/src/addon/messages/lang/ar.json
deleted file mode 100755
index a13101c39..000000000
--- a/src/addon/messages/lang/ar.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "addcontact": "أضف عنوان أتصال",
- "blockcontact": "أحجب عنوان الأتصال",
- "blocknoncontacts": "امنع المستخدمين الذين ليسوا في قائمة اتصالاتي من مراسلتي",
- "contactlistempty": "قائمة الاتصال فارغة",
- "contacts": "عناوين اتصال",
- "errordeletemessage": "خطأ عند حذف الرسالة",
- "message": "رسالة",
- "messagenotsent": "لم يتم إرسال الرسالة، يرجي المحاولة لاحقا",
- "messagepreferences": "مراجع الرسالة",
- "messages": "رسائل",
- "mustbeonlinetosendmessages": "لابد أن تكون متصل بالأنترنت لكي ترسل أي رسائل",
- "newmessage": "رسالة جديدة",
- "nomessages": "لا توجد رسائل بعد",
- "nousersfound": "لا يوجد مستخدمون",
- "removecontact": "ازل عنوان الاتصال",
- "send": "إرسل",
- "sendmessage": "إرسل رسالة",
- "type_offline": "غير متصل",
- "type_online": "متصل",
- "type_search": "نتائج البحث",
- "type_strangers": "رسائل أخرى",
- "unblockcontact": "أزل الحجب عن عنوان الاتصال"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/bg.json b/src/addon/messages/lang/bg.json
deleted file mode 100755
index 9a9879a95..000000000
--- a/src/addon/messages/lang/bg.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "addcontact": "Добавяне на контакт",
- "blockcontact": "Блокиране на контакт",
- "blocknoncontacts": "Блокирай съобщения от потребители извън списъка с контакти ",
- "contactlistempty": "Списъка с контакти е празен",
- "contactname": "Име на контакта",
- "contacts": "Контакти",
- "deletemessage": "Изтриване на съобщение",
- "deletemessageconfirmation": "Сигурни ли сте, че искате да изтриете това съобщение? То ще бъде изтрито само от Вашето хранилище за съобщения и ще продължи да се вижда от изпращача или получателя.",
- "errorwhileretrievingcontacts": "Грешка при изчитането на списъка с контакти от сървъра.",
- "errorwhileretrievingdiscussions": "Грешка при изчитането на дискусиите от сървъра.",
- "errorwhileretrievingmessages": "Грешка при изчитането на съобщенията от сървъра.",
- "message": "Текст на съобщението",
- "messagenotsent": "Съобщението не беше изпратено. Моля опитайте пак по-късно.",
- "messagepreferences": "Предпочитания за съобщенията",
- "messages": "Съобщения",
- "mustbeonlinetosendmessages": "Трябва да сте онлайн, за да изпращате съобщения.",
- "newmessage": "Ново съобщение",
- "nomessages": "Няма чакащи съобщения",
- "nousersfound": "Не са намерени потребители",
- "removecontact": "Премахване на контакт",
- "send": "изпращане",
- "sendmessage": "Изпращане на съобщение",
- "type_blocked": "Блокиран",
- "type_offline": "Офлайн",
- "type_online": "Онлайн",
- "type_search": "Резултати от търсенето",
- "type_strangers": "Други",
- "unblockcontact": "Разблокиране на контакт"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/ca.json b/src/addon/messages/lang/ca.json
deleted file mode 100755
index 15b889086..000000000
--- a/src/addon/messages/lang/ca.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Afegeix contacte",
- "blockcontact": "Bloca contacte",
- "blockcontactconfirm": "Ja no rebreu més missatges d'aquest contacte.",
- "blocknoncontacts": "Impedeix que m'enviïn missatges els usuaris que no siguin a la meva llista de contactes",
- "contactlistempty": "La llista de contactes és buida",
- "contactname": "Nom del contacte",
- "contacts": "Contactes",
- "deletemessage": "Esborra el missatge",
- "deletemessageconfirmation": "Confirmeu que voleu esborrar aquest missatge? Només s'esborrarà del vostre historial de missatgeria, i encara serà visible per a l'usuari que va enviar o va rebre el missatge.",
- "errordeletemessage": "S'ha produït un error mentre s'esborrava el missatge.",
- "errorwhileretrievingcontacts": "S'ha produït un error en recuperar els contactes del servidor.",
- "errorwhileretrievingdiscussions": "S'ha produït un error mentre es recuperaven els debats del servidor.",
- "errorwhileretrievingmessages": "S'ha produït un error descarregant els missatges.",
- "loadpreviousmessages": "Carrega els missatges anteriors",
- "message": "Cos del missatge",
- "messagenotsent": "El missatge no s'ha enviat. Si us plau, intenteu-ho més tard",
- "messagepreferences": "Preferències dels missatges",
- "messages": "Missatges",
- "mustbeonlinetosendmessages": "Heu de tenir connexió a la xarxa per a enviar missatges",
- "newmessage": "Missatge nou",
- "newmessages": "Nous missatges",
- "nomessages": "No teniu missatges pendents",
- "nousersfound": "No s'han trobat usuaris",
- "removecontact": "Suprimeix contacte",
- "removecontactconfirm": "El contacte s'eliminarà de la vostra llista de contactes.",
- "send": "envia",
- "sendmessage": "Envia missatge",
- "type_blocked": "Bloquejat",
- "type_offline": "Fora de línia",
- "type_online": "En línia",
- "type_search": "Resultats de la cerca",
- "type_strangers": "Altres",
- "unblockcontact": "Desbloca contacte",
- "warningmessagenotsent": "No s'han pogut enviar missatges a l'usuari {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/cs.json b/src/addon/messages/lang/cs.json
deleted file mode 100755
index 9ba11c02c..000000000
--- a/src/addon/messages/lang/cs.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Přidat kontakt",
- "blockcontact": "Blokovat kontakt",
- "blockcontactconfirm": "Od tohoto kontaktu již nebudete přijímat zprávy.",
- "blocknoncontacts": "Blokuj všechny nové zprávy od uživatelů, které nemám v seznamu kontaktů",
- "contactlistempty": "Seznam kontaktů je prázdný",
- "contactname": "Jméno kontaktu",
- "contacts": "Kontakty",
- "deletemessage": "Odstranit zprávu",
- "deletemessageconfirmation": "Jste si jisti, že chcete smazat tuto zprávu? Bude odstraněna pouze z historie zpráv a nadále bude možné zobrazit uživatele, který zprávu odeslal nebo přijal.",
- "errordeletemessage": "Chyba při odstraňování zprávy.",
- "errorwhileretrievingcontacts": "Chyba při načítání kontaktů ze serveru.",
- "errorwhileretrievingdiscussions": "Chyba při načítání diskusí ze serveru.",
- "errorwhileretrievingmessages": "Chyba při načítání zpráv ze serveru.",
- "loadpreviousmessages": "Načtení předchozích zpráv",
- "message": "Zpráva",
- "messagenotsent": "Zpráva nebyla odeslána. Zkuste to prosím později.",
- "messagepreferences": "Nastavení zpráv",
- "messages": "Zprávy",
- "mustbeonlinetosendmessages": "Pro odesílání zpráv musíte být online",
- "newmessage": "Nová zpráva",
- "newmessages": "Nové zprávy",
- "nomessages": "Zatím žádné zprávy",
- "nousersfound": "Nenalezeni žádní uživatelé",
- "removecontact": "Odebrat kontakt",
- "removecontactconfirm": "Kontakt bude odstraněn ze seznamu kontaktů.",
- "send": "odeslat",
- "sendmessage": "Odeslat zprávu",
- "type_blocked": "Blokováno",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Výsledky hledání",
- "type_strangers": "Další",
- "unblockcontact": "Odblokovat kontakt",
- "warningmessagenotsent": "Nelze odeslat zprávu (y) uživateli {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/da.json b/src/addon/messages/lang/da.json
deleted file mode 100755
index 536c24257..000000000
--- a/src/addon/messages/lang/da.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Tilføj kontakt",
- "blockcontact": "Bloker kontakt",
- "blockcontactconfirm": "Du modtager ikke længere beskeder fra denne kontakt.",
- "blocknoncontacts": "Bloker alle beskeder fra personer der ikke er i min kontaktliste.",
- "contactlistempty": "Kontaktlisten er tom",
- "contactname": "Navn",
- "contacts": "Kontakter",
- "deletemessage": "Slet besked",
- "deletemessageconfirmation": "Er du sikker på at du ønsker at slette denne besked? Den vil blive sletter fra din beskeds historik og vil stadig kunne ses af den bruger der har afsendt eller modtaget beskeden",
- "errordeletemessage": "Fejl under sletning af filen",
- "errorwhileretrievingcontacts": "Fejl ved hentning af kontakter fra serveren",
- "errorwhileretrievingdiscussions": "Fejl ved hentning af diskussioner fra serveren",
- "errorwhileretrievingmessages": "Fejl ved hentning af beskeder fra serveren.",
- "loadpreviousmessages": "Indlæs forrige besked",
- "message": "Beskedtekst",
- "messagenotsent": "Beskeden blev ikke sendt, prøv igen senere.",
- "messagepreferences": "Indstillinger for beskeder",
- "messages": "Beskeder",
- "mustbeonlinetosendmessages": "Du skal være online for at sende beskeder",
- "newmessage": "Ny besked",
- "newmessages": "Nye beskeder",
- "nomessages": "Ingen beskeder endnu",
- "nousersfound": "Ingen brugere fundet",
- "removecontact": "Fjern kontakt",
- "removecontactconfirm": "Kontakten vil blive fjernet fra listen",
- "send": "send",
- "sendmessage": "Send besked",
- "type_blocked": "Blokeret",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Søgeresultat",
- "type_strangers": "Andre",
- "unblockcontact": "Fjern blokering af kontakt",
- "warningmessagenotsent": "Kunne ikke sende besked(er) til brugeren {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/de-du.json b/src/addon/messages/lang/de-du.json
deleted file mode 100755
index 613dd9a3c..000000000
--- a/src/addon/messages/lang/de-du.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "addcontact": "Kontakt hinzufügen",
- "blockcontact": "Kontakt sperren",
- "blockcontactconfirm": "Möchtest du von dieser Person keine Mitteilungen mehr empfangen?",
- "blocknoncontacts": "Mitteilungen nur für Kontakte zulassen",
- "contactlistempty": "Die Kontaktliste ist leer.",
- "contactname": "Name",
- "contacts": "Kontakte",
- "errordeletemessage": "Fehler beim Löschen der Mitteilung",
- "errorwhileretrievingcontacts": "Fehler beim Abrufen der Kontakte vom Server",
- "errorwhileretrievingdiscussions": "Fehler beim Abrufen der Themen vom Server",
- "errorwhileretrievingmessages": "Fehler beim Abrufen der Mitteilungen vom Server",
- "loadpreviousmessages": "Vorherige Mitteilungen laden",
- "message": "Mitteilung",
- "messagenotsent": "Die Mitteilung wurde nicht gesendet. Versuche es später noch einmal.",
- "messagepreferences": "Mitteilungen",
- "messages": "Mitteilungen",
- "mustbeonlinetosendmessages": "Du muss online sein, um Mitteilungen zu senden.",
- "newmessage": "Neue Mitteilung",
- "newmessages": "Neue Mitteilungen",
- "nomessages": "Keine Mitteilungen",
- "nousersfound": "Keine Nutzer/innen gefunden",
- "removecontact": "Kontakt entfernen",
- "removecontactconfirm": "Der Kontakt wird aus deiner Kontaktliste gelöscht.",
- "send": "Senden",
- "sendmessage": "Mitteilung senden",
- "type_blocked": "Blockiert",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Suchergebnisse",
- "type_strangers": "Weitere Personen",
- "unblockcontact": "Kontakt aktivieren",
- "warningmessagenotsent": "Die Mitteilung an {{user}} konnte nicht gesendet werden. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/de.json b/src/addon/messages/lang/de.json
deleted file mode 100755
index b97803d22..000000000
--- a/src/addon/messages/lang/de.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Kontakt hinzufügen",
- "blockcontact": "Kontakt sperren",
- "blockcontactconfirm": "Möchten Sie von dieser Person keine Mitteilungen mehr empfangen?",
- "blocknoncontacts": "Mitteilungen nur für Kontakte zulassen",
- "contactlistempty": "Die Kontaktliste ist leer.",
- "contactname": "Name",
- "contacts": "Kontakte",
- "deletemessage": "Nachricht löschen",
- "deletemessageconfirmation": "Möchten Sie wirklich diese Nachricht löschen? Die Nachricht wird ausschließlich aus Ihrem Nachrichtenverlauf gelöscht, ist aber weiterhin bei der Person zu sehen, die Ihnen die Nachricht geschickt hat.",
- "errordeletemessage": "Fehler beim Löschen der Mitteilung",
- "errorwhileretrievingcontacts": "Fehler beim Abrufen der Kontakte vom Server",
- "errorwhileretrievingdiscussions": "Fehler beim Abrufen der Themen vom Server",
- "errorwhileretrievingmessages": "Fehler beim Abrufen der Mitteilungen vom Server",
- "loadpreviousmessages": "Vorherige Mitteilungen laden",
- "message": "Mitteilung",
- "messagenotsent": "Die Mitteilung wurde nicht gesendet. Versuchen Sie es später noch einmal.",
- "messagepreferences": "Mitteilungen",
- "messages": "Mitteilungen",
- "mustbeonlinetosendmessages": "Sie müssen online sein, um Mitteilungen zu senden.",
- "newmessage": "Neue Mitteilung",
- "newmessages": "Neue Mitteilungen",
- "nomessages": "Keine Mitteilungen",
- "nousersfound": "Keine Personen gefunden",
- "removecontact": "Kontakt entfernen",
- "removecontactconfirm": "Der Kontakt wird aus Ihrer Kontaktliste gelöscht.",
- "send": "Senden",
- "sendmessage": "Mitteilung senden",
- "type_blocked": "Blockiert",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Suchergebnisse",
- "type_strangers": "Weitere Personen",
- "unblockcontact": "Kontakt aktivieren",
- "warningmessagenotsent": "Mitteilung an {{user}} konnte nicht gesendet werden. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/el.json b/src/addon/messages/lang/el.json
deleted file mode 100755
index 792d12476..000000000
--- a/src/addon/messages/lang/el.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "addcontact": "Προσθήκη επαφής",
- "blockcontact": "Φραγμός επαφής",
- "blockcontactconfirm": "Θα σταματήσετε να λαμβάνετε μηνύματα από αυτήν την επαφή.",
- "blocknoncontacts": "Φραγή όλων των νέων μηνυμάτων που προέρχονται από χρήστες που δεν βρίσκονται στη λίστα επαφών σας.",
- "contactlistempty": "Η λίστα επαφών είναι κενή",
- "contactname": "Όνομα επαφής",
- "contacts": "Επαφές",
- "errordeletemessage": "Σφάλμα κατά τη διαγραφή του μηνύματος.",
- "errorwhileretrievingcontacts": "Σφάλμα κατά την ανάκτηση των επαφών από το διακομιστή.",
- "errorwhileretrievingdiscussions": "Σφάλμα κατά την ανάκτηση των συζητήσεων από το διακομιστή.",
- "errorwhileretrievingmessages": "Σφάλμα κατά την ανάκτηση των μηνυμάτων από το διακομιστή.",
- "loadpreviousmessages": "Φορτώστε τα προηγούμενα μηνύματα",
- "message": "Σώμα μηνύματος",
- "messagenotsent": "Το μήνυμα δεν στάλθηκε, δοκιμάστε ξανά αργότερα.",
- "messagepreferences": "Προτιμήσεις μηνύματος",
- "messages": "Μηνύματα",
- "mustbeonlinetosendmessages": "Πρέπει να είστε συνδεδεμένοι για να στείλετε μηνύματα",
- "newmessage": "Νέο μήνυμα",
- "newmessages": "Νέα μηνύματα",
- "nomessages": "Δεν υπάρχουν ακόμα μηνύματα",
- "nousersfound": "Δε βρέθηκαν χρήστες",
- "removecontact": "Αφαίρεσε την επαφή",
- "removecontactconfirm": "Η επαφή θα καταργηθεί από τη λίστα επαφών σας.",
- "send": "Αποστολή",
- "sendmessage": "Αποστολή μηνύματος",
- "type_blocked": "Μπλοκαρισμένοι",
- "type_offline": "Εκτός σύνδεσης",
- "type_online": "Συνδεδεμένος",
- "type_search": "Αποτελέσματα αναζήτησης",
- "type_strangers": "Άλλοι",
- "unblockcontact": "Ξεμπλόκαρε την επαφή",
- "warningmessagenotsent": "Το/τα μήνυμα/μηνύματα δεν μπόρεσε/αν να σταλεί/ούν στο χρήστη {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/en.json b/src/addon/messages/lang/en.json
index a75924db0..f11b07ab6 100644
--- a/src/addon/messages/lang/en.json
+++ b/src/addon/messages/lang/en.json
@@ -1,32 +1,76 @@
{
+ "acceptandaddcontact": "Accept and add to contacts",
"addcontact": "Add contact",
- "blockcontact": "Block contact",
- "blockcontactconfirm": "You will no longer receive messages from this contact.",
+ "addcontactconfirm": "Are you sure you want to add {{$a}} to your contacts?",
+ "addtofavourites": "Star",
+ "addtoyourcontacts": "Add to contacts",
"blocknoncontacts": "Prevent non-contacts from messaging me",
+ "blockuser": "Block user",
+ "blockuserconfirm": "Are you sure you want to block {{$a}}?",
+ "contactableprivacy": "Accept messages from:",
+ "contactableprivacy_coursemember": "My contacts and anyone in my courses",
+ "contactableprivacy_onlycontacts": "My contacts only",
+ "contactableprivacy_site": "Anyone on the site",
+ "contactblocked": "Contact blocked",
"contactlistempty": "The contact list is empty",
"contactname": "Contact name",
+ "contactrequestsent": "Contact request sent",
"contacts": "Contacts",
+ "decline": "Decline",
+ "deleteallconfirm": "Are you sure you would like to delete this entire conversation? This will not delete it for other conversation participants.",
+ "deleteconversation": "Delete conversation",
"deletemessage": "Delete message",
"deletemessageconfirmation": "Are you sure you want to delete this message? It will only be deleted from your messaging history and will still be viewable by the user who sent or received the message.",
"errordeletemessage": "Error while deleting the message.",
"errorwhileretrievingcontacts": "Error while retrieving contacts from the server.",
"errorwhileretrievingdiscussions": "Error while retrieving discussions from the server.",
"errorwhileretrievingmessages": "Error while retrieving messages from the server.",
+ "errorwhileretrievingusers": "Error while retrieving users from the server.",
+ "groupinfo": "Group info",
+ "groupconversations": "Group",
+ "individualconversations": "Private",
+ "info": "Info",
+ "isnotinyourcontacts": "{{$a}} is not in your contacts",
"messagenotsent": "The message was not sent. Please try again later.",
"message": "Message",
"messagepreferences": "Message preferences",
"messages": "Messages",
"newmessage": "New message",
"newmessages": "New messages",
- "nomessages": "No messages",
+ "nocontactrequests": "No contact requests",
+ "noncontacts": "Non-contacts",
+ "nocontactsgetstarted": "Try searching for someone to add them as a contact",
+ "nofavourites": "No starred conversations",
+ "nogroupconversations": "No group conversations",
+ "noindividualconversations": "No private conversations",
+ "nomessagesfound": "No messages were found",
"nousersfound": "No users found",
+ "numparticipants": "{{$a}} participants",
"removecontact": "Remove contact",
- "removecontactconfirm": "Contact will be removed from your contacts list.",
+ "removecontactconfirm": "Are you sure you want to remove {{$a}} from your contacts?",
+ "removefromyourcontacts": "Remove from contacts",
+ "removefromfavourites": "Unstar",
+ "requests": "Requests",
+ "requirecontacttomessage": "You need to request {{$a}} to add you as a contact to be able to message them.",
+ "searchcombined": "Search people and messages",
+ "searchnocontactsfound": "No contacts found",
+ "searchnomessagesfound": "No messages found",
+ "searchnononcontactsfound": "No non contacts found",
+ "sendcontactrequest": "Send contact request",
+ "showdeletemessages": "Show delete options",
"type_blocked": "Blocked",
"type_offline": "Offline",
"type_online": "Online",
"type_search": "Search results",
"type_strangers": "Others",
- "unblockcontact": "Unblock contact",
- "warningmessagenotsent": "Couldn't send message(s) to user {{user}}. {{error}}"
+ "unabletomessage": "You are unable to message this user",
+ "unblockuser": "Unblock user",
+ "unblockuserconfirm": "Are you sure you want to unblock {{$a}}?",
+ "userwouldliketocontactyou": "{{$a}} would like to contact you",
+ "warningconversationmessagenotsent": "Couldn't send message(s) to conversation {{conversation}}. {{error}}",
+ "warningmessagenotsent": "Couldn't send message(s) to user {{user}}. {{error}}",
+ "wouldliketocontactyou": "Would like to contact you",
+ "you": "You:",
+ "youhaveblockeduser": "You have blocked this user in the past",
+ "yourcontactrequestpending": "Your contact request is pending with {{$a}}"
}
\ No newline at end of file
diff --git a/src/addon/messages/lang/es-mx.json b/src/addon/messages/lang/es-mx.json
deleted file mode 100755
index db39dcf25..000000000
--- a/src/addon/messages/lang/es-mx.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Añadir contacto",
- "blockcontact": "Bloquear contacto",
- "blockcontactconfirm": "Usted dejará de recibir mensajes de este contacto.",
- "blocknoncontacts": "Bloquear mensajes de usuarios que no figuren en mi lista de contactos",
- "contactlistempty": "La lista de contactos está vacía",
- "contactname": "Nombre del contacto",
- "contacts": "Contactos",
- "deletemessage": "Eliminar mensaje",
- "deletemessageconfirmation": "¿Está Usted seguro de querer eliminar este mensaje? Solamente será eliminado de su historia de mensajería y todavía será visible por el usuario que lo envió o recibió.",
- "errordeletemessage": "Error al eliminar el mensaje",
- "errorwhileretrievingcontacts": "Error al recuperar los contactos del servidor.",
- "errorwhileretrievingdiscussions": "Error al recuperar las discusiones del servidor.",
- "errorwhileretrievingmessages": "Error al recuperar mensajes del servidor.",
- "loadpreviousmessages": "Cargar mensajes anteriores",
- "message": "Cuerpo del mensaje",
- "messagenotsent": "El mensaje no fue enviado. Por favor inténtelo nuevamente después.",
- "messagepreferences": "Preferencias de Mensaje",
- "messages": "Mensajes",
- "mustbeonlinetosendmessages": "Usted debe de estar en-linea para enviar mensajes",
- "newmessage": "Nuevo mensaje",
- "newmessages": "Nuevos mensajes",
- "nomessages": "No hay mensajes",
- "nousersfound": "No se encuentran usuarios",
- "removecontact": "Eliminar contacto",
- "removecontactconfirm": "El contacto será quitado de su lista de contactos.",
- "send": "enviar",
- "sendmessage": "Enviar mensaje",
- "type_blocked": "Bloqueado",
- "type_offline": "Fuera-de-línea",
- "type_online": "En-línea",
- "type_search": "Resultados de la búsqueda",
- "type_strangers": "Otros",
- "unblockcontact": "Desbloquear contacto",
- "warningmessagenotsent": "No se pudo enviar mensaje(s) al usuario {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/es.json b/src/addon/messages/lang/es.json
deleted file mode 100755
index b81086eab..000000000
--- a/src/addon/messages/lang/es.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Añadir contacto",
- "blockcontact": "Bloquear contacto",
- "blockcontactconfirm": "Usted dejará de recibir mensajes de este contacto.",
- "blocknoncontacts": "Bloquear mensajes de usuarios que no figuren en mi lista de contactos",
- "contactlistempty": "Lista de contactos vacía",
- "contactname": "Nombre del contacto",
- "contacts": "Contactos",
- "deletemessage": "Eliminar mensaje",
- "deletemessageconfirmation": "¿Está seguro que quiere eliminar este mensaje? Sólo será eliminado de su historial de mensajes y seguirá siendo visible por el usuario que envió o recibió el mensaje.",
- "errordeletemessage": "Error borrando el mensaje.",
- "errorwhileretrievingcontacts": "Error al recuperar los contactos del servidor.",
- "errorwhileretrievingdiscussions": "Error al recuperar las discusiones del servidor.",
- "errorwhileretrievingmessages": "Error al recuperar los mensajes del servidor.",
- "loadpreviousmessages": "Cargar mensajes anteriores",
- "message": "Cuerpo del mensaje",
- "messagenotsent": "El mensaje no fue enviado; por favor inténtelo nuevamente después.",
- "messagepreferences": "Preferencias de mensajes",
- "messages": "Mensajes",
- "mustbeonlinetosendmessages": "Debe conectarse para enviar mensajes",
- "newmessage": "Nuevo mensaje",
- "newmessages": "Nuevos mensajes",
- "nomessages": "Aún no hay mensajes",
- "nousersfound": "No se encuentran usuarios",
- "removecontact": "Eliminar contacto",
- "removecontactconfirm": "El contacto se eliminará de su lista de contactos.",
- "send": "enviar",
- "sendmessage": "Enviar mensaje",
- "type_blocked": "Bloqueado",
- "type_offline": "Desconectado",
- "type_online": "En línea",
- "type_search": "Resultados de la búsqueda",
- "type_strangers": "Otros",
- "unblockcontact": "Desbloquear contacto",
- "warningmessagenotsent": "No se pudo enviar mensaje(s) al usuario {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/eu.json b/src/addon/messages/lang/eu.json
deleted file mode 100755
index 63496514f..000000000
--- a/src/addon/messages/lang/eu.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Gehitu kontaktua",
- "blockcontact": "Blokeatu kontaktua",
- "blockcontactconfirm": "Kontaktu honen mezuak jasotzeari utziko diozu.",
- "blocknoncontacts": "Ez utzi kontaktu ez direnei niri mezuak bidaltzen",
- "contactlistempty": "Kontaktu zerrenda hutsik dago",
- "contactname": "Kontaktuaren izena",
- "contacts": "Kontaktuak",
- "deletemessage": "Ezabatu mezua",
- "deletemessageconfirmation": "Ziur zaude mezu hau ezabatu nahi duzula? Soilik zure mezuen historiatik ezabatuko da, eta mezua bidali edo jaso duen erabiltzaileak ikusgai izaten jarraituko du.",
- "errordeletemessage": "Errorea mezua ezabatzean.",
- "errorwhileretrievingcontacts": "Errore bat gertatu da kontaktuak zerbitzaritik jasotzean.",
- "errorwhileretrievingdiscussions": "Errore bat gertatu da elkarrizketak zerbitzaritik jasotzean.",
- "errorwhileretrievingmessages": "Errore bat gertatu da mezuak zerbitzaritik jasotzean.",
- "loadpreviousmessages": "Kargatu aurreko mezuak",
- "message": "Mezuren gurputza",
- "messagenotsent": "Mezua ez da bidali. Mesedez, saiatu beranduago.",
- "messagepreferences": "Mezuen hobespenak",
- "messages": "Mezuak",
- "mustbeonlinetosendmessages": "On-line egon behar duzu mezuak bidali ahal izateko.",
- "newmessage": "Mezu berria",
- "newmessages": "Mezu beriak",
- "nomessages": "Ez dago mezurik oraindik",
- "nousersfound": "Ez da erabiltzailerik aurkitu",
- "removecontact": "Ezabatu kontaktua",
- "removecontactconfirm": "Kontaktua zure kontaktuen zerrendatik ezabatuko da.",
- "send": "bidali",
- "sendmessage": "Mezua bidali",
- "type_blocked": "Blokeatuta",
- "type_offline": "Lineaz kanpo",
- "type_online": "Online",
- "type_search": "Bilaketaren emaitzak",
- "type_strangers": "Beste batzuk",
- "unblockcontact": "Desblokeatu kontaktua",
- "warningmessagenotsent": "Ezin izan d(ir)a mezua(k) bidali {{user}} erabiltzaileari. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/fa.json b/src/addon/messages/lang/fa.json
deleted file mode 100755
index a6d80f699..000000000
--- a/src/addon/messages/lang/fa.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "addcontact": "افزودن به مخاطبين",
- "blockcontact": "مسدود کردن مخاطب",
- "blocknoncontacts": "افرادی که در لیست مخاطبین من نیستند نتوانند برای من پیام بفرستند",
- "contactlistempty": "لیست مخاطبین شما خالی است",
- "contactname": "نام مخاطب",
- "contacts": "مخاطبین",
- "errorwhileretrievingdiscussions": "خطا در دریافت مباحثهها از کارگزار.",
- "message": "متن پیام",
- "messagepreferences": "ترجیحات پیامدهی",
- "messages": "پیامها",
- "newmessage": "پیام جدید",
- "nomessages": "هنوز پیامی گفته نشده است",
- "nousersfound": "کاربری پیدا نشد",
- "removecontact": "حذف کردن مخاطب",
- "send": "فرستادن",
- "sendmessage": "ارسال پیام",
- "unblockcontact": "خارج کردن مخاطب از حالت مسدود"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/fi.json b/src/addon/messages/lang/fi.json
deleted file mode 100755
index 5deb99834..000000000
--- a/src/addon/messages/lang/fi.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "addcontact": "Lisää kontakti",
- "blockcontact": "Estä kontakti",
- "blockcontactconfirm": "Et saa enää viestejä tältä yhteystietohenkilöltä.",
- "blocknoncontacts": "Estä kaikki viestit, jos lähettäjä ei ole kontaktilistallani",
- "contactlistempty": "Yhteystietolistasi on tyhjä",
- "contactname": "Yhteystiedon nimi",
- "contacts": "Kontaktit",
- "errordeletemessage": "Viestiä poistettaessa tapahtui virhe.",
- "errorwhileretrievingcontacts": "Virhe ladattaessa yhteystietoja palvelimelta.",
- "errorwhileretrievingdiscussions": "Virhe ladattaessa keskusteluja palvelimelta.",
- "errorwhileretrievingmessages": "Virhe ladattaessa viestejä palvelimelta.",
- "loadpreviousmessages": "Lataa aiemmat viestit.",
- "message": "Viesti",
- "messagenotsent": "Viestiä ei lähetetty. Ole hyvä ja yritä uudelleen myöhemmin.",
- "messagepreferences": "Viestien asetukset",
- "messages": "Viestit",
- "mustbeonlinetosendmessages": "Sinun täytyy olla online-tilassa lähettääksesi viestin.",
- "newmessage": "Uusi viesti",
- "newmessages": "Uusia viestejä",
- "nomessages": "Ei odottavia viestejä",
- "nousersfound": "Käyttäjiä ei löytynyt",
- "removecontact": "Poista kontakti",
- "removecontactconfirm": "Tämä yhteystieto poistetaan yhteystietolistaltasi.",
- "send": "lähetä",
- "sendmessage": "Lähetä viesti",
- "type_blocked": "Estetty",
- "type_search": "Hakutulokset",
- "type_strangers": "Muut",
- "unblockcontact": "Salli kontakti",
- "warningmessagenotsent": "Ei voitu lähettää viestiä/viestejä käyttäjälle {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/fr.json b/src/addon/messages/lang/fr.json
deleted file mode 100755
index 65d22afa7..000000000
--- a/src/addon/messages/lang/fr.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Ajouter ce contact",
- "blockcontact": "Bloquer ce contact",
- "blockcontactconfirm": "Vous ne recevrez plus de messages de ce contact.",
- "blocknoncontacts": "Empêcher les utilisateurs hors liste de contacts de m'envoyer des messages personnels",
- "contactlistempty": "La liste des contacts est vide",
- "contactname": "Nom du contact",
- "contacts": "Contacts",
- "deletemessage": "Supprimer le message",
- "deletemessageconfirmation": "Voulez-vous vraiment supprimer ce message ? Il ne sera supprimé que de votre historique des messages, mais sera toujours visible pour l'utilisateur qui l'a envoyé ou reçu.",
- "errordeletemessage": "Erreur lors de la suppression du message.",
- "errorwhileretrievingcontacts": "Erreur lors de la récupération de contacts depuis le serveur.",
- "errorwhileretrievingdiscussions": "Erreur lors de la récupération de discussions depuis le serveur.",
- "errorwhileretrievingmessages": "Erreur lors de la récupération de messages depuis le serveur.",
- "loadpreviousmessages": "Charger les messages antérieurs",
- "message": "Corps du message",
- "messagenotsent": "Ce message n'a pas été envoyé. Veuillez essayer plus tard.",
- "messagepreferences": "Préférences des messages",
- "messages": "Messages",
- "mustbeonlinetosendmessages": "Vous devez être en ligne pour envoyer des messages.",
- "newmessage": "Nouveau message",
- "newmessages": "Nouveaux messages",
- "nomessages": "Pas encore de messages",
- "nousersfound": "Aucun utilisateur n'a été trouvé",
- "removecontact": "Supprimer ce contact",
- "removecontactconfirm": "Le contact sera retiré de votre liste.",
- "send": "Envoyer",
- "sendmessage": "Envoyer message",
- "type_blocked": "Bloqué",
- "type_offline": "Hors connexion",
- "type_online": "En ligne",
- "type_search": "Résultats de recherche",
- "type_strangers": "Autres",
- "unblockcontact": "Débloquer ce contact",
- "warningmessagenotsent": "Impossible d'envoyer de message à l'utilisateur {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/he.json b/src/addon/messages/lang/he.json
deleted file mode 100755
index fb473cf82..000000000
--- a/src/addon/messages/lang/he.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "addcontact": "הוספת איש קשר",
- "blockcontact": "חסימת איש הקשר",
- "blocknoncontacts": "חסימת כל המסרים החדשים מאנשים שלא נמצאים ברשימת אנשי הקשר שלי",
- "contactlistempty": "רשימת אנשי הקשר ריקה",
- "contactname": "שם איש קשר",
- "contacts": "אנשי קשר",
- "deletemessage": "מחיקת מסר",
- "deletemessageconfirmation": "האם הינך בטוח(ה) כי ברצונך למחוק את המסר? המסר ימחק רק מהיסטורית מסרים שלך ועדיין יהיה ניתן לצפות בו מהמשתמש השני שקיבל או שלח את המסר.",
- "errorwhileretrievingcontacts": "שגיאה בזמן טעינת אנשי קשר מהשרת.",
- "errorwhileretrievingdiscussions": "שגיאה בזמן טעינת הדיונים מהשרת.",
- "errorwhileretrievingmessages": "שגיאה בזמן טעינת המסרים מהשרת.",
- "message": "גוף ההודעה",
- "messagenotsent": "מסר זה לא נשלח, אנא נסה שוב מאוחר יותר.",
- "messagepreferences": "העדפות מסרים",
- "messages": "הודעות",
- "mustbeonlinetosendmessages": "עליך להיות מחובר/ת בכדי לשלוח מסר.",
- "newmessage": "הודעה חדשה",
- "nomessages": "אין הודעות עדיין",
- "nousersfound": "לתשומת-לב",
- "removecontact": "הסרת איש הקשר",
- "send": "שליחה",
- "sendmessage": "שליחת הודעה",
- "type_blocked": "חסומים",
- "type_offline": "לא מחוברים",
- "type_online": "מחוברים",
- "type_search": "תוצאות חיפוש",
- "type_strangers": "אחרים",
- "unblockcontact": "ביטול חסימת איש הקשר"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/hr.json b/src/addon/messages/lang/hr.json
deleted file mode 100755
index ef9b4ba2f..000000000
--- a/src/addon/messages/lang/hr.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "addcontact": "Dodaj kontakt",
- "blockcontact": "Blokiraj kontakt",
- "blocknoncontacts": "Blokiraj nepoznate korisnike",
- "contactlistempty": "Vaš adresar je prazan",
- "contacts": "Kontakti",
- "message": "Tijelo poruke",
- "messagepreferences": "Postavke za poruke",
- "messages": "Poruke",
- "newmessage": "Nova poruka",
- "newmessages": "Nove poruke",
- "nomessages": "Nema poruka (još)",
- "nousersfound": "Nema korisnika",
- "removecontact": "Ukloni kontakt",
- "send": "Pošalji",
- "sendmessage": "Slanje poruke",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_strangers": "Ostali",
- "unblockcontact": "Odblokiraj osobu (kontakt)"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/hu.json b/src/addon/messages/lang/hu.json
deleted file mode 100755
index 324fe26fe..000000000
--- a/src/addon/messages/lang/hu.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "addcontact": "Kapcsolat hozzáadása",
- "blockcontact": "Kapcsolat zárolása",
- "blocknoncontacts": "Ismeretlenek üzeneteit ne kapjam meg",
- "contactlistempty": "Kapcsolatainak jegyzéke jelenleg üres.",
- "contactname": "Név a kapcsolattartáshoz",
- "contacts": "Kapcsolatok",
- "deletemessage": "Üzenet törlése",
- "deletemessageconfirmation": "Biztosan törli az üzenetet? Az csak a korábbi üzeneteiből törlődik, az azt küldő vagy fogadó fél továbbra is láthatja.",
- "message": "Üzenet törzsszövege",
- "messagepreferences": "Üzenet beállításai",
- "messages": "Üzenetek",
- "newmessage": "Új üzenet",
- "nomessages": "Még nincs üzenet",
- "nousersfound": "Nincs felhasználó",
- "removecontact": "Kapcsolat törlése",
- "send": "Elküld",
- "sendmessage": "Üzenet küldése",
- "unblockcontact": "Kapcsolat zárolásának feloldása"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/it.json b/src/addon/messages/lang/it.json
deleted file mode 100755
index cb87a15d2..000000000
--- a/src/addon/messages/lang/it.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Aggiungi contatto",
- "blockcontact": "Blocca contatto",
- "blockcontactconfirm": "Non riceverai più messaggi da questo contatto.",
- "blocknoncontacts": "Evita messaggi da parte di utenti che non fanno parte dei miei contatti",
- "contactlistempty": "L'elenco dei contatti è vuoto",
- "contactname": "Nome del contatto",
- "contacts": "Contatti",
- "deletemessage": "Elimina messaggio",
- "deletemessageconfirmation": "Sei sicuro di eliminare questo messaggio? Verrà eliminato solamente dalla storico dei tuoi messaggi rimanendo comunque visibile a coloro che lo hanno ricevuto.",
- "errordeletemessage": "Si è verificato un errore durante l'eliminazione del messaggio.",
- "errorwhileretrievingcontacts": "Si è verificato un errore durante la ricezione dei contatti dal server.",
- "errorwhileretrievingdiscussions": "Si è verificato un errore durante la ricezione delle discussioni dal server.",
- "errorwhileretrievingmessages": "Si è verificato un errore durante la ricezione dei messaggi dal server.",
- "loadpreviousmessages": "Carica messaggi precedenti",
- "message": "Corpo del messaggio",
- "messagenotsent": "Il messaggio non è stato inviato, per favore riprova più tardi.",
- "messagepreferences": "Preferenze messaggi",
- "messages": "Messaggi",
- "mustbeonlinetosendmessages": "Per inviare messaggi devi essere online.",
- "newmessage": "Nuovo messaggio",
- "newmessages": "Nuovi messaggi",
- "nomessages": "Non ci sono ancora messaggi",
- "nousersfound": "Non trovato alcun utente",
- "removecontact": "Cancella contatti",
- "removecontactconfirm": "Il contatto sarà eliminato dalla lista dei contatti.",
- "send": "invia",
- "sendmessage": "Invia messaggio",
- "type_blocked": "Bloccato",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Risultati della ricerca",
- "type_strangers": "Altri",
- "unblockcontact": "Sblocca contatto",
- "warningmessagenotsent": "Non è stato possibile inviare messaggi all'utente {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/ja.json b/src/addon/messages/lang/ja.json
deleted file mode 100755
index 545fd8d51..000000000
--- a/src/addon/messages/lang/ja.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "コンタクトに追加する",
- "blockcontact": "受信拒否",
- "blockcontactconfirm": "この連絡先からのメッセージ受信を停止します。",
- "blocknoncontacts": "不明なユーザをブロックする",
- "contactlistempty": "連絡先リストが空",
- "contactname": "連絡先名称",
- "contacts": "コンタクト",
- "deletemessage": "メッセージを削除する",
- "deletemessageconfirmation": "本当にこのメッセージを削除してもよろしいですか? あなたのメッセージング履歴からのみ削除され、メッセージを送受信したユーザはまだ閲覧することができます。",
- "errordeletemessage": "メッセージ消去中にエラーが発生しました。",
- "errorwhileretrievingcontacts": "サーバから連絡先を取得中にエラーが発生しました。",
- "errorwhileretrievingdiscussions": "サーバからディスカッションを受信中にエラーが発生しました。",
- "errorwhileretrievingmessages": "サーバからメッセージを受信中にエラーが発生しました。",
- "loadpreviousmessages": "以前のメッセージを読み込み",
- "message": "メッセージ本文",
- "messagenotsent": "メッセージは送信されませんでした。後で再び試みてください。",
- "messagepreferences": "メッセージプリファレンス",
- "messages": "メッセージ",
- "mustbeonlinetosendmessages": "メッセージを送信するにはオンラインでなければなりません。",
- "newmessage": "新しいメッセージ",
- "newmessages": "新規メッセージ...",
- "nomessages": "メッセージはありません。",
- "nousersfound": "ユーザは見つかりませんでした。",
- "removecontact": "コンタクトから削除する",
- "removecontactconfirm": "連絡先はあなたの連絡先リストから削除されます。",
- "send": "送信",
- "sendmessage": "メッセージを送信する",
- "type_blocked": "ブロックされています",
- "type_offline": "オフライン",
- "type_online": "オンライン",
- "type_search": "結果の検索",
- "type_strangers": "その他",
- "unblockcontact": "コンタクトの拒否を解除する",
- "warningmessagenotsent": "ユーザ {{user}} へのメッセージ送信ができませんでした。 {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/ko.json b/src/addon/messages/lang/ko.json
deleted file mode 100755
index 0fe6608a0..000000000
--- a/src/addon/messages/lang/ko.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "addcontact": "연락 추가",
- "blockcontact": "연락 차단",
- "blockcontactconfirm": "이 연락처의 메시지는 더 이상 수신되지 않습니다.",
- "blocknoncontacts": "연락처에 없는 사람들이 나에게 메세지 보내는 것 방지",
- "contactlistempty": "연락처가 비어 있습니다.",
- "contactname": "연락처 이름",
- "contacts": "연락처",
- "errordeletemessage": "메시지를 지우는 중 오류 발생",
- "errorwhileretrievingcontacts": "서버에서 연락처를 검색하는 동안 오류 발생",
- "errorwhileretrievingdiscussions": "서버에서 토론을 가져 오는 중에 오류 발생",
- "errorwhileretrievingmessages": "서버에서 메시지를 검색하는 중 오류 발생",
- "loadpreviousmessages": "이전 메시지 로드",
- "message": "메세지 내용",
- "messagenotsent": "메시지가 전송되지 않았습니다. 다시 시도해 주세요.",
- "messages": "메시지",
- "mustbeonlinetosendmessages": "메시지를 전송하기 위해서는 온라인 상태여야 합니다.",
- "newmessages": "새로운 메시지",
- "nomessages": "아직 메시지 없음",
- "nousersfound": "사용자 없음",
- "removecontact": "연락처 제거",
- "removecontactconfirm": "연락처가 연락처 목록에서 제거됩니다.",
- "send": "전송",
- "sendmessage": "메세지 보내기",
- "type_blocked": "차단된",
- "type_offline": "오프라인",
- "type_online": "온라인",
- "type_search": "검색 결과",
- "type_strangers": "기타",
- "unblockcontact": "차단되지 않은 연락처",
- "warningmessagenotsent": "{{user}} 사용자에게 메시지를 보낼 수 없습니다. {{오류}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/lt.json b/src/addon/messages/lang/lt.json
deleted file mode 100755
index 0f808f5de..000000000
--- a/src/addon/messages/lang/lt.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "addcontact": "Įtraukti kontaktą",
- "blockcontact": "Blokuoti kontaktą",
- "blocknoncontacts": "Neleisti neįtrauktiems į kontaktų sąrašą asmenims siųsti man žinutes",
- "contactlistempty": "Kontaktų sąrašas tuščias",
- "contactname": "Kontaktas",
- "contacts": "Kontaktai",
- "errordeletemessage": "Klaida trinant žinutes.",
- "errorwhileretrievingcontacts": "Klaida nuskaitant kontaktus iš serverio.",
- "errorwhileretrievingdiscussions": "Klaida nuskaitant diskusijas iš serverio.",
- "errorwhileretrievingmessages": "Klaida nuskaitant pranešimus iš serverio.",
- "message": "Pranešimo tekstas",
- "messagenotsent": "Žinutė nebuvo išsiųsta, pabandykite vėliau.",
- "messagepreferences": "Žinučių nuostatos",
- "messages": "Žinutės",
- "mustbeonlinetosendmessages": "Norėdamas išsiųsti žinutę, turite prisijungti",
- "newmessage": "Nauja žinutė",
- "nomessages": "Nėra žinučių",
- "nousersfound": "Nerasta naudotojų",
- "removecontact": "Pašalinti kontaktą",
- "send": "siųsti",
- "sendmessage": "Siųsti žinutę",
- "type_blocked": "Užblokuota",
- "type_offline": "Neprisjungęs",
- "type_online": "Prisijungęs",
- "type_search": "Paieška",
- "type_strangers": "Kita",
- "unblockcontact": "Atblokuoti kontaktą",
- "warningmessagenotsent": "Žinutė {{user}} vartotojui neišsiųsta. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/mr.json b/src/addon/messages/lang/mr.json
deleted file mode 100755
index 4746a2507..000000000
--- a/src/addon/messages/lang/mr.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "addcontact": "संपर्क भरा",
- "blockcontact": "संपर्क थांबवा",
- "blockcontactconfirm": "आपण या संपर्कातून संदेश प्राप्त करणे थांबवाल.",
- "blocknoncontacts": "माझ्या संपर्क यादीमध्ये नसलेल्या लोकांकडून येणारे सर्व नविन संदेश थांबवा",
- "contactlistempty": "संपर्क यादी रिक्त आहे",
- "contactname": "संपर्क नाव",
- "contacts": "संपर्क",
- "errordeletemessage": "संदेश हटवताना त्रुटी.",
- "errorwhileretrievingcontacts": "सर्व्हरवरून संपर्क पुनर्प्राप्त करताना त्रुटी.",
- "errorwhileretrievingdiscussions": "सर्व्हरवरून चर्चा पुनर्प्राप्त करताना त्रुटी.",
- "errorwhileretrievingmessages": "सर्व्हरवरून संदेश पुनर्प्राप्त करताना त्रुटी.",
- "loadpreviousmessages": "मागील संदेश लोड करा",
- "message": "संदेश",
- "messagenotsent": "संदेश पाठविला गेला नाही, कृपया नंतर पुन्हा प्रयत्न करा.",
- "messages": "संदेश",
- "mustbeonlinetosendmessages": "आपल्याला संदेश पाठविण्यासाठी ऑनलाइन असणे आवश्यक आहे",
- "newmessages": "नवीन संदेश",
- "nomessages": "प्रतीक्षा सुचीमध्ये संदेश नाहीत",
- "nousersfound": "युजर सापडत नाहीत",
- "removecontact": "संपर्क काढुन टाका",
- "removecontactconfirm": "आपल्या संपर्क यादीतून संपर्क काढला जाईल.",
- "sendmessage": "संदेश पाठवा",
- "type_blocked": "अवरोधित केले",
- "type_offline": "ऑफलाइन",
- "type_online": "ऑनलाइन",
- "type_search": "शोध परिणाम",
- "type_strangers": "इतर",
- "unblockcontact": "संपर्क सुरू करा",
- "warningmessagenotsent": "वापरकर्ता {{user}} ला संदेश पाठवू शकला नाही. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/nl.json b/src/addon/messages/lang/nl.json
deleted file mode 100755
index a6059a8c5..000000000
--- a/src/addon/messages/lang/nl.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Voeg contactpersoon toe",
- "blockcontact": "Blokkeer contactpersoon",
- "blockcontactconfirm": "Je zult geen berichten meer krijgen van deze contactpersoon.",
- "blocknoncontacts": "Blokkeer gebruikers die niet op mijn contactenlijst staan",
- "contactlistempty": "De contactenlijst is leeg",
- "contactname": "Naam",
- "contacts": "Contactpersonen",
- "deletemessage": "Verwijder bericht",
- "deletemessageconfirmation": "Weet je zeker dat je dit bericht wil verwijderen? Het zal alleen verwijderd worden van je berichtengeschiedenis. Het zal nog zichtbaar blijven voor de gebruiker die het bericht verstuurd of ontvangen heeft.",
- "errordeletemessage": "Fout bij het verwijderen van het bericht.",
- "errorwhileretrievingcontacts": "Fout bij het ophalen van contacten van de server.",
- "errorwhileretrievingdiscussions": "Fout bij het ophalen van discussies van de server.",
- "errorwhileretrievingmessages": "Fout bij het ophalen van berichten van de server.",
- "loadpreviousmessages": "Laad vorige berichten",
- "message": "Berichtinhoud",
- "messagenotsent": "Het bericht is niet verzonden. Probeer het later opnieuw.",
- "messagepreferences": "Berichten voorkeuren",
- "messages": "Berichten",
- "mustbeonlinetosendmessages": "Je moet online zijn om berichten te versturen",
- "newmessage": "Nieuw bericht",
- "newmessages": "Nieuwe berichten",
- "nomessages": "Nog geen berichten",
- "nousersfound": "Geen gebruikers gevonden",
- "removecontact": "Verwijder contactpersoon",
- "removecontactconfirm": "Contact zal verwijderd worden van je contactenlijst.",
- "send": "Stuur",
- "sendmessage": "Stuur bericht",
- "type_blocked": "Geblokkeerd",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Zoekresultaten",
- "type_strangers": "Anderen",
- "unblockcontact": "deblokkeer deze contactpersoon",
- "warningmessagenotsent": "Kon bericht(en) niet versturen naar gebruiker {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/no.json b/src/addon/messages/lang/no.json
deleted file mode 100755
index 17dc96bf2..000000000
--- a/src/addon/messages/lang/no.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "addcontact": "Legg til kontakt",
- "blockcontact": "Blokker kontakten",
- "blockcontactconfirm": "Du vil slutte å motta meldinger fra denne kontakten",
- "blocknoncontacts": "Blokker alle beskjeder fra folk som ikke er på kontaklisten min",
- "contactlistempty": "Kontaktlisten er tom",
- "contactname": "Navn på kontakt",
- "contacts": "Kontakter",
- "errordeletemessage": "Feil ved sletting av melding",
- "errorwhileretrievingcontacts": "Feil ved henting av kontakter fra server",
- "errorwhileretrievingdiscussions": "Feil ved henting av diskusjoner fra server",
- "errorwhileretrievingmessages": "Feil ved henting av meldinger fra server",
- "loadpreviousmessages": "Last forrige meldinger",
- "message": "Meldingsteksten",
- "messagenotsent": "Meldingen ble ikke sendt. Prøv igjen senere",
- "messagepreferences": "Meldingspreferanser",
- "messages": "Beskjeder",
- "mustbeonlinetosendmessages": "Du må være på nett for å sende meldinger",
- "newmessage": "Ny melding",
- "newmessages": "Nye meldinger",
- "nomessages": "Ingen beskjeder ennå",
- "nousersfound": "Ingen brukere funnet",
- "removecontact": "Fjern kontakt",
- "removecontactconfirm": "Kontakten vil bli fjernet fra kontaktlisten",
- "send": "Send",
- "sendmessage": "Send melding",
- "type_blocked": "Blokkert",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Søkeresultat",
- "type_strangers": "Andre",
- "unblockcontact": "Opphev blokkering av kontakt",
- "warningmessagenotsent": "Kunne ikke sende melding(er) til {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/pl.json b/src/addon/messages/lang/pl.json
deleted file mode 100755
index a0b20dc95..000000000
--- a/src/addon/messages/lang/pl.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "addcontact": "Dodaj kontakt",
- "blockcontact": "Blokuj kontakt",
- "blocknoncontacts": "Blokuj wiadomości od użytkowników spoza listy kontaktów",
- "contactlistempty": "Lista kontaktów jest pusta",
- "contactname": "Nazwa kontaktu",
- "contacts": "Kontakty",
- "deletemessage": "Usuń wiadomość",
- "deletemessageconfirmation": "Czy jesteś pewien, że chcesz usunąć tę wiadomość? Zostanie ona usunięta wyłącznie z twojej historii wiadomości, użytkownik który ją wysłał lub odebrał nadal będzie mógł ją wyświetlić.",
- "message": "Treść wiadomości",
- "messagepreferences": "Preferencje wiadomości",
- "messages": "Wiadomości",
- "newmessage": "Nowa wiadomość",
- "nomessages": "Brak wiadomości",
- "nousersfound": "Nie znaleziono użytkowników",
- "removecontact": "Usuń kontakt",
- "send": "wyślij",
- "sendmessage": "Wyślij wiadomość",
- "unblockcontact": "Odblokuj kontakt"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/pt-br.json b/src/addon/messages/lang/pt-br.json
deleted file mode 100755
index fdebbcdec..000000000
--- a/src/addon/messages/lang/pt-br.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Acrescentar Contato",
- "blockcontact": "Bloquear contato",
- "blockcontactconfirm": "Você deixará de receber mensagens deste contato.",
- "blocknoncontacts": "Bloquear todas as mensagens de quem não estiver na minha lista de contatos",
- "contactlistempty": "A lista de contatos está vaiza",
- "contactname": "Nome do contato",
- "contacts": "Contatos",
- "deletemessage": "Excluir mensagem",
- "deletemessageconfirmation": "Tem certeza de que deseja excluir esta mensagem? Ela só será excluída do seu histórico de mensagens e ainda poderá ser vista pelo usuário que enviou ou recebeu a mensagem.",
- "errordeletemessage": "Erro enquanto excluía a mensagem.",
- "errorwhileretrievingcontacts": "Erro ao recuperar contatos a partir do servidor.",
- "errorwhileretrievingdiscussions": "Erro ao recuperar discussão do servidor.",
- "errorwhileretrievingmessages": "Erro ao recuperar as mensagens do servidor.",
- "loadpreviousmessages": "Carregar mensagens anteriores",
- "message": "Corpo da mensagem",
- "messagenotsent": "A mensagem não foi enviada. Por favor tente novamente mais tarde.",
- "messagepreferences": "Preferências de mensagens",
- "messages": "Mensagens",
- "mustbeonlinetosendmessages": "Você precisa estar conectado para enviar mensagens.",
- "newmessage": "Nova Mensagem",
- "newmessages": "Novas mensagens",
- "nomessages": "Sem novas mensagens",
- "nousersfound": "Nenhum usuário encontrado",
- "removecontact": "Eliminar contato",
- "removecontactconfirm": "O contato será removido da sua lista de contatos.",
- "send": "enviar",
- "sendmessage": "Enviar mensagem",
- "type_blocked": "Bloqueado",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Resultados de busca",
- "type_strangers": "Outros",
- "unblockcontact": "Desbloquear contato",
- "warningmessagenotsent": "Não pode enviar mensagem(s) para o usuário {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/pt.json b/src/addon/messages/lang/pt.json
deleted file mode 100755
index 71a811502..000000000
--- a/src/addon/messages/lang/pt.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Adicionar contacto",
- "blockcontact": "Bloquear contacto",
- "blockcontactconfirm": "Não irá receber mais mensagens deste contacto.",
- "blocknoncontacts": "Bloquear mensagens de pessoas que não estão na minha lista de contactos",
- "contactlistempty": "A lista de contactos está vazia",
- "contactname": "Nome do contacto",
- "contacts": "Contactos",
- "deletemessage": "Apagar mensagem",
- "deletemessageconfirmation": "Tem a certeza que deseja apagar esta mensagem? A mesma será apagada apenas do seu histórico de mensagens, continuando visível para o utilizador que a enviou ou que recebeu a mensagem.",
- "errordeletemessage": "Erro ao eliminar a mensagem.",
- "errorwhileretrievingcontacts": "Erro ao obter contactos do servidor.",
- "errorwhileretrievingdiscussions": "Erro ao obter tópicos de discussão do servidor.",
- "errorwhileretrievingmessages": "Erro ao obter mensagens do servidor.",
- "loadpreviousmessages": "Carregar mensagens antigas",
- "message": "Corpo da mensagem",
- "messagenotsent": "A mensagem não foi enviada. Tente novamente mais tarde.",
- "messagepreferences": "Preferências das mensagens",
- "messages": "Mensagens",
- "mustbeonlinetosendmessages": "Precisa de estar online para enviar mensagens.",
- "newmessage": "Nova mensagem",
- "newmessages": "Novas mensagens",
- "nomessages": "Sem mensagens",
- "nousersfound": "Nenhum utilizador encontrado",
- "removecontact": "Remover contacto",
- "removecontactconfirm": "O contacto será removido da sua lista de contactos.",
- "send": "Enviar",
- "sendmessage": "Enviar mensagem",
- "type_blocked": "Bloqueado",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Resultados da pesquisa",
- "type_strangers": "Outros",
- "unblockcontact": "Desbloquear contacto",
- "warningmessagenotsent": "Não foi possível enviar mensagens ao utilizador {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/ro.json b/src/addon/messages/lang/ro.json
deleted file mode 100755
index 551e062e9..000000000
--- a/src/addon/messages/lang/ro.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "addcontact": "Adaugă prieten",
- "blockcontact": "Blochează această persoană",
- "blocknoncontacts": "Blochează toate mesajele noi de la persoane care nu se află în lista mea de prieteni",
- "contactlistempty": "Lista de contacte este goală",
- "contactname": "Nume contact",
- "contacts": "Prieteni",
- "deletemessage": "Șterge mesaj",
- "deletemessageconfirmation": "Sunteți sigur că doriți să ștergeți acest mesaj? Va fi șters numai din istoricul mesajelor și va fi în continuare vizibil de către utilizatorul care a trimis sau a primit mesajul.",
- "errordeletemessage": "Eroare la ștergerea mesajului.",
- "errorwhileretrievingcontacts": "A apărut o eroare în găsirea contactelor pe server.",
- "errorwhileretrievingdiscussions": "A apărut o eroare în găsirea conversațiilor de pe server.",
- "errorwhileretrievingmessages": "A apărut o eroare în găsirea mesajelor de pe server.",
- "message": "Conținut mesaj",
- "messagenotsent": "Mesajul nu a fost expediat, vă rugăm să încercați mai târziu.",
- "messages": "Mesaje",
- "mustbeonlinetosendmessages": "Trebuie să fiți online pentru a putea trimite mesaje",
- "newmessage": "Mesaj nou",
- "nomessages": "Nu există mesaje în aşteptare",
- "nousersfound": "Nu s-au găsit utilizatori",
- "removecontact": "Şterge prieten din listă",
- "send": "Trimis",
- "sendmessage": "Trimite mesaj",
- "type_blocked": "Blocat",
- "type_offline": "Deconectat",
- "type_online": "Conectat",
- "type_search": "Caută rezultatele",
- "type_strangers": "Alții",
- "unblockcontact": "Deblochează utilizator"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/ru.json b/src/addon/messages/lang/ru.json
deleted file mode 100755
index 5d4238cfd..000000000
--- a/src/addon/messages/lang/ru.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "addcontact": "Добавить собеседника",
- "blockcontact": "Блокировать сообщения от этого человека",
- "blockcontactconfirm": "Вы больше не будете получать сообщения от этого контакта.",
- "blocknoncontacts": "Не принимать сообщения от людей, которых нет в списке моих собеседников",
- "contactlistempty": "Список контактов пуст",
- "contactname": "Имя контакта",
- "contacts": "Собеседники",
- "deletemessage": "Удалить сообщение",
- "deletemessageconfirmation": "Вы уверены, что хотите удалить данное сообщение? Сообщение будет удалено лишь из списка сообщений и будет доступно для просмотра отправителем или получателем.",
- "errordeletemessage": "Ошибка при удалении сообщения.",
- "errorwhileretrievingcontacts": "Ошибка при извлечении контактов с сервера.",
- "errorwhileretrievingdiscussions": "Ошибка при получении обсуждений с сервера.",
- "errorwhileretrievingmessages": "Ошибка при получении сообщений с сервера.",
- "loadpreviousmessages": "Загрузить предыдущее сообщение",
- "message": "Текст сообщения",
- "messagenotsent": "Сообщение не было отправлено. Пожалуйста, повторите попытку позже.",
- "messagepreferences": "Настройки сообщений",
- "messages": "Сообщения",
- "mustbeonlinetosendmessages": "Вы должны быть подключены к сети, чтобы отправлять сообщения.",
- "newmessage": "Новое сообщение",
- "newmessages": "Новые сообщения",
- "nomessages": "Нет ни одного сообщения",
- "nousersfound": "Пользователи не найдены",
- "removecontact": "Удалить собеседника из моего списка",
- "removecontactconfirm": "Контакт будет удалён из вашего списка контактов.",
- "send": "Отправить",
- "sendmessage": "Отправить сообщение",
- "type_blocked": "Заблокировано",
- "type_offline": "Вне сайта",
- "type_online": "На сайте",
- "type_search": "Результаты поиска",
- "type_strangers": "Другие",
- "unblockcontact": "Разблокировать сообщения от этого собеседника",
- "warningmessagenotsent": "Не получилось отправить сообщение(я) пользователю {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/sr-cr.json b/src/addon/messages/lang/sr-cr.json
deleted file mode 100755
index 18a467fa4..000000000
--- a/src/addon/messages/lang/sr-cr.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "addcontact": "Додај контакт",
- "blockcontact": "Блокирај контакт",
- "blockcontactconfirm": "Нећете више добијати поруке од ове особе.",
- "blocknoncontacts": "Блокирај све нове поруке од корисника који нису на мојој листи контаката",
- "contactlistempty": "Листа контаката је празна",
- "contactname": "Име особе",
- "contacts": "Контакти",
- "errordeletemessage": "Грешка приликом брисања поруке.",
- "errorwhileretrievingcontacts": "Грешка приликом преузимања контаката са сервера.",
- "errorwhileretrievingdiscussions": "Грешка приликом преузимања дискусија са сервера.",
- "errorwhileretrievingmessages": "Грешка приликом преузимања порука са сервера.",
- "loadpreviousmessages": "Учитај претходне поруке",
- "message": "Тело поруке",
- "messagenotsent": "Порука није послата. Молимо, покушајте поново касније.",
- "messagepreferences": "Параметри порука",
- "messages": "Поруке",
- "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке",
- "newmessage": "Нове поруке...",
- "newmessages": "Нове поруке",
- "nomessages": "Нема порука.",
- "nousersfound": "Није пронађен ниједан корисник",
- "removecontact": "Обриши контакт",
- "removecontactconfirm": "Особа ће бити уклоњена са ваше листе контаката.",
- "send": "Пошаљи",
- "sendmessage": "Пошаљи поруку",
- "type_blocked": "Блокиран",
- "type_offline": "Офлајн",
- "type_online": "Онлајн",
- "type_search": "Резултати претраге",
- "type_strangers": "Други",
- "unblockcontact": "Одблокирај контакт",
- "warningmessagenotsent": "Није могуће послати поруку/е кориснику {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/sr-lt.json b/src/addon/messages/lang/sr-lt.json
deleted file mode 100755
index 3d5a353c5..000000000
--- a/src/addon/messages/lang/sr-lt.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "addcontact": "Dodaj kontakt",
- "blockcontact": "Blokiraj kontakt",
- "blockcontactconfirm": "Nećete više dobijati poruke od ove osobe.",
- "blocknoncontacts": "Blokiraj sve nove poruke od korisnika koji nisu na mojoj listi kontakata",
- "contactlistempty": "Lista kontakata je prazna",
- "contactname": "Ime osobe",
- "contacts": "Kontakti",
- "errordeletemessage": "Greška prilikom brisanja poruke.",
- "errorwhileretrievingcontacts": "Greška prilikom preuzimanja kontakata sa servera.",
- "errorwhileretrievingdiscussions": "Greška prilikom preuzimanja diskusija sa servera.",
- "errorwhileretrievingmessages": "Greška prilikom preuzimanja poruka sa servera.",
- "loadpreviousmessages": "Učitaj prethodne poruke",
- "message": "Telo poruke",
- "messagenotsent": "Poruka nije poslata. Molimo, pokušajte ponovo kasnije.",
- "messagepreferences": "Parametri poruka",
- "messages": "Poruke",
- "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke",
- "newmessage": "Nove poruke...",
- "newmessages": "Nove poruke",
- "nomessages": "Nema poruka.",
- "nousersfound": "Nije pronađen nijedan korisnik",
- "removecontact": "Obriši kontakt",
- "removecontactconfirm": "Osoba će biti uklonjena sa vaše liste kontakata.",
- "send": "Pošalji",
- "sendmessage": "Pošalji poruku",
- "type_blocked": "Blokiran",
- "type_offline": "Oflajn",
- "type_online": "Onlajn",
- "type_search": "Rezultati pretrage",
- "type_strangers": "Drugi",
- "unblockcontact": "Odblokiraj kontakt",
- "warningmessagenotsent": "Nije moguće poslati poruku/e korisniku {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/sv.json b/src/addon/messages/lang/sv.json
deleted file mode 100755
index 46c8195fc..000000000
--- a/src/addon/messages/lang/sv.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "addcontact": "Lägg till kontakt",
- "blockcontact": "Blockera kontakt",
- "blocknoncontacts": "Blockera alla nya meddelanden från personer som inte finns med på min kontaktlista.",
- "contactlistempty": "kontaktlista är tom",
- "contactname": "Kontakt namn",
- "contacts": "Kontakter",
- "deletemessage": "Radera meddelande",
- "deletemessageconfirmation": "Vill du verkligen radera detta meddelande?\nDet kommer bara att raderas från din egen meddelandehistorik. Användaren som har skickat/fått meddelandet kan fortfarande se det.",
- "errordeletemessage": "Fel vid borttagning av meddelandet",
- "errorwhileretrievingcontacts": "Fel vid hämtning av kontakter från servern.",
- "errorwhileretrievingdiscussions": "Fel vid hämtning av diskussionerna från servern.",
- "errorwhileretrievingmessages": "Fel vid hämtning meddelanden från servern.",
- "message": "Meddelandets brödtext",
- "messagenotsent": "Meddelandet skickades inte, försök igen senare.",
- "messagepreferences": "Välj inställningar för meddelanden",
- "messages": "Meddelanden",
- "mustbeonlinetosendmessages": "Du måste vara online för att skicka meddelanden",
- "newmessage": "Nytt meddelande",
- "nomessages": "Inga meddelanden än",
- "nousersfound": "Det gick inte att hitta några användare",
- "removecontact": "Ta bort kontakt",
- "send": "skicka",
- "sendmessage": "Skicka meddelande",
- "type_blocked": "blockerad",
- "type_offline": "Offline",
- "type_online": "Online",
- "type_search": "Sökresultat",
- "type_strangers": "Andra",
- "unblockcontact": "Ta bort blockering av användare"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/tg.json b/src/addon/messages/lang/tg.json
deleted file mode 100755
index 56bdcf78c..000000000
--- a/src/addon/messages/lang/tg.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "addcontact": "Ҳамсӯҳбат илова карда шавад",
- "blockcontact": "Бастани тамос",
- "blocknoncontacts": "Мактубчаҳо аз касоне ки дар рӯйхати ҳамсӯҳбатони ман нестанд, қабул карда нашаванд",
- "contacts": "Ҳамсӯҳбатон",
- "message": "Мактубча",
- "messagepreferences": "Хусусиятҳои паём",
- "messages": "Мактубчаҳо",
- "newmessage": "Паёми нав",
- "newmessages": "Паёмҳои нав",
- "nomessages": "Мактубчаҳои нав нестанд",
- "nousersfound": "Корбарон ёфт нашудаанд",
- "removecontact": "Ҳамсӯҳбат аз рӯйхати ман нест карда шавад",
- "send": "Фиристода шавад",
- "sendmessage": "Мактубча фиристода шавад",
- "type_offline": "Офлайн",
- "type_online": "Онлайн",
- "type_search": "Натиҷаҳои ҷустуҷӯ",
- "unblockcontact": "Мактубчаҳо аз ин ҳамсӯҳбат аз масдудкунӣ кушода шаванд"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/tr.json b/src/addon/messages/lang/tr.json
deleted file mode 100755
index 05abab807..000000000
--- a/src/addon/messages/lang/tr.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "addcontact": "Kişi ekle",
- "blockcontact": "Kişiyi engelle",
- "blocknoncontacts": "Tanımadığım kullanıcıları engelle",
- "contactlistempty": "Kişi listeniz şu anda boş",
- "contactname": "Adı",
- "contacts": "Kişiler",
- "message": "Mesaj gövdesi",
- "messagepreferences": "İleti tercihleri",
- "messages": "Mesajlar",
- "mustbeonlinetosendmessages": "İleti gönderebilmek için çevrimiçi olmanız gerekir",
- "newmessage": "Yeni ileti",
- "newmessages": "Yeni ileti",
- "nomessages": "Yeni ileti yok",
- "nousersfound": "Kullanıcı bulunamadı",
- "removecontact": "Kişiyi sil",
- "send": "Gönder",
- "sendmessage": "Mesaj gönder",
- "type_blocked": "Engellendi",
- "type_offline": "Çevrimdışı",
- "type_online": "Çevrimiçi",
- "type_search": "Arama sonuçları",
- "type_strangers": "Diğer",
- "unblockcontact": "Engeli kaldır"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/uk.json b/src/addon/messages/lang/uk.json
deleted file mode 100755
index d562482c2..000000000
--- a/src/addon/messages/lang/uk.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "addcontact": "Додати контакт",
- "blockcontact": "Заблокувати контакт",
- "blockcontactconfirm": "Ви не будете отримувати повідомлення від цього контакту.",
- "blocknoncontacts": "Запобігти повідомленням, що не в моїх контактах",
- "contactlistempty": "Список контактів порожній",
- "contactname": "Ім'я контакту",
- "contacts": "Контакти",
- "errordeletemessage": "Помилка при видаленні повідомлення.",
- "errorwhileretrievingcontacts": "Помилка при отриманні контактів з сервера.",
- "errorwhileretrievingdiscussions": "Помилка при отриманні обговорення з сервера.",
- "errorwhileretrievingmessages": "Помилка при отриманні повідомлень від сервера.",
- "loadpreviousmessages": "Завантаження попередніх повідомлень",
- "message": "Текст повідомлення",
- "messagenotsent": "Повідомлення не було відправлено, будь ласка, спробуйте ще раз пізніше.",
- "messages": "Повідомлення",
- "mustbeonlinetosendmessages": "Ви повинні бути онлайн, щоб відправляти повідомлення",
- "newmessage": "Нове повідомлення...",
- "newmessages": "Нові повідомлення",
- "nomessages": "Ще немає повідомлень",
- "nousersfound": "Користувачів не знайдено",
- "removecontact": "Видалити контакт",
- "removecontactconfirm": "Контакт буде видалено зі списку контактів.",
- "send": "Відіслати",
- "sendmessage": "Надіслати повідомлення",
- "type_blocked": "Заблоковано",
- "type_offline": "Офлайн",
- "type_online": "Онлайн",
- "type_search": "Результати пошуку",
- "type_strangers": "Інші",
- "unblockcontact": "Розблокувати контакт",
- "warningmessagenotsent": "Неможливо відправити повідомлення до {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/zh-cn.json b/src/addon/messages/lang/zh-cn.json
deleted file mode 100755
index fa7d75993..000000000
--- a/src/addon/messages/lang/zh-cn.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "addcontact": "添加联系人",
- "blockcontact": "屏蔽联系人",
- "blocknoncontacts": "禁止不在联系人中的用户给我发消息",
- "contactlistempty": "您的联系人名单是空的",
- "contactname": "联系人",
- "contacts": "联系人",
- "deletemessage": "删除消息",
- "message": "正文",
- "messages": "消息",
- "nomessages": "没有新消息",
- "nousersfound": "未找到用户",
- "removecontact": "删除联系人",
- "send": "发送",
- "sendmessage": "发送消息",
- "unblockcontact": "不再阻拦联系人"
-}
\ No newline at end of file
diff --git a/src/addon/messages/lang/zh-tw.json b/src/addon/messages/lang/zh-tw.json
deleted file mode 100755
index 60b1bfa8d..000000000
--- a/src/addon/messages/lang/zh-tw.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "addcontact": "增加聯絡人",
- "blockcontact": "封鎖聯絡人",
- "blocknoncontacts": "僅接收通訊錄中的使用者所發送的簡訊。(其他都拒收)",
- "contactlistempty": "聯絡人清單沒有資料",
- "contactname": "聯絡人名稱",
- "contacts": "通訊錄",
- "deletemessage": "刪除簡訊",
- "deletemessageconfirmation": "你確定要刪除這一簡訊?它只會從你的簡訊歷史紀錄上刪除,但是那發送或接收這一簡訊的用戶仍可以看得到。",
- "errordeletemessage": "刪除訊息時發生錯誤.",
- "errorwhileretrievingcontacts": "從伺服器存取聯絡人時出錯",
- "errorwhileretrievingdiscussions": "從伺服器存取討論區時出錯",
- "errorwhileretrievingmessages": "從伺服器存取訊息時出錯",
- "message": "訊息",
- "messagenotsent": "訊息未發送, 請稍後再試.",
- "messagepreferences": "簡訊偏好",
- "messages": "簡訊",
- "mustbeonlinetosendmessages": "您必須上線才能發送訊息",
- "newmessage": "新簡訊",
- "nomessages": "尚無訊息",
- "nousersfound": "沒有使用者",
- "removecontact": "刪除聯絡人",
- "send": "送出",
- "sendmessage": "傳送簡訊",
- "type_blocked": "已停止",
- "type_offline": "離線",
- "type_online": "上線",
- "type_search": "搜尋結果",
- "type_strangers": "其他",
- "unblockcontact": "不再封鎖聯絡",
- "warningmessagenotsent": "無法傳送訊息給使用者 {{user}}. {{error}}"
-}
\ No newline at end of file
diff --git a/src/addon/messages/messages.module.ts b/src/addon/messages/messages.module.ts
index 5413893ae..43b3609c6 100644
--- a/src/addon/messages/messages.module.ts
+++ b/src/addon/messages/messages.module.ts
@@ -25,6 +25,7 @@ import { CoreCronDelegate } from '@providers/cron';
import { AddonMessagesSendMessageUserHandler } from './providers/user-send-message-handler';
import { AddonMessagesAddContactUserHandler } from './providers/user-add-contact-handler';
import { AddonMessagesBlockContactUserHandler } from './providers/user-block-contact-handler';
+import { AddonMessagesContactRequestLinkHandler } from './providers/contact-request-link-handler';
import { AddonMessagesDiscussionLinkHandler } from './providers/discussion-link-handler';
import { AddonMessagesIndexLinkHandler } from './providers/index-link-handler';
import { AddonMessagesSyncCronHandler } from './providers/sync-cron-handler';
@@ -58,6 +59,7 @@ export const ADDON_MESSAGES_PROVIDERS: any[] = [
AddonMessagesSendMessageUserHandler,
AddonMessagesAddContactUserHandler,
AddonMessagesBlockContactUserHandler,
+ AddonMessagesContactRequestLinkHandler,
AddonMessagesDiscussionLinkHandler,
AddonMessagesIndexLinkHandler,
AddonMessagesSyncCronHandler,
@@ -74,11 +76,13 @@ export class AddonMessagesModule {
sitesProvider: CoreSitesProvider, linkHelper: CoreContentLinksHelperProvider, updateManager: CoreUpdateManagerProvider,
settingsHandler: AddonMessagesSettingsHandler, settingsDelegate: CoreSettingsDelegate,
pushNotificationsDelegate: AddonPushNotificationsDelegate, utils: CoreUtilsProvider,
- addContactHandler: AddonMessagesAddContactUserHandler, blockContactHandler: AddonMessagesBlockContactUserHandler) {
+ addContactHandler: AddonMessagesAddContactUserHandler, blockContactHandler: AddonMessagesBlockContactUserHandler,
+ contactRequestLinkHandler: AddonMessagesContactRequestLinkHandler) {
// Register handlers.
mainMenuDelegate.registerHandler(mainmenuHandler);
contentLinksDelegate.registerHandler(indexLinkHandler);
contentLinksDelegate.registerHandler(discussionLinkHandler);
+ contentLinksDelegate.registerHandler(contactRequestLinkHandler);
userDelegate.registerHandler(sendMessageHandler);
userDelegate.registerHandler(addContactHandler);
userDelegate.registerHandler(blockContactHandler);
@@ -103,7 +107,14 @@ export class AddonMessagesModule {
}
messagesProvider.invalidateDiscussionsCache(notification.site).finally(() => {
- linkHelper.goInSite(undefined, 'AddonMessagesIndexPage', undefined, notification.site);
+ // Check if group messaging is enabled, to determine which page should be loaded.
+ messagesProvider.isGroupMessagingEnabledInSite(notification.site).then((enabled) => {
+ let pageName = 'AddonMessagesIndexPage';
+ if (enabled) {
+ pageName = 'AddonMessagesGroupConversationsPage';
+ }
+ linkHelper.goInSite(undefined, pageName, undefined, notification.site);
+ });
});
});
});
@@ -117,7 +128,10 @@ export class AddonMessagesModule {
// Register push notification clicks.
pushNotificationsDelegate.on('click').subscribe((notification) => {
if (utils.isFalseOrZero(notification.notif)) {
- notificationClicked(notification);
+ // Execute the callback in the Angular zone, so change detection doesn't stop working.
+ zone.run(() => {
+ notificationClicked(notification);
+ });
return true;
}
diff --git a/src/addon/messages/pages/contacts/contacts.html b/src/addon/messages/pages/contacts/contacts.html
new file mode 100644
index 000000000..1316bd027
--- /dev/null
+++ b/src/addon/messages/pages/contacts/contacts.html
@@ -0,0 +1,28 @@
+
+
+ {{ 'addon.messages.contacts' | translate }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/addon/messages/pages/contacts/contacts.module.ts b/src/addon/messages/pages/contacts/contacts.module.ts
new file mode 100644
index 000000000..a69ec60b7
--- /dev/null
+++ b/src/addon/messages/pages/contacts/contacts.module.ts
@@ -0,0 +1,37 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonMessagesContactsPage } from './contacts';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+import { CorePipesModule } from '@pipes/pipes.module';
+import { AddonMessagesComponentsModule } from '../../components/components.module';
+
+@NgModule({
+ declarations: [
+ AddonMessagesContactsPage,
+ ],
+ imports: [
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ CorePipesModule,
+ AddonMessagesComponentsModule,
+ IonicPageModule.forChild(AddonMessagesContactsPage),
+ TranslateModule.forChild()
+ ],
+})
+export class AddonMessagesContactsPageModule {}
diff --git a/src/addon/messages/pages/contacts/contacts.ts b/src/addon/messages/pages/contacts/contacts.ts
new file mode 100644
index 000000000..047961507
--- /dev/null
+++ b/src/addon/messages/pages/contacts/contacts.ts
@@ -0,0 +1,122 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnDestroy, ViewChild } from '@angular/core';
+import { IonicPage, NavController } from 'ionic-angular';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreSitesProvider } from '@providers/sites';
+import { AddonMessagesProvider } from '../../providers/messages';
+import { CoreSplitViewComponent } from '@components/split-view/split-view';
+import { CoreTabsComponent } from '@components/tabs/tabs';
+
+/**
+ * Page that displays contacts and contact requests.
+ */
+@IonicPage({ segment: 'addon-messages-contacts' })
+@Component({
+ selector: 'page-addon-messages-contacts',
+ templateUrl: 'contacts.html',
+})
+export class AddonMessagesContactsPage implements OnDestroy {
+
+ @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent;
+ @ViewChild(CoreTabsComponent) tabsComponent: CoreTabsComponent;
+
+ contactRequestsCount = 0;
+
+ protected loadSplitViewObserver: any;
+ protected siteId: string;
+ protected contactRequestsCountObserver: any;
+ protected conversationUserId: number; // User id of the conversation opened in the split view.
+ protected selectedUserId = {
+ contacts: null, // User id of the selected user in the confirmed contacts tab.
+ requests: null, // User id of the selected user in the contact requests tab.
+ };
+
+ constructor(eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider,
+ private navCtrl: NavController, private messagesProvider: AddonMessagesProvider) {
+
+ this.siteId = sitesProvider.getCurrentSiteId();
+
+ // Update the contact requests badge.
+ this.contactRequestsCountObserver = eventsProvider.on(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, (data) => {
+ this.contactRequestsCount = data.count;
+ }, this.siteId);
+ }
+
+ /**
+ * Page being initialized.
+ */
+ ngOnInit(): void {
+ this.messagesProvider.getContactRequestsCount(this.siteId); // Badge already updated by the observer.
+ }
+
+ /**
+ * Navigate to the search page.
+ */
+ gotoSearch(): void {
+ this.navCtrl.push('AddonMessagesSearchPage');
+ }
+
+ /**
+ * User entered the page.
+ */
+ ionViewDidEnter(): void {
+ if (!this.splitviewCtrl.isOn()) {
+ this.selectedUserId.contacts = null;
+ this.selectedUserId.requests = null;
+ }
+
+ this.tabsComponent && this.tabsComponent.ionViewDidEnter();
+ }
+
+ /**
+ * User left the page.
+ */
+ ionViewDidLeave(): void {
+ this.tabsComponent && this.tabsComponent.ionViewDidLeave();
+ }
+
+ /**
+ * Set the selected user and open the conversation in the split view if needed.
+ *
+ * @param {string} tab Active tab: "contacts" or "requests".
+ * @param {number} [userId] Id of the selected user, undefined to use the last selected user in the tab.
+ * @param {boolean} [onInit=false] Whether the contact was selected on initial load.
+ */
+ selectUser(tab: string, userId?: number, onInit: boolean = false): void {
+ userId = userId || this.selectedUserId[tab];
+
+ if (!userId || userId == this.conversationUserId && this.splitviewCtrl.isOn()) {
+ // No user conversation to open or it is already opened.
+ return;
+ }
+
+ if (onInit && !this.splitviewCtrl.isOn()) {
+ // Do not open a conversation by default when split view is not visible.
+ return;
+ }
+
+ this.conversationUserId = userId;
+ this.selectedUserId[tab] = userId;
+ this.splitviewCtrl.push('AddonMessagesDiscussionPage', { userId });
+ }
+
+ /**
+ * Page destroyed.
+ */
+ ngOnDestroy(): void {
+ this.contactRequestsCountObserver && this.contactRequestsCountObserver.off();
+ }
+}
diff --git a/src/addon/messages/pages/conversation-info/conversation-info.html b/src/addon/messages/pages/conversation-info/conversation-info.html
new file mode 100644
index 000000000..36af28369
--- /dev/null
+++ b/src/addon/messages/pages/conversation-info/conversation-info.html
@@ -0,0 +1,36 @@
+
+
+ {{ 'addon.messages.groupinfo' | translate }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'addon.messages.numparticipants' | translate:{$a: conversation.membercount} }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/addon/messages/pages/conversation-info/conversation-info.module.ts b/src/addon/messages/pages/conversation-info/conversation-info.module.ts
new file mode 100644
index 000000000..f2b0cb96c
--- /dev/null
+++ b/src/addon/messages/pages/conversation-info/conversation-info.module.ts
@@ -0,0 +1,33 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { AddonMessagesConversationInfoPage } from './conversation-info';
+import { CoreComponentsModule } from '@components/components.module';
+import { CoreDirectivesModule } from '@directives/directives.module';
+
+@NgModule({
+ declarations: [
+ AddonMessagesConversationInfoPage,
+ ],
+ imports: [
+ CoreComponentsModule,
+ CoreDirectivesModule,
+ IonicPageModule.forChild(AddonMessagesConversationInfoPage),
+ TranslateModule.forChild()
+ ],
+})
+export class AddonMessagesConversationInfoPageModule {}
diff --git a/src/addon/messages/pages/conversation-info/conversation-info.ts b/src/addon/messages/pages/conversation-info/conversation-info.ts
new file mode 100644
index 000000000..b79ece62b
--- /dev/null
+++ b/src/addon/messages/pages/conversation-info/conversation-info.ts
@@ -0,0 +1,133 @@
+// (C) Copyright 2015 Martin Dougiamas
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, OnInit } from '@angular/core';
+import { IonicPage, NavParams, ViewController } from 'ionic-angular';
+import { AddonMessagesProvider } from '../../providers/messages';
+import { CoreDomUtilsProvider } from '@providers/utils/dom';
+
+/**
+ * Page that displays the list of conversations, including group conversations.
+ */
+@IonicPage({ segment: 'addon-messages-conversation-info' })
+@Component({
+ selector: 'page-addon-messages-conversation-info',
+ templateUrl: 'conversation-info.html',
+})
+export class AddonMessagesConversationInfoPage implements OnInit {
+
+ loaded = false;
+ conversation: any;
+ members = [];
+ canLoadMore = false;
+ loadMoreError = false;
+
+ protected conversationId: number;
+
+ constructor(private messagesProvider: AddonMessagesProvider, private domUtils: CoreDomUtilsProvider, navParams: NavParams,
+ protected viewCtrl: ViewController) {
+ this.conversationId = navParams.get('conversationId');
+ }
+
+ /**
+ * Component loaded.
+ */
+ ngOnInit(): void {
+ this.fetchData().finally(() => {
+ this.loaded = true;
+ });
+ }
+
+ /**
+ * Fetch the required data.
+ *
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchData(): Promise {
+ // Get the conversation data first.
+ return this.messagesProvider.getConversation(this.conversationId, false, true, 0, 0).then((conversation) => {
+ this.conversation = conversation;
+
+ // Now get the members.
+ return this.fetchMembers();
+ }).catch((error) => {
+ this.domUtils.showErrorModalDefault(error, 'Error getting members.');
+ });
+ }
+
+ /**
+ * Get conversation members.
+ *
+ * @param {boolean} [loadingMore} Whether we are loading more data or just the first ones.
+ * @return {Promise} Promise resolved when done.
+ */
+ protected fetchMembers(loadingMore?: boolean): Promise {
+ this.loadMoreError = false;
+
+ const limitFrom = loadingMore ? this.members.length : 0;
+
+ return this.messagesProvider.getConversationMembers(this.conversationId, limitFrom).then((data) => {
+ if (loadingMore) {
+ this.members = this.members.concat(data.members);
+ } else {
+ this.members = data.members;
+ }
+
+ this.canLoadMore = data.canLoadMore;
+ });
+ }
+
+ /**
+ * Function to load more members.
+ *
+ * @param {any} [infiniteComplete] Infinite scroll complete function. Only used from core-infinite-loading.
+ * @return {Promise} Resolved when done.
+ */
+ loadMoreMembers(infiniteComplete?: any): Promise {
+ return this.fetchMembers(true).catch((error) => {
+ this.domUtils.showErrorModalDefault(error, 'Error getting members.');
+ this.loadMoreError = true;
+ }).finally(() => {
+ infiniteComplete && infiniteComplete();
+ });
+ }
+
+ /**
+ * Refresh the data.
+ *
+ * @param {any} [refresher] Refresher.
+ * @return {Promise} Promise resolved when done.
+ */
+ refreshData(refresher?: any): Promise {
+ const promises = [];
+
+ promises.push(this.messagesProvider.invalidateConversation(this.conversationId));
+ promises.push(this.messagesProvider.invalidateConversationMembers(this.conversationId));
+
+ return Promise.all(promises).then(() => {
+ return this.fetchData().finally(() => {
+ refresher && refresher.complete();
+ });
+ });
+ }
+
+ /**
+ * Close modal.
+ *
+ * @param {number} [userId] User conversation to load.
+ */
+ closeModal(userId?: number): void {
+ this.viewCtrl.dismiss(userId);
+ }
+}
diff --git a/src/addon/messages/pages/discussion/discussion.html b/src/addon/messages/pages/discussion/discussion.html
index 89bd5a6be..7fb8da636 100644
--- a/src/addon/messages/pages/discussion/discussion.html
+++ b/src/addon/messages/pages/discussion/discussion.html
@@ -1,43 +1,57 @@
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-