From 28b61f76e82803167743956f869724bafbd34661 Mon Sep 17 00:00:00 2001 From: taeseunguser Date: Thu, 19 Oct 2017 14:43:55 +0900 Subject: [PATCH 1/2] Revert "taegong" --- .dockerignore | 18 - .gitignore | 3 - .nvmrc | 1 - .travis.yml | 25 +- COPYRIGHT | 6 +- Dockerfile.example | 18 - Makefile | 37 +- README.md | 12 +- app.js | 246 +- azuredeploy.json | 50 +- bin/generateCacheBuster.js | 4 - bower.json | 2 +- bundle/bundle.source.js | 45 +- bundle/index.js | 4 +- deploy.sh | 2 +- env.js | 3 - lib/api/alexa/index.js | 78 +- lib/api/entries/index.js | 44 +- lib/api/treatments/index.js | 166 +- lib/client/boluscalc.js | 107 +- lib/client/browser-settings.js | 7 +- lib/client/browser-utils.js | 2 +- lib/client/careportal.js | 3 +- lib/client/chart.js | 15 + lib/client/index.js | 40 +- lib/client/receiveddata.js | 2 +- lib/client/renderer.js | 192 +- lib/data/calcdelta.js | 2 +- lib/data/dataloader.js | 31 +- lib/data/ddata.js | 42 +- lib/devicestatus.js | 5 +- lib/hashauth.js | 9 +- lib/language.js | 1459 +--- lib/plugins/alexa.js | 2 +- lib/plugins/basalprofile.js | 43 +- lib/plugins/bgnow.js | 55 +- lib/plugins/bridge.js | 20 +- lib/plugins/careportal.js | 4 +- lib/plugins/cob.js | 47 +- lib/plugins/iob.js | 98 +- lib/plugins/loop.js | 66 +- lib/plugins/openaps.js | 42 +- lib/plugins/pluginbase.js | 2 - lib/plugins/pump.js | 7 - lib/plugins/treatmentnotify.js | 3 +- lib/plugins/upbat.js | 12 +- lib/profilefunctions.js | 60 +- lib/report_plugins/dailystats.js | 11 +- lib/report_plugins/daytoday.js | 279 +- lib/report_plugins/glucosedistribution.js | 568 +- lib/report_plugins/hourlystats.js | 147 +- lib/report_plugins/index.js | 10 +- lib/report_plugins/profiles.js | 103 - lib/report_plugins/treatments.js | 2 +- lib/treatments.js | 20 +- lib/utils.js | 37 +- lib/websocket.js | 44 +- package-lock.json | 7241 ----------------- package.json | 95 +- .../admin/index.html | 13 +- views/bgclock.html => static/clock.html | 12 +- static/colorbrewer/LICENSE.txt | 38 - static/colorbrewer/README.md | 8 - static/colorbrewer/colorbrewer.css | 1691 ---- static/colorbrewer/colorbrewer.js | 315 - static/colorbrewer/index.js | 1 - static/colorbrewer/package.json | 65 - static/css/main.css | 77 +- static/css/report.css | 4 - .../ui-darkness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 220 -> 0 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 230 -> 0 bytes .../images/ui-bg_glass_20_555555_1x400.png | Bin 260 -> 0 bytes .../images/ui-bg_glass_40_0078a3_1x400.png | Bin 342 -> 0 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 316 -> 0 bytes .../ui-bg_gloss-wave_25_333333_500x100.png | Bin 3816 -> 0 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 276 -> 0 bytes .../ui-bg_inset-soft_25_000000_1x100.png | Bin 275 -> 0 bytes .../ui-bg_inset-soft_30_f58400_1x100.png | Bin 340 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_a83300_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_cccccc_256x240.png | Bin 6975 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes static/css/ui-darkness/jquery-ui.css | 1225 --- static/css/ui-darkness/jquery-ui.min.css | 7 - static/css/ui-darkness/theme.css | 410 - .../ui-lightness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 205 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 348 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 5815 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 278 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 328 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes static/css/ui-lightness/jquery-ui.css | 1225 --- static/css/ui-lightness/jquery-ui.min.css | 7 - static/css/ui-lightness/theme.css | 410 - static/font/nsicons.eot | Bin 8420 -> 0 bytes static/font/nsicons.svg | 32 - static/font/nsicons.ttf | Bin 8256 -> 0 bytes static/font/nsicons.woff | Bin 4560 -> 0 bytes static/font/nsicons.woff2 | Bin 3836 -> 0 bytes .../foodindex.html => static/food/index.html | 13 +- static/glyphs/demo.html | 2 +- static/images/DoubleDown.svg | 10 - static/images/DoubleUp.svg | 10 - static/images/Flat.svg | 9 - static/images/FortyFiveDown.svg | 9 - static/images/FortyFiveUp.svg | 9 - static/images/NONE.svg | 9 - static/images/SingleDown.svg | 9 - static/images/SingleUp.svg | 9 - static/images/launch.png | Bin 3111 -> 0 bytes {views => static}/index.html | 191 +- static/js/client.js | 10 +- .../profile/index.html | 13 +- static/radio.html | 59 + static/report/compare.html | 10 +- .../report/index.html | 20 +- static/report/js/flotcandle.js | 2 +- static/report/js/report.js | 34 +- .../translations/index.html | 12 +- tests/admintools.test.js | 22 +- tests/api.treatments.test.js | 91 +- tests/ar2.test.js | 3 - tests/basalprofileplugin.test.js | 5 +- tests/bgnow.test.js | 6 +- tests/careportal.test.js | 4 +- tests/fixtures/headless.js | 17 +- tests/fixtures/localstorage.js | 9 - tests/hashauth.test.js | 7 +- tests/iob.test.js | 9 - tests/openaps-storage.test.js | 2 + tests/openaps.test.js | 115 - tests/profileeditor.test.js | 7 +- tests/reports.test.js | 16 +- tests/utils.test.js | 13 +- views/clock-color.html | 182 - views/clock.html | 78 - views/nightscout.appcache | 34 - webpack.config.js | 108 - 149 files changed, 1330 insertions(+), 17076 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .nvmrc delete mode 100644 Dockerfile.example delete mode 100644 bin/generateCacheBuster.js delete mode 100644 lib/report_plugins/profiles.js delete mode 100644 package-lock.json rename views/adminindex.html => static/admin/index.html (82%) rename views/bgclock.html => static/clock.html (83%) delete mode 100644 static/colorbrewer/LICENSE.txt delete mode 100644 static/colorbrewer/README.md delete mode 100644 static/colorbrewer/colorbrewer.css delete mode 100644 static/colorbrewer/colorbrewer.js delete mode 100644 static/colorbrewer/index.js delete mode 100644 static/colorbrewer/package.json delete mode 100755 static/css/ui-darkness/images/animated-overlay.gif delete mode 100644 static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png delete mode 100644 static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png delete mode 100644 static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png delete mode 100644 static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png delete mode 100644 static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png delete mode 100644 static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png delete mode 100644 static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png delete mode 100644 static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png delete mode 100644 static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png delete mode 100644 static/css/ui-darkness/images/ui-icons_222222_256x240.png delete mode 100644 static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png delete mode 100644 static/css/ui-darkness/images/ui-icons_a83300_256x240.png delete mode 100644 static/css/ui-darkness/images/ui-icons_cccccc_256x240.png delete mode 100644 static/css/ui-darkness/images/ui-icons_ffffff_256x240.png delete mode 100644 static/css/ui-darkness/jquery-ui.css delete mode 100644 static/css/ui-darkness/jquery-ui.min.css delete mode 100644 static/css/ui-darkness/theme.css delete mode 100755 static/css/ui-lightness/images/animated-overlay.gif delete mode 100644 static/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 static/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 static/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png delete mode 100644 static/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 static/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 static/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 static/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 static/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 static/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 static/css/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 static/css/ui-lightness/images/ui-icons_228ef1_256x240.png delete mode 100644 static/css/ui-lightness/images/ui-icons_ef8c08_256x240.png delete mode 100644 static/css/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100644 static/css/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100644 static/css/ui-lightness/jquery-ui.css delete mode 100644 static/css/ui-lightness/jquery-ui.min.css delete mode 100644 static/css/ui-lightness/theme.css delete mode 100755 static/font/nsicons.eot delete mode 100755 static/font/nsicons.svg delete mode 100755 static/font/nsicons.ttf delete mode 100755 static/font/nsicons.woff delete mode 100755 static/font/nsicons.woff2 rename views/foodindex.html => static/food/index.html (92%) delete mode 100755 static/images/DoubleDown.svg delete mode 100755 static/images/DoubleUp.svg delete mode 100755 static/images/Flat.svg delete mode 100755 static/images/FortyFiveDown.svg delete mode 100755 static/images/FortyFiveUp.svg delete mode 100644 static/images/NONE.svg delete mode 100755 static/images/SingleDown.svg delete mode 100755 static/images/SingleUp.svg delete mode 100644 static/images/launch.png rename {views => static}/index.html (83%) rename views/profileindex.html => static/profile/index.html (96%) create mode 100644 static/radio.html rename views/reportindex.html => static/report/index.html (85%) rename views/translationsindex.html => static/translations/index.html (79%) delete mode 100644 views/clock-color.html delete mode 100644 views/clock.html delete mode 100644 views/nightscout.appcache delete mode 100644 webpack.config.js diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index e462a2e5ef47..000000000000 --- a/.dockerignore +++ /dev/null @@ -1,18 +0,0 @@ -# Don't include the .git history in the Docker image: -.git - -# Items from .gitignore -bower_components/ -node_modules/ -bundle/bundle.out.js -.idea/ -*.iml -my.env -*.env -static/bower_components/ -.*.sw? -.DS_Store -.vagrant -/iisnode -coverage/ -npm-debug.log diff --git a/.gitignore b/.gitignore index e088fce02408..4fcbc57e59d6 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,3 @@ static/bower_components/ coverage/ npm-debug.log -*.heapsnapshot - -/tmp \ No newline at end of file diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index ac2895c59674..000000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -8.1.4 diff --git a/.travis.yml b/.travis.yml index c4e348952a80..c7b9ed5a57e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,23 @@ language: node_js -sudo: required +sudo: false node_js: - - "8.5.0" + - 0.10 + - 0.12 + - 4 + - 5 matrix: fast_finish: true -services: - - mongodb - - docker + allow_failures: + - node_js: 4 + - node_js: 5 +services: mongodb script: make travis -after_success: - - nvm version - - if [[ ! -z "$DOCKER_USER" ]]; then docker login -u ${DOCKER_USER} -p ${DOCKER_PASS} && git checkout -- . && git clean -fd . && make docker_release; fi after_script: make report +env: + - CXX=g++-4.8 +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.8 diff --git a/COPYRIGHT b/COPYRIGHT index 300be637b69a..b5038bbdfdc1 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,5 +1 @@ - -We track contributions on a per-patch basis using git. -Please see our published git log: -* https://github.com/nightscout/cgm-remote-monitor/commits/master - +Copyright (C) 2015 The Nightscout Foundation, http://www.nightscoutfoundation.org diff --git a/Dockerfile.example b/Dockerfile.example deleted file mode 100644 index d6f6f0f88213..000000000000 --- a/Dockerfile.example +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:8.5.0 - -MAINTAINER Nightscout Contributors - -RUN apt-get update && \ - apt-get -y dist-upgrade - -RUN mkdir -p /opt/app -ADD . /opt/app -WORKDIR /opt/app - -RUN npm install && \ - npm run postinstall && \ - npm run env - -EXPOSE 1337 - -CMD ["node", "server.js"] diff --git a/Makefile b/Makefile index 34f9030cb34f..44e16a9d0214 100644 --- a/Makefile +++ b/Makefile @@ -24,13 +24,11 @@ ISTANBUL=./node_modules/.bin/istanbul ANALYZED=./coverage/lcov.info export CODACY_REPO_TOKEN=e29ae5cf671f4f918912d9864316207c -DOCKER_IMAGE=nightscout/cgm-remote-monitor-travis - all: test coverage: NODE_ENV=test ${MONGO_SETTINGS} \ - ${ISTANBUL} cover ${MOCHA} -- --timeout 30000 -R tap ${TESTS} + ${ISTANBUL} cover ${MOCHA} -- -R tap ${TESTS} report: test -f ${ANALYZED} && \ @@ -41,37 +39,10 @@ report: YOURPACKAGE_COVERAGE=1 ./node_modules/codacy-coverage/bin/codacy-coverage.js) || echo "NO COVERAGE" test: - ${MONGO_SETTINGS} ${MOCHA} --timeout 30000 -R tap ${TESTS} + ${MONGO_SETTINGS} ${MOCHA} -R tap ${TESTS} travis: NODE_ENV=test ${MONGO_SETTINGS} \ - ${ISTANBUL} cover ${MOCHA} --report lcovonly -- --timeout 50000 -R tap ${TESTS} - -docker_release: - # Get the version from the package.json file - $(eval DOCKER_TAG=$(shell cat package.json | jq '.version' | tr -d '"')) - $(eval NODE_VERSION=$(shell cat .nvmrc)) - # - # Create a Dockerfile that contains the correct NodeJS version - cat Dockerfile.example | sed -e "s/^FROM node:.*/FROM node:${NODE_VERSION}/" > Dockerfile - # - # Rebuild the image. We do this with no-cache so that we have all security upgrades, - # since that's more important than fewer layers in the Docker image. - docker build --no-cache=true -t $(DOCKER_IMAGE):$(DOCKER_TAG) . - # Push an image to Docker Hub with the version from package.json: - docker push $(DOCKER_IMAGE):$(DOCKER_TAG) - # - # Push the master branch to Docker hub as 'latest' - if [ "$(TRAVIS_BRANCH)" = "master" ]; then \ - docker tag $(DOCKER_IMAGE):$(DOCKER_TAG) $(DOCKER_IMAGE):latest && \ - docker push $(DOCKER_IMAGE):latest; \ - fi - # - # Push the dev branch to Docker Hub as 'latest_dev' - if [ "$(TRAVIS_BRANCH)" = "dev" ]; then \ - docker tag $(DOCKER_IMAGE):$(DOCKER_TAG) $(DOCKER_IMAGE):latest_dev && \ - docker push $(DOCKER_IMAGE):latest_dev; \ - fi - rm -f Dockerfile + ${ISTANBUL} cover ${MOCHA} --report lcovonly -- -R tap ${TESTS} -.PHONY: all coverage docker_release report test travis +.PHONY: all coverage report test travis diff --git a/README.md b/README.md index cdb941efbf90..eca170715585 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,7 @@ Clone this repo then install dependencies into the root of the project: $ npm install ``` -If deploying the software to Microsoft Azure, you must set *WEBSITE_NODE_DEFAULT_VERSION* in the app settings to *8.5.0* or the site deployment will fail. Other hosting environments do not require this setting. - -# Usage +#Usage The data being uploaded from the server to the client is from a MongoDB server such as [mongolab][mongodb]. @@ -220,7 +218,6 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs.htm * `SSL_CERT` - Path to your ssl cert file, so that ssl(https) can be enabled directly in node.js * `SSL_CA` - Path to your ssl ca file, so that ssl(https) can be enabled directly in node.js * `HEARTBEAT` (`60`) - Number of seconds to wait in between database checks - * `DEBUG_MINIFY` (`true`) - Debug option, setting to `false` will disable bundle minification to help tracking down error and speed up development ### Predefined values for your browser settings (optional) @@ -377,7 +374,6 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs.htm Generic Pump Monitoring for OpenAPS, MiniMed Connect, RileyLink, t:slim, with more on the way * Requires `DEVICESTATUS_ADVANCED="true"` to be set * `PUMP_ENABLE_ALERTS` (`false`) - Set to `true` to enable notifications for Pump battery and reservoir. - * `PUMP_WARNONSUSPEND` (`false`) - Set to `true` to get an alarm when the pump is suspended. * `PUMP_FIELDS` (`reservoir battery`) - The fields to display by default. Any of the following fields: `reservoir`, `battery`, `clock`, `status`, and `device` * `PUMP_RETRO_FIELDS` (`reservoir battery clock`) - The fields to display in retro mode. Any of the above fields. * `PUMP_WARN_CLOCK` (`30`) - The number of minutes ago that needs to be exceed before an alert is triggered. @@ -496,7 +492,7 @@ Easy to emulate on the commandline: From now on you can run using ```bash - $ (eval $(cat my.env | sed 's/^/export /') && PORT=1337 node server.js) + $ env $(cat my.env) PORT=1337 node server.js ``` Your hosting provider probably has a way to set these through their GUI. @@ -536,9 +532,7 @@ License [agpl-3]: http://www.gnu.org/licenses/agpl-3.0.txt cgm-remote-monitor - web app to broadcast cgm readings - Copyright (C) 2017 Nightscout contributors. See the COPYRIGHT file - at the root directory of this distribution and at - https://github.com/nightscout/cgm-remote-monitor/blob/master/COPYRIGHT + Copyright (C) 2015 The Nightscout Foundation, http://www.nightscoutfoundation.org. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app.js b/app.js index a073eff8f809..45c78b2fc0d4 100644 --- a/app.js +++ b/app.js @@ -4,201 +4,83 @@ var _ = require('lodash'); var express = require('express'); var compression = require('compression'); var bodyParser = require('body-parser'); -var prettyjson = require('prettyjson'); - -var path = require('path'); -var fs = require('fs'); - -function create(env, ctx) { - var app = express(); - var appInfo = env.name + ' ' + env.version; - app.set('title', appInfo); - app.enable('trust proxy'); // Allows req.secure test on heroku https connections. - - app.set('view engine', 'ejs'); - // this allows you to render .html files as templates in addition to .ejs - app.engine('html', require('ejs').renderFile); - app.engine('appcache', require('ejs').renderFile); - app.set("views", path.join(__dirname, "views/")); - - app.locals.cachebuster = fs.readFileSync(process.cwd() + '/tmp/cacheBusterToken').toString().trim(); - - if (ctx.bootErrors && ctx.bootErrors.length > 0) { - app.get('*', require('./lib/booterror')(ctx)); - return app; - } - - if (env.settings.isEnabled('cors')) { - var allowOrigin = _.get(env, 'extendedSettings.cors.allowOrigin') || '*'; - console.info('Enabled CORS, allow-origin:', allowOrigin); - app.use(function allowCrossDomain(req, res, next) { - res.header('Access-Control-Allow-Origin', allowOrigin); - res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); - res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); - - // intercept OPTIONS method - if ('OPTIONS' === req.method) { - res.send(200); - } else { - next(); - } - }); - } - - /////////////////////////////////////////////////// - // api and json object variables - /////////////////////////////////////////////////// - var api = require('./lib/api/')(env, ctx); - var ddata = require('./lib/data/endpoints')(env, ctx); - - app.use(compression({ - filter: function shouldCompress(req, res) { - //TODO: return false here if we find a condition where we don't want to compress - // fallback to standard filter function - return compression.filter(req, res); - } - })); - - app.get("/", (req, res) => { - res.render("index.html", { - locals: app.locals - }); - }); - - var appPages = { - "/clock-color.html":"clock-color.html", - "/admin":"adminindex.html", - "/profile":"profileindex.html", - "/food":"foodindex.html", - "/bgclock.html":"bgclock.html", - "/report":"reportindex.html", - "/translations":"translationsindex.html", - "/clock.html":"clock.html" - }; - - Object.keys(appPages).forEach(function(page) { - app.get(page, (req, res) => { - res.render(appPages[page], { - locals: app.locals - }); - }); - }); - - app.get("/nightscout.appcache", (req, res) => { - res.render("nightscout.appcache", { - locals: app.locals - }); - }); - - app.use('/api/v1', bodyParser({ - limit: 1048576 * 50 - }), api); - - app.use('/api/v2/properties', ctx.properties); - app.use('/api/v2/authorization', ctx.authorization.endpoints); - app.use('/api/v2/ddata', ddata); - // pebble data - app.get('/pebble', ctx.pebble); - - // expose swagger.yaml - app.get('/swagger.yaml', function(req, res) { - res.sendFile(__dirname + '/swagger.yaml'); - }); - -/* - if (env.settings.isEnabled('dumps')) { - var heapdump = require('heapdump'); - app.get('/api/v2/dumps/start', function(req, res) { - var path = new Date().toISOString() + '.heapsnapshot'; - path = path.replace(/:/g, '-'); - console.info('writing dump to', path); - heapdump.writeSnapshot(path); - res.send('wrote dump to ' + path); - }); - } -*/ - - //app.get('/package.json', software); - - // Allow static resources to be cached for week - var maxAge = 7 * 24 * 60 * 60 * 1000; - - if (process.env.NODE_ENV === 'development') { - maxAge = 10; - console.log('Development environment detected, setting static file cache age to 10 seconds'); - - app.get('/nightscout.appcache', function(req, res) { - res.sendStatus(404); - }); - } - - //TODO: JC - changed cache to 1 hour from 30d ays to bypass cache hell until we have a real solution - var staticFiles = express.static(env.static_files, { - maxAge: maxAge - }); +function create (env, ctx) { + var app = express(); + var appInfo = env.name + ' ' + env.version; + app.set('title', appInfo); + app.enable('trust proxy'); // Allows req.secure test on heroku https connections. - // serve the static content - app.use(staticFiles); - - var tmpFiles = express.static('tmp', { - maxAge: maxAge + if (ctx.bootErrors && ctx.bootErrors.length > 0) { + app.get('*', require('./lib/booterror')(ctx)); + return app; + } + + if (env.settings.isEnabled('cors')) { + var allowOrigin = _.get(env, 'extendedSettings.cors.allowOrigin') || '*'; + console.info('Enabled CORS, allow-origin:', allowOrigin); + app.use(function allowCrossDomain (req, res, next) { + res.header('Access-Control-Allow-Origin', allowOrigin); + res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); + + // intercept OPTIONS method + if ('OPTIONS' === req.method) { + res.send(200); + } else { + next(); + } }); + } - // serve the static content - app.use(tmpFiles); - - if (process.env.NODE_ENV !== 'development') { - - console.log('Production environment detected, enabling Minify'); + /////////////////////////////////////////////////// + // api and json object variables + /////////////////////////////////////////////////// + var api = require('./lib/api/')(env, ctx); + var ddata = require('./lib/data/endpoints')(env, ctx); - var minify = require('express-minify'); - var myUglifyJS = require('uglify-js'); - var myCssmin = require('cssmin'); + app.use(compression({filter: function shouldCompress(req, res) { + //TODO: return false here if we find a condition where we don't want to compress + // fallback to standard filter function + return compression.filter(req, res); + }})); + // app.use(bodyParser({limit: 1048576 * 50, extended: true })); - app.use(minify({ - js_match: /\.js/, - css_match: /\.css/, - sass_match: /scss/, - less_match: /less/, - stylus_match: /stylus/, - coffee_match: /coffeescript/, - json_match: /json/, - uglifyJS: myUglifyJS, - cssmin: myCssmin, - cache: __dirname + '/tmp', - onerror: undefined, - })); + //if (env.api_secret) { + // console.log("API_SECRET", env.api_secret); + //} + app.use('/api/v1', bodyParser({limit: 1048576 * 50 }), api); - } + app.use('/api/v2/properties', ctx.properties); + app.use('/api/v2/authorization', ctx.authorization.endpoints); + app.use('/api/v2/ddata', ddata); - // if this is dev environment, package scripts on the fly - // if production, rely on postinstall script to run packaging for us + // pebble data + app.get('/pebble', ctx.pebble); - if (process.env.NODE_ENV === 'development') { + // expose swagger.yaml + app.get('/swagger.yaml', function (req, res) { + res.sendFile(__dirname + '/swagger.yaml'); + }); - var webpack = require("webpack"); - var webpack_conf = require('./webpack.config'); + //app.get('/package.json', software); - webpack(webpack_conf, function(err, stats) { + // define static server + //TODO: JC - changed cache to 1 hour from 30d ays to bypass cache hell until we have a real solution + var staticFiles = express.static(env.static_files, {maxAge: 60 * 60 * 1000}); - var json = stats.toJson() // => webpack --json + // serve the static content + app.use(staticFiles); - var options = { - noColor: true - }; + var bundle = require('./bundle')(); + app.use(bundle); - console.log(prettyjson.render(json.errors, options)); - console.log(prettyjson.render(json.assets, options)); - - }); - } - - // Handle errors with express's errorhandler, to display more readable error messages. - var errorhandler = require('errorhandler'); - //if (process.env.NODE_ENV === 'development') { + // Handle errors with express's errorhandler, to display more readable error messages. + var errorhandler = require('errorhandler'); + //if (process.env.NODE_ENV === 'development') { app.use(errorhandler()); - //} - return app; + //} + return app; } -module.exports = create; \ No newline at end of file +module.exports = create; + diff --git a/azuredeploy.json b/azuredeploy.json index 777b513ddbdd..4e43137b850c 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -64,7 +64,7 @@ "colors", "colorblindfriendly" ], - "defaultValue": "colors" + "defaultValue": "colors", }, "time_format": { "type": "string", @@ -72,7 +72,7 @@ "12", "24" ], - "defaultValue": "24" + "defaultValue": "24", }, "language": { "type": "string", @@ -99,11 +99,11 @@ "fi", "ko" ], - "defaultValue": "en" + "defaultValue": "en", }, "custom_title": { "type": "string", - "defaultValue": "Nightscout" + "defaultValue": "Nightscout", }, "alarm_high": { "type": "string", @@ -111,7 +111,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "alarm_low": { "type": "string", @@ -119,7 +119,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "alarm_timeago_urgent": { "type": "string", @@ -127,7 +127,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "alarm_timeago_warn": { "type": "string", @@ -135,7 +135,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "alarm_urgent_high": { "type": "string", @@ -143,7 +143,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "alarm_urgent_low": { "type": "string", @@ -151,7 +151,7 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "basal_render": { "type": "string", @@ -160,7 +160,7 @@ "default", "icicle" ], - "defaultValue": "none" + "defaultValue": "none", }, "scale_y": { "type": "string", @@ -169,11 +169,11 @@ "linear", "log-dynamic" ], - "defaultValue": "log" + "defaultValue": "log", }, "enable": { "type": "string", - "defaultValue": "basal bwp cage careportal iob cob rawbg sage iage treatmentnotify boluscalc profile food" + "defaultValue": "basal bwp cage careportal cob rawbg sage iage treatmentnotify boluscalc profile", }, "night_mode": { "type": "string", @@ -181,11 +181,11 @@ "on", "off" ], - "defaultValue": "off" + "defaultValue": "off", }, "show_plugins": { "type": "string", - "defaultValue": "careportal" + "defaultValue": "careportal", }, "show_rawbg": { "type": "string", @@ -194,7 +194,7 @@ "never", "noise" ], - "defaultValue": "never" + "defaultValue": "never", }, "devicestatus_advanced": { "type": "string", @@ -202,7 +202,7 @@ "true", "false" ], - "defaultValue": "false" + "defaultValue": "false", }, "profile_multiple": { "type": "string", @@ -210,15 +210,7 @@ "on", "off" ], - "defaultValue": "off" - }, - "auth_default_roles": { - "type": "string", - "defaultValue": "readable devicestatus-upload" - }, - "WEBSITE_NODE_DEFAULT_VERSION": { - "type": "string", - "defaultValue": "8.5.0" + "defaultValue": "off", } }, "resources": [{ @@ -312,12 +304,6 @@ }, { "name": "PROFILE_MULTIPLE", "value": "[parameters('profile_multiple')]" - }, { - "name": "AUTH_DEFAULT_ROLES", - "value": "[parameters('auth_default_roles')]" - }, { - "name": "WEBSITE_NODE_DEFAULT_VERSION", - "value": "8.5.0" } ] } diff --git a/bin/generateCacheBuster.js b/bin/generateCacheBuster.js deleted file mode 100644 index 02058daf844b..000000000000 --- a/bin/generateCacheBuster.js +++ /dev/null @@ -1,4 +0,0 @@ - -var randomToken = require('random-token'); -var token = randomToken(16); -console.log(token); diff --git a/bower.json b/bower.json index b54e6ccc7e90..79e5006b11a8 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "nightscout", - "version": "0.10.1-release-20171016", + "version": "0.9.2", "dependencies": { "colorbrewer": "~1.0.0", "jQuery-Storage-API": "~1.7.2", diff --git a/bundle/bundle.source.js b/bundle/bundle.source.js index 9124fceb2536..aa9d19e6f1d5 100644 --- a/bundle/bundle.source.js +++ b/bundle/bundle.source.js @@ -1,34 +1,21 @@ -import '../static/css/drawer.css'; -import '../static/css/dropdown.css'; -import '../static/css/sgv.css'; -import '../node_modules/jquery.tipsy/src/jquery.tipsy.css'; +(function () { + window._ = require('lodash'); + window.d3 = require('d3'); + window.$ = window.jQuery = require('jquery'); + window.moment = require('moment-timezone'); + window.sugar = require('sugar'); + window.crossfilter = require('crossfilter'); + window.Nightscout = window.Nightscout || {}; -$ = require("jquery"); + window.Nightscout = { + client: require('../lib/client') + , units: require('../lib/units')() + , report_plugins: require('../lib/report_plugins/')() + , admin_plugins: require('../lib/admin_plugins/')() + }; -require('jquery-ui-bundle'); + console.info('Nightscout bundle ready'); -window._ = require('lodash'); -window.d3 = require('d3'); +})(); -require('jquery.tipsy'); - -window.Storage = require('js-storage'); - -require('flot'); -require('../node_modules/flot/jquery.flot.time'); -require('../node_modules/flot/jquery.flot.pie'); -require('../node_modules/flot/jquery.flot.fillbetween'); - -window.moment = require('moment-timezone'); - -window.Nightscout = window.Nightscout || {}; - -window.Nightscout = { - client: require('../lib/client'), - units: require('../lib/units')(), - report_plugins: require('../lib/report_plugins/')(), - admin_plugins: require('../lib/admin_plugins/')() -}; - -console.info('Nightscout bundle ready'); \ No newline at end of file diff --git a/bundle/index.js b/bundle/index.js index 2b37869c95bc..cb22a5ebcfaf 100644 --- a/bundle/index.js +++ b/bundle/index.js @@ -2,13 +2,13 @@ var browserify_express = require('browserify-express'); -function bundle(env) { +function bundle() { return browserify_express({ entry: __dirname + '/bundle.source.js', watch: __dirname + '/../lib/', mount: '/public/js/bundle.js', verbose: true, - minify: env.debug.minify, + minify: true, bundle_opts: { debug: true }, // enable inline sourcemap on js files write_file: __dirname + '/bundle.out.js' }); diff --git a/deploy.sh b/deploy.sh index 98b623124250..37b307e8ad0e 100755 --- a/deploy.sh +++ b/deploy.sh @@ -113,7 +113,7 @@ selectNodeVersion # 3. Install npm packages if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then cd "$DEPLOYMENT_TARGET" - eval $NPM_CMD install --scripts-prepend-node-path --production + eval $NPM_CMD install --production exitWithMessageOnError "npm failed" cd - > /dev/null fi diff --git a/env.js b/env.js index 6527d0750f02..73d3ce58a25f 100644 --- a/env.js +++ b/env.js @@ -20,9 +20,6 @@ function config ( ) { env.HOSTNAME = readENV('HOSTNAME', null); env.IMPORT_CONFIG = readENV('IMPORT_CONFIG', null); env.static_files = readENV('NIGHTSCOUT_STATIC_FILES', __dirname + '/static/'); - env.debug = { - minify: readENVTruthy('DEBUG_MINIFY', true) - }; if (env.err) { delete env.err; diff --git a/lib/api/alexa/index.js b/lib/api/alexa/index.js index ad1413b0980d..ff233a53de0b 100644 --- a/lib/api/alexa/index.js +++ b/lib/api/alexa/index.js @@ -7,8 +7,8 @@ var _ = require('lodash'); function configure (app, wares, ctx, env) { var entries = ctx.entries; var express = require('express') - , api = express.Router( ); - var translate = ctx.language.translate; + , api = express.Router( ) + ; // invoke common middleware api.use(wares.sendJSONStatus); @@ -43,16 +43,7 @@ function configure (app, wares, ctx, env) { }); api.post('/alexa', ctx.authorization.isPermitted('api:*:read'), function (req, res, next) { - console.log('Incoming request from Alexa'); - var locale = req.body.request.locale; - if(locale){ - if(locale.length > 2) { - locale = locale.substr(0, 2); - } - ctx.language.set(locale); - moment.locale(locale); - } - + console.log('Incoming request from Alexa'); switch (req.body.request.type) { case 'IntentRequest': onIntent(req.body.request.intent, function (title, response) { @@ -76,48 +67,57 @@ function configure (app, wares, ctx, env) { }); ctx.alexa.addToRollup('Status', function bgRollupHandler(slots, sbx, callback) { - entries.list({count: 1}, function (err, records) { - var direction; - if (translate(records[0].direction)) { - direction = translate(records[0].direction); + entries.list({count: 1}, function(err, records) { + var direction = ''; + if (records[0].direction === 'FortyFiveDown') { + direction = ' and slightly dropping'; + } else if (records[0].direction === 'FortyFiveUp') { + direction = ' and slightly rising'; + } else if (records[0].direction === 'Flat') { + direction = ' and holding'; + } else if (records[0].direction === 'SingleUp') { + direction = ' and rising'; + } else if (records[0].direction === 'SingleDown') { + direction = ' and dropping'; + } else if (records[0].direction === 'DoubleDown') { + direction = ' and rapidly dropping'; + } else if (records[0].direction === 'DoubleUp') { + direction = ' and rapidly rising'; } else { direction = records[0].direction; } - var status = translate('alexaStatus', { - params: [ - sbx.scaleMgdl(records[0].sgv), - direction, - moment(records[0].date).from(moment(sbx.time)) - ] - }); - //var status = sbx.scaleMgdl(records[0].sgv) + direction + ' as of ' + moment(records[0].date).from(moment(sbx.time)) + '.'; + var status = sbx.scaleMgdl(records[0].sgv) + direction + ' as of ' + moment(records[0].date).from(moment(sbx.time)) + '.'; callback(null, {results: status, priority: -1}); }); // console.log('BG results called'); // callback(null, 'BG results'); }, 'BG Status'); - ctx.alexa.configureIntentHandler('MetricNow', function ( callback, slots, sbx, locale) { + ctx.alexa.configureIntentHandler('MetricNow', function (callback, slots, sbx) { entries.list({count: 1}, function(err, records) { - var direction; - if(translate(records[0].direction)){ - direction = translate(records[0].direction); - } else { - direction = records[0].direction; + var direction = ''; + if (records[0].direction === 'FortyFiveDown') { + direction = ' and slightly dropping'; + } else if (records[0].direction === 'FortyFiveUp') { + direction = ' and slightly rising'; + } else if (records[0].direction === 'Flat') { + direction = ' and holding'; + } else if (records[0].direction === 'SingleUp') { + direction = ' and rising'; + } else if (records[0].direction === 'SingleDown') { + direction = ' and dropping'; + } else if (records[0].direction === 'DoubleDown') { + direction = ' and rapidly dropping'; + } else if (records[0].direction === 'DoubleUp') { + direction = ' and rapidly rising'; } - var status = translate('alexaStatus', { - params: [ - sbx.scaleMgdl(records[0].sgv), - direction, - moment(records[0].date).from(moment(sbx.time))] - }); - //var status = sbx.scaleMgdl(records[0].sgv) + direction + ' as of ' + moment(records[0].date).from(moment(sbx.time)); + var status = sbx.scaleMgdl(records[0].sgv) + direction + ' as of ' + moment(records[0].date).from(moment(sbx.time)); callback('Current blood glucose', status); }); }, 'metric', ['bg', 'blood glucose', 'number']); - ctx.alexa.configureIntentHandler('NSStatus', function(callback, slots, sbx, locale) { - ctx.alexa.getRollup('Status', sbx, slots, locale, function (status) { + ctx.alexa.configureIntentHandler('NSStatus', function(callback, slots, sbx) { + ctx.alexa.getRollup('Status', sbx, slots, function (status) { callback('Full status', status); }); }); diff --git a/lib/api/entries/index.js b/lib/api/entries/index.js index ffecef92f78e..cfd43b2d1125 100644 --- a/lib/api/entries/index.js +++ b/lib/api/entries/index.js @@ -71,48 +71,6 @@ function configure (app, wares, ctx) { return es.map(sync); } - // check for last modified from in-memory data - - function ifModifiedSinceCTX (req, res, next) { - - var lastEntry = _.last(ctx.ddata.sgvs); - var lastEntryDate = null; - - if (!_.isNil(lastEntry)) { - lastEntryDate = new Date(_.last(ctx.ddata.sgvs).mills); - res.setHeader('Last-Modified', lastEntryDate.toUTCString()); - } - - var ifModifiedSince = req.get('If-Modified-Since'); - if (!ifModifiedSince) { return next(); } - - if (lastEntryDate <= new Date(ifModifiedSince)) { - res.status(304).send({status:304, message: 'Not modified', type:'internal'}); - return; - } - - return next(); - } - - // check for last modified from query results - - function ifModifiedSince (req, res, next) { - - var lastEntryDate = new Date(_.last(res.entries).dateString); - res.setHeader('Last-Modified', lastEntryDate.toUTCString()); - - var ifModifiedSince = req.get('If-Modified-Since'); - - if (!ifModifiedSince) { return next(); } - - if (lastEntryDate <= new Date(ifModifiedSince)) { - res.status(304).send({status:304, message: 'Not modified', type:'internal'}); - return; - } - - return next(); - } - /** * @method format_entries * A final middleware to send payloads assembled by previous middlewares @@ -334,7 +292,7 @@ function configure (app, wares, ctx) { * `find[date]`. * */ - api.get('/entries', ifModifiedSinceCTX, query_models, format_entries); + api.get('/entries', query_models, format_entries); /** * @function echo_query diff --git a/lib/api/treatments/index.js b/lib/api/treatments/index.js index 5b0c0500b777..dc3d6337af1a 100644 --- a/lib/api/treatments/index.js +++ b/lib/api/treatments/index.js @@ -3,115 +3,73 @@ var _ = require('lodash'); var consts = require('../../constants'); -function configure(app, wares, ctx) { - var express = require('express') - , api = express.Router(); - - api.use(wares.compression()); - api.use(wares.bodyParser({ - limit: 1048576 * 50 - })); - // text body types get handled as raw buffer stream - api.use(wares.bodyParser.raw({ - limit: 1048576 - })); - // json body types get handled as parsed json - api.use(wares.bodyParser.json({ - limit: 1048576 - })); - // also support url-encoded content-type - api.use(wares.bodyParser.urlencoded({ - limit: 1048576 - , extended: true - })); - // invoke common middleware - api.use(wares.sendJSONStatus); - - api.use(ctx.authorization.isPermitted('api:treatments:read')); - - // List treatments available - api.get('/treatments', function(req, res) { - var ifModifiedSince = req.get('If-Modified-Since'); - ctx.treatments.list(req.query, function(err, results) { - var d1 = null; - - _.forEach(results, function clean(t) { - t.carbs = Number(t.carbs); - t.insulin = Number(t.insulin); - - var d2 = new Date(t.timestamp); - - if (d1 == null || d2 > d1) { - d1 = d2; - } - }); - - if (!_.isNil(d1)) res.setHeader('Last-Modified', d1.toUTCString()); - - if (ifModifiedSince && d1 <= new Date(ifModifiedSince)) { - res.status(304).send({ - status: 304 - , message: 'Not modified' - , type: 'internal' - }); - return; - } else { - return res.json(results); - } - }); +function configure (app, wares, ctx) { + var express = require('express'), + api = express.Router( ); + + api.use(wares.compression( )); + api.use(wares.bodyParser({limit: 1048576 * 50})); + // text body types get handled as raw buffer stream + api.use(wares.bodyParser.raw({limit: 1048576 })); + // json body types get handled as parsed json + api.use(wares.bodyParser.json({limit: 1048576 })); + // also support url-encoded content-type + api.use(wares.bodyParser.urlencoded({limit: 1048576 , extended: true })); + // invoke common middleware + api.use(wares.sendJSONStatus); + + api.use(ctx.authorization.isPermitted('api:treatments:read')); + + // List treatments available + api.get('/treatments', function(req, res) { + ctx.treatments.list(req.query, function (err, results) { + _.forEach(results, function clean(t) { t.carbs = Number(t.carbs); t.insulin = Number(t.insulin); }); + return res.json(results); }); - - function config_authed(app, api, wares, ctx) { - - function post_response(req, res) { - var treatments = req.body; - - if (!_.isArray(treatments)) { - treatments = [treatments]; - }; - - ctx.treatments.create(treatments, function(err, created) { - if (err) { - console.log('Error adding treatment', err); - res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); - } else { - console.log('Treatment created'); - res.json(created); - } - }); + }); + + function config_authed (app, api, wares, ctx) { + + function post_response(req, res) { + var treatment = req.body; + ctx.treatments.create(treatment, function (err, created) { + if (err) { + console.log('Error adding treatment', err); + res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); + } else { + console.log('Treatment created'); + res.json(created); } - - api.post('/treatments/', wares.bodyParser({ - limit: 1048576 * 50 - }), ctx.authorization.isPermitted('api:treatments:create'), post_response); - - api.delete('/treatments/:_id', ctx.authorization.isPermitted('api:treatments:delete'), function(req, res) { - ctx.treatments.remove(req.params._id, function() { - res.json({}); - }); - }); - - // update record - api.put('/treatments/', ctx.authorization.isPermitted('api:treatments:update'), function(req, res) { - var data = req.body; - ctx.treatments.save(data, function(err, created) { - if (err) { - res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); - console.log('Error saving treatment'); - console.log(err); - } else { - res.json(created); - console.log('Treatment saved', data); - } - }); - }); + }); } + api.post('/treatments/', wares.bodyParser({limit: 1048576 * 50 }), ctx.authorization.isPermitted('api:treatments:create'), post_response); + api.delete('/treatments/:_id', ctx.authorization.isPermitted('api:treatments:delete'), function(req, res) { + ctx.treatments.remove(req.params._id, function ( ) { + res.json({ }); + }); + }); - if (app.enabled('api') && app.enabled('careportal')) { - config_authed(app, api, wares, ctx); - } + // update record + api.put('/treatments/', ctx.authorization.isPermitted('api:treatments:update'), function(req, res) { + var data = req.body; + ctx.treatments.save(data, function (err, created) { + if (err) { + res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); + console.log('Error saving treatment'); + console.log(err); + } else { + res.json(created); + console.log('Treatment saved', data); + } + }); + }); + } + + if (app.enabled('api') && app.enabled('careportal')) { + config_authed(app, api, wares, ctx); + } - return api; + return api; } module.exports = configure; diff --git a/lib/client/boluscalc.js b/lib/client/boluscalc.js index d99995990944..074661ab1890 100644 --- a/lib/client/boluscalc.js +++ b/lib/client/boluscalc.js @@ -3,16 +3,15 @@ var _ = require('lodash'); var moment = require('moment-timezone'); var times = require('../times'); -var Storages = require('js-storage'); - + function init(client, $) { var boluscalc = { }; - + var translate = client.translate; - var storage = Storages.localStorage; + var storage = $.localStorage; var iob = client.plugins('iob'); var cob = client.plugins('cob'); - + var eventTime = $('#bc_eventTimeValue'); var eventDate = $('#bc_eventDateValue'); @@ -27,7 +26,7 @@ function init(client, $) { } return 0; } - + function maybePrevent (event) { if (event) { event.preventDefault(); @@ -35,12 +34,12 @@ function init(client, $) { } function isProfileEnabled(profiles) { - return client.settings.enable.indexOf('profile') > -1 + return client.settings.enable.indexOf('profile') > -1 && client.settings.extendedSettings.profile && client.settings.extendedSettings.profile.multiple && profiles.length > 1; } - + function isTouch() { try { document.createEvent('TouchEvent'); return true; } catch (e) { return false; } @@ -76,24 +75,24 @@ function init(client, $) { sensorbg = 0; } } - + // Set BG if ($('#bc_bgfromsensor').is(':checked')) { $('#bc_bg').val(sensorbg ? sensorbg : ''); } } - + boluscalc.updateVisualisations = function updateVisualisations (sbx) { // update BG in GUI setBG(sbx.lastSGVEntry(), mergeDateAndTime().toDate()); - + if (client.browserUtils.getLastOpenedDrawer !== '#boluscalcDrawer') { return; } if ($('#bc_nowtime').is(':checked')) { // Update time setDateAndTime(); - + boluscalc.calculateInsulin(); } }; @@ -116,11 +115,11 @@ function init(client, $) { if (ele.attr('oldminutes') === '0' && merged.minutes() === 59) { merged.add(-1, 'hours'); } - + setDateAndTime(merged); updateTime(ele, merged); boluscalc.eventTimeTypeChange(); - + // update BG from sgv to this time setBG(findClosestSGVToPastTime(merged.toDate()), merged.toDate()); @@ -167,7 +166,7 @@ function init(client, $) { $('#bc_profile').append(''); }); $('#bc_profileLabel').toggle(isProfileEnabled(profiles)); - + $('#bc_usebg').prop('checked','checked'); $('#bc_usecarbs').prop('checked','checked'); $('#bc_usecob').prop('checked',''); @@ -177,7 +176,7 @@ function init(client, $) { $('#bc_quickpick').val(-1); $('#bc_preBolus').val(0); $('#bc_notes').val(''); - $('#bc_enteredBy').val(Storages.localStorage.get('enteredBy') || ''); + $('#bc_enteredBy').val($.localStorage.get('enteredBy') || ''); $('#bc_nowtime').prop('checked', true); $('#bc_othercorrection').val(0); $('#bc_profile').val(client.profilefunctions.activeProfileToTime()); @@ -186,21 +185,21 @@ function init(client, $) { boluscalc.updateVisualisations(client.sbx); boluscalc.calculateInsulin(); }; - + boluscalc.calculateInsulin = function calculateInsulin (event) { maybePrevent(event); boluscalc.gatherBoluscalcData( ); boluscalc.updateGui(boluscalc.record); return boluscalc.record; }; - + boluscalc.updateGui = function updateGui (record) { record = record || boluscalc.record; if (record.eventTime === undefined) { return; } - + var targetBGLow = record.targetBGLow; var targetBGHigh = record.targetBGHigh; var isf = record.isf; @@ -237,7 +236,7 @@ function init(client, $) { } $('#bc_inzulinbg').text(record.insulinbg.toFixed(2)); $('#bc_inzulinbg').attr('title', - 'Target BG range: '+targetBGLow + ' - ' + targetBGHigh + + 'Target BG range: '+targetBGLow + ' - ' + targetBGHigh + '\nISF: ' + isf + '\nBG diff: ' + record.bgdiff.toFixed(1) ); @@ -247,7 +246,7 @@ function init(client, $) { $('#bc_inzulinbg').text(''); $('#bc_inzulinbg').attr('title', ''); } - + // Show foods if (record.foods.length) { var html = ''; @@ -299,11 +298,11 @@ function init(client, $) { $('#bc_inzulincarbs').attr('title',''); $('#bc_carbs').text(''); } - + // Show Total $('#bc_rouding').text(record.roundingcorrection.toFixed(2)); $('#bc_insulintotal').text(record.insulin.toFixed(2)); - + // Carbs needed if too much iob or in range message when nothing entered and in range var outcome = record.bg - record.iob * isf; if (record.othercorrection === 0 && record.carbs === 0 && record.cob === 0 && record.bg > 0 && outcome > targetBGLow && outcome < targetBGHigh) { @@ -334,16 +333,16 @@ function init(client, $) { tempMark += tempMark ? ': ' : ''; $('#bc_basal').text(tempMark + basal.totalbasal.toFixed(3)); }; - + boluscalc.gatherBoluscalcData = function gatherBoluscalcData() { boluscalc.record = {}; var record = boluscalc.record; - + if (!client.sbx) { console.log('No sandbox data yet. Exiting gatherBoluscalcData()'); return; } - + record.profile = $('#bc_profile').val(); if (!record.profile) { delete record.profile; @@ -351,7 +350,7 @@ function init(client, $) { return; } - + // Calculate event time from date & time record.eventTime = new Date(); if ($('#bc_othertime').is(':checked')) { @@ -401,7 +400,7 @@ function init(client, $) { record.cob = roundTo(cob.cobTotal(client.sbx.data.treatments, client.sbx.data.devicestatus, client.sbx.data.profile, record.eventTime, record.profile).cob, 0.01); record.insulincob = roundTo(record.cob / ic, 0.01); } - + // Load BG record.bg = 0; record.insulinbg = 0; @@ -421,7 +420,7 @@ function init(client, $) { record.insulinbg = roundTo(record.bgdiff / isf, 0.01); } } - + // Load foods record.carbs = 0; record.foods = _.cloneDeep(foods); @@ -436,7 +435,7 @@ function init(client, $) { } else { record.gi = $('#bc_gi').val(); } - + // Load Carbs record.insulincarbs = 0; if ($('#bc_usecarbs').is(':checked')) { @@ -448,7 +447,7 @@ function init(client, $) { } record.insulincarbs = roundTo(record.carbs / ic, 0.01); } - + // Corrections record.othercorrection = parseFloat($('#bc_othercorrection').val()); @@ -459,13 +458,13 @@ function init(client, $) { } record.insulin = roundTo(total, 0.05); record.roundingcorrection = record.insulin - total; - + // Carbs needed if too much iob record.carbsneeded = 0; if (record.insulin<0) { record.carbsneeded = Math.ceil(-total * ic); } - + console.log('Insulin calculation result: ',record); return record; }; @@ -477,7 +476,7 @@ function init(client, $) { alert('Calculation not completed!'); return null; } - + data.enteredBy = $('#bc_enteredBy').val(); data.eventType = 'Bolus Wizard'; if ($('#bc_bg').val()!==0) { @@ -496,13 +495,13 @@ function init(client, $) { if ($('#bc_othertime').is(':checked')) { data.eventTime = mergeDateAndTime().toDate(); } - + // replace boluscalc.eventTime by ISO string data.boluscalc.eventTime = data.boluscalc.eventTime.toISOString(); - + return data; } - + boluscalc.submit = function submit(event) { var data = gatherData(); if (data) { @@ -568,10 +567,10 @@ function init(client, $) { maybePrevent(event); return false; } - + function quickpickChange(event) { var qpiselected = $('#bc_quickpick').val(); - + if (qpiselected === null || qpiselected === '-1') { // (none) $('#bc_carbs').val(0); foods = []; @@ -581,14 +580,14 @@ function init(client, $) { foods = _.cloneDeep(qp.foods); $('#bc_addfoodarea').css('display','none'); } - + boluscalc.calculateInsulin(); maybePrevent(event); } - + function quickpickHideFood() { var qpiselected = $('#bc_quickpick').val(); - + if (qpiselected >= 0) { var qp = quickpicks[qpiselected]; if (qp.hideafteruse) { @@ -604,11 +603,11 @@ function init(client, $) { xhr.send(dataJson); } } - + boluscalc.calculateInsulin(); maybePrevent(event); } - + var categories = []; var foodlist = []; var databaseloaded = false; @@ -617,7 +616,7 @@ function init(client, $) { , subcategory: '' , name: '' }; - + boluscalc.loadFoodDatabase = function loadFoodDatabase(event, callback) { categories = []; foodlist = []; @@ -657,7 +656,7 @@ function init(client, $) { } }); }; - + function fillForm(event) { $('#bc_filter_category').empty().append(''); Object.keys(categories).forEach( function eachCategory(s) { @@ -665,11 +664,11 @@ function init(client, $) { }); filter.category = ''; fillSubcategories(); - + $('#bc_filter_category').change(fillSubcategories); $('#bc_filter_subcategory').change(doFilter); $('#bc_filter_name').on('input',doFilter); - + maybePrevent(event); return false; } @@ -686,7 +685,7 @@ function init(client, $) { } doFilter(); } - + function doFilter(event) { if (event) { filter.category = $('#bc_filter_category').val(); @@ -706,16 +705,16 @@ function init(client, $) { $('#bc_data').append(''); } $('#bc_addportions').val('1'); - + maybePrevent(event); } - + function addFoodFromDatabase(event) { if (!databaseloaded) { boluscalc.loadFoodDatabase(event, addFoodFromDatabase); return; } - + $('#bc_addportions').val('1'); $('#bc_addfooddialog').dialog({ width: 640 @@ -755,7 +754,7 @@ function init(client, $) { return d.type === 'sgv' && d.mills <= time.getTime(); }); var focusPoint = _.last(nowData); - + if (!focusPoint || focusPoint.mills + times.mins(10).mills < time.getTime()) { return null; } @@ -776,7 +775,7 @@ function init(client, $) { boluscalc.calculateInsulin(); maybePrevent(event); }); - + $('#boluscalcDrawerToggle').click(boluscalc.toggleDrawer); $('#boluscalcDrawer').find('button').click(boluscalc.submit); $('#bc_eventTime input:radio').change(boluscalc.eventTimeTypeChange); diff --git a/lib/client/browser-settings.js b/lib/client/browser-settings.js index fab5dafbd505..910214c4b634 100644 --- a/lib/client/browser-settings.js +++ b/lib/client/browser-settings.js @@ -4,17 +4,16 @@ var _ = require('lodash'); // VERSION 1 - 0.9.0 - 2015-Nov-07 - initial version var STORAGE_VERSION = 1; -var Storages = require('js-storage'); function init (client, serverSettings, $) { serverSettings = serverSettings || {settings: {}}; - var storage = Storages.localStorage; + var storage = $.localStorage; var settings = require('../settings')(); function loadForm ( ) { - var utils = client.utils; + var utils = require('../utils')(settings); var language = require('../language')(); language.set(settings.language); var translate = language.translate; @@ -92,7 +91,7 @@ function init (client, serverSettings, $) { showPluginsSettings.toggle(hasPluginsToShow); - $('#editprofilelink').toggle(settings.isEnabled('iob') || settings.isEnabled('cob') || settings.isEnabled('bwp') || settings.isEnabled('basal')); + $('#editprofilelink').toggle(settings.isEnabled(['iob', 'cob', 'bwp', 'basal'])); } diff --git a/lib/client/browser-utils.js b/lib/client/browser-utils.js index 6ce7d2461d70..6f6df6d0a7d1 100644 --- a/lib/client/browser-utils.js +++ b/lib/client/browser-utils.js @@ -46,7 +46,7 @@ function init ($) { //strip '#' so form submission does not fail var url = window.location.href; url = url.replace(/#$/, ''); - window.location.href = url; + window.location = url; } diff --git a/lib/client/careportal.js b/lib/client/careportal.js index f595b3357343..fd84b4017847 100644 --- a/lib/client/careportal.js +++ b/lib/client/careportal.js @@ -4,13 +4,12 @@ var moment = require('moment-timezone'); var _ = require('lodash'); var parse_duration = require('parse-duration'); // https://www.npmjs.com/package/parse-duration var times = require('../times'); -var Storages = require('js-storage'); function init (client, $) { var careportal = { }; var translate = client.translate; - var storage = Storages.localStorage; + var storage = $.localStorage; careportal.allEventTypes = client.plugins.getAllEventTypes(client.sbx); diff --git a/lib/client/chart.js b/lib/client/chart.js index 91f72e3036bb..a2473cd2fa32 100644 --- a/lib/client/chart.js +++ b/lib/client/chart.js @@ -295,6 +295,14 @@ function init (client, d3, $) { d3.select('.x.brush').select('.resize.e').style('cursor', 'move'); d3.select('.x.brush').select('.resize.w').style('cursor', 'move'); + // create a clipPath for when brushing + chart.clip = chart.charts.append('defs') + .append('clipPath') + .attr('id', 'clip') + .append('rect') + .attr('height', chartHeight) + .attr('width', chartWidth); + // add a line that marks the current time chart.focus.append('line') .attr('class', 'now-line') @@ -416,6 +424,13 @@ function init (client, d3, $) { // .attr('transform', 'translate(0,' + 0 + ')') // .call(chart.yAxisBasals); + if (chart.clip) { + // reset clip to new dimensions + chart.clip.transition() + .attr('width', chartWidth) + .attr('height', chartHeight); + } + // reset brush location chart.context.select('.x.brush') .selectAll('rect') diff --git a/lib/client/index.js b/lib/client/index.js index ac801e2561e2..864d9fa35ce7 100644 --- a/lib/client/index.js +++ b/lib/client/index.js @@ -6,8 +6,6 @@ var $ = (global && global.$) || require('jquery'); var d3 = (global && global.d3) || require('d3'); var shiroTrie = require('shiro-trie'); -var Storages = require('js-storage'); - var language = require('../language')(); var sandbox = require('../sandbox')(); var profile = require('../profilefunctions')(); @@ -18,8 +16,6 @@ var receiveDData = require('./receiveddata'); var client = { }; -$('#loadingMessageText').html('Connecting to server'); - client.hashauth = require('../hashauth').init(client, $); client.headers = function headers ( ) { @@ -41,7 +37,7 @@ client.init = function init(callback) { client.browserUtils = require('./browser-utils')($); var token = client.browserUtils.queryParms().token; - var secret = client.hashauth.apisecrethash || Storages.localStorage.get('apisecrethash'); + var secret = client.hashauth.apisecrethash || $.localStorage.get('apisecrethash'); var src = '/api/v1/status.json?t=' + new Date().getTime(); @@ -57,28 +53,16 @@ client.init = function init(callback) { , headers: client.headers() }).done(function success (serverSettings) { client.settingsFailed = false; - console.log('Application appears to be online'); - $('#centerMessagePanel').hide(); client.load(serverSettings, callback); - }).fail(function fail(jqXHR, textStatus, errorThrown) { - - // check if we couldn't reach the server at all, show offline message - if (jqXHR.readyState == 0) { - console.log('Application appears to be OFFLINE'); - $('#loadingMessageText').html('Connecting to Nightscout server failed, retrying every 2 seconds'); - window.setTimeout(window.Nightscout.client.init(), 2000); - return; - } - + }).fail(function fail( ) { //no server setting available, use defaults, auth, etc if (client.settingsFailed) { - console.log('Already tried to get settings after auth, but failed'); + console.info('Already tried to get settings after auth, but failed'); } else { client.settingsFailed = true; language.set('en'); client.translate = language.translate; - // auth failed, hide loader and request for key - $('#centerMessagePanel').hide(); + client.hashauth.requestAuthentication(function afterRequest ( ) { client.init(null, callback); }); @@ -148,10 +132,8 @@ client.load = function load(serverSettings, callback) { , language: language }).registerClientDefaults(); - client.utils = require('../utils')({ - settings: client.settings - , language: language - }); + //After plugins are initialized with browser settings; + browserSettings.loadAndWireForm(); client.rawbg = client.plugins('rawbg'); client.delta = client.plugins('delta'); @@ -164,15 +146,13 @@ client.load = function load(serverSettings, callback) { , bus: require('../bus')(client.settings, client.ctx) , settings: client.settings , notifications: require('../notifications')(client.settings, client.ctx) - , pluginBase: client.plugins.base(majorPills, minorPills, statusPills, bgStatus, client.tooltip, Storages.localStorage) + , pluginBase: client.plugins.base(majorPills, minorPills, statusPills, bgStatus, client.tooltip, $.localStorage) }; + client.utils = require('../utils')(client.ctx.settings); client.sbx = sandbox.clientInit(client.ctx, client.now); client.renderer = require('./renderer')(client, d3, $); - //After plugins are initialized with browser settings; - browserSettings.loadAndWireForm(); - if (serverSettings && serverSettings.authorized) { client.authorized = serverSettings.authorized; client.authorized.lat = Date.now(); @@ -476,7 +456,7 @@ client.load = function load(serverSettings, callback) { .value() .join(' '); } - Storages.localStorage.set('showForecast', client.settings.showForecast); + $.localStorage.set('showForecast', client.settings.showForecast); refreshChart(true); }); viewMenu.append(forecastOption); @@ -869,7 +849,7 @@ client.load = function load(serverSettings, callback) { li.addClass('selected'); var hours = Number(li.data('hours')); client.foucusRangeMS = times.hours(hours).msecs; - Storages.localStorage.set('focusHours', hours); + $.localStorage.set('focusHours', hours); refreshChart(); } else { viewDropdown.open(e); diff --git a/lib/client/receiveddata.js b/lib/client/receiveddata.js index e80b971710f2..6d04a8129476 100644 --- a/lib/client/receiveddata.js +++ b/lib/client/receiveddata.js @@ -114,7 +114,7 @@ function receiveDData (received, ddata, settings) { ddata.mbgs = mergeDataUpdate(received.delta, ddata.mbgs, received.mbgs); ddata.treatments = mergeTreatmentUpdate(received.delta, ddata.treatments, received.treatments); - ddata.processTreatments(false); + ddata.processTreatments(); // Do some reporting on the console // console.log('Total SGV data size', ddata.sgvs.length); diff --git a/lib/client/renderer.js b/lib/client/renderer.js index ca263bac6f1d..078d762e3611 100644 --- a/lib/client/renderer.js +++ b/lib/client/renderer.js @@ -146,7 +146,7 @@ function init (client, d3) { var rawbgInfo = getRawbgInfo(); client.tooltip.transition().duration(TOOLTIP_TRANS_MS).style('opacity', .9); - client.tooltip.html('' + translate('BG')+ ': ' + client.sbx.scaleEntry( d ) + + client.tooltip.html('' + translate('BG')+ ': ' + client.sbx.scaleEntry(d) + (d.type === 'mbg' ? '
' + translate('Device') + ': ' + d.device : '') + (rawbgInfo.value ? '
' + translate('Raw BG') + ': ' + rawbgInfo.value : '') + (rawbgInfo.noise ? '
' + translate('Noise') + ': ' + rawbgInfo.noise : '') + @@ -164,6 +164,9 @@ function init (client, d3) { .on('mouseout', hideTooltip); focusCircles.exit().remove(); + + // add clipping path so that data stays within axis + focusCircles.attr('clip-path', 'url(#clip)'); }; renderer.addTreatmentCircles = function addTreatmentCircles ( ) { @@ -256,6 +259,8 @@ function init (client, d3) { }) .on('mouseout', hideTooltip); + treatCircles.attr('clip-path', 'url(#clip)'); + var durationTreatments = client.ddata.treatments.filter(function(treatment) { return !treatment.carbs && !treatment.insulin && treatment.duration && ! _.includes(['Temp Basal', 'Profile Switch', 'Combo Bolus', 'Temporary Target'], treatment.eventType); @@ -347,6 +352,9 @@ function init (client, d3) { } return d.notes || d.eventType; }); + + + treatRects.attr('clip-path', 'url(#clip)'); }; renderer.addContextCircles = function addContextCircles ( ) { @@ -423,10 +431,6 @@ function init (client, d3) { arc_data[1].element = Math.round(treatment.carbs) + ' g'; } - if (treatment.foodType) { - arc_data[1].element = arc_data[1].element + " " + treatment.foodType; - } - if (treatment.insulin > 0) { arc_data[3].element = Math.round(treatment.insulin * 100) / 100 + ' U'; } @@ -458,9 +462,9 @@ function init (client, d3) { function isInRect(x,y,rect) { return !(x < rect.x || x > rect.x + rect.width || y < rect.y || y > rect.y + rect.height); } - + function appendTreatments(treatment, arc) { - + function boluscalcTooltip (treatment) { if (!treatment.boluscalc) { return ''; @@ -482,12 +486,11 @@ function init (client, d3) { } return html; } - + function treatmentTooltip() { client.tooltip.transition().duration(TOOLTIP_TRANS_MS).style('opacity', .9); client.tooltip.html('' + translate('Time') + ': ' + client.formatTime(new Date(treatment.mills)) + '
' + '' + translate('Treatment type') + ': ' + translate(client.careportal.resolveEventName(treatment.eventType)) + '
' + (treatment.carbs ? '' + translate('Carbs') + ': ' + treatment.carbs + '
' : '') + - (treatment.absorptionTime > 0 ? '' + translate('Absorption Time') + ': ' + (Math.round( treatment.absorptionTime / 60.0 * 10) / 10) + 'h' + '
' : '') + (treatment.insulin ? '' + translate('Insulin') + ': ' + treatment.insulin + '
' : '') + (treatment.enteredinsulin ? '' + translate('Combo Bolus') + ': ' + treatment.enteredinsulin + 'U, ' + treatment.splitNow + '% : ' + treatment.splitExt + '%, ' + translate('Duration') + ': ' + treatment.duration + '
' : '') + (treatment.glucose ? '' + translate('BG') + ': ' + treatment.glucose + (treatment.glucoseType ? ' (' + translate(treatment.glucoseType) + ')' : '') + '
' : '') + @@ -504,9 +507,9 @@ function init (client, d3) { var insulinRect = { x: 0, y: 0, width: 0, height: 0 }; var carbsRect = { x: 0, y: 0, width: 0, height: 0 }; var operation; - renderer.drag = d3.behavior.drag() - .on('dragstart', function() { - //console.log(treatment); + renderer.drag = d3.behavior.drag() + .on('dragstart', function() { + //console.log(treatment); var windowWidth = $(client.tooltip).parent().parent().width(); var left = d3.event.x + TOOLTIP_WIDTH < windowWidth ? d3.event.x : windowWidth - TOOLTIP_WIDTH - 10; client.tooltip.transition().duration(TOOLTIP_TRANS_MS).style('opacity', .9) @@ -607,17 +610,17 @@ function init (client, d3) { }) .text(translate('Move insulin')); } - + chart().basals.attr('display','none'); - + operation = 'Move'; }) - .on('drag', function() { + .on('drag', function() { //console.log(d3.event); client.tooltip.transition().style('opacity', .9); var x = Math.min(Math.max(0, d3.event.x), chart().charts.attr('width')); var y = Math.min(Math.max(0, d3.event.y), chart().focusHeight); - + operation = 'Move'; if (isInRect(x, y, deleteRect) && isInRect(x, y, insulinRect)) { operation = 'Remove insulin'; @@ -634,8 +637,8 @@ function init (client, d3) { newTime = new Date(chart().xScale.invert(x)); var minDiff = times.msecs(newTime.getTime() - treatment.mills).mins.toFixed(0); client.tooltip.html( - '' + translate('Operation') + ': ' + translate(operation) + '
' - + '' + translate('New time') + ': ' + newTime.toLocaleTimeString() + '
' + '' + translate('Operation') + ': ' + translate(operation) + '
' + + '' + translate('New time') + ': ' + newTime.toLocaleTimeString() + '
' + '' + translate('Difference') + ': ' + (minDiff > 0 ? '+' : '') + minDiff + ' ' + translate('mins') ); @@ -651,9 +654,9 @@ function init (client, d3) { 'stroke-width': 2, 'stroke': 'white' }); - + }) - .on('dragend', function() { + .on('dragend', function() { var newTreatment; chart().drag.selectAll('.drag-droparea').remove(); hideTooltip(); @@ -661,14 +664,14 @@ function init (client, d3) { case 'Move': if (window.confirm(translate('Change treatment time to %1 ?', { params: [newTime.toLocaleTimeString()] } ))) { client.socket.emit( - 'dbUpdate', - { - collection: 'treatments', + 'dbUpdate', + { + collection: 'treatments', _id: treatment._id, - data: { created_at: newTime.toISOString() } + data: { created_at: newTime.toISOString() } }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -679,14 +682,14 @@ function init (client, d3) { case 'Remove insulin': if (window.confirm(translate('Remove insulin from treatment ?'))) { client.socket.emit( - 'dbUpdateUnset', - { - collection: 'treatments', + 'dbUpdateUnset', + { + collection: 'treatments', _id: treatment._id, - data: { insulin: 1 } + data: { insulin: 1 } }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -697,14 +700,14 @@ function init (client, d3) { case 'Remove carbs': if (window.confirm(translate('Remove carbs from treatment ?'))) { client.socket.emit( - 'dbUpdateUnset', - { - collection: 'treatments', + 'dbUpdateUnset', + { + collection: 'treatments', _id: treatment._id, - data: { carbs: 1 } + data: { carbs: 1 } }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -715,13 +718,13 @@ function init (client, d3) { case 'Remove': if (window.confirm(translate('Remove treatment ?'))) { client.socket.emit( - 'dbRemove', - { - collection: 'treatments', + 'dbRemove', + { + collection: 'treatments', _id: treatment._id }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -732,26 +735,25 @@ function init (client, d3) { case 'Move insulin': if (window.confirm(translate('Change insulin time to %1 ?', { params: [newTime.toLocaleTimeString()] } ))) { client.socket.emit( - 'dbUpdateUnset', - { - collection: 'treatments', + 'dbUpdateUnset', + { + collection: 'treatments', _id: treatment._id, - data: { insulin: 1 } + data: { insulin: 1 } } ); newTreatment = _.cloneDeep(treatment); delete newTreatment._id; - delete newTreatment.NSCLIENT_ID; delete newTreatment.carbs; newTreatment.created_at = newTime.toISOString(); client.socket.emit( - 'dbAdd', - { - collection: 'treatments', - data: newTreatment + 'dbAdd', + { + collection: 'treatments', + data: newTreatment }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -762,26 +764,25 @@ function init (client, d3) { case 'Move carbs': if (window.confirm(translate('Change carbs time to %1 ?', { params: [newTime.toLocaleTimeString()] } ))) { client.socket.emit( - 'dbUpdateUnset', - { - collection: 'treatments', + 'dbUpdateUnset', + { + collection: 'treatments', _id: treatment._id, - data: { carbs: 1 } + data: { carbs: 1 } } ); newTreatment = _.cloneDeep(treatment); delete newTreatment._id; - delete newTreatment.NSCLIENT_ID; delete newTreatment.insulin; newTreatment.created_at = newTime.toISOString(); client.socket.emit( - 'dbAdd', - { - collection: 'treatments', - data: newTreatment + 'dbAdd', + { + collection: 'treatments', + data: newTreatment }, - function callback(result) { - console.log(result); + function callback(result) { + console.log(result); chart().drag.selectAll('.arrow').transition().duration(5000).style('opacity', 0).remove(); } ); @@ -859,7 +860,7 @@ function init (client, d3) { }); }); }; - + renderer.drawTreatment = function drawTreatment(treatment, opts) { if (!treatment.carbs && !treatment.insulin) { return; @@ -894,17 +895,13 @@ function init (client, d3) { var comboareadata = []; var from = chart().brush.extent()[0].getTime(); var to = Math.max(chart().brush.extent()[1].getTime(), client.sbx.time) + client.forecastTime; - + var date = from; var lastbasal = 0; - + if (!profile.activeProfileToTime(from)) { window.alert(translate('Wrong profile setting.\nNo profile defined to displayed time.\nRedirecting to profile editor to create new profile.')); - try { - window.location.href = '/profile'; - } catch (err) { - //doesn't work when running tests, so catch and ignore - } + window.location.href = '/profile'; return; } @@ -962,7 +959,7 @@ function init (client, d3) { .x(function(d) { return chart().xScaleBasals(d.d); }) .y0(chart().yScaleBasals(0)) .y1(function(d) { return chart().yScaleBasals(d.b); }); - + var g = chart().basals.append('g'); g.append('path') @@ -971,6 +968,7 @@ function init (client, d3) { .attr('stroke-width', 1) .attr('fill', 'none') .attr('d', valueline(linedata)) + .attr('clip-path', 'url(#clip)'); g.append('path') .attr('class', 'line notempline') @@ -979,6 +977,7 @@ function init (client, d3) { .attr('stroke-dasharray', ('3, 3')) .attr('fill', 'none') .attr('d', valueline(notemplinedata)) + .attr('clip-path', 'url(#clip)'); g.append('path') .attr('class', 'area basalarea') @@ -1030,13 +1029,11 @@ function init (client, d3) { if (client.profilefunctions.listBasalProfiles().length < 2) { return; // do not visualize profiles if there is only one } - + function profileTooltip (d) { return ''+translate('Time')+': ' + client.formatTime(new Date(d.mills)) + '
' + (d.eventType ? ''+translate('Treatment type')+': ' + translate(client.careportal.resolveEventName(d.eventType)) + '
' : '') + - (d.endprofile ? ''+translate('End of profile')+': ' + d.endprofile + '
' : '') + (d.profile ? ''+translate('Profile')+': ' + d.profile + '
' : '') + - (d.duration ? ''+translate('Duration')+': ' + d.duration + translate('mins') + '
' : '') + (d.enteredBy ? ''+translate('Entered By')+': ' + d.enteredBy + '
' : '') + (d.notes ? ''+translate('Notes')+': ' + d.notes : ''); } @@ -1046,7 +1043,7 @@ function init (client, d3) { var to = chart().brush.extent()[1].getTime(); var mult = (to-from) / times.hours(24).msecs; from += times.mins(20 * mult).msecs; - + var mode = client.settings.extendedSettings.basal.render; var data = client.ddata.profileTreatments.slice(); data.push({ @@ -1055,40 +1052,19 @@ function init (client, d3) { , mills: from , first: true }); - - _.forEach(client.ddata.profileTreatments, function eachTreatment (d) { - if (d.duration && !d.cuttedby) { - data.push({ - cutting: d.profile - , profile: client.profilefunctions.activeProfileToTime(times.mins(d.duration).msecs + d.mills + 1) - , mills: times.mins(d.duration).msecs + d.mills - , end: true - }); - } - }); - var treatProfiles = chart().basals.selectAll('.g-profile').data(data); var topOfText = ('icicle' === mode ? chart().maxBasalValue + 0.05 : -0.05); - - var generateText = function (t) { - var sign = t.first ? '▲▲▲' : '▬▬▬'; - var ret; - if (t.cutting) { - ret = sign + ' ' + t.cutting + ' ' + '►►►' + ' ' + t.profile + ' ' + sign; - } else { - ret = sign + ' ' + t.profile + ' ' + sign; - } - return ret; - }; - - treatProfiles.transition().duration(0) + treatProfiles.transition() .attr('transform', function (t) { // change text of record on left side return 'rotate(-90,' + chart().xScale(t.mills) + ',' + chart().yScaleBasals(topOfText) + ') ' + 'translate(' + chart().xScale(t.mills) + ',' + chart().yScaleBasals(topOfText) + ')'; - }). - text(generateText); + }) + .text(function (t) { + var sign = t.first ? '↑↑↑' : '---'; + return sign + ' ' + t.profile + ' ' + sign; + }); treatProfiles.enter().append('text') .attr('class', 'g-profile') @@ -1101,7 +1077,10 @@ function init (client, d3) { return 'rotate(-90 ' + chart().xScale(t.mills) + ',' + chart().yScaleBasals(topOfText) + ') ' + 'translate(' + chart().xScale(t.mills) + ',' + chart().yScaleBasals(topOfText) + ')'; }) - .text(generateText) + .text(function (t) { + var sign = t.first ? '↑↑↑' : '---'; + return sign + ' ' + t.profile + ' ' + sign; + }) .on('mouseover', function (d) { client.tooltip.transition().duration(TOOLTIP_TRANS_MS).style('opacity', .9); client.tooltip.html(profileTooltip(d)) @@ -1110,7 +1089,6 @@ function init (client, d3) { }) .on('mouseout', hideTooltip); - treatProfiles.exit().remove(); }; return renderer; diff --git a/lib/data/calcdelta.js b/lib/data/calcdelta.js index 8e39885d86a8..df03ba77083d 100644 --- a/lib/data/calcdelta.js +++ b/lib/data/calcdelta.js @@ -59,7 +59,7 @@ module.exports = function calcDelta (oldData, newData) { } } if (!found) { - result.push({ _id: oo._id, mills: oo.mills, action: 'remove' }); + result.push({ _id: oo._id, action: 'remove' }); } } diff --git a/lib/data/dataloader.js b/lib/data/dataloader.js index 78b979e29a49..dd48d41395a8 100644 --- a/lib/data/dataloader.js +++ b/lib/data/dataloader.js @@ -43,7 +43,7 @@ function init(env, ctx) { if (err) { console.error(err); } - ddata.processTreatments(true); + ddata.processTreatments(); var counts = []; _.forIn(ddata, function each (value, key) { @@ -59,7 +59,7 @@ function init(env, ctx) { // clear treatments, we're going to merge from more queries ddata.treatments = []; - + async.parallel([ loadEntries.bind(null, ddata, ctx) , loadTreatments.bind(null, ddata, ctx) @@ -111,11 +111,8 @@ function loadEntries (ddata, ctx, callback) { } } }); - - //stop using uniq for SGVs since we use buckets, also enables more detailed monitoring - ddata.sgvs = sgvs; - ddata.mbgs = uniq(mbgs); + ddata.sgvs = uniq(sgvs); ddata.cals = uniq(cals); } callback(); @@ -138,9 +135,7 @@ function mergeToTreatments (ddata, results) { return !treatment.eventType || treatment.eventType.indexOf('Temp Basal') === -1 || treatment.mills > oldestAgo; }); - ddata.treatments = _.unionWith(ddata.treatments, treatments, function (a, b) { - return a._id.toString() == b._id.toString(); - }); + ddata.treatments = _.union(ddata.treatments, treatments); } function loadTreatments (ddata, ctx, callback) { @@ -157,7 +152,7 @@ function loadTreatments (ddata, ctx, callback) { , sort: {created_at: 1} }; - console.log('searching treatments q', tq); + console.log('searching tretaments q', tq); ctx.treatments.list(tq, function (err, results) { if (!err && results) { mergeToTreatments(ddata, results); @@ -171,14 +166,16 @@ function loadProfileSwitchTreatments (ddata, ctx, callback) { var dateRange = { $gte: new Date(ddata.lastUpdated - (ONE_DAY * 31 * 12)).toISOString() }; - + if (ddata.page && ddata.page.frame) { dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); } - + var tq = { find: { - eventType: 'Profile Switch' + eventType: { + $eq: 'Profile Switch' + } , created_at: dateRange } , sort: {created_at: -1} @@ -201,7 +198,7 @@ function loadProfileSwitchTreatments (ddata, ctx, callback) { } } } - + callback(); }); } @@ -210,15 +207,15 @@ function loadSensorAndInsulinTreatments (ddata, ctx, callback) { var dateRange = { $gte: new Date(ddata.lastUpdated - (ONE_DAY * 32)).toISOString() }; - + if (ddata.page && ddata.page.frame) { dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); } - + var tq = { find: { eventType: { - $in: [ 'Sensor Start', 'Sensor Change', 'Insulin Change', 'Pump Battery Change'] + $in: [ 'Sensor Start', 'Sensor Change','Insulin Change'] } , created_at: dateRange } diff --git a/lib/data/ddata.js b/lib/data/ddata.js index c975bd41f02d..7d896d00360f 100644 --- a/lib/data/ddata.js +++ b/lib/data/ddata.js @@ -30,7 +30,7 @@ function init( ) { }); }; - ddata.splitRecent = function splitRecent (time, cutoff, max, treatmentsToo) { + ddata.splitRecent = function splitRecent (time, cutoff, max) { var result = { first: { } , rest: { } @@ -57,7 +57,7 @@ function init( ) { result.rest[field] = parts[1]; } - partition('treatments', treatmentsToo ? filterMax : false); + partition('treatments', false); result.first.devicestatus = ddata.recentDeviceStatus(time); @@ -116,23 +116,19 @@ function init( ) { }; - ddata.processDurations = function processDurations (treatments, keepzeroduration) { + ddata.processDurations = function processDurations (treatments) { treatments = _.uniqBy(treatments, 'mills'); // cut temp basals by end events // better to do it only on data update - var endevents = treatments.filter(function filterEnd(t) { - return !t.duration; - }); + var endevents = treatments.filter(function filterEnd (t) { + return ! t.duration; + }); function cutIfInInterval (base, end) { if (base.mills < end.mills && base.mills + times.mins(base.duration).msecs > end.mills) { base.duration = times.msecs(end.mills-base.mills).mins; - if (end.profile) { - base.cuttedby = end.profile; - end.cutting = base.profile; - } } } @@ -154,16 +150,12 @@ function init( ) { } }); - if (keepzeroduration) { - return treatments; - } else { - return treatments.filter(function filterEnd(t) { - return t.duration; - }); - } + return treatments.filter(function filterEnd (t) { + return t.duration; + }); }; - ddata.processTreatments = function processTreatments (preserveOrignalTreatments ) { + ddata.processTreatments = function processTreatments ( ) { // filter & prepare 'Site Change' events ddata.sitechangeTreatments = ddata.treatments.filter( function filterSensor (t) { @@ -181,12 +173,9 @@ function init( ) { }).sort(function (a,b) { return a.mills > b.mills; }); // filter & prepare 'Profile Switch' events - var profileTreatments = ddata.treatments.filter( function filterProfiles (t) { + ddata.profileTreatments = ddata.treatments.filter( function filterProfiles (t) { return t.eventType === 'Profile Switch'; }).sort(function (a,b) { return a.mills > b.mills; }); - if (preserveOrignalTreatments) - profileTreatments = _.cloneDeep(profileTreatments); - ddata.profileTreatments = ddata.processDurations(profileTreatments, true); // filter & prepare 'Combo Bolus' events ddata.combobolusTreatments = ddata.treatments.filter( function filterComboBoluses (t) { @@ -197,17 +186,14 @@ function init( ) { var tempbasalTreatments = ddata.treatments.filter( function filterBasals (t) { return t.eventType && t.eventType.indexOf('Temp Basal') > -1; }); - if (preserveOrignalTreatments) - tempbasalTreatments = _.cloneDeep(tempbasalTreatments); - ddata.tempbasalTreatments = ddata.processDurations(tempbasalTreatments, false); + // store prepared temp basal treatments + ddata.tempbasalTreatments = ddata.processDurations(tempbasalTreatments); // filter temp target var tempTargetTreatments = ddata.treatments.filter( function filterTargets (t) { return t.eventType && t.eventType.indexOf('Temporary Target') > -1; }); - if (preserveOrignalTreatments) - tempTargetTreatments = _.cloneDeep(tempTargetTreatments); - ddata.tempTargetTreatments = ddata.processDurations(tempTargetTreatments, false); + ddata.tempTargetTreatments = ddata.processDurations(tempTargetTreatments); }; diff --git a/lib/devicestatus.js b/lib/devicestatus.js index 1939450adb5b..12d3df95d8ea 100644 --- a/lib/devicestatus.js +++ b/lib/devicestatus.js @@ -79,10 +79,7 @@ function storage (collection, ctx) { api.last = last; api.remove = remove; api.aggregate = require('./aggregate')({ }, api); - api.indexedFields = [ - 'created_at' - , 'NSCLIENT_ID' - ]; + api.indexedFields = ['created_at']; return api; } diff --git a/lib/hashauth.js b/lib/hashauth.js index e4956860c59f..d2fe0d5646e4 100644 --- a/lib/hashauth.js +++ b/lib/hashauth.js @@ -1,7 +1,6 @@ 'use strict'; var crypto = require('crypto'); -var Storages = require('js-storage'); var hashauth = { apisecret: '' @@ -48,7 +47,7 @@ hashauth.init = function init(client, $) { }; hashauth.initAuthentication = function initAuthentication(next) { - hashauth.apisecrethash = hashauth.apisecrethash || Storages.localStorage.get('apisecrethash') || null; + hashauth.apisecrethash = hashauth.apisecrethash || $.localStorage.get('apisecrethash') || null; hashauth.verifyAuthentication(function () { hashauth.injectHtml(); if (next) { next( hashauth.isAuthenticated() ); } @@ -58,7 +57,7 @@ hashauth.init = function init(client, $) { hashauth.removeAuthentication = function removeAuthentication(event) { - Storages.localStorage.remove('apisecrethash'); + $.localStorage.remove('apisecrethash'); if (hashauth.authenticated) { client.browserUtils.reload(); @@ -136,7 +135,7 @@ hashauth.init = function init(client, $) { hashauth.verifyAuthentication( function(isok) { if (isok) { if (hashauth.storeapisecret) { - Storages.localStorage.set('apisecrethash',hashauth.apisecrethash); + $.localStorage.set('apisecrethash',hashauth.apisecrethash); } $('#authentication_placeholder').html(hashauth.inlineCode()); if (callback) { @@ -164,7 +163,7 @@ hashauth.init = function init(client, $) { console.info('status isAuthenticated', hashauth); status = translate('Admin authorized') + ' (' + translate('Remove') + ')'; } else { - status = translate('Unauthorized') + ' (' + translate('Authenticate') + ')'; + status = translate('Not authorized') + ' (' + translate('Authenticate') + ')'; } var html = diff --git a/lib/language.js b/lib/language.js index 01fc8da6fe6e..fee8a33ede26 100644 --- a/lib/language.js +++ b/lib/language.js @@ -12,26 +12,26 @@ function init() { language.languages = [ { code: 'bg', language: 'Български' } , { code: 'cs', language: 'Čeština' } - , { code: 'de', language: 'Deutsch' } , { code: 'dk', language: 'Dansk' } - , { code: 'el', language: 'Ελληνικά' } + , { code: 'de', language: 'Deutsch' } , { code: 'en', language: 'English' } , { code: 'es', language: 'Español' } - , { code: 'fi', language: 'Suomi' } , { code: 'fr', language: 'Français' } + , { code: 'el', language: 'Ελληνικά' } , { code: 'he', language: 'עברית' } , { code: 'hr', language: 'Hrvatski' } , { code: 'it', language: 'Italiano' } - , { code: 'ko', language: '한국어' } + , { code: 'nl', language: 'Nederlands' } , { code: 'nb', language: 'Norsk (Bokmål)' } + , { code: 'nl', language: 'Nederlands' } , { code: 'pl', language: 'Polski' } , { code: 'pt', language: 'Português (Brasil)' } , { code: 'ro', language: 'Română' } , { code: 'ru', language: 'Русский' } , { code: 'sk', language: 'Slovenčina' } , { code: 'sv', language: 'Svenska' } -   , { code: 'zh_cn', language: '中文(简体)' } -   , { code: 'zh_tw', language: '中文(繁體)' } + , { code: 'fi', language: 'Suomi' } + , { code: 'ko', language: 'Korean' } ]; var translations = { @@ -42,7 +42,7 @@ function init() { ,fr: 'Ecoute sur port' ,pt: 'Escutando porta' ,sv: 'Lyssnar på port' - ,ro: 'Activ pe portul' + , ro: 'Activ pe portul' ,el: 'Σύνδεση στην πόρτα' ,bg: 'Активиране на порта' ,hr: 'Slušanje na portu' @@ -57,15 +57,14 @@ function init() { ,de: 'Lauscht auf Port' ,nl: 'Luitert op poort' ,ko: '포트에서 수신' - ,zh_cn: '正在监听端口' - } + } // Client ,'Mo' : { cs: 'Po' ,de: 'Mo' ,es: 'Lu' - ,fr: 'Lu' - ,el: 'Δε' + , fr: 'Lu' + ,el:'Δε' ,pt: 'Seg' ,sv: 'Mån' ,ro: 'Lu' @@ -77,11 +76,10 @@ function init() { ,nb: 'Man' ,he: 'ב' ,pl: 'Pn' - ,ru: 'Пон' + ,ru: 'Пон' ,sk: 'Po' ,nl: 'Ma' ,ko: '월' - ,zh_cn: '一' } ,'Tu' : { cs: 'Út' @@ -103,14 +101,13 @@ function init() { ,ru: 'Вт' ,sk: 'Ut' ,nl: 'Di' - ,ko: '화' - ,zh_cn: '二' + ,ko: '화' } ,'We' : { cs: 'St' ,de: 'Mi' ,es: 'Mie' - ,fr: 'Me' + , fr: 'Me' ,el: 'Τε' ,pt: 'Qua' ,sv: 'Ons' @@ -126,14 +123,13 @@ function init() { ,ru: 'Ср' ,sk: 'St' ,nl: 'Wo' - ,ko: '수' - ,zh_cn: '三' + ,ko: '수' } ,'Th' : { cs: 'Čt' ,de: 'Do' ,es: 'Jue' - ,fr: 'Je' + , fr: 'Je' ,el: 'Πε' ,pt: 'Qui' ,sv: 'Tor' @@ -149,8 +145,7 @@ function init() { ,ru: 'Чт' ,sk: 'Št' ,nl: 'Do' - ,ko: '목' - ,zh_cn: '四' + ,ko: '목' } ,'Fr' : { cs: 'Pá' @@ -172,8 +167,7 @@ function init() { ,ru: 'Пт' ,sk: 'Pi' ,nl: 'Vr' - ,ko: '금' - ,zh_cn: '五' + ,ko: '금' } ,'Sa' : { cs: 'So' @@ -195,8 +189,7 @@ function init() { ,ru: 'Сб' ,sk: 'So' ,nl: 'Za' - ,ko: '토' - ,zh_cn: '六' + ,ko: '토' } ,'Su' : { cs: 'Ne' @@ -218,8 +211,7 @@ function init() { ,ru: 'Вс' ,sk: 'Ne' ,nl: 'Zo' - ,ko: '일' - ,zh_cn: '日' + ,ko: '일' } ,'Monday' : { cs: 'Pondělí' @@ -241,8 +233,7 @@ function init() { ,ru: 'Понедельник' ,sk: 'Pondelok' ,nl: 'Maandag' - ,ko: '월요일' - ,zh_cn: '星期一' + ,ko: '월요일' } ,'Tuesday' : { cs: 'Úterý' @@ -264,8 +255,7 @@ function init() { ,ru: 'Вторник' ,sk: 'Utorok' ,nl: 'Dinsdag' - ,ko: '화요일' - ,zh_cn: '星期二' + ,ko: '화요일' } ,'Wednesday' : { cs: 'Středa' @@ -288,7 +278,6 @@ function init() { ,sk: 'Streda' ,nl: 'Woensdag' ,ko: '수요일' - ,zh_cn: '星期三' } ,'Thursday' : { cs: 'Čtvrtek' @@ -311,7 +300,6 @@ function init() { ,sk: 'Štvrtok' ,nl: 'Donderdag' ,ko: '목요일' - ,zh_cn: '星期四' } ,'Friday' : { cs: 'Pátek' @@ -334,7 +322,6 @@ function init() { ,sk: 'Piatok' ,nl: 'Vrijdag' ,ko: '금요일' - ,zh_cn: '星期五' } ,'Saturday' : { cs: 'Sobota' @@ -357,7 +344,6 @@ function init() { ,sk: 'Sobota' ,nl: 'Zaterdag' ,ko: '토요일' - ,zh_cn: '星期六' } ,'Sunday' : { cs: 'Neděle' @@ -380,7 +366,6 @@ function init() { ,sk: 'Nedeľa' ,nl: 'Zondag' ,ko: '일요일' - ,zh_cn: '星期日' } ,'Category' : { cs: 'Kategorie' @@ -403,7 +388,6 @@ function init() { ,sk: 'Kategória' ,nl: 'Categorie' ,ko: '분류' - ,zh_cn: '类别' } ,'Subcategory' : { cs: 'Podkategorie' @@ -426,7 +410,6 @@ function init() { ,sk: 'Podkategória' ,nl: 'Subcategorie' ,ko: '세부 분류' - ,zh_cn: '子类别' } ,'Name' : { cs: 'Jméno' @@ -449,7 +432,6 @@ function init() { ,sk: 'Meno' ,nl: 'Naam' ,ko: '이름' - ,zh_cn: '名称' } ,'Today' : { cs: 'Dnes' @@ -472,7 +454,6 @@ function init() { ,sk: 'Dnes' ,nl: 'Vandaag' ,ko: '오늘' - ,zh_cn: '今天' } ,'Last 2 days' : { cs: 'Poslední 2 dny' @@ -495,7 +476,6 @@ function init() { ,sk: 'Posledné 2 dni' ,nl: 'Afgelopen 2 dagen' ,ko: '지난 2일' - ,zh_cn: '过去2天' } ,'Last 3 days' : { cs: 'Poslední 3 dny' @@ -518,7 +498,6 @@ function init() { ,sk: 'Posledné 3 dni' ,nl: 'Afgelopen 3 dagen' ,ko: '지난 3일' - ,zh_cn: '过去3天' } ,'Last week' : { cs: 'Poslední týden' @@ -541,7 +520,6 @@ function init() { ,sk: 'Posledný týždeň' ,nl: 'Afgelopen week' ,ko: '지난주' - ,zh_cn: '上周' } ,'Last 2 weeks' : { cs: 'Poslední 2 týdny' @@ -564,7 +542,6 @@ function init() { ,sk: 'Posledné 2 týždne' ,nl: 'Afgelopen 2 weken' ,ko: '지난 2주' - ,zh_cn: '过去2周' } ,'Last month' : { cs: 'Poslední měsíc' @@ -587,7 +564,6 @@ function init() { ,sk: 'Posledný mesiac' ,nl: 'Afgelopen maand' ,ko: '지난달' - ,zh_cn: '上个月' } ,'Last 3 months' : { cs: 'Poslední 3 měsíce' @@ -610,7 +586,6 @@ function init() { ,sk: 'Posledné 3 mesiace' ,nl: 'Afgelopen 3 maanden' ,ko: '지난 3달' - ,zh_cn: '过去3个月' } ,'From' : { cs: 'Od' @@ -633,7 +608,6 @@ function init() { ,sk: 'Od' ,nl: 'Van' ,ko: '시작일' - ,zh_cn: '从' } ,'To' : { cs: 'Do' @@ -656,7 +630,6 @@ function init() { ,sk: 'Do' ,nl: 'Tot' ,ko: '종료일' - ,zh_cn: '到' } ,'Notes' : { cs: 'Poznámky' @@ -679,7 +652,6 @@ function init() { ,sk: 'Poznámky' ,nl: 'Notities' ,ko: '메모' - ,zh_cn: '记录' } ,'Food' : { cs: 'Jídlo' @@ -702,7 +674,6 @@ function init() { ,sk: 'Jedlo' ,nl: 'Voeding' ,ko: '음식' - ,zh_cn: '食物' } ,'Insulin' : { cs: 'Inzulín' @@ -725,7 +696,6 @@ function init() { ,sk: 'Inzulín' ,nl: 'Insuline' ,ko: '인슐린' - ,zh_cn: '胰岛素' } ,'Carbs' : { cs: 'Sacharidy' @@ -748,7 +718,6 @@ function init() { ,sk: 'Sacharidy' ,nl: 'Koolhydraten' ,ko: '탄수화물' - ,zh_cn: '碳水化合物' } ,'Notes contain' : { cs: 'Poznámky obsahují' @@ -770,7 +739,6 @@ function init() { ,sk: 'Poznámky obsahujú' ,nl: 'Inhoud aantekening' ,ko: '메모 포함' - ,zh_cn: '记录包括' } ,'Target bg range bottom' : { cs: 'Cílová glykémie spodní' @@ -793,7 +761,6 @@ function init() { ,sk: 'Cieľová glykémia spodná' ,nl: 'Ondergrens doelbereik glucose' ,ko: '최저 목표 혈당 범위' - ,zh_cn: '目标血糖范围 下限' } ,'top' : { cs: 'horní' @@ -816,7 +783,6 @@ function init() { ,sk: 'horná' ,nl: 'Top' ,ko: '최고치' - ,zh_cn: '上限' } ,'Show' : { cs: 'Zobraz' @@ -839,7 +805,6 @@ function init() { ,sk: 'Ukáž' ,nl: 'Laat zien' ,ko: '보여 주세요~' - ,zh_cn: '生成' } ,'Display' : { cs: 'Zobraz' @@ -862,7 +827,6 @@ function init() { ,sk: 'Zobraz' ,nl: 'Weergeven' ,ko: '출력' - ,zh_cn: '显示' } ,'Loading' : { cs: 'Nahrávám' @@ -885,7 +849,6 @@ function init() { ,sk: 'Nahrávam' ,nl: 'Laden' ,ko: '로딩' - ,zh_cn: '载入中' } ,'Loading profile' : { cs: 'Nahrávám profil' @@ -908,7 +871,6 @@ function init() { ,sk: 'Nahrávam profil' ,nl: 'Profiel laden' ,ko: '프로파일 로딩' - ,zh_cn: '载入配置文件' } ,'Loading status' : { cs: 'Nahrávám status' @@ -931,7 +893,6 @@ function init() { ,sk: 'Nahrávam status' ,nl: 'Laadstatus' ,ko: '상태 로딩' - ,zh_cn: '载入状态' } ,'Loading food database' : { cs: 'Nahrávám databázi jídel' @@ -954,7 +915,6 @@ function init() { ,sk: 'Nahrávam databázu jedál' ,nl: 'Voeding database laden' ,ko: '음식 데이터 베이스 로딩' - ,zh_cn: '载入食物数据库' } ,'not displayed' : { cs: 'není zobrazeno' @@ -973,11 +933,10 @@ function init() { ,nb: 'Vises ikke' ,he: 'לא מוצג' ,pl: 'Nie jest wyświetlany' - ,ru: 'Не изображено' + ,ru: 'Не визуализировано' ,sk: 'Nie je zobrazené' ,nl: 'Niet weergegeven' ,ko: '출력되지 않음' - ,zh_cn: '未显示' } ,'Loading CGM data of' : { cs: 'Nahrávám CGM data' @@ -1000,7 +959,6 @@ function init() { ,sk: 'Nahrávam CGM dáta' ,nl: 'CGM data laden van' ,ko: 'CGM 데이터 로딩' - ,zh_cn: '载入CGM(连续血糖监测)数据从' } ,'Loading treatments data of' : { cs: 'Nahrávám data ošetření' @@ -1023,7 +981,6 @@ function init() { ,sk: 'Nahrávam dáta ošetrenia' ,nl: 'Behandel gegevens laden van' ,ko: '처리 데이터 로딩' - ,zh_cn: '载入操作数据从' } ,'Processing data of' : { cs: 'Zpracovávám data' @@ -1046,7 +1003,6 @@ function init() { ,sk: 'Spracovávam dáta' ,nl: 'Gegevens verwerken van' ,ko: '데이터 처리 중' - ,zh_cn: '处理数据从' } ,'Portion' : { cs: 'Porce' @@ -1069,7 +1025,6 @@ function init() { ,sk: 'Porcia' ,nl: 'Portie' ,ko: '부분' - ,zh_cn: '部分' } ,'Size' : { cs: 'Rozměr' @@ -1092,7 +1047,6 @@ function init() { ,sk: 'Veľkosť' ,nl: 'Grootte' ,ko: '크기' - ,zh_cn: '大小' } ,'(none)' : { cs: '(Žádný)' @@ -1115,8 +1069,6 @@ function init() { ,sk: '(žiadny)' ,nl: '(geen)' ,ko: '(없음)' - ,zh_cn: '(无)' - ,zh_tw: '(無)' } ,'None' : { cs: 'Žádný' @@ -1139,8 +1091,6 @@ function init() { ,sk: 'Žiadny' ,nl: 'geen' ,ko: '없음' - ,zh_cn: '无' - ,zh_tw: '無' } ,'' : { cs: '<Žádný>' @@ -1163,7 +1113,6 @@ function init() { ,sk: '<žiadny>' ,nl: '' ,ko: '<없음>' - ,zh_cn: '<无>' } ,'Result is empty' : { cs: 'Prázdný výsledek' @@ -1186,7 +1135,6 @@ function init() { ,sk: 'Prázdny výsledok' ,nl: 'Geen resultaat' ,ko: '결과 없음' - ,zh_cn: '结果为空' } ,'Day to day' : { cs: 'Den po dni' @@ -1209,7 +1157,6 @@ function init() { ,sk: 'Deň po dni' ,nl: 'Dag tot Dag' ,ko: '날짜' - ,zh_cn: '日到日' } ,'Daily Stats' : { cs: 'Denní statistiky' @@ -1232,7 +1179,6 @@ function init() { ,sk: 'Denné štatistiky' ,nl: 'Dagelijkse statistiek' ,ko: '날짜 통계' - ,zh_cn: '每日状态' } ,'Percentile Chart' : { cs: 'Percentil' @@ -1255,7 +1201,6 @@ function init() { ,sk: 'Percentil' ,nl: 'Procentuele grafiek' ,ko: '백분위 그래프' - ,zh_cn: '百分位图形' } ,'Distribution' : { cs: 'Rozložení' @@ -1278,7 +1223,6 @@ function init() { ,sk: 'Distribúcia' ,nl: 'Verdeling' ,ko: '분포' - ,zh_cn: '分布' } ,'Hourly stats' : { cs: 'Statistika po hodinách' @@ -1301,7 +1245,6 @@ function init() { ,sk: 'Hodinové štatistiky' ,nl: 'Uurlijkse statistieken ' ,ko: '시간 통계' - ,zh_cn: '每小时状态' } ,'Weekly success' : { cs: 'Statistika po týdnech' @@ -1323,7 +1266,6 @@ function init() { ,sk: 'Týždenná úspešnosť' ,nl: 'Wekelijkse successen' ,ko: '주간 통계' - ,zh_cn: '每周统计' } ,'No data available' : { cs: 'Žádná dostupná data' @@ -1346,7 +1288,6 @@ function init() { ,sk: 'Žiadne dostupné dáta' ,nl: 'Geen gegevens beschikbaar' ,ko: '활용할 수 있는 데이터 없음' - ,zh_cn: '无可用数据' } ,'Low' : { cs: 'Nízká' @@ -1369,7 +1310,6 @@ function init() { ,sk: 'Nízka' ,nl: 'Laag' ,ko: '낮음' - ,zh_cn: '低血糖' } ,'In Range' : { cs: 'V rozsahu' @@ -1392,7 +1332,6 @@ function init() { ,sk: 'V rozsahu' ,nl: 'Binnen bereik' ,ko: '범위 안 ' - ,zh_cn: '范围内' } ,'Period' : { cs: 'Období' @@ -1415,7 +1354,6 @@ function init() { ,sk: 'Obdobie' ,nl: 'Periode' ,ko: '기간 ' - ,zh_cn: '期间' } ,'High' : { cs: 'Vysoká' @@ -1438,10 +1376,9 @@ function init() { ,sk: 'Vysoká' ,nl: 'Hoog' ,ko: '높음' - ,zh_cn: '高血糖' } ,'Average' : { - cs: 'Průměr' + cs: 'Průměrná' ,de: 'Mittelwert' ,es: 'Media' ,fr: 'Moyenne' @@ -1461,7 +1398,6 @@ function init() { ,sk: 'Priemer' ,nl: 'Gemiddeld' ,ko: '평균' - ,zh_cn: '平均' } ,'Low Quartile' : { cs: 'Nízký kvartil' @@ -1484,7 +1420,6 @@ function init() { ,sk: 'Nizky kvartil' ,nl: 'Eerste kwartiel' ,ko: '낮은 4분위' - ,zh_cn: '下四分位数' } ,'Upper Quartile' : { cs: 'Vysoký kvartil' @@ -1507,7 +1442,6 @@ function init() { ,sk: 'Vysoký kvartil' ,nl: 'Derde kwartiel' ,ko: '높은 4분위' - ,zh_cn: '上四分位数' } ,'Quartile' : { cs: 'Kvartil' @@ -1530,7 +1464,6 @@ function init() { ,sk: 'Kvartil' ,nl: 'Kwartiel' ,ko: '4분위' - ,zh_cn: '四分位数' } ,'Date' : { cs: 'Datum' @@ -1553,7 +1486,6 @@ function init() { ,sk: 'Dátum' ,nl: 'Datum' ,ko: '날짜' - ,zh_cn: '日期' } ,'Normal' : { cs: 'Normální' @@ -1575,7 +1507,6 @@ function init() { ,sk: 'Normálny' ,nl: 'Normaal' ,ko: '보통' - ,zh_cn: '正常' } ,'Median' : { cs: 'Medián' @@ -1598,7 +1529,6 @@ function init() { ,sk: 'Medián' ,nl: 'Mediaan' ,ko: '중간값' - ,zh_cn: '中值' } ,'Readings' : { cs: 'Záznamů' @@ -1621,10 +1551,9 @@ function init() { ,sk: 'Záznamy' ,nl: 'Metingen' ,ko: '혈당' - ,zh_cn: '读数' } ,'StDev' : { - cs: 'Směrodatná odchylka' + cs: 'St. odchylka' ,de: 'Standardabweichung' ,es: 'Desviación estándar' ,fr: 'Déviation St.' @@ -1640,10 +1569,9 @@ function init() { ,nb: 'Standardavvik' ,he: 'סטיית תקן' ,pl: 'Stand. odchylenie' - ,ru: 'Стандартное отклонение' + ,ru: 'Стандартные отклонения' ,sk: 'Štand. odch.' ,ko: '표준 편차' - ,zh_cn: '标准偏差' } ,'Daily stats report' : { cs: 'Denní statistiky' @@ -1666,7 +1594,6 @@ function init() { ,sk: 'Denné štatistiky' ,nl: 'Dagelijkse statistieken' ,ko: '날짜 통계 보고서' - ,zh_cn: '每日状态报表' } ,'Glucose Percentile report' : { cs: 'Tabulka percentil glykémií' @@ -1688,7 +1615,6 @@ function init() { ,sk: 'Report percentilu glykémií' ,nl: 'Glucose percentiel rapport' ,ko: '혈당 백분위 보고서' - ,zh_cn: '血糖百分位报表' } ,'Glucose distribution' : { cs: 'Rozložení glykémií' @@ -1711,7 +1637,6 @@ function init() { ,sk: 'Rozloženie glykémie' ,nl: 'Glucose verdeling' ,ko: '혈당 분포' - ,zh_cn: '血糖分布' } ,'days total' : { cs: 'dní celkem' @@ -1734,7 +1659,6 @@ function init() { ,sk: 'dní celkom' ,nl: 'Totaal dagen' ,ko: '날짜 전체' - ,zh_cn: '天总计' } ,'Overall' : { cs: 'Celkem' @@ -1757,7 +1681,6 @@ function init() { ,sk: 'Súhrn' ,nl: 'Totaal' ,ko: '전체' - ,zh_cn: '概览' } ,'Range' : { cs: 'Rozsah' @@ -1780,7 +1703,6 @@ function init() { ,sk: 'Rozsah' ,nl: 'Bereik' ,ko: '범위' - ,zh_cn: '范围' } ,'% of Readings' : { cs: '% záznamů' @@ -1803,7 +1725,6 @@ function init() { ,sk: '% záznamov' ,nl: '% metingen' ,ko: '% 읽는 중' - ,zh_cn: '%已读取' } ,'# of Readings' : { cs: 'počet záznamů' @@ -1826,7 +1747,6 @@ function init() { ,sk: 'Počet záznamov' ,nl: 'Aantal metingen' ,ko: '# 읽는 중' - ,zh_cn: '#已读取' } ,'Mean' : { cs: 'Střední hodnota' @@ -1849,7 +1769,6 @@ function init() { ,sk: 'Stred' ,nl: 'Gemiddeld' ,ko: '평균' - ,zh_cn: '平均' } ,'Standard Deviation' : { cs: 'Standardní odchylka' @@ -1872,7 +1791,6 @@ function init() { ,sk: 'Štandardná odchylka' ,nl: 'Standaard deviatie' ,ko: '표준 편차' - ,zh_cn: '标准偏差' } ,'Max' : { cs: 'Max' @@ -1895,7 +1813,6 @@ function init() { ,sk: 'Max' ,nl: 'Max' ,ko: '최대값' - ,zh_cn: '最大值' } ,'Min' : { cs: 'Min' @@ -1918,7 +1835,6 @@ function init() { ,sk: 'Min' ,nl: 'Min' ,ko: '최소값' - ,zh_cn: '最小值' } ,'A1c estimation*' : { cs: 'Předpokládané HBA1c*' @@ -1941,7 +1857,6 @@ function init() { ,sk: 'Odhadované HbA1C*' ,nl: 'Geschatte HbA1C' ,ko: '예상 당화혈 색소' - ,zh_cn: '糖化血红蛋白估算' } ,'Weekly Success' : { cs: 'Týdenní úspěšnost' @@ -1963,7 +1878,6 @@ function init() { ,sk: 'Týždenná úspešnosť' ,nl: 'Wekelijks succes' ,ko: '주간 통계' - ,zh_cn: '每周统计' } ,'There is not sufficient data to run this report. Select more days.' : { cs: 'Není dostatek dat. Vyberte delší časové období.' @@ -1986,9 +1900,8 @@ function init() { ,sk: 'Nedostatok dát. Vyberte dlhšie časové obdobie.' ,nl: 'Er zijn niet genoeg gegevens voor dit rapport, selecteer meer dagen.' ,ko: '이 보고서를 실행하기 위한 데이터가 충분하지 않습니다. 더 많은 날들을 선택해 주세요.' - ,zh_cn: '没有足够的数据生成报表,请选择更长时间段。' } - // food editor +// food editor ,'Using stored API secret hash' : { cs: 'Používám uložený hash API hesla' ,de: 'Gespeicherte API-Prüfsumme verwenden' @@ -2009,8 +1922,6 @@ function init() { ,sk: 'Používam uložený API hash heslo' ,nl: 'Gebruik opgeslagen geheime API Hash' ,ko: '저장된 API secret hash를 사용 중' - ,zh_cn: '使用已存储的API密钥哈希值' - ,zh_tw: '使用已存儲的API密鑰哈希值' } ,'No API secret hash stored yet. You need to enter API secret.' : { cs: 'Není uložený žádný hash API hesla. Musíte zadat API heslo.' @@ -2032,8 +1943,6 @@ function init() { ,sk: 'Nieje uložené žiadne API hash heslo. Musíte zadať API heslo.' ,nl: 'Er is nog geen geheime API Hash opgeslagen. U moet eerst een geheime API code invoeren.' ,ko: 'API secret hash가 아직 저장되지 않았습니다. API secret를 입력해 주세요.' - ,zh_cn: '没有已存储的API密钥,请输入API密钥。' - ,zh_tw: '沒有已存儲的API密鑰,請輸入API密鑰。' } ,'Database loaded' : { cs: 'Databáze načtena' @@ -2055,7 +1964,6 @@ function init() { ,sk: 'Databáza načítaná' ,nl: 'Database geladen' ,ko: '데이터베이스 로드' - ,zh_cn: '数据库已载入' } ,'Error: Database failed to load' : { cs: 'Chyba při načítání databáze' @@ -2078,7 +1986,6 @@ function init() { ,sk: 'Chyba pri načítaní databázy' ,nl: 'FOUT: Database niet geladen' ,ko: '에러: 데이터베이스 로드 실패' - ,zh_cn: '错误:数据库载入失败' } ,'Create new record' : { cs: 'Vytvořit nový záznam' @@ -2101,7 +2008,6 @@ function init() { ,sk: 'Vytovriť nový záznam' ,nl: 'Opslaan' ,ko: '새입력' - ,zh_cn: '新增记录' } ,'Save record' : { cs: 'Uložit záznam' @@ -2124,7 +2030,6 @@ function init() { ,sk: 'Uložiť záznam' ,nl: 'Sla op' ,ko: '저장' - ,zh_cn: '保存记录' } ,'Portions' : { cs: 'Porcí' @@ -2147,7 +2052,6 @@ function init() { ,sk: 'Porcií' ,nl: 'Porties' ,ko: '부분' - ,zh_cn: '部分' } ,'Unit' : { cs: 'Jedn' @@ -2170,7 +2074,6 @@ function init() { ,sk: 'Jednot.' ,nl: 'Eenheid' ,ko: '단위' - ,zh_cn: '单位' } ,'GI' : { cs: 'GI' @@ -2192,7 +2095,6 @@ function init() { ,sk: 'GI' ,nl: 'Glycemische index ' ,ko: '혈당 지수' - ,zh_cn: 'GI(血糖生成指数)' } ,'Edit record' : { cs: 'Upravit záznam' @@ -2215,7 +2117,6 @@ function init() { ,sk: 'Upraviť záznam' ,nl: 'Bewerk invoer' ,ko: '편집' - ,zh_cn: '编辑记录' } ,'Delete record' : { cs: 'Smazat záznam' @@ -2238,7 +2139,6 @@ function init() { ,sk: 'Zmazať záznam' ,nl: 'Verwijder invoer' ,ko: '삭제' - ,zh_cn: '删除记录' } ,'Move to the top' : { cs: 'Přesuň na začátek' @@ -2261,7 +2161,6 @@ function init() { ,sk: 'Presunúť na začiatok' ,nl: 'Ga naar boven' ,ko: '맨처음으로 이동' - ,zh_cn: '移至顶端' } ,'Hidden' : { cs: 'Skrytý' @@ -2284,7 +2183,6 @@ function init() { ,sk: 'Skrytý' ,nl: 'Verborgen' ,ko: '숨김' - ,zh_cn: '隐藏' } ,'Hide after use' : { cs: 'Skryj po použití' @@ -2307,7 +2205,6 @@ function init() { ,sk: 'Skryť po použití' ,nl: 'Verberg na gebruik' ,ko: '사용 후 숨김' - ,zh_cn: '使用后隐藏' } ,'Your API secret must be at least 12 characters long' : { cs: 'Vaše API heslo musí mít alespoň 12 znaků' @@ -2329,8 +2226,6 @@ function init() { ,sk: 'Vaše API heslo musí mať najmenej 12 znakov' ,nl: 'Uw API code dient tenminste 12 karakters lang te zijn' ,ko: 'API secret는 최소 12자 이상이여야 합니다.' - ,zh_cn: 'API密钥最少需要12个字符' - ,zh_tw: 'API密鑰最少需要12個字符' } ,'Bad API secret' : { cs: 'Chybné API heslo' @@ -2352,8 +2247,6 @@ function init() { ,sk: 'Nesprávne API heslo' ,nl: 'Onjuiste API' ,ko: '잘못된 API secret' - ,zh_cn: 'API密钥错误' - ,zh_tw: 'API密鑰錯誤' } ,'API secret hash stored' : { cs: 'Hash API hesla uložen' @@ -2375,8 +2268,6 @@ function init() { ,sk: 'Hash API hesla uložený' ,nl: 'Geheime API hash opgeslagen' ,ko: 'API secret hash가 저장 되었습니다.' - ,zh_cn: 'API密钥已存储' - ,zh_tw: 'API密鑰已存儲' } ,'Status' : { cs: 'Status' @@ -2399,7 +2290,6 @@ function init() { ,sk: 'Status' ,nl: 'Status' ,ko: '상태' - ,zh_cn: '状态' } ,'Not loaded' : { cs: 'Nenačtený' @@ -2421,7 +2311,6 @@ function init() { ,sk: 'Nenačítaný' ,nl: 'Niet geladen' ,ko: '로드되지 않음' - ,zh_cn: '未载入' } ,'Food Editor' : { cs: 'Editor jídel' @@ -2443,7 +2332,6 @@ function init() { ,sk: 'Editor jedál' ,nl: 'Voeding beheer' ,ko: '음식 편집기' - ,zh_cn: '食物编辑器' } ,'Your database' : { cs: 'Vaše databáze' @@ -2466,7 +2354,6 @@ function init() { ,sk: 'Vaša databáza' ,nl: 'Uw database' ,ko: '당신의 데이터베이스' - ,zh_cn: '你的数据库' } ,'Filter' : { cs: 'Filtr' @@ -2489,7 +2376,6 @@ function init() { ,sk: 'Filter' ,nl: 'Filter' ,ko: '필터' - ,zh_cn: '过滤器' } ,'Save' : { cs: 'Ulož' @@ -2512,8 +2398,6 @@ function init() { ,sk: 'Uložiť' ,nl: 'Opslaan' ,ko: '저장' - ,zh_cn: '保存' - ,zh_tw: '保存' } ,'Clear' : { cs: 'Vymaž' @@ -2536,7 +2420,6 @@ function init() { ,sk: 'Vymazať' ,nl: 'Leeg maken' ,ko: '취소' - ,zh_cn: '清除' } ,'Record' : { cs: 'Záznam' @@ -2559,7 +2442,6 @@ function init() { ,sk: 'Záznam' ,nl: 'Toevoegen' ,ko: '기록' - ,zh_cn: '记录' } ,'Quick picks' : { cs: 'Rychlý výběr' @@ -2582,7 +2464,6 @@ function init() { ,sk: 'Rýchly výber' ,nl: 'Snelkeuze' ,ko: '빠른 선택' - ,zh_cn: '快速选择' } ,'Show hidden' : { cs: 'Zobraz skryté' @@ -2605,7 +2486,6 @@ function init() { ,sk: 'Zobraziť skryté' ,nl: 'Laat verborgen zien' ,ko: '숨김 보기' - ,zh_cn: '显示隐藏值' } ,'Your API secret' : { cs: 'Vaše API heslo' @@ -2627,8 +2507,6 @@ function init() { ,sk: 'Vaše API heslo' ,nl: 'Uw API geheim' ,ko: 'API secret' - ,zh_cn: 'API密钥' - ,zh_tw: 'API密鑰' } ,'Store hash on this computer (Use only on private computers)' : { cs: 'Ulož hash na tomto počítači (používejte pouze na soukromých počítačích)' @@ -2650,8 +2528,6 @@ function init() { ,sk: 'Uložiť hash na tomto počítači (Používajte iba na súkromných počítačoch)' ,nl: 'Sla HASH op. (gebruik dit alleen op prive computers)' ,ko: '이 컴퓨터에 hash를 저장하세요.(단, 개인 컴퓨터를 사용하세요.)' - ,zh_cn: '在本机存储API密钥\n(请勿在公用电脑上使用本功能)' - ,zh_tw: '在本機存儲API密鑰\n(請勿在公用電腦上使用本功能)' } ,'Treatments' : { cs: 'Ošetření' @@ -2674,7 +2550,6 @@ function init() { ,sk: 'Ošetrenie' ,nl: 'Behandelingen' ,ko: '대처' - ,zh_cn: '操作' } ,'Time' : { cs: 'Čas' @@ -2697,8 +2572,6 @@ function init() { ,sk: 'Čas' ,nl: 'Tijd' ,ko: '시간' - ,zh_cn: '时间' - ,zh_tw: '時間' } ,'Event Type' : { cs: 'Typ události' @@ -2721,7 +2594,6 @@ function init() { ,sk: 'Typ udalosti' ,nl: 'Soort' ,ko: '입력 유형' - ,zh_cn: '事件类型' } ,'Blood Glucose' : { cs: 'Glykémie' @@ -2744,7 +2616,6 @@ function init() { ,sk: 'Glykémia' ,nl: 'Bloed glucose' ,ko: '혈당' - ,zh_cn: '血糖值' } ,'Entered By' : { cs: 'Zadal' @@ -2767,7 +2638,6 @@ function init() { ,sk: 'Zadal' ,nl: 'Ingevoerd door' ,ko: '입력됨' - ,zh_cn: '输入人' } ,'Delete this treatment?' : { cs: 'Vymazat toto ošetření?' @@ -2790,7 +2660,6 @@ function init() { ,sk: 'Vymazať toto ošetrenie?' ,nl: 'Verwijder' ,ko: '이 대처를 지울까요?' - ,zh_cn: '删除这个操作?' } ,'Carbs Given' : { cs: 'Sacharidů' @@ -2813,7 +2682,6 @@ function init() { ,sk: 'Sacharidov' ,nl: 'Aantal koolhydraten' ,ko: '탄수화물 요구량' - ,zh_cn: '碳水化合物量' } ,'Inzulin Given' : { cs: 'Inzulínu' @@ -2836,7 +2704,6 @@ function init() { ,sk: 'Inzulínu' ,nl: 'Insuline' ,ko: '인슐린 요구량' - ,zh_cn: '胰岛素输注' } ,'Event Time' : { cs: 'Čas události' @@ -2859,7 +2726,6 @@ function init() { ,sk: 'Čas udalosti' ,nl: 'Tijdstip' ,ko: '입력 시간' - ,zh_cn: '事件时间' } ,'Please verify that the data entered is correct' : { cs: 'Prosím zkontrolujte, zda jsou údaje zadány správně' @@ -2882,7 +2748,6 @@ function init() { ,sk: 'Prosím, skontrolujte správnosť zadaných údajov' ,nl: 'Controleer uw invoer' ,ko: '입력한 데이터가 정확한지 확인해 주세요.' - ,zh_cn: '请验证输入的数据是否正确' } ,'BG' : { cs: 'Glykémie' @@ -2904,7 +2769,6 @@ function init() { ,sk: 'Glykémia' ,nl: 'Bloed glucose' ,ko: '혈당' - ,zh_cn: '血糖' } ,'Use BG correction in calculation' : { cs: 'Použij korekci na glykémii' @@ -2926,7 +2790,6 @@ function init() { ,sk: 'Použite korekciu na glykémiu' ,nl: 'Gebruik BG in berekeningen' ,ko: '계산에 보정된 혈당을 사용하세요.' - ,zh_cn: '使用血糖值修正计算' } ,'BG from CGM (autoupdated)' : { cs: 'Glykémie z CGM (automaticky aktualizovaná)' @@ -2948,7 +2811,6 @@ function init() { ,sk: 'Glykémia z CGM (automatická aktualizácia) ' ,nl: 'BG van CGM (automatische invoer)' ,ko: 'CGM 혈당(자동 업데이트)' - ,zh_cn: 'CGM(连续血糖监测)测量的血糖值(自动更新)' } ,'BG from meter' : { cs: 'Glykémie z glukoměru' @@ -2970,7 +2832,6 @@ function init() { ,sk: 'Glykémia z glukomeru' ,nl: 'BG van meter' ,ko: '혈당 측정기에서의 혈당' - ,zh_cn: '血糖仪测量的血糖值' } ,'Manual BG' : { cs: 'Ručně zadaná glykémie' @@ -2992,7 +2853,6 @@ function init() { ,sk: 'Ručne zadaná glykémia' ,nl: 'Handmatige BG' ,ko: '수동 입력 혈당' - ,zh_cn: '手动输入的血糖值' } ,'Quickpick' : { cs: 'Rychlý výběr' @@ -3014,7 +2874,6 @@ function init() { ,sk: 'Rýchly výber' ,nl: 'Snelkeuze' ,ko: '빠른 선택' - ,zh_cn: '快速选择' } ,'or' : { cs: 'nebo' @@ -3037,7 +2896,6 @@ function init() { ,sk: 'alebo' ,nl: 'of' ,ko: '또는' - ,zh_cn: '或' } ,'Add from database' : { cs: 'Přidat z databáze' @@ -3060,7 +2918,6 @@ function init() { ,sk: 'Pridať z databázy' ,nl: 'Toevoegen uit database' ,ko: '데이터베이스로 부터 추가' - ,zh_cn: '从数据库增加' } ,'Use carbs correction in calculation' : { cs: 'Použij korekci na sacharidy' @@ -3082,7 +2939,6 @@ function init() { ,sk: 'Použite korekciu na sacharidy' ,nl: 'Gebruik KH correctie in berekening' ,ko: '계산에 보정된 탄수화물을 사용하세요.' - ,zh_cn: '使用碳水化合物修正计算结果' } ,'Use COB correction in calculation' : { cs: 'Použij korekci na COB' @@ -3104,7 +2960,6 @@ function init() { ,sk: 'Použite korekciu na COB' ,nl: 'Gebruik ingenomen KH in berekening' ,ko: '계산에 보정된 COB를 사용하세요.' - ,zh_cn: '使用COB(活性碳水化合物)修正计算结果' } ,'Use IOB in calculation' : { cs: 'Použij IOB ve výpočtu' @@ -3115,7 +2970,7 @@ function init() { ,pt: 'Usar IOB no cálculo' ,ro: 'Folosește IOB în calcule' ,bg: 'Включи активния инсулин в изчислението' - ,hr: 'Koristi aktivni inzulin u izračunu' + ,hr: 'Koristi aktivni inzulin u izračunu"' ,sv: 'Använd aktivt insulin för beräkning' ,it: 'Utilizzare la correzione IOB nel calcolo' ,dk: 'Benyt aktivt insulin i beregningen' @@ -3126,7 +2981,6 @@ function init() { ,sk: 'Použite IOB vo výpočte' ,nl: 'Gebruik IOB in berekening' ,ko: '계산에 IOB를 사용하세요.' - ,zh_cn: '使用IOB(活性胰岛素)修正计算结果' } ,'Other correction' : { cs: 'Jiná korekce' @@ -3148,7 +3002,6 @@ function init() { ,sk: 'Iná korekcia' ,nl: 'Andere correctie' ,ko: '다른 보정' - ,zh_cn: '其它修正' } ,'Rounding' : { cs: 'Zaokrouhlení' @@ -3170,8 +3023,7 @@ function init() { ,sk: 'Zaokrúhlenie' ,nl: 'Afgerond' ,ko: '라운딩' - ,zh_cn: '取整' - } + } ,'Enter insulin correction in treatment' : { cs: 'Zahrň inzulín do záznamu ošetření' ,de: 'Insulin Korrektur zur Behandlung eingeben' @@ -3192,7 +3044,6 @@ function init() { ,sk: 'Zadajte korekciu inzulínu do ošetrenia' ,nl: 'Voer insuline correctie toe aan behandeling' ,ko: '대처를 위해 보정된 인슐린을 입력하세요.' - ,zh_cn: '在操作中输入胰岛素修正' } ,'Insulin needed' : { cs: 'Potřebný inzulín' @@ -3215,7 +3066,6 @@ function init() { ,sk: 'Potrebný inzulín' ,nl: 'Benodigde insuline' ,ko: '인슐린 필요' - ,zh_cn: '需要的胰岛素量' } ,'Carbs needed' : { cs: 'Potřebné sach' @@ -3238,7 +3088,6 @@ function init() { ,sk: 'Potrebné sacharidy' ,nl: 'Benodigde koolhydraten' ,ko: '탄수화물 필요' - ,zh_cn: '需要的碳水量' } ,'Carbs needed if Insulin total is negative value' : { cs: 'Chybějící sacharidy v případě, že výsledek je záporný' @@ -3260,7 +3109,6 @@ function init() { ,sk: 'Potrebné sacharidy, ak je celkový inzulín záporná hodnota' ,nl: 'Benodigde KH als insuline een negatieve waarde geeft' ,ko: '인슐린 전체가 마이너스 값이면 탄수화물이 필요합니다.' - ,zh_cn: '如果胰岛素总量为负时所需的碳水化合物量' } ,'Basal rate' : { cs: 'Bazál' @@ -3282,7 +3130,6 @@ function init() { ,sk: 'Bazál' ,nl: 'Basaal snelheid' ,ko: '기초량 비율' - ,zh_cn: '基础率' } ,'60 minutes earlier' : { cs: '60 min předem' @@ -3304,7 +3151,6 @@ function init() { ,sk: '60 min. pred' ,nl: '60 minuten eerder' ,ko: '60분 더 일찍' - ,zh_cn: '60分钟前' } ,'45 minutes earlier' : { cs: '45 min předem' @@ -3326,7 +3172,6 @@ function init() { ,sk: '45 min. pred' ,nl: '45 minuten eerder' ,ko: '45분 더 일찍' - ,zh_cn: '45分钟前' } ,'30 minutes earlier' : { cs: '30 min předem' @@ -3348,7 +3193,6 @@ function init() { ,sk: '30 min. pred' ,nl: '30 minuten eerder' ,ko: '30분 더 일찍' - ,zh_cn: '30分钟前' } ,'20 minutes earlier' : { cs: '20 min předem' @@ -3370,7 +3214,6 @@ function init() { ,sk: '20 min. pred' ,nl: '20 minuten eerder' ,ko: '20분 더 일찍' - ,zh_cn: '20分钟前' } ,'15 minutes earlier' : { cs: '15 min předem' @@ -3392,7 +3235,6 @@ function init() { ,sk: '15 min. pred' ,nl: '15 minuten eerder' ,ko: '15분 더 일찍' - ,zh_cn: '15分钟前' } ,'Time in minutes' : { cs: 'Čas v minutách' @@ -3415,7 +3257,6 @@ function init() { ,sk: 'Čas v minútach' ,nl: 'Tijd in minuten' ,ko: '분' - ,zh_cn: '1分钟前' } ,'15 minutes later' : { cs: '15 min po' @@ -3438,7 +3279,6 @@ function init() { ,sk: '15 min. po' ,nl: '15 minuten later' ,ko: '15분 더 나중에' - ,zh_cn: '15分钟后' } ,'20 minutes later' : { cs: '20 min po' @@ -3461,7 +3301,6 @@ function init() { ,sk: '20 min. po' ,nl: '20 minuten later' ,ko: '20분 더 나중에' - ,zh_cn: '20分钟后' } ,'30 minutes later' : { cs: '30 min po' @@ -3484,7 +3323,6 @@ function init() { ,sk: '30 min. po' ,nl: '30 minuten later' ,ko: '30분 더 나중에' - ,zh_cn: '30分钟后' } ,'45 minutes later' : { cs: '45 min po' @@ -3507,7 +3345,6 @@ function init() { ,sk: '45 min. po' ,nl: '45 minuten later' ,ko: '45분 더 나중에' - ,zh_cn: '45分钟后' } ,'60 minutes later' : { cs: '60 min po' @@ -3530,7 +3367,6 @@ function init() { ,sk: '60 min. po' ,nl: '60 minuten later' ,ko: '60분 더 나중에' - ,zh_cn: '60分钟后' } ,'Additional Notes, Comments' : { cs: 'Dalši poznámky, komentáře' @@ -3553,7 +3389,6 @@ function init() { ,sk: 'Ďalšie poznámky, komentáre' ,nl: 'Extra aantekeningen' ,ko: '추가 메모' - ,zh_cn: '备注' } ,'RETRO MODE' : { cs: 'V MINULOSTI' @@ -3574,7 +3409,6 @@ function init() { ,ru: 'режим РЕТРО' ,sk: 'V MINULOSTI' ,ko: 'PETRO MODE' - ,zh_cn: '历史模式' } ,'Now' : { cs: 'Nyní' @@ -3597,7 +3431,6 @@ function init() { ,sk: 'Teraz' ,nl: 'Nu' ,ko: '현재' - ,zh_cn: '现在' } ,'Other' : { cs: 'Jiný' @@ -3620,7 +3453,6 @@ function init() { ,sk: 'Iný' ,nl: 'Andere' ,ko: '다른' - ,zh_cn: '其它' } ,'Submit Form' : { cs: 'Odeslat formulář' @@ -3643,7 +3475,6 @@ function init() { ,sk: 'Odoslať formulár' ,nl: 'Formulier opslaan' ,ko: '양식 제출' - ,zh_cn: '提交' } ,'Profile Editor' : { cs: 'Editor profilu' @@ -3666,8 +3497,6 @@ function init() { ,sk: 'Editor profilu' ,nl: 'Profiel beheer' ,ko: '프로 편집기' - ,zh_cn: '配置文件编辑器' - ,zh_tw: '配置文件編輯器' } ,'Reports' : { cs: 'Výkazy' @@ -3689,8 +3518,6 @@ function init() { ,sk: 'Správy' ,nl: 'Rapporten' ,ko: '보고서' - ,zh_cn: '生成报表' - ,zh_tw: '生成報表' } ,'Add food from your database' : { cs: 'Přidat jidlo z Vaší databáze' @@ -3708,11 +3535,10 @@ function init() { ,fi: 'Lisää ruoka tietokannasta' ,nb: 'Legg til mat fra din database' ,pl: 'Dodaj posiłek z twojej bazy danych' - ,ru: 'Добавьте продукт из вашей базы данных' + ,ru: 'Добавьте еду из вашей базы данных' ,sk: 'Pridať jedlo z Vašej databázy' ,nl: 'Voeg voeding toe uit uw database' ,ko: '데이터베이스에서 음식을 추가하세요.' - ,zh_cn: '从数据库增加食物' } ,'Reload database' : { cs: 'Znovu nahraj databázi' @@ -3734,7 +3560,6 @@ function init() { ,sk: 'Obnoviť databázu' ,nl: 'Database opnieuw laden' ,ko: '데이터베이스 재로드' - ,zh_cn: '重新载入数据库' } ,'Add' : { cs: 'Přidej' @@ -3756,7 +3581,6 @@ function init() { ,sk: 'Pridať' ,nl: 'Toevoegen' ,ko: '추가' - ,zh_cn: '增加' } ,'Unauthorized' : { cs: 'Neautorizováno' @@ -3778,8 +3602,6 @@ function init() { ,sk: 'Neautorizované' ,nl: 'Ongeauthoriseerd' ,ko: '미인증' - ,zh_cn: '未授权' - ,zh_tw: '未授權' } ,'Entering record failed' : { cs: 'Vložení záznamu selhalo' @@ -3801,7 +3623,6 @@ function init() { ,sk: 'Zadanie záznamu zlyhalo' ,nl: 'Toevoegen mislukt' ,ko: '입력 실패' - ,zh_cn: '输入记录失败' } ,'Device authenticated' : { cs: 'Zařízení ověřeno' @@ -3823,8 +3644,6 @@ function init() { ,sk: 'Zariadenie overené' ,nl: 'Apparaat geauthenticeerd' ,ko: '기기 인증' - ,zh_cn: '设备已认证' - ,zh_tw: '設備已認證' } ,'Device not authenticated' : { cs: 'Zařízení není ověřeno' @@ -3846,8 +3665,6 @@ function init() { ,sk: 'Zariadenie nieje overené' ,nl: 'Apparaat niet geauthenticeerd' ,ko: '미인증 기기' - ,zh_cn: '设备未认证' - ,zh_tw: '設備未認證' } ,'Authentication status' : { cs: 'Stav ověření' @@ -3869,8 +3686,6 @@ function init() { ,sk: 'Stav overenia' ,nl: 'Authenticatie status' ,ko: '인증 상태' - ,zh_cn: '认证状态' - ,zh_tw: '認證狀態' } ,'Authenticate' : { cs: 'Ověřit' @@ -3892,8 +3707,6 @@ function init() { ,sk: 'Overiť' ,nl: 'Authenticatie' ,ko: '인증' - ,zh_cn: '认证' - ,zh_tw: '認證' } ,'Remove' : { cs: 'Vymazat' @@ -3915,8 +3728,6 @@ function init() { ,sk: 'Odstrániť' ,nl: 'Verwijder' ,ko: '삭제' - ,zh_cn: '取消' - ,zh_tw: '取消' } ,'Your device is not authenticated yet' : { cs: 'Toto zařízení nebylo dosud ověřeno' @@ -3938,8 +3749,6 @@ function init() { ,sk: 'Toto zariadenie zatiaľ nebolo overené' ,nl: 'Uw apparaat is nog niet geauthenticeerd' ,ko: '당신의 기기는 아직 인증되지 않았습니다.' - ,zh_cn: '此设备还未进行认证' - ,zh_tw: '這個設備還未進行認證' } ,'Sensor' : { cs: 'Senzor' @@ -3962,8 +3771,7 @@ function init() { ,sk: 'Senzor' ,nl: 'Sensor' ,ko: '센서' - ,zh_cn: 'CGM探头' - } + } ,'Finger' : { cs: 'Glukoměr' ,de: 'Finger' @@ -3985,7 +3793,6 @@ function init() { ,sk: 'Glukomer' ,nl: 'Vinger' ,ko: '손가락' - ,zh_cn: '手指' } ,'Manual' : { cs: 'Ručně' @@ -4008,7 +3815,6 @@ function init() { ,sk: 'Ručne' ,nl: 'Handmatig' ,ko: '수' - ,zh_cn: '手动' } ,'Scale' : { cs: 'Měřítko' @@ -4030,9 +3836,7 @@ function init() { ,sk: 'Mierka' ,nl: 'Schaal' ,ko: '규모' - ,zh_cn: '函数' - ,zh_tw: '函數' - } + } ,'Linear' : { cs: 'Lineární' ,de: 'Linear' @@ -4054,8 +3858,6 @@ function init() { ,sk: 'Lineárne' ,nl: 'Lineair' ,ko: 'Linear' - ,zh_cn: '线性' - ,zh_tw: '線性' } ,'Logarithmic' : { cs: 'Logaritmické' @@ -4078,8 +3880,6 @@ function init() { ,sk: 'Logaritmické' ,nl: 'Logaritmisch' ,ko: '다수' - ,zh_cn: '对数' - ,zh_tw: '對數' } ,'Logarithmic (Dynamic)' : { cs: 'Logaritmické (Dynamické)' @@ -4097,8 +3897,6 @@ function init() { ,sk: 'Logaritmické (Dynamické)' ,nl: 'Logaritmisch (Dynamisch)' ,ko: '다수(동적인)' - ,zh_cn: '对数(动态)' - ,zh_tw: '對數(動態)' } ,'Insulin-on-Board' : { cs: 'IOB' @@ -4116,11 +3914,9 @@ function init() { ,sk: 'Aktívny inzulín (IOB)' ,nl: 'Actieve insuline (IOB)' ,ko: 'IOB' - ,zh_cn: '活性胰岛素(IOB)' - ,zh_tw: '活性胰島素(IOB)' } ,'Carbs-on-Board' : { - cs: 'COB' + cs: 'COB' ,de: 'Aktiv wirksame Kohlenhydrate' ,it: 'COB-Carboidrati a Bordo' ,nb: 'AK' @@ -4135,8 +3931,6 @@ function init() { ,sk: 'Aktívne sacharidy (COB)' ,nl: 'Actieve koolhydraten (COB)' ,ko: 'COB' - ,zh_cn: '活性碳水化合物(COB)' - ,zh_tw: '活性碳水化合物(COB)' } ,'Bolus Wizard Preview' : { cs: 'BWP-Náhled bolusového kalk.' @@ -4154,8 +3948,6 @@ function init() { ,sk: 'Bolus Wizard' ,nl: 'Bolus Wizard Preview (BWP)' ,ko: 'Bolus 마법사 미리보기' - ,zh_cn: '大剂量向导预览(BWP)' - ,zh_tw: '大劑量嚮導預覽(BWP)' } ,'Value Loaded' : { cs: 'Hodnoty načteny' @@ -4172,8 +3964,6 @@ function init() { ,ru: 'Величина загружена' ,sk: 'Hodnoty načítané' ,ko: '값이 로드됨' - ,zh_cn: '数值已读取' - ,zh_tw: '數值已讀取' } ,'Cannula Age' : { cs: 'CAGE-Stáří kanyly' @@ -4191,8 +3981,6 @@ function init() { ,sk: 'Zavedenie kanyly (CAGE)' ,nl: 'Canule leeftijd (CAGE)' ,ko: '캐뉼라 사용기간' - ,zh_cn: '管路使用时间(CAGE)' - ,zh_tw: '管路使用時間(CAGE)' } ,'Basal Profile' : { cs: 'Bazál' @@ -4210,8 +3998,6 @@ function init() { ,sk: 'Bazál' ,nl: 'Basaal profiel' ,ko: 'Basal 프로파일' - ,zh_cn: '基础率配置文件' - ,zh_tw: '基礎率配置文件' } ,'Silence for 30 minutes' : { cs: 'Ztlumit na 30 minut' @@ -4233,8 +4019,6 @@ function init() { ,sk: 'Stíšiť na 30 minút' ,nl: 'Sluimer 30 minuten' ,ko: '30분간 무음' - ,zh_cn: '静音30分钟' - ,zh_tw: '靜音30分鐘' } ,'Silence for 60 minutes' : { cs: 'Ztlumit na 60 minut' @@ -4256,8 +4040,6 @@ function init() { ,sk: 'Stíšiť na 60 minút' ,nl: 'Sluimer 60 minuten' ,ko: '60분간 무음' - ,zh_cn: '静音60分钟' - ,zh_tw: '靜音60分鐘' } ,'Silence for 90 minutes' : { cs: 'Ztlumit na 90 minut' @@ -4279,8 +4061,6 @@ function init() { ,sk: 'Stíšiť na 90 minút' ,nl: 'Sluimer 90 minuten' ,ko: '90분간 무음' - ,zh_cn: '静音90分钟' - ,zh_tw: '靜音90分鐘' } ,'Silence for 120 minutes' : { cs: 'Ztlumit na 120 minut' @@ -4302,8 +4082,6 @@ function init() { ,sk: 'Stíšiť na 120 minút' ,nl: 'Sluimer 2 uur' ,ko: '120분간 무음' - ,zh_cn: '静音2小时' - ,zh_tw: '靜音2小時' } ,'3HR' : { cs: '3hod' @@ -4325,8 +4103,6 @@ function init() { ,sk: '3 hod' ,nl: '3 uur' ,ko: '3시간' - ,zh_cn: '3小时' - ,zh_tw: '3小時' } ,'6HR' : { cs: '6hod' @@ -4348,8 +4124,6 @@ function init() { ,sk: '6 hod' ,nl: '6 uur' ,ko: '6시간' - ,zh_cn: '6小时' - ,zh_tw: '6小時' } ,'12HR' : { cs: '12hod' @@ -4371,8 +4145,6 @@ function init() { ,sk: '12 hod' ,nl: '12 uur' ,ko: '12시간' - ,zh_cn: '12小时' - ,zh_tw: '12小時' } ,'24HR' : { cs: '24hod' @@ -4394,8 +4166,6 @@ function init() { ,sk: '24 hod' ,nl: '24 uur' ,ko: '24시간' - ,zh_cn: '24小时' - ,zh_tw: '24小時' } ,'Settings' : { cs: 'Nastavení' @@ -4417,8 +4187,6 @@ function init() { ,sk: 'Nastavenia' ,nl: 'Instellingen' ,ko: '설정' - ,zh_cn: '设置' - ,zh_tw: '設置' } ,'Units' : { cs: 'Jednotky' @@ -4440,8 +4208,6 @@ function init() { ,sk: 'Jednotky' ,nl: 'Eenheden' ,ko: '단위' - ,zh_cn: '计量单位' - ,zh_tw: '计量單位' } ,'Date format' : { cs: 'Formát datumu' @@ -4463,8 +4229,6 @@ function init() { ,sk: 'Formát času' ,nl: 'Datum formaat' ,ko: '날짜 형식' - ,zh_cn: '时间格式' - ,zh_tw: '時間格式' } ,'12 hours' : { cs: '12 hodin' @@ -4486,8 +4250,6 @@ function init() { ,sk: '12 hodín' ,nl: '12 uur' ,ko: '12 시간' - ,zh_cn: '12小时制' - ,zh_tw: '12小時制' } ,'24 hours' : { cs: '24 hodin' @@ -4509,8 +4271,6 @@ function init() { ,sk: '24 hodín' ,nl: '24 uur' ,ko: '24 시간' - ,zh_cn: '24小时制' - ,zh_tw: '24小時制' } ,'Log a Treatment' : { cs: 'Záznam ošetření' @@ -4533,7 +4293,6 @@ function init() { ,sk: 'Záznam ošetrenia' ,nl: 'Registreer een behandeling' ,ko: 'Treatment 로그' - ,zh_cn: '记录操作' } ,'BG Check' : { cs: 'Kontrola glykémie' @@ -4556,7 +4315,6 @@ function init() { ,sk: 'Kontrola glykémie' ,nl: 'Bloedglucose check' ,ko: '혈당 체크' - ,zh_cn: '测量血糖' } ,'Meal Bolus' : { cs: 'Bolus na jídlo' @@ -4579,7 +4337,6 @@ function init() { ,sk: 'Bolus na jedlo' ,nl: 'Maaltijd bolus' ,ko: '식사 인슐린' - ,zh_cn: '正餐大剂量' } ,'Snack Bolus' : { cs: 'Bolus na svačinu' @@ -4602,7 +4359,6 @@ function init() { ,sk: 'Bolus na desiatu/olovrant' ,nl: 'Snack bolus' ,ko: '스넥 인슐린' - ,zh_cn: '加餐大剂量' } ,'Correction Bolus' : { cs: 'Bolus na glykémii' @@ -4625,7 +4381,6 @@ function init() { ,sk: 'Korekčný bolus' ,nl: 'Correctie bolus' ,ko: '수정 인슐린' - ,zh_cn: '临时大剂量' } ,'Carb Correction' : { cs: 'Přídavek sacharidů' @@ -4648,7 +4403,6 @@ function init() { ,sk: 'Prídavok sacharidov' ,nl: 'Koolhydraat correctie' ,ko: '탄수화물 수정' - ,zh_cn: '碳水修正' } ,'Note' : { cs: 'Poznámka' @@ -4671,7 +4425,6 @@ function init() { ,sk: 'Poznámka' ,nl: 'Notitie' ,ko: '메모' - ,zh_cn: '备忘' } ,'Question' : { cs: 'Otázka' @@ -4694,7 +4447,6 @@ function init() { ,sk: 'Otázka' ,nl: 'Vraag' ,ko: '질문' - ,zh_cn: '问题' } ,'Exercise' : { cs: 'Cvičení' @@ -4717,7 +4469,6 @@ function init() { ,sk: 'Cvičenie' ,nl: 'Beweging / sport' ,ko: '운동' - ,zh_cn: '运动' } ,'Pump Site Change' : { cs: 'Výměna setu' @@ -4740,7 +4491,6 @@ function init() { ,sk: 'Výmena setu' ,nl: 'Nieuwe pomp locatie' ,ko: '펌프 위치 변경' - ,zh_cn: '更换胰岛素输注部位' } ,'CGM Sensor Start' : { cs: 'Spuštění sensoru' @@ -4763,7 +4513,6 @@ function init() { ,sk: 'Spustenie senzoru' ,nl: 'CGM Sensor start' ,ko: 'CGM 센서 시작' - ,zh_cn: '启动CGM(连续血糖监测)探头' } ,'CGM Sensor Insert' : { cs: 'Výměna sensoru' @@ -4786,7 +4535,6 @@ function init() { ,sk: 'Výmena senzoru' ,nl: 'CGM sensor wissel' ,ko: 'CGM 센서 삽입' - ,zh_cn: '植入CGM(连续血糖监测)探头' } ,'Dexcom Sensor Start' : { cs: 'Spuštění sensoru' @@ -4809,7 +4557,6 @@ function init() { ,sk: 'Spustenie senzoru DEXCOM' ,nl: 'Dexcom sensor start' ,ko: 'Dexcom 센서 시작' - ,zh_cn: '启动Dexcom探头' } ,'Dexcom Sensor Change' : { cs: 'Výměna sensoru' @@ -4832,7 +4579,6 @@ function init() { ,sk: 'Výmena senzoru DEXCOM' ,nl: 'Dexcom sensor wissel' ,ko: 'Dexcom 센서 교체' - ,zh_cn: '更换Dexcom探头' } ,'Insulin Cartridge Change' : { cs: 'Výměna inzulínu' @@ -4855,7 +4601,6 @@ function init() { ,sk: 'Výmena inzulínu' ,nl: 'Insuline cartridge wissel' ,ko: '인슐린 카트리지 교체' - ,zh_cn: '更换胰岛素储液器' } ,'D.A.D. Alert' : { cs: 'D.A.D. Alert' @@ -4878,7 +4623,6 @@ function init() { ,sk: 'Upozornenie signálneho psa' ,nl: 'Hulphond waarschuwing' ,ko: 'D.A.D(Diabetes Alert Dog) 알림' - ,zh_cn: 'D.A.D(低血糖通报犬)警告' } ,'Glucose Reading' : { cs: 'Hodnota glykémie' @@ -4901,7 +4645,6 @@ function init() { ,sk: 'Hodnota glykémie' ,nl: 'Glucose meting' ,ko: '혈당 읽기' - ,zh_cn: '血糖数值' } ,'Measurement Method' : { cs: 'Metoda měření' @@ -4924,7 +4667,6 @@ function init() { ,sk: 'Metóda merania' ,nl: 'Meetmethode' ,ko: '측정 방법' - ,zh_cn: '测量方法' } ,'Meter' : { cs: 'Glukoměr' @@ -4947,7 +4689,6 @@ function init() { ,sk: 'Glukomer' ,nl: 'Glucosemeter' ,ko: '혈당 측정기' - ,zh_cn: '血糖仪' } ,'Insulin Given' : { cs: 'Inzulín' @@ -4970,7 +4711,6 @@ function init() { ,sk: 'Podaný inzulín' ,nl: 'Toegediende insuline' ,ko: '인슐린 요구량' - ,zh_cn: '胰岛素输注量' } ,'Amount in grams' : { cs: 'Množství v gramech' @@ -4993,7 +4733,6 @@ function init() { ,sk: 'Množstvo v gramoch' ,nl: 'Hoeveelheid in gram' ,ko: '합계(grams)' - ,zh_cn: '总量(g)' } ,'Amount in units' : { cs: 'Množství v jednotkách' @@ -5016,7 +4755,6 @@ function init() { ,sk: 'Množstvo v jednotkách' ,nl: 'Aantal in eenheden' ,ko: '합계(units)' - ,zh_cn: '总量(U)' } ,'View all treatments' : { cs: 'Zobraz všechny ošetření' @@ -5039,7 +4777,6 @@ function init() { ,sk: 'Zobraziť všetky ošetrenia' ,nl: 'Bekijk alle behandelingen' ,ko: '모든 treatments 보기' - ,zh_cn: '查看所有操作' } ,'Enable Alarms' : { cs: 'Povolit alarmy' @@ -5062,8 +4799,6 @@ function init() { ,sk: 'Aktivovať alarmy' ,nl: 'Alarmen aan!' ,ko: '알람 켜기' - ,zh_cn: '启用报警' - ,zh_tw: '啟用報警' } ,'When enabled an alarm may sound.' : { cs: 'Při povoleném alarmu zní zvuk' @@ -5086,8 +4821,6 @@ function init() { ,sk: 'Pri aktivovanom alarme znie zvuk ' ,nl: 'Als ingeschakeld kan alarm klinken' ,ko: '알림을 활성화 하면 알람이 울립니다.' - ,zh_cn: '启用后可发出声音报警' - ,zh_tw: '啟用後可發出聲音報警' } ,'Urgent High Alarm' : { cs: 'Urgentní vysoká glykémie' @@ -5110,8 +4843,6 @@ function init() { ,sk: 'Naliehavý alarm vysokej glykémie' ,nl: 'Urgent Alarm Hoge BG' ,ko: '긴급 고혈당 알람' - ,zh_cn: '血糖过高报警' - ,zh_tw: '血糖過高報警' } ,'High Alarm' : { cs: 'Vysoká glykémie' @@ -5134,8 +4865,6 @@ function init() { ,sk: 'Alarm vysokej glykémie' ,nl: 'Alarm hoge BG' ,ko: '고혈당 알람' - ,zh_cn: '高血糖报警' - ,zh_tw: '高血糖報警' } ,'Low Alarm' : { cs: 'Nízká glykémie' @@ -5158,8 +4887,6 @@ function init() { ,sk: 'Alarm nízkej glykémie' ,nl: 'Alarm lage BG' ,ko: '저혈당 알람' - ,zh_cn: '低血糖报警' - ,zh_tw: '低血糖報警' } ,'Urgent Low Alarm' : { cs: 'Urgentní nízká glykémie' @@ -5182,8 +4909,6 @@ function init() { ,sk: 'Naliehavý alarm nízkej glykémie' ,nl: 'Urgent alarm lage BG' ,ko: '긴급 저혈당 알람' - ,zh_cn: '血糖过低报警' - ,zh_tw: '血糖過低報警' } ,'Stale Data: Warn' : { cs: 'Zastaralá data' @@ -5205,8 +4930,6 @@ function init() { ,sk: 'Varovanie: Zastaralé dáta' ,nl: 'Data ouder dan' ,ko: '손실 데이터 : 경고' - ,zh_cn: '数据过期:提醒' - ,zh_tw: '數據過期:提醒' } ,'Stale Data: Urgent' : { cs: 'Zastaralá data urgentní' @@ -5228,8 +4951,6 @@ function init() { ,sk: 'Naliehavé: Zastaralé dáta' ,nl: 'URGENT data ouder dan' ,ko: '손실 데이터 : 긴급' - ,zh_cn: '数据过期:警告' - ,zh_tw: '數據過期:警告' } ,'mins' : { cs: 'min' @@ -5251,8 +4972,6 @@ function init() { ,sk: 'min.' ,nl: 'minuten' ,ko: '분' - ,zh_cn: '分' - ,zh_tw: '分' } ,'Night Mode' : { cs: 'Noční mód' @@ -5274,8 +4993,6 @@ function init() { ,sk: 'Nočný mód' ,nl: 'Nachtstand' ,ko: '나이트 모드' - ,zh_cn: '夜间模式' - ,zh_tw: '夜間模式' } ,'When enabled the page will be dimmed from 10pm - 6am.' : { cs: 'Když je povoleno, obrazovka je ztlumena 22:00 - 6:00' @@ -5297,8 +5014,6 @@ function init() { ,sk: 'Keď je povolený, obrazovka bude stlmená od 22:00 do 6:00.' ,nl: 'Scherm dimmen tussen 22:00 en 06:00' ,ko: '페이지를 켜면 오후 10시 부터 오전 6시까지 비활성화 될 것이다.' - ,zh_cn: '启用后将在夜间22点至早晨6点降低页面亮度' - ,zh_tw: '啟用後將在夜間22點至早晨6點降低頁面亮度' } ,'Enable' : { cs: 'Povoleno' @@ -5320,8 +5035,6 @@ function init() { ,sk: 'Povoliť' ,nl: 'Activeren' ,ko: '활성화' - ,zh_cn: '启用' - ,zh_tw: '啟用' } ,'Show Raw BG Data' : { cs: 'Zobraz RAW data' @@ -5343,8 +5056,6 @@ function init() { ,sk: 'Zobraziť RAW dáta' ,nl: 'Laat ruwe data zien' ,ko: 'Raw 혈당 데이터 보기' - ,zh_cn: '显示原始血糖数据' - ,zh_tw: '顯示原始血糖數據' } ,'Never' : { cs: 'Nikdy' @@ -5366,8 +5077,6 @@ function init() { ,sk: 'Nikdy' ,nl: 'Nooit' ,ko: '보지 않기' - ,zh_cn: '不显示' - ,zh_tw: '不顯示' } ,'Always' : { cs: 'Vždy' @@ -5389,8 +5098,6 @@ function init() { ,sk: 'Vždy' ,nl: 'Altijd' ,ko: '항상' - ,zh_cn: '一直显示' - ,zh_tw: '一直顯示' } ,'When there is noise' : { cs: 'Při šumu' @@ -5412,8 +5119,6 @@ function init() { ,sk: 'Pri šume' ,nl: 'Bij ruis' ,ko: '노이즈가 있을 때' - ,zh_cn: '当有噪声时显示' - ,zh_tw: '當有噪聲時顯示' } ,'When enabled small white dots will be displayed for raw BG data' : { cs: 'Když je povoleno, malé tečky budou zobrazeny pro RAW data' @@ -5435,8 +5140,6 @@ function init() { ,sk: 'Keď je povolené, malé bodky budú zobrazovať RAW dáta.' ,nl: 'Indien geactiveerd is ruwe data zichtbaar als witte punten ' ,ko: '활성화 하면 작은 흰점들이 raw 혈당 데이터를 표시하게 될 것이다.' - ,zh_cn: '启用后将使用小白点标注原始血糖数据' - ,zh_tw: '啟用後將使用小白點標註原始血糖數據' } ,'Custom Title' : { cs: 'Vlastní název stránky' @@ -5454,12 +5157,10 @@ function init() { ,fi: 'Omavalintainen otsikko' ,nb: 'Egen tittel' ,pl: 'Własny tytuł strony' - ,ru: 'Произвольное название' + ,ru: 'Произвольное наименование' ,sk: 'Vlastný názov stránky' ,ko: '사용자 정의 제목' - ,nl: 'Eigen titel' - ,zh_cn: '自定义标题' - ,zh_tw: '自定義標題' + ,nl: 'Eigen titel' } ,'Theme' : { cs: 'Téma' @@ -5481,8 +5182,6 @@ function init() { ,sk: 'Vzhľad' ,nl: 'Thema' ,ko: '테마' - ,zh_cn: '主题' - ,zh_tw: '主題' } ,'Default' : { cs: 'Výchozí' @@ -5504,8 +5203,6 @@ function init() { ,sk: 'Predvolený' ,nl: 'Standaard' ,ko: '초기설정' - ,zh_cn: '默认' - ,zh_tw: '默認' } ,'Colors' : { cs: 'Barevné' @@ -5527,8 +5224,6 @@ function init() { ,sk: 'Farebný' ,nl: 'Kleuren' ,ko: '색상' - ,zh_cn: '彩色' - ,zh_tw: '彩色' } ,'Colorblind-friendly colors' : { cs: 'Pro barvoslepé' @@ -5544,8 +5239,6 @@ function init() { ,bg: 'Цветове за далтонисти' ,it: 'Colori per daltonici' ,fi: 'Värisokeille sopivat värit' - ,zh_cn: '色盲患者可辨识的颜色' - ,zh_tw: '色盲患者可辨識的顏色' } ,'Reset, and use defaults' : { cs: 'Vymaž a nastav výchozí hodnoty' @@ -5567,8 +5260,6 @@ function init() { ,sk: 'Resetovať do pôvodného nastavenia' ,nl: 'Herstel standaard waardes' ,ko: '초기화 그리고 초기설정으로 사용' - ,zh_cn: '使用默认值重置' - ,zh_tw: '使用默認值重置' } ,'Calibrations' : { cs: 'Kalibrace' @@ -5590,7 +5281,6 @@ function init() { ,sk: 'Kalibrácie' ,nl: 'Kalibraties' ,ko: '보정' - ,zh_cn: '校准' } ,'Alarm Test / Smartphone Enable' : { cs: 'Test alarmu' @@ -5612,8 +5302,6 @@ function init() { ,sk: 'Test alarmu' ,nl: 'Alarm test / activeer Smartphone' ,ko: '알람 테스트 / 스마트폰 활성화' - ,zh_cn: '报警测试/智能手机启用' - ,zh_tw: '報警測試/智能手機啟用' } ,'Bolus Wizard' : { cs: 'Bolusový kalkulátor' @@ -5635,8 +5323,6 @@ function init() { ,sk: 'Bolusový kalkulátor' ,nl: 'Bolus calculator' ,ko: 'Bolus 마법사' - ,zh_cn: '大剂量向导' - ,zh_tw: '大劑量嚮導' } ,'in the future' : { cs: 'v budoucnosti' @@ -5658,8 +5344,6 @@ function init() { ,sk: 'v budúcnosti' ,nl: 'In de toekomst' ,ko: '미래' - ,zh_cn: '在未来' - ,zh_tw: '在未來' } ,'time ago' : { cs: 'min zpět' @@ -5681,8 +5365,6 @@ function init() { ,sk: 'čas pred' ,nl: 'tijd geleden' ,ko: '시간 전' - ,zh_cn: '在过去' - ,zh_tw: '在過去' } ,'hr ago' : { cs: 'hod zpět' @@ -5704,8 +5386,6 @@ function init() { ,sk: 'hod. pred' ,nl: 'uur geleden' ,ko: '시간 전' - ,zh_cn: '小时前' - ,zh_tw: '小時前' } ,'hrs ago' : { cs: 'hod zpět' @@ -5727,8 +5407,6 @@ function init() { ,sk: 'hod. pred' ,nl: 'uren geleden' ,ko: '시간 전' - ,zh_cn: '小时前' - ,zh_tw: '小時前' } ,'min ago' : { cs: 'min zpět' @@ -5750,8 +5428,6 @@ function init() { ,sk: 'min. pred' ,nl: 'minuut geleden' ,ko: '분 전' - ,zh_cn: '分钟前' - ,zh_tw: '分鐘前' } ,'mins ago' : { cs: 'min zpět' @@ -5773,8 +5449,6 @@ function init() { ,sk: 'min. pred' ,nl: 'minuten geleden' ,ko: '분 전' - ,zh_cn: '分钟前' - ,zh_tw: '分鐘前' } ,'day ago' : { cs: 'den zpět' @@ -5796,8 +5470,6 @@ function init() { ,sk: 'deň pred' ,nl: 'dag geleden' ,ko: '일 전' - ,zh_cn: '天前' - ,zh_tw: '天前' } ,'days ago' : { cs: 'dnů zpět' @@ -5819,8 +5491,6 @@ function init() { ,sk: 'dni pred' ,nl: 'dagen geleden' ,ko: '일 전' - ,zh_cn: '天前' - ,zh_tw: '天前' } ,'long ago' : { cs: 'dlouho zpět' @@ -5842,8 +5512,6 @@ function init() { ,sk: 'veľmi dávno' ,nl: 'lang geleden' ,ko: '기간 전' - ,zh_cn: '很长时间前' - ,zh_tw: '很長時間前' } ,'Clean' : { cs: 'Čistý' @@ -5865,8 +5533,6 @@ function init() { ,sk: 'Čistý' ,nl: 'Schoon' ,ko: 'Clean' - ,zh_cn: '无' - ,zh_tw: '無' } ,'Light' : { cs: 'Lehký' @@ -5888,8 +5554,6 @@ function init() { ,sk: 'Nízky' ,nl: 'Licht' ,ko: 'Light' - ,zh_cn: '轻度' - ,zh_tw: '輕度' } ,'Medium' : { cs: 'Střední' @@ -5911,8 +5575,6 @@ function init() { ,sk: 'Stredný' ,nl: 'Gemiddeld' ,ko: '보통' - ,zh_cn: '中度' - ,zh_tw: '中度' } ,'Heavy' : { cs: 'Velký' @@ -5934,8 +5596,6 @@ function init() { ,sk: 'Veľký' ,nl: 'Zwaar' ,ko: '심한' - ,zh_cn: '重度' - ,zh_tw: '嚴重' } ,'Treatment type' : { cs: 'Typ ošetření' @@ -5957,7 +5617,6 @@ function init() { ,sk: 'Typ ošetrenia' ,nl: 'Type behandeling' ,ko: 'Treatment 타입' - ,zh_cn: '操作类型' } ,'Raw BG' : { cs: 'Glykémie z RAW dat' @@ -5979,7 +5638,6 @@ function init() { ,sk: 'RAW dáta glykémie' ,nl: 'Ruwe BG data' ,ko: 'Raw 혈당' - ,zh_cn: '原始血糖' } ,'Device' : { cs: 'Zařízení' @@ -6001,7 +5659,6 @@ function init() { ,sk: 'Zariadenie' ,nl: 'Apparaat' ,ko: '기기' - ,zh_cn: '设备' } ,'Noise' : { cs: 'Šum' @@ -6023,7 +5680,6 @@ function init() { ,sk: 'Šum' ,nl: 'Ruis' ,ko: '노이즈' - ,zh_cn: '噪声' } ,'Calibration' : { cs: 'Kalibrace' @@ -6045,7 +5701,6 @@ function init() { ,sk: 'Kalibrácia' ,nl: 'Kalibratie' ,ko: '보정' - ,zh_cn: '校准' } ,'Show Plugins' : { cs: 'Zobrazuj pluginy' @@ -6067,8 +5722,6 @@ function init() { ,sk: 'Zobraziť pluginy' ,nl: 'Laat Plug-Ins zien' ,ko: '플러그인 보기' - ,zh_cn: '显示插件' - ,zh_tw: '顯示插件' } ,'About' : { cs: 'O aplikaci' @@ -6090,8 +5743,6 @@ function init() { ,sk: 'O aplikácii' ,nl: 'Over' ,ko: '대하여' - ,zh_cn: '关于' - ,zh_tw: '關於' } ,'Value in' : { cs: 'Hodnota v' @@ -6113,7 +5764,6 @@ function init() { ,sk: 'Hodnota v' ,nl: 'Waarde in' ,ko: '값' - ,zh_cn: '数值' } ,'Carb Time' : { cs: 'Čas jídla' @@ -6136,7 +5786,6 @@ function init() { ,sk: 'Čas jedla' ,nl: 'Koolhydraten tijd' ,ko: '탄수화물 시간' - ,zh_cn: '碳水时间' } ,'Language' : { cs: 'Jazyk' @@ -6154,8 +5803,6 @@ function init() { ,sk: 'Jazyk' ,nl: 'Taal' ,ko: '언어' - ,zh_cn: '语言' - ,zh_tw: '語言' } ,'Add new' : { cs: 'Přidat nový' @@ -6173,7 +5820,6 @@ function init() { ,nl: 'Voeg toe' ,ko: '새입력' ,it: 'Aggiungi nuovo' - ,zh_cn: '新增' } ,'g' : { // grams shortcut cs: 'g' @@ -6190,8 +5836,6 @@ function init() { ,nl: 'g' ,ko: 'g' ,it: 'g' - ,zh_cn: '克' - ,zh_tw: '克' } ,'ml' : { // milliliters shortcut cs: 'ml' @@ -6208,8 +5852,6 @@ function init() { ,nl: 'ml' ,ko: 'ml' ,it: 'ml' - ,zh_cn: '毫升' - ,zh_tw: '毫升' } ,'pcs' : { // pieces shortcut cs: 'ks' @@ -6226,8 +5868,6 @@ function init() { ,nl: 'stk' ,ko: '조각 바로 가기(pieces shortcut)' ,it: 'pz' - ,zh_cn: '件' - ,zh_tw: '件' } ,'Drag&drop food here' : { cs: 'Sem táhni & pusť jídlo' @@ -6244,7 +5884,6 @@ function init() { ,sk: 'Potiahni a pusti jedlo sem' ,ko: '음식을 여기에 드래그&드랍 해주세요.' ,it: 'Trascina&rilascia cibo qui' - ,zh_cn: '拖放食物到这' } ,'Care Portal' : { cs: 'Portál ošetření' @@ -6261,8 +5900,6 @@ function init() { ,sk: 'Portál starostlivosti' ,nl: 'Zorgportaal' ,ko: 'Care Portal' - ,zh_cn: '服务面板' - ,zh_tw: '服務面板' } ,'Medium/Unknown' : { // GI of food cs: 'Střední/Neznámá' @@ -6280,7 +5917,6 @@ function init() { ,nl: 'Medium/Onbekend' ,ko: '보통/알려지지 않은' ,it: 'Media/Sconosciuto' - ,zh_cn: '中等/不知道' } ,'IN THE FUTURE' : { cs: 'V BUDOUCNOSTI' @@ -6298,7 +5934,6 @@ function init() { ,nl: 'IN DE TOEKOMST' ,ko: '미래' ,it: 'NEL FUTURO' - ,zh_cn: '在未来' } ,'Update' : { // Update button cs: 'Aktualizovat' @@ -6316,8 +5951,6 @@ function init() { ,sk: 'Aktualizovať' ,nl: 'Update' ,ko: '업데이트' - ,zh_cn: '更新认证状态' - ,zh_tw: '更新認證狀態' } ,'Order' : { cs: 'Pořadí' @@ -6335,7 +5968,6 @@ function init() { ,sk: 'Usporiadať' ,nl: 'Sortering' ,ko: '순서' - ,zh_cn: '排序' } ,'oldest on top' : { cs: 'nejstarší nahoře' @@ -6353,7 +5985,6 @@ function init() { ,sk: 'najstaršie hore' ,nl: 'Oudste boven' ,ko: '오래된 것 부터' - ,zh_cn: '按时间升序排列' } ,'newest on top' : { cs: 'nejnovější nahoře' @@ -6371,7 +6002,6 @@ function init() { ,sk: 'najnovšie hore' ,nl: 'Nieuwste boven' ,ko: '새로운 것 부터' - ,zh_cn: '按时间降序排列' } ,'All sensor events' : { cs: 'Všechny události sensoru' @@ -6389,7 +6019,6 @@ function init() { ,sk: 'Všetky udalosti senzoru' ,nl: 'Alle sensor gegevens' ,ko: '모든 센서 이벤트' - ,zh_cn: '所有探头事件' } ,'Remove future items from mongo database' : { cs: 'Odebrání položek v budoucnosti z Mongo databáze' @@ -6407,8 +6036,6 @@ function init() { ,sk: 'Odobrať budúce položky z Mongo databázy' ,nl: 'Verwijder items die in de toekomst liggen uit database' ,ko: 'mongo DB에서 미래 항목들을 지우세요.' - ,zh_cn: '从数据库中清除所有未来条目' - ,zh_tw: '從數據庫中清除所有未來條目' } ,'Find and remove treatments in the future' : { cs: 'Najít a odstranit záznamy ošetření v budoucnosti' @@ -6426,8 +6053,6 @@ function init() { ,sk: 'Nájsť a odstrániť záznamy ošetrenia v budúcnosti' ,nl: 'Zoek en verwijder behandelingen met datum in de toekomst' ,ko: '미래에 treatments를 검색하고 지우세요.' - ,zh_cn: '查找并清除所有未来的操作' - ,zh_tw: '查找並清除所有未來的操作' } ,'This task find and remove treatments in the future.' : { cs: 'Tento úkol najde a odstraní ošetření v budoucnosti.' @@ -6445,8 +6070,6 @@ function init() { ,sk: 'Táto úloha nájde a odstáni záznamy ošetrenia v budúcnosti.' ,nl: 'Zoek en verwijder behandelingen met datum in de toekomst' ,ko: '이 작업은 미래에 treatments를 검색하고 지우는 것입니다.' - ,zh_cn: '此功能查找并清除所有未来的操作。' - ,zh_tw: '此功能查找並清除所有未來的操作。' } ,'Remove treatments in the future' : { cs: 'Odstraň ošetření v budoucnosti' @@ -6464,8 +6087,6 @@ function init() { ,sk: 'Odstrániť záznamy ošetrenia v budúcnosti' ,nl: 'Verwijder behandelingen met datum in de toekomst' ,ko: '미래 treatments 지우기' - ,zh_cn: '清除未来操作' - ,zh_tw: '清除未來操作' } ,'Find and remove entries in the future' : { cs: 'Najít a odstranit CGM data v budoucnosti' @@ -6483,8 +6104,6 @@ function init() { ,sk: 'Nájsť a odstrániť CGM dáta v budúcnosti' ,nl: 'Zoek en verwijder behandelingen met datum in de toekomst' ,ko: '미래에 입력을 검색하고 지우세요.' - ,zh_cn: '查找并清除所有的未来的记录' - ,zh_tw: '查找並清除所有的未來的記錄' } ,'This task find and remove CGM data in the future created by uploader with wrong date/time.' : { cs: 'Tento úkol najde a odstraní CGM data v budoucnosti vzniklé špatně nastaveným datem v uploaderu.' @@ -6502,8 +6121,6 @@ function init() { ,sk: 'Táto úloha nájde a odstráni CGM dáta v budúcnosti vzniknuté zle nastaveným časom uploaderu.' ,nl: 'Zoek en verwijder behandelingen met datum in de toekomst' ,ko: '이 작업은 잘못된 날짜/시간으로 업로드 되어 생성된 미래의 CGM 데이터를 검색하고 지우는 것입니다.' - ,zh_cn: '此功能查找并清除所有上传时日期时间错误导致生成在未来时间的CGM数据。' - ,zh_tw: '此功能查找並清除所有上傳時日期時間錯誤導致生成在未來時間的CGM數據。' } ,'Remove entries in the future' : { cs: 'Odstraň CGM data v budoucnosti' @@ -6521,8 +6138,6 @@ function init() { ,sk: 'Odstrániť CGM dáta v budúcnosti' ,nl: 'Verwijder invoer met datum in de toekomst' ,ko: '미래의 입력 지우기' - ,zh_cn: '清除未来记录' - ,zh_tw: '清除未來記錄' } ,'Loading database ...' : { cs: 'Nahrávám databázi ...' @@ -6540,8 +6155,6 @@ function init() { ,sk: 'Nahrávam databázu...' ,nl: 'Database laden ....' ,ko: '데이터베이스 로딩' - ,zh_cn: '载入数据库...' - ,zh_tw: '載入數據庫...' } ,'Database contains %1 future records' : { cs: 'Databáze obsahuje %1 záznamů v budoucnosti' @@ -6559,8 +6172,6 @@ function init() { ,sk: 'Databáza obsahuje %1 záznamov v budúcnosti' ,nl: 'Database bevat %1 toekomstige records' ,ko: '데이터베이스는 미래 기록을 %1 포함하고 있습니다.' - ,zh_cn: '数据库包含%1条未来记录' - ,zh_tw: '數據庫包含%1條未來記錄' } ,'Remove %1 selected records?' : { cs: 'Odstranit %1 vybraných záznamů' @@ -6578,8 +6189,6 @@ function init() { ,sk: 'Odstrániť %1 vybraných záznamov' ,nl: 'Verwijder %1 geselecteerde records?' ,ko: '선택된 기록 %1를 지우시겠습니까?' - ,zh_cn: '清除%1条选择的记录?' - ,zh_tw: '清除%1條選擇的記錄?' } ,'Error loading database' : { cs: 'Chyba při nahrávání databáze' @@ -6597,8 +6206,6 @@ function init() { ,sk: 'Chyba pri nahrávanií databázy' ,nl: 'Fout bij het laden van database' ,ko: '데이터베이스 로딩 에러' - ,zh_cn: '载入数据库错误' - ,zh_tw: '載入數據庫錯誤' } ,'Record %1 removed ...' : { cs: 'Záznam %1 odstraněn ...' @@ -6616,8 +6223,6 @@ function init() { ,sk: '%1 záznamov bolo odstránených...' ,nl: 'Record %1 verwijderd ' ,ko: '기록 %1가 삭제되었습니다.' - ,zh_cn: '%1条记录已清除' - ,zh_tw: '%1條記錄已清除' } ,'Error removing record %1' : { cs: 'Chyba při odstaňování záznamu %1' @@ -6635,8 +6240,6 @@ function init() { ,sk: 'Chyba pri odstraňovaní záznamu %1' ,nl: 'Fout bij het verwijderen van %1 record' ,ko: '기록 %1을 삭제하는 중에 에러가 발생했습니다.' - ,zh_cn: '%1条记录清除出错' - ,zh_tw: '%1條記錄清除出錯' } ,'Deleting records ...' : { cs: 'Odstraňování záznamů ...' @@ -6654,8 +6257,6 @@ function init() { ,sk: 'Odstraňovanie záznamov...' ,nl: 'Verwijderen records .....' ,ko: '기록 삭제 중' - ,zh_cn: '正在删除记录...' - ,zh_tw: '正在刪除記錄...' } ,'Clean Mongo status database' : { cs: 'Vyčištění Mongo databáze statusů' @@ -6673,7 +6274,6 @@ function init() { ,sk: 'Vyčistiť Mongo databázu statusov' ,nl: 'Schoon Mongo database status' ,ko: 'Mongo 상태 데이터베이스를 지우세요.' - ,zh_cn: '清除状态数据库' } ,'Delete all documents from devicestatus collection' : { cs: 'Odstranění všech záznamů z kolekce devicestatus' @@ -6690,7 +6290,6 @@ function init() { ,ru: 'Стереть все документы из коллекции статус устройства' ,sk: 'Odstránenie všetkých záznamov z kolekcie "devicestatus"' ,ko: 'devicestatus 수집에서 모든 문서들을 지우세요' - ,zh_cn: '从设备状态采集删除所有文档' } ,'This task removes all documents from devicestatus collection. Useful when uploader battery status is not properly updated.' : { cs: 'Tento úkol odstraní všechny dokumenty z kolekce devicestatus. Je to vhodné udělat, pokud se ukazatel stavu baterie neobnovuje správně.' @@ -6707,7 +6306,6 @@ function init() { ,ru: 'Эта опция удаляет все документы из коллекции статус устройства. Полезно когда состояние батвреи загрузчика не обновляется' ,sk: 'Táto úloha vymaže všetky záznamy z kolekcie "devicestatus". Je to vhodné keď sa stav batérie nezobrazuje správne.' ,ko: '이 작업은 모든 문서를 devicestatus 수집에서 지웁니다. 업로더 배터리 상태가 적절하게 업데이트 되지 않을 때 유용합니다.' - ,zh_cn: '此功能从设备状态采集中删除所有文档。适用于上传设备电量信息不能正常同步时使用。' } ,'Delete all documents' : { cs: 'Odstranit všechny dokumenty' @@ -6725,24 +6323,22 @@ function init() { ,sk: 'Zmazať všetky záznamy' ,nl: 'Verwijder alle documenten' ,ko: '모든 문서들을 지우세요' - ,zh_cn: '删除所有文档' } ,'Delete all documents from devicestatus collection devicestatus?' : { - cs: 'Odstranit všechny dokumenty z kolekce devicestatus?' - ,nb: 'Fjern alle dokumenter fra device status tabellen?' - ,el: 'Διαγραφή όλων των δεδομένων της κατάστασης της συσκευής ανάγνωσης?' - ,de: 'Löschen aller Dokumente der Gerätestatus-Sammlung?' - ,ro: 'Șterg toate documentele din colecția devicestatus?' - ,sv: 'Ta bort alla dokument från devicestatuscollektionen' - ,bg: 'Изтриване на всички документи от папката статус-устройство?' - ,it: 'Eliminare tutti i documenti dalla collezione devicestatus?' - ,fi: 'Poista tiedot statustietokannasta?' - ,pl: 'Czy na pewno usunąć wszystkie dokumenty z kolekcji devicestatus?' - ,pt: 'Apagar todos os documentos da coleção devicestatus?' - ,ru: 'Стереть все документы коллекции статус устройства?' - ,sk: 'Zmazať všetky záznamy z kolekcie "devicestatus"?' - ,ko: 'devicestatus 수집의 모든 문서들을 지우세요.' - ,zh_cn: '从设备状态采集删除所有文档?' + cs: 'Odstranit všechny dokumenty z kolekce devicestatus?' + ,nb: 'Fjern alle dokumenter fra device status tabellen?' + ,el: 'Διαγραφή όλων των δεδομένων της κατάστασης της συσκευής ανάγνωσης?' + ,de: 'Löschen aller Dokumente der Gerätestatus-Sammlung?' + ,ro: 'Șterg toate documentele din colecția devicestatus?' + ,sv: 'Ta bort alla dokument från devicestatuscollektionen' + ,bg: 'Изтриване на всички документи от папката статус-устройство?' + ,it: 'Eliminare tutti i documenti dalla collezione devicestatus?' + ,fi: 'Poista tiedot statustietokannasta?' + ,pl: 'Czy na pewno usunąć wszystkie dokumenty z kolekcji devicestatus?' + ,pt: 'Apagar todos os documentos da coleção devicestatus?' + ,ru: 'Стереть все документы коллекции статус устройства?' + ,sk: 'Zmazať všetky záznamy z kolekcie "devicestatus"?' + ,ko: 'devicestatus 수집의 모든 문서들을 지우세요.' } ,'Database contains %1 records' : { cs: 'Databáze obsahuje %1 záznamů' @@ -6760,7 +6356,6 @@ function init() { ,sk: 'Databáza obsahuje %1 záznamov' ,nl: 'Database bevat %1 records' ,ko: '데이터베이스는 %1 기록을 포함합니다.' - ,zh_cn: '数据库包含%1条记录' } ,'All records removed ...' : { cs: 'Všechny záznamy odstraněny ...' @@ -6778,7 +6373,6 @@ function init() { ,sk: 'Všetky záznamy boli zmazané...' ,nl: 'Alle records verwijderd' ,ko: '모든 기록들이 지워졌습니다.' - ,zh_cn: '所有记录已经被清除' } ,'Admin Tools' : { cs: 'Nástroje pro správu' @@ -6796,8 +6390,6 @@ function init() { ,sk: 'Nástroje pre správu' ,nl: 'Admin tools' ,ko: '관리 도구' - ,zh_cn: '管理工具' - ,zh_tw: '管理工具' } ,'Nightscout reporting' : { cs: 'Nightscout - Výkazy' @@ -6815,7 +6407,6 @@ function init() { ,sk: 'Nightscout výkazy' ,nl: 'Nightscout rapportages' ,ko: 'Nightscout 보고하기' - ,zh_cn: 'Nightscout报表生成器' } ,'Cancel' : { cs: 'Zrušit' @@ -6833,7 +6424,6 @@ function init() { ,sk: 'Zrušiť' ,nl: 'Annuleer' ,ko: '취소' - ,zh_cn: '取消' } ,'Edit treatment' : { cs: 'Upravit ošetření' @@ -6851,7 +6441,6 @@ function init() { ,sk: 'Upraviť ošetrenie' ,nl: 'Bewerkt behandeling' ,ko: 'Treatments 편집' - ,zh_cn: '编辑操作' } ,'Duration' : { cs: 'Doba trvání' @@ -6869,7 +6458,6 @@ function init() { ,sk: 'Trvanie' ,nl: 'Duur' ,ko: '기간' - ,zh_cn: '持续' } ,'Duration in minutes' : { cs: 'Doba trvání v minutách' @@ -6887,7 +6475,6 @@ function init() { ,sk: 'Trvanie v minútach' ,nl: 'Duur in minuten' ,ko: '분당 지속 기간' - ,zh_cn: '持续时间(分钟)' } ,'Temp Basal' : { cs: 'Dočasný bazál' @@ -6904,7 +6491,6 @@ function init() { ,sk: 'Dočasný bazál' ,nl: 'Tijdelijke basaal' ,ko: '임시 basal' - ,zh_cn: '临时基础率' } ,'Temp Basal Start' : { cs: 'Dočasný bazál začátek' @@ -6921,7 +6507,6 @@ function init() { ,sk: 'Začiatok dočasného bazálu' ,nl: 'Start tijdelijke basaal' ,ko: '임시 basal 시작' - ,zh_cn: '临时基础率开始' } ,'Temp Basal End' : { cs: 'Dočasný bazál konec' @@ -6938,7 +6523,6 @@ function init() { ,sk: 'Koniec dočasného bazálu' ,nl: 'Einde tijdelijke basaal' ,ko: '임시 basal 종료' - ,zh_cn: '临时基础率结束' } ,'Percent' : { // value in % for temp basal cs: 'Procenta' @@ -6956,7 +6540,6 @@ function init() { ,sk: 'Percent' ,nl: 'Procent' ,ko: '퍼센트' - ,zh_cn: '百分比' } ,'Basal change in %' : { cs: 'Změna bazálu v %' @@ -6973,7 +6556,6 @@ function init() { ,sk: 'Zmena bazálu v %' ,nl: 'Basaal aanpassing in %' ,ko: '% 이내의 basal 변경' - ,zh_cn: '基础率变化百分比' } ,'Basal value' : { // absolute value for temp basal cs: 'Hodnota bazálu' @@ -6990,7 +6572,6 @@ function init() { ,sk: 'Hodnota bazálu' ,nl: 'Basaal snelheid' ,ko: 'Basal' - ,zh_cn: '基础率值' } ,'Absolute basal value' : { cs: 'Hodnota bazálu' @@ -7007,7 +6588,6 @@ function init() { ,sk: 'Absolútna hodnota bazálu' ,nl: 'Absolute basaal waarde' ,ko: '절대적인 basal' - ,zh_cn: '绝对基础率值' } ,'Announcement' : { cs: 'Oznámení' @@ -7026,7 +6606,6 @@ function init() { ,sk: 'Oznámenia' ,nl: 'Mededeling' ,ko: '공지' - ,zh_cn: '通告' } ,'Loading temp basal data' : { cs: 'Nahrávám dočasné bazály' @@ -7043,7 +6622,6 @@ function init() { ,sk: 'Nahrávam dáta dočasného bazálu' ,nl: 'Laden tijdelijke basaal gegevens' ,ko: '임시 basal 로딩' - ,zh_cn: '载入临时基础率数据' } ,'Save current record before changing to new?' : { cs: 'Uložit současný záznam před změnou na nový?' @@ -7061,7 +6639,6 @@ function init() { ,nl: 'Opslaan voor verder te gaan?' ,ko: '새 데이터로 변경하기 전에 현재의 기록을 저장하시겠습니까?' ,it: 'Salvare i dati correnti prima di cambiarli?' - ,zh_cn: '在修改至新值前保存当前记录?' } ,'Profile Switch' : { cs: 'Přepnutí profilu' @@ -7079,7 +6656,6 @@ function init() { ,nl: 'Profiel wissel' ,ko: '프로파일 변경' ,it: 'Cambio profilo' - ,zh_cn: '切换配置文件' } ,'Profile' : { cs: 'Profil' @@ -7097,7 +6673,6 @@ function init() { ,sk: 'Profil' ,nl: 'Profiel' ,ko: '프로파일' - ,zh_cn: '配置文件' } ,'General profile settings' : { cs: 'Obecná nastavení profilu' @@ -7115,7 +6690,6 @@ function init() { ,nl: 'Profiel instellingen' ,ko: '일반 프로파일 설정' ,it: 'Impostazioni generali profilo' - ,zh_cn: '通用配置文件设置' } ,'Title' : { cs: 'Název' @@ -7133,7 +6707,6 @@ function init() { ,nl: 'Titel' ,ko: '제목' ,it: 'Titolo' - ,zh_cn: '标题' } ,'Database records' : { cs: 'Záznamy v databázi' @@ -7150,7 +6723,6 @@ function init() { ,sk: 'Záznamy databázi' ,ko: '데이터베이스 기록' ,it: 'Record del database' - ,zh_cn: '数据库记录' } ,'Add new record' : { cs: 'Přidat nový záznam' @@ -7168,7 +6740,6 @@ function init() { ,nl: 'Toevoegen' ,ko: '새 기록 추가' ,it: 'Aggiungi un nuovo record' - ,zh_cn: '新增记录' } ,'Remove this record' : { cs: 'Vymazat tento záznam' @@ -7186,7 +6757,6 @@ function init() { ,nl: 'Verwijder' ,ko: '이 기록 삭' ,it: 'Rimuovi questo record' - ,zh_cn: '删除记录' } ,'Clone this record to new' : { cs: 'Zkopíruj tento záznam do nového' @@ -7204,7 +6774,6 @@ function init() { ,nl: 'Kopieer deze invoer naar nieuwe' ,ko: '이 기록을 새기록으로 복제하기' ,it: 'Clona questo record in uno nuovo' - ,zh_cn: '复制记录' } ,'Record valid from' : { cs: 'Záznam platný od' @@ -7222,7 +6791,6 @@ function init() { ,nl: 'Geldig van' ,ko: '유효 기록' ,it: 'Record valido da' - ,zh_cn: '有效记录,从' } ,'Stored profiles' : { cs: 'Uložené profily' @@ -7240,7 +6808,6 @@ function init() { ,nl: 'Opgeslagen profielen' ,ko: '저장된 프로파일' ,it: 'Profili salvati' - ,zh_cn: '配置文件已存储' } ,'Timezone' : { cs: 'Časová zóna' @@ -7258,7 +6825,6 @@ function init() { ,nl: 'Tijdzone' ,ko: '타임존' ,it: 'Fuso orario' - ,zh_cn: '时区' } ,'Duration of Insulin Activity (DIA)' : { cs: 'Doba působnosti inzulínu (DIA)' @@ -7276,7 +6842,6 @@ function init() { ,nl: 'Werkingsduur insuline (DIA)' ,ko: '활성 인슐린 지속 시간(DIA)' ,it: 'Durata Attività Insulinica (DIA)' - ,zh_cn: '胰岛素作用时间(DIA)' } ,'Represents the typical duration over which insulin takes effect. Varies per patient and per insulin type. Typically 3-4 hours for most pumped insulin and most patients. Sometimes also called insulin lifetime.' : { cs: 'Představuje typickou dobu, po kterou inzulín působí. Bývá různá podle pacienta a inzulínu. Typicky 3-4 hodiny pro pacienty s pumpou.' @@ -7294,7 +6859,6 @@ function init() { ,nl: 'Geeft de werkingsduur van de insuline in het lichaam aan. Dit verschilt van patient tot patient er per soort insuline, algemeen gemiddelde is 3 tot 4 uur. ' ,ko: '인슐린이 작용하는 지속시간을 나타냅니다. 사람마다 그리고 인슐린 종류에 따라 다르고 일반적으로 3~4시간간 동안 지속되며 인슐린 작용 시간(Insulin lifetime)이라고 불리기도 합니다.' ,it: 'Rappresenta la durata tipica nel quale l\'insulina ha effetto. Varia in base al paziente ed al tipo d\'insulina. Tipicamente 3-4 ore per la maggior parte dei microinfusori e dei pazienti. Chiamata anche durata d\'azione insulinica.' - ,zh_cn: '体现典型的胰岛素活性持续时间。 通过百分比和胰岛素类型体现。对于大多数胰岛素和患者来说是3至4个小时。也称为胰岛素生命周期。' } ,'Insulin to carb ratio (I:C)' : { cs: 'Inzulíno-sacharidový poměr (I:C).' @@ -7312,7 +6876,6 @@ function init() { ,nl: 'Insuline - Koolhydraat ratio (I:C)' ,ko: '탄수화물에 대한 인슐린 비율(I:C)' ,it: 'Rapporto Insulina-Carboidrati (I:C)' - ,zh_cn: '碳水化合物系数(ICR)' } ,'hours' : { cs: 'hodin' @@ -7330,7 +6893,6 @@ function init() { ,nl: 'Uren' ,ko: '시간' ,it: 'ore' - ,zh_cn: '小时' } ,'g/hour' : { cs: 'g/hod' @@ -7347,7 +6909,6 @@ function init() { ,nl: 'gr/uur' ,ko: 'g/시간' ,it: 'g/ora' - ,zh_cn: 'g/小时' } ,'g carbs per U insulin. The ratio of how many grams of carbohydrates are offset by each U of insulin.' : { cs: 'gramy na jednotku inzulínu. Poměr, jaké množství sacharidů pokryje jednotku inzulínu.' @@ -7364,7 +6925,6 @@ function init() { ,sk: 'gramy sacharidov na jednotku inzulínu. Pomer udáva aké množstvo sacharidov pokryje jednotka inzulínu.' ,ko: '인슐린 단위 당 탄수화물 g. 인슐린 단위에 대한 탄수화물의 양의 비율을 나타냅니다.' ,it: 'g carbo per U di insulina. Il rapporto tra quanti grammi di carboidrati sono compensati da ogni U di insulina.' - ,zh_cn: '克碳水每单位胰岛素。每单位胰岛素可以抵消的碳水化合物克值比例。' } ,'Insulin Sensitivity Factor (ISF)' : { cs: 'Citlivost inzulínu (ISF)' @@ -7382,7 +6942,6 @@ function init() { ,nl: 'Insuline gevoeligheid' ,ko: '인슐린 민감도(ISF)' ,it: 'Fattore di Sensibilità Insulinica (ISF)' - ,zh_cn: '胰岛素敏感系数(ISF)' } ,'mg/dL or mmol/L per U insulin. The ratio of how much BG changes with each U of corrective insulin.' : { cs: 'mg/dL nebo mmol/L na jednotku inzulínu. Poměr, jak se změní glykémie po podaní jednotky inzulínu' @@ -7400,7 +6959,6 @@ function init() { ,nl: 'Ratio daling BG waarde per eenheid correctie' ,ko: '인슐린 단위당 mg/dL 또는 mmol/L. 인슐린 단위당 얼마나 많은 혈당 변화가 있는지의 비율을 나타냅니다.' ,it: 'mg/dL o mmol/L per U insulina. Il rapporto di quanto la glicemia varia per ogni U di correzione insulinica.' - ,zh_cn: 'mg/dL或mmol/L每单位胰岛素。每单位输入胰岛素导致血糖变化的比例' } ,'Carbs activity / absorption rate' : { cs: 'Rychlost absorbce sacharidů' @@ -7418,7 +6976,6 @@ function init() { ,nl: 'Koolhydraat opname snelheid' ,ko: '활성 탄수화물/흡수율' ,it: 'Attività carboidrati / Velocità di assorbimento' - ,zh_cn: '碳水化合物活性/吸收率' } ,'grams per unit time. Represents both the change in COB per unit of time, as well as the amount of carbs that should take effect over that time. Carb absorption / activity curves are less well understood than insulin activity, but can be approximated using an initial delay followed by a constant rate of absorption (g/hr).' : { cs: 'gramy za jednotku času. Reprezentuje jak změnu COB za jednoku času, tak množství sacharidů, které se za tu dobu projevily. Křivka absorbce sacharidů je mnohem méně pochopitelná než IOB, ale může být aproximována počáteční pauzou následovanou konstantní hodnotou absorbce (g/hod).' @@ -7435,7 +6992,6 @@ function init() { ,sk: 'gramy za jednotku času. Reprezentuje súčasne zmenu COB za jednotku času, ako aj množstvo sacharidov ktoré sa za tú dobu prejavili. Krivka vstrebávania sacharidov je omnoho menej pochopiteľná ako pôsobenie inzulínu (IOB), ale môže byť približne s použitím počiatočného oneskorenia a následne s konštantným vstrebávaním (g/hod). ' ,ko: '단위 시간당 그램. 시간당 작용하는 탄수화물의 총량 뿐 아니라 시간 단위당 COB의 변화를 나타냅니다. 탄수화물 흡수율/활성도 곡선은 인슐린 활성도보다 이해가 잘 되지는 않지만 지속적인 흡수율(g/hr)에 따른 초기 지연을 사용하여 근사치를 구할 수 있습니다.' ,it: 'grammi per unità di tempo. Rappresentano sia il cambio di COB per unità di tempo, sia la quantità di carboidrati che faranno effetto nel tempo. Assorbimento di carboidrati / curva di attività sono meno conosciute rispetto all\'attività insulinica, ma possono essere approssimate usando un ritardo iniziale seguito da un rapporto costante di assorbimento (g/hr).' - ,zh_cn: '克每单位时间。表示每单位时间COB(活性碳水化合物)的变化,以及在该时间应该生效的碳水化合物的量。碳水化合物活性/吸收曲线比胰岛素活性难理解,但可以使用初始延迟,接着恒定吸收速率(克/小时)来近似模拟。' } ,'Basal rates [unit/hour]' : { cs: 'Bazály [U/hod].' @@ -7453,7 +7009,6 @@ function init() { ,nl: 'Basaal snelheid [eenheden/uur]' ,ko: 'Basal 비율[unit/hour]' ,it: 'Basale [unità/ora]' - ,zh_cn: '基础率 [U/小时]' } ,'Target BG range [mg/dL,mmol/L]' : { cs: 'Cílový rozsah glykémií [mg/dL,mmol/L]' @@ -7471,7 +7026,6 @@ function init() { ,nl: 'Doel BG waarde in [mg/dl,mmol/L' ,ko: '목표 혈당 범위 [mg/dL,mmol/L]' ,it: 'Obiettivo d\'intervallo glicemico [mg/dL,mmol/L]' - ,zh_cn: '目标血糖范围 [mg/dL,mmol/L]' } ,'Start of record validity' : { cs: 'Začátek platnosti záznamu' @@ -7489,7 +7043,6 @@ function init() { ,nl: 'Start geldigheid' ,ko: '기록 유효기간의 시작일' ,it: 'Inizio di validità del dato' - ,zh_cn: '有效记录开始' } ,'Icicle' : { cs: 'Rampouch' @@ -7505,8 +7058,6 @@ function init() { ,ru: 'Силуэт сосульки' ,sk: 'Inverzne' ,ko: '고드름 방향' - ,zh_cn: 'Icicle' - ,zh_tw: 'Icicle' } ,'Render Basal' : { cs: 'Zobrazení bazálu' @@ -7524,8 +7075,6 @@ function init() { ,sk: 'Zobrazenie bazálu' ,nl: 'Render basaal' ,ko: 'Basal 사용하기' - ,zh_cn: '使用基础率' - ,zh_tw: '使用基礎率' } ,'Profile used' : { cs: 'Použitý profil' @@ -7543,7 +7092,6 @@ function init() { ,nl: 'Gebruikt profiel' ,ko: '프로파일이 사용됨' ,it: 'Profilo usato' - ,zh_cn: '配置文件已使用' } ,'Calculation is in target range.' : { cs: 'Kalkulace je v cílovém rozsahu.' @@ -7561,7 +7109,6 @@ function init() { ,nl: 'Berekening valt binnen doelwaards' ,ko: '계산은 목표 범위 안에 있습니다.' ,it: 'Calcolo all\'interno dell\'intervallo' - ,zh_cn: '预计在目标范围内' } ,'Loading profile records ...' : { cs: 'Nahrávám profily ...' @@ -7579,7 +7126,6 @@ function init() { ,nl: 'Laden profiel gegevens' ,ko: '프로파일 기록 로딩' ,it: 'Caricamento dati del profilo ...' - ,zh_cn: '载入配置文件记录...' } ,'Values loaded.' : { cs: 'Data nahrána.' @@ -7597,7 +7143,6 @@ function init() { ,nl: 'Gegevens geladen' ,ko: '값이 로드됨' ,it: 'Valori caricati.' - ,zh_cn: '已载入数值' } ,'Default values used.' : { cs: 'Použity výchozí hodnoty.' @@ -7615,7 +7160,6 @@ function init() { ,nl: 'Standaard waardes gebruikt' ,ko: '초기 설정 값이 사용됨' ,it: 'Valori standard usati.' - ,zh_cn: '已使用默认值' } ,'Error. Default values used.' : { cs: 'CHYBA: Použity výchozí hodnoty.' @@ -7633,7 +7177,6 @@ function init() { ,nl: 'FOUT: Standaard waardes gebruikt' ,ko: '에러. 초기 설정 값이 사용됨' ,it: 'Errore. Valori standard usati.' - ,zh_cn: '错误,已使用默认值' } ,'Time ranges of target_low and target_high don\'t match. Values are restored to defaults.' : { cs: 'Rozsahy časů pro limity glykémií si neodpovídají. Budou nastaveny výchozí hodnoty.' @@ -7650,7 +7193,6 @@ function init() { ,sk: 'Časové rozsahy pre cieľové glykémie sa nezhodujú. Hodnoty nastavené na východzie.' ,ko: '설정한 저혈당과 고혈당의 시간 범위와 일치하지 않습니다. 값은 초기 설정값으로 다시 저장 될 것입니다.' ,it: 'Intervalli di tempo della glicemia obiettivo inferiore e superiore non corretti. Valori ripristinati a quelli standard.' - ,zh_cn: '时间范围内的目标高低血糖值不匹配。已恢复使用默认值。' } ,'Valid from:' : { cs: 'Platné od:' @@ -7668,7 +7210,6 @@ function init() { ,nl: 'Geldig van:' ,ko: '유효' ,it: 'Valido da:' - ,zh_cn: '生效从:' } ,'Save current record before switching to new?' : { cs: 'Uložit současný záznam před přepnutím na nový?' @@ -7686,7 +7227,6 @@ function init() { ,nl: 'Opslaan voor verder te gaan?' ,ko: '새 데이터로 변환하기 전에 현재의 기록을 저장하겠습니까?' ,it: 'Salvare il dato corrente prima di passare ad uno nuovo?' - ,zh_cn: '切换至新记录前保存当前记录?' } ,'Add new interval before' : { cs: 'Přidat nový interval před' @@ -7704,7 +7244,6 @@ function init() { ,nl: 'Voeg interval toe voor' ,ko: '새로운 구간을 추가하세요' ,it: 'Aggiungere prima un nuovo intervallo' - ,zh_cn: '在此前新增区间' } ,'Delete interval' : { cs: 'Smazat interval' @@ -7722,7 +7261,6 @@ function init() { ,nl: 'Verwijder interval' ,ko: '구간을 지우세요.' ,it: 'Elimina intervallo' - ,zh_cn: '删除区间' } ,'I:C' : { cs: 'I:C' @@ -7738,7 +7276,6 @@ function init() { ,sk: 'I:C' ,ko: 'I:C' ,it: 'I:C' - ,zh_cn: 'ICR' } ,'ISF' : { cs: 'ISF' @@ -7754,7 +7291,6 @@ function init() { ,sk: 'ISF' ,ko: 'ISF' ,it: 'ISF' - ,zh_cn: 'ISF' } ,'Combo Bolus' : { cs: 'Kombinovaný bolus' @@ -7772,7 +7308,6 @@ function init() { ,nl: 'Pizza Bolus' ,ko: 'Combo Bolus' ,it: 'Combo Bolo' - ,zh_cn: '双波' } ,'Difference' : { cs: 'Rozdíl' @@ -7790,7 +7325,6 @@ function init() { ,nl: 'Verschil' ,ko: '차이' ,it: 'Differenza' - ,zh_cn: '差别' } ,'New time' : { cs: 'Nový čas' @@ -7808,7 +7342,6 @@ function init() { ,nl: 'Nieuwe tijd' ,ko: '새로운 시간' ,it: 'Nuovo Orario' - ,zh_cn: '新时间' } ,'Edit Mode' : { cs: 'Editační mód' @@ -7825,8 +7358,6 @@ function init() { ,pt: 'Modo de edição' ,ko: '편집 모드' ,it: 'Modalità di Modifica' - ,zh_cn: '编辑模式' - ,zh_tw: '編輯模式' } ,'When enabled icon to start edit mode is visible' : { cs: 'Pokud je povoleno, ikona pro vstup do editačního módu je zobrazena' @@ -7844,8 +7375,6 @@ function init() { ,nl: 'Als geactiveerd is edit mode beschikbaar' ,ko: '편집모드를 시작하기 위해 아이콘을 활성화하면 볼 수 있습니다.' ,it: 'Quando abilitata, l\'icona della Modalità di Modifica è visibile' - ,zh_cn: '启用后开始编辑模式图标可见' - ,zh_tw: '啟用後開始編輯模式圖標可見' } ,'Operation' : { cs: 'Operace' @@ -7862,7 +7391,6 @@ function init() { ,pt: 'Operação' ,ko: '동작' ,it: 'Operazione' - ,zh_cn: '操作' } ,'Move' : { cs: 'Přesunout' @@ -7880,7 +7408,6 @@ function init() { ,nl: 'Verplaats' ,ko: '이동' ,it: 'Muovi' - ,zh_cn: '移动' } ,'Delete' : { cs: 'Odstranit' @@ -7898,7 +7425,6 @@ function init() { ,nl: 'Verwijder' ,ko: '삭제' ,it: 'Elimina' - ,zh_cn: '删除' } ,'Move insulin' : { cs: 'Přesunout inzulín' @@ -7916,7 +7442,6 @@ function init() { ,nl: 'Verplaats insuline' ,ko: '인슐린을 이동하세요.' ,it: 'Muovi Insulina' - ,zh_cn: '移动胰岛素' } ,'Move carbs' : { cs: 'Přesunout sacharidy' @@ -7934,7 +7459,6 @@ function init() { ,nl: 'Verplaats KH' ,ko: '탄수화물을 이동하세요.' ,it: 'Muovi carboidrati' - ,zh_cn: '移动碳水' } ,'Remove insulin' : { cs: 'Odstranit inzulín' @@ -7952,7 +7476,6 @@ function init() { ,nl: 'Verwijder insuline' ,ko: '인슐린을 지우세요.' ,it: 'Rimuovi insulina' - ,zh_cn: '去除胰岛素' } ,'Remove carbs' : { cs: 'Odstranit sacharidy' @@ -7970,7 +7493,6 @@ function init() { ,nl: 'Verwijder KH' ,ko: '탄수화물을 지우세요.' ,it: 'Rimuovi carboidrati' - ,zh_cn: '去除碳水' } ,'Change treatment time to %1 ?' : { cs: 'Změnit čas ošetření na %1 ?' @@ -7988,7 +7510,6 @@ function init() { ,nl: 'Wijzig behandel tijdstip naar %1' ,ko: '%1 treatment을 변경하세요.' ,it: 'Cambiare tempo alla somministrazione a %1 ?' - ,zh_cn: '修改操作时间到%1?' } ,'Change carbs time to %1 ?' : { cs: 'Změnit čas sacharidů na %1 ?' @@ -8006,7 +7527,6 @@ function init() { ,nl: 'Wijzig KH tijdstip naar %1' ,ko: '%1로 탄수화물 시간을 변경하세요.' ,it: 'Cambiare durata carboidrati a %1 ?' - ,zh_cn: '修改碳水时间到%1?' } ,'Change insulin time to %1 ?' : { cs: 'Změnit čas inzulínu na %1 ?' @@ -8024,7 +7544,6 @@ function init() { ,nl: 'Wijzig insuline tijdstip naar %1' ,ko: '%1로 인슐린 시간을 변경하세요.' ,it: 'Cambiare durata insulina a %1 ?' - ,zh_cn: '修改胰岛素时间到%1?' } ,'Remove treatment ?' : { cs: 'Odstranit ošetření ?' @@ -8042,7 +7561,7 @@ function init() { ,nl: 'Verwijder behandeling' ,ko: 'Treatment를 지우세요.' ,it: 'Rimuovere somministrazione ?' - ,zh_cn: '去除操作?' + } ,'Remove insulin from treatment ?' : { cs: 'Odstranit inzulín z ošetření ?' @@ -8060,7 +7579,6 @@ function init() { ,nl: 'Verwijder insuline van behandeling' ,ko: 'Treatment에서 인슐린을 지우세요.' ,it: 'Rimuovere insulina dalla somministrazione ?' - ,zh_cn: '从操作中去除胰岛素?' } ,'Remove carbs from treatment ?' : { cs: 'Odstranit sacharidy z ošetření ?' @@ -8078,7 +7596,6 @@ function init() { ,nl: 'Verwijder KH van behandeling' ,ko: 'Treatment에서 탄수화물을 지우세요.' ,it: 'Rimuovere carboidrati dalla somministrazione ?' - ,zh_cn: '从操作中去除碳水化合物?' } ,'Rendering' : { cs: 'Vykresluji' @@ -8096,7 +7613,6 @@ function init() { ,nl: 'Renderen ' ,ko: '랜더링' ,it: 'Traduzione' - ,zh_cn: '渲染' } ,'Loading OpenAPS data of' : { cs: 'Nahrávám OpenAPS data z' @@ -8113,7 +7629,6 @@ function init() { ,pt: 'Carregando dados de OpenAPS de' ,ko: 'OpenAPS 데이터 로딩' ,it: 'Caricamento in corso dati OpenAPS' - ,zh_cn: '载入OpenAPS数据从' } ,'Loading profile switch data' : { cs: 'Nahrávám data přepnutí profilu' @@ -8130,7 +7645,6 @@ function init() { ,pt: 'Carregando dados de troca de perfil' ,ko: '프로파일 변환 데이터 로딩' ,it: 'Caricamento in corso dati cambio profilo' - ,zh_cn: '载入配置文件交换数据' } ,'Profile is going to be saved in newer format used in Nightscout 0.9.0 and above and will not be usable in older versions anymore.\nAre you sure?' : { cs: 'Profil bude uložen v novějším formátu používaném v Nightscoutu 0.9.0 a novějších. Již nebude použitelný se starší verzí.\nJste si jistý?' @@ -8147,7 +7661,6 @@ function init() { ,pt: 'O perfil será salvo no novo format usado no Nightscout 0.9.0 e acima e não será mais utilizado em versões mais antigas. \nTem certeza de que quer fazer isso?' ,ko: '프로파일은 Nightscout 0.9.0 에서 새로운 형식으로 저장될 예정입니다. 구버전은 더이상 사용되지 않을 예정입니다. 확인 하셨습니까?' ,it: 'Profilo sta per essere salvato nel formato più recente utilizzato in Nightscout 0.9.0 e/o superiori e non sarà più possibile utilizzarlo nelle versioni precedenti. \nSei sicuro?' - ,zh_cn: '配置文件将使用0.9.0版本之后的新格式保存,旧版本程序将无法使用。\n你确定吗?' } ,'Wrong profile setting.\nNo profile defined to displayed time.\nRedirecting to profile editor to create new profile.' : { cs: 'Chybě nastavený profil.\nNení definovaný žádný platný profil k času zobrazení.\nProvádím přesměrování na editor profilu.' @@ -8164,7 +7677,6 @@ function init() { ,pt: 'Configuração de perfil incorreta. \nNão há perfil definido para mostrar o horário. \nRedirecionando para o editor de perfil para criar um perfil novo.' ,ko: '잘못된 프로파일 설정. \n프로파일이 없어서 표시된 시간으로 정의됩니다. 새 프로파일을 생성하기 위해 프로파일 편집기로 리다이렉팅' ,it: 'Impostazione errata del profilo. \nNessun profilo definito per visualizzare l\'ora. \nReindirizzamento al profilo editor per creare un nuovo profilo.' - ,zh_cn: '配置文件设置错误。\n没有配置文件定义为显示时间。\n返回配置文件编辑器以新建配置文件。' } ,'Pump' : { cs: 'Pumpa' @@ -8181,7 +7693,6 @@ function init() { ,fi: 'Pumppu' ,pt: 'Bomba' ,it: 'Pompa' - ,zh_cn: '胰岛素泵' } ,'Sensor Age' : { cs: 'Stáří senzoru (SAGE)' @@ -8198,8 +7709,6 @@ function init() { ,fi: 'Sensorin ikä' ,pt: 'Idade do sensor' ,it: 'SAGE - Durata Sensore' - ,zh_cn: '探头使用时间(SAGE)' - ,zh_tw: '探頭使用時間(SAGE)' } ,'Insulin Age' : { cs: 'Stáří inzulínu (IAGE)' @@ -8210,14 +7719,12 @@ function init() { ,de: 'Insulin-Alter' ,bg: 'Възраст на инсулина (ВИ)' ,ro: 'Vechimea insulinei' - ,ru: 'инсулин проработал' + ,ru: 'Возраст инсулина' ,nl: 'Insuline leeftijd (IAGE)' ,ko: '인슐린 사용 기간' ,fi: 'Insuliinin ikä' ,pt: 'Idade da insulina' - ,it: 'IAGE - Durata Insulina' - ,zh_cn: '胰岛素使用时间(IAGE)' - ,zh_tw: '胰島素使用時間(IAGE)' + ,it: 'IAGE - Durata Insulina' } ,'Temporary target' : { cs: 'Dočasný cíl' @@ -8234,7 +7741,6 @@ function init() { ,fi: 'Tilapäinen tavoite' ,pt: 'Meta temporária' ,it: 'Obiettivo Temporaneo' - ,zh_cn: '临时目标' } ,'Reason' : { cs: 'Důvod' @@ -8251,7 +7757,6 @@ function init() { ,fi: 'Syy' ,pt: 'Razão' ,it: 'Ragionare' - ,zh_cn: '原因' } ,'Eating soon' : { cs: 'Následuje jídlo' @@ -8267,7 +7772,6 @@ function init() { ,fi: 'Syödään pian' ,pt: 'Refeição em breve' ,it: 'Mangiare prossimamente' - ,zh_cn: '接近用餐时间' } ,'Top' : { cs: 'Horní' @@ -8284,7 +7788,6 @@ function init() { ,fi: 'Ylä' ,pt: 'Superior' ,it: 'Superiore' - ,zh_cn: '顶部' } ,'Bottom' : { cs: 'Dolní' @@ -8301,7 +7804,6 @@ function init() { ,fi: 'Ala' ,pt: 'Inferior' ,it: 'Inferiore' - ,zh_cn: '底部' } ,'Activity' : { cs: 'Aktivita' @@ -8317,8 +7819,7 @@ function init() { ,ko: '활성도' ,fi: 'Aktiviteetti' ,pt: 'Atividade' - ,it: 'Attività' - ,zh_cn: '有效的' + ,it: 'Attività' } ,'Targets' : { cs: 'Cíl' @@ -8335,7 +7836,6 @@ function init() { ,fi: 'Tavoitteet' ,pt: 'Metas' ,it: 'Obiettivi' - ,zh_cn: '目标' } ,'Bolus insulin:' : { cs: 'Bolusový inzulín:' @@ -8351,8 +7851,7 @@ function init() { ,pt: 'Insulina de bolus' ,sk: 'Bolusový inzulín:' ,it: 'Insulina Bolo' - ,nl: 'Bolus insuline' - ,zh_cn: '大剂量胰岛素' + ,nl: 'Bolus insuline' } ,'Base basal insulin:' : { cs: 'Základní bazální inzulín:' @@ -8368,8 +7867,7 @@ function init() { ,pt: 'Insulina basal programada:' ,sk: 'Základný bazálny inzulín:' ,it: 'Insulina Basale:' - ,nl: 'Basis basaal insuline' - ,zh_cn: '基础率胰岛素' + ,nl: 'Basis basaal insuline' } ,'Positive temp basal insulin:' : { cs: 'Pozitivní dočasný bazální inzulín:' @@ -8385,7 +7883,6 @@ function init() { ,pt: 'Insulina basal temporária positiva:' ,sk: 'Pozitívny dočasný bazálny inzulín:' ,it: 'Insulina basale temp positiva:' - ,zh_cn: '实际临时基础率胰岛素' } ,'Negative temp basal insulin:' : { cs:'Negativní dočasný bazální inzulín:' @@ -8401,7 +7898,6 @@ function init() { ,pt: 'Insulina basal temporária negativa:' ,sk: 'Negatívny dočasný bazálny inzulín:' ,it: 'Insulina basale Temp negativa:' - ,zh_cn: '其余临时基础率胰岛素' } ,'Total basal insulin:' : { cs: 'Celkový bazální inzulín:' @@ -8417,8 +7913,7 @@ function init() { ,pt: 'Insulina basal total:' ,sk: 'Celkový bazálny inzulín:' ,it: 'Insulina Basale Totale:' - ,nl: 'Totaal basaal insuline' - ,zh_cn: '基础率胰岛素合计' + ,nl: 'Totaal basaal insuline' } ,'Total daily insulin:' : { cs:'Celkový denní inzulín:' @@ -8434,8 +7929,7 @@ function init() { ,pt: 'Insulina diária total:' ,sk: 'Celkový denný inzulín:' ,it: 'Totale giornaliero d\'insulina:' - ,nl: 'Totaal dagelijkse insuline' - ,zh_cn: '每日胰岛素合计' + ,nl: 'Totaal dagelijkse insuline' } ,'Unable to %1 Role' : { // PUT or POST cs: 'Chyba volání %1 Role:' @@ -8450,8 +7944,7 @@ function init() { ,sk: 'Chyba volania %1 Role' ,ko: '%1로 비활성' ,it: 'Incapace di %1 Ruolo' - ,nl: 'Kan %1 rol niet verwijderen' - ,zh_cn: '%1角色不可用' + ,nl: 'Kan %1 rol niet verwijderen' } ,'Unable to delete Role' : { cs: 'Nelze odstranit Roli:' @@ -8466,8 +7959,7 @@ function init() { ,sk: 'Rola sa nedá zmazať' ,ko: '삭제로 비활성' ,it: 'Incapace di eliminare Ruolo' - ,nl: 'Niet mogelijk rol te verwijderen' - ,zh_cn: '无法删除角色' + ,nl: 'Niet mogelijk rol te verwijderen' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' @@ -8482,8 +7974,7 @@ function init() { ,sk: 'Databáza obsahuje %1 rolí' ,ko: '데이터베이스가 %1 포함' ,it: 'Database contiene %1 ruolo' - ,nl: 'Database bevat %1 rollen' - ,zh_cn: '数据库包含%1个角色' + ,nl: 'Database bevat %1 rollen' } ,'Edit Role' : { cs:'Editovat roli' @@ -8498,8 +7989,7 @@ function init() { ,sk: 'Editovať rolu' ,ko: '편집 모드' ,it: 'Modifica ruolo' - ,nl: 'Pas rol aan' - ,zh_cn: '编辑角色' + ,nl: 'Pas rol aan' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' @@ -8514,8 +8004,7 @@ function init() { ,sk: 'administrátor, škola, rodina atď...' ,ko: '관리자, 학교, 가족 등' ,it: 'amministrazione, scuola, famiglia, etc' - ,nl: 'admin, school, familie, etc' - ,zh_cn: '政府、学校、家庭等' + ,nl: 'admin, school, familie, etc' } ,'Permissions' : { cs: 'Oprávnění' @@ -8531,7 +8020,6 @@ function init() { ,ko: '허가' ,it: 'Permessi' ,nl: 'Rechten' - ,zh_cn: '权限' } ,'Are you sure you want to delete: ' : { cs: 'Opravdu vymazat: ' @@ -8546,8 +8034,7 @@ function init() { ,sk: 'Naozaj zmazať:' ,ko: '정말로 삭제하시겠습니까: ' ,it: 'Sei sicuro di voler eliminare:' - ,nl: 'Weet u het zeker dat u wilt verwijderen?' - ,zh_cn: '你确定要删除:' + ,nl: 'Weet u het zeker dat u wilt verwijderen?' } ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a separator.' : { cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' @@ -8562,7 +8049,6 @@ function init() { ,sk: 'Každá rola má 1 alebo viac oprávnení. Oprávnenie * je zástupný znak, oprávnenia sú hierarchie používajúce : ako oddelovač.' ,ko: '각각은 1 또는 그 이상의 허가를 가지고 있습니다. 허가는 예측이 안되고 구분자로 : 사용한 계층이 있습니다' ,it: 'Ogni ruolo avrà un 1 o più autorizzazioni. Il * il permesso è un jolly, i permessi sono una gerarchia utilizzando : come separatore.' - ,zh_cn: '每个角色都具有一个或多个权限。权限设置时使用*作为通配符,层次结构使用:作为分隔符。' } ,'Add new Role' : { cs: 'Přidat novou roli' @@ -8577,8 +8063,7 @@ function init() { ,sk: 'Pridať novú rolu' ,ko: '새 역할 추가' ,it: 'Aggiungere un nuovo ruolo' - ,nl: 'Voeg rol toe' - ,zh_cn: '添加新角色' + ,nl: 'Voeg rol toe' } ,'Roles - Groups of People, Devices, etc' : { cs: 'Role - Skupiny lidí, zařízení atd.' @@ -8593,8 +8078,7 @@ function init() { ,sk: 'Role - skupiny ľudí, zariadení atď...' ,ko: '역할 - 그룹, 기기, 등' ,it: 'Ruoli - gruppi di persone, dispositivi, etc' - ,nl: 'Rollen - Groepen mensen apparaten etc' - ,zh_cn: '角色 - 一组人或设备等' + ,nl: 'Rollen - Groepen mensen apparaten etc' } ,'Edit this role' : { cs: 'Editovat tuto roli' @@ -8609,8 +8093,7 @@ function init() { ,sk: 'Editovať túto rolu' ,ko: '이 역할 편집' ,it: 'Modifica questo ruolo' - ,nl: 'Pas deze rol aan' - ,zh_cn: '编辑角色' + ,nl: 'Pas deze rol aan' } ,'Admin authorized' : { cs: 'Admin autorizován' @@ -8625,15 +8108,13 @@ function init() { ,sk: 'Admin autorizovaný' ,ko: '인증된 관리자' ,it: 'Amministrativo autorizzato' - ,nl: 'Admin geauthoriseerd' - ,zh_cn: '已授权' - ,zh_tw: '已授權' + ,nl: 'Admin geauthoriseerd' } ,'Subjects - People, Devices, etc' : { cs: 'Subjekty - Lidé, zařízení atd.' ,bg: 'Субекти - Хора,Устройства,т.н.' ,ro: 'Subiecte - Persoane, dispozitive, etc' - ,ru: 'Субъекты - Люди, устройства и т п' + ,ru: 'Люди, устройства и т п' ,sv: 'Ämnen - Användare, Enheter, etc' ,nb: 'Ressurser - Brukere, enheter osv' ,fi: 'Käyttäjät (Ihmiset, laitteet jne)' @@ -8642,8 +8123,7 @@ function init() { ,sk: 'Subjekty - ľudia, zariadenia atď...' ,ko: '주제 - 사람, 기기 등' ,it: 'Soggetti - persone, dispositivi, etc' - ,nl: 'Onderwerpen - Mensen, apparaten etc' - ,zh_cn: '用户 - 人、设备等' + ,nl: 'Onderwerpen - Mensen, apparaten etc' } ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' @@ -8658,7 +8138,6 @@ function init() { ,sk: 'Každý objekt má svoj unikátny prístupový token a 1 alebo viac rolí. Klikni na prístupový token pre otvorenie nového okna pre tento subjekt. Tento link je možné zdielať.' ,ko: '각 주제는 유일한 access token을 가지고 1 또는 그 이상의 역할을 가질 것이다. 선택된 주제와 새로운 뷰를 열기 위해 access token을 클릭하세요. 이 비밀 링크는 공유되어질 수 있다.' ,it: 'Ogni soggetto avrà un gettone d\'accesso unico e 1 o più ruoli. Fare clic sul gettone d\'accesso per aprire una nuova vista con il soggetto selezionato, questo legame segreto può quindi essere condiviso.' - ,zh_cn: '每个用户具有唯一的访问令牌和一个或多个角色。在访问令牌上单击打开新窗口查看已选择用户,此时该链接可分享。' } ,'Add new Subject' : { cs: 'Přidat nový subjekt' @@ -8673,8 +8152,7 @@ function init() { ,sk: 'Pridať nový subjekt' ,ko: '새 주제 추가' ,it: 'Aggiungere un nuovo Soggetto' - ,nl: 'Voeg onderwerp toe' - ,zh_cn: '添加新用户' + ,nl: 'Voeg onderwerp toe' } ,'Unable to %1 Subject' : { // PUT or POST cs: 'Chyba volání %1 Subjektu:' @@ -8690,7 +8168,6 @@ function init() { ,ko: '%1 주제 비활성화' ,it: 'Incapace di %1 sottoporre' ,nl: 'Niet in staat %1 Onderwerp' - ,zh_cn: '%1用户不可用' } ,'Unable to delete Subject' : { cs: 'Nelze odstranit Subjekt:' @@ -8705,8 +8182,7 @@ function init() { ,sk: 'Subjekt sa nedá odstrániť' ,ko: '주제를 지우기 위해 비활성화' ,it: 'Impossibile eliminare Soggetto' - ,nl: 'Kan onderwerp niet verwijderen' - ,zh_cn: '无法删除用户' + ,nl: 'Kan onderwerp niet verwijderen' } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' @@ -8721,8 +8197,7 @@ function init() { ,sk: 'Databáza obsahuje %1 subjektov' ,ko: '데이터베이스는 %1 주제를 포함' ,it: 'Database contiene %1 soggetti' - ,nl: 'Database bevat %1 onderwerpen' - ,zh_cn: '数据库包含%1个用户' + ,nl: 'Database bevat %1 onderwerpen' } ,'Edit Subject' : { cs:'Editovat subjekt' @@ -8737,8 +8212,7 @@ function init() { ,sk: 'Editovať subjekt' ,ko: '주제 편집' ,it: 'Modifica Oggetto' - ,nl: 'Pas onderwerp aan' - ,zh_cn: '编辑用户' + ,nl: 'Pas onderwerp aan' } ,'person, device, etc' : { cs:'osoba, zařízeni atd.' @@ -8753,8 +8227,7 @@ function init() { ,sk: 'osoba, zariadenie atď...' ,ko: '사람, 기기 등' ,it: 'persona, dispositivo, ecc' - ,nl: 'persoon, apparaat etc' - ,zh_cn: '人、设备等' + ,nl: 'persoon, apparaat etc' } ,'role1, role2' : { cs:'role1, role2' @@ -8770,7 +8243,6 @@ function init() { ,ko: '역할1, 역할2' ,it: 'ruolo1, ruolo2' ,nl: 'rol 2' - ,zh_cn: '角色1、角色2' } ,'Edit this subject' : { cs:'Editovat tento subjekt' @@ -8785,8 +8257,7 @@ function init() { ,sk: 'Editovať tento subjekt' ,ko: '이 주제 편집' ,it: 'Modifica questo argomento' - ,nl: 'pas dit onderwerp aan' - ,zh_cn: '编辑此用户' + ,nl: 'pas dit onderwerp aan' } ,'Delete this subject' : { cs:'Smazat tento subjekt' @@ -8801,8 +8272,7 @@ function init() { ,sk: 'Zmazať tento subjekt' ,ko: '이 주제 삭제' ,it: 'Eliminare questo argomento' - ,nl: 'verwijder dit onderwerp' - ,zh_cn: '删除此用户' + ,nl: 'verwijder dit onderwerp' } ,'Roles' : { cs:'Role' @@ -8818,7 +8288,6 @@ function init() { ,ko: '역할' ,it: 'Ruoli' ,nl: 'Rollen' - ,zh_cn: '角色' } ,'Access Token' : { cs:'Přístupový token' @@ -8834,7 +8303,6 @@ function init() { ,ko: 'Access Token' ,it: 'Gettone d\'accesso' ,nl: 'toegangscode' - ,zh_cn: '访问令牌' } ,'hour ago' : { cs:'hodina zpět' @@ -8850,7 +8318,6 @@ function init() { ,ko: '시간 후' ,it: 'ora fa' ,nl: 'uur geleden' - ,zh_cn: '小时前' } ,'hours ago' : { cs:'hodin zpět' @@ -8865,8 +8332,7 @@ function init() { ,sk: 'hodín pred' ,ko: '시간 후' ,it: 'ore fa' - ,nl: 'uren geleden' - ,zh_cn: '小时前' + ,nl: 'uren geleden' } ,'Silence for %1 minutes' : { cs:'Ztlumit na %1 minut' @@ -8881,9 +8347,7 @@ function init() { ,sk: 'Stíšiť na %1 minút' ,ko: '%1 분 동안 무음' ,it: 'Silenzio per %1 minuti' - ,nl: 'Sluimer %1 minuten' - ,zh_cn: '静音%1分钟' - ,zh_tw: '靜音%1分鐘' + ,nl: 'Sluimer %1 minuten' } ,'Check BG' : { cs:'Zkontrolovat glykémii' @@ -8897,8 +8361,7 @@ function init() { ,bg: 'Проверка КЗ' ,ko: '혈당 체크' ,it: 'Controllare BG' - ,nl: 'Controleer BG' - ,zh_cn: '测量血糖' + ,nl: 'Controleer BG' } ,'BASAL' : { cs:'BAZÁL' @@ -8912,9 +8375,7 @@ function init() { ,bg: 'Базал' ,ko: 'BASAL' ,it: 'BASALE' - ,nl: 'Basaal' - ,zh_cn: '基础率' - ,zh_tw: '基礎率' + ,nl: 'Basaal' } ,'Current basal' : { cs:'Současný bazál' @@ -8928,8 +8389,7 @@ function init() { ,bg: 'Актуален базал' ,ko: '현재 basal' ,it: 'Basale corrente' - ,nl: 'Huidige basaal' - ,zh_cn: '当前基础率' + ,nl: 'Huidige basaal' } ,'Sensitivity' : { cs:'Citlivost (ISF)' @@ -8943,8 +8403,7 @@ function init() { ,bg: 'Инсулинова чувствителност (ISF)' ,ko: '인슐린 민감도(ISF)' ,it: 'ISF - sensibilità' - ,nl: 'Gevoeligheid' - ,zh_cn: '胰岛素敏感系数' + ,nl: 'Gevoeligheid' } ,'Current Carb Ratio' : { cs:'Sacharidový poměr (I:C)' @@ -8958,8 +8417,7 @@ function init() { ,bg: 'Актуално Въглехидратно Съотношение' ,ko: '현재 탄수화물 비율(ICR)' ,it: 'Attuale rapporto I:C' - ,nl: 'Huidige KH ratio' - ,zh_cn: '当前碳水化合物系数' + ,nl: 'Huidige KH ratio' } ,'Basal timezone' : { cs:'Časová zóna' @@ -8973,13 +8431,12 @@ function init() { ,bg: 'Базална часова зона' ,ko: 'Basal 타임존' ,it: 'fuso orario basale' - ,nl: 'Basaal tijdzone' - ,zh_cn: '基础率时区' + ,nl: 'Basaal tijdzone' } ,'Active profile' : { cs:'Aktivní profil' ,ro: 'Profilul activ' - ,ru: 'Действующий профиль' + ,ru: 'Действующий профайл' ,sk: 'Aktívny profil' ,sv: 'Aktiv profil' ,nb: 'Aktiv profil' @@ -8988,8 +8445,7 @@ function init() { ,bg: 'Активен профил' ,ko: '활성 프로파일' ,it: 'Attiva profilo' - ,nl: 'Actief profiel' - ,zh_cn: '当前配置文件' + ,nl: 'Actief profiel' } ,'Active temp basal' : { cs:'Aktivní dočasný bazál' @@ -9003,8 +8459,7 @@ function init() { ,bg: 'Активен временен базал' ,ko: '활성 임시 basal' ,it: 'Attiva Basale Temp' - ,nl: 'Actieve tijdelijke basaal' - ,zh_cn: '当前临时基础率' + ,nl: 'Actieve tijdelijke basaal' } ,'Active temp basal start' : { cs:'Začátek dočasného bazálu' @@ -9018,8 +8473,7 @@ function init() { ,bg: 'Старт на активен временен базал' ,ko: '활성 임시 basal 시작' ,it: 'Attiva Inizio Basale temp' - ,nl: 'Actieve tijdelijke basaal start' - ,zh_cn: '当前临时基础率开始' + ,nl: 'Actieve tijdelijke basaal start' } ,'Active temp basal duration' : { cs:'Trvání dočasného bazálu' @@ -9033,8 +8487,7 @@ function init() { ,bg: 'Продължителност на Активен временен базал' ,ko: '활성 임시 basal 시간' ,it: 'Attiva durata basale temp' - ,nl: 'Actieve tijdelijk basaal duur' - ,zh_cn: '当前临时基础率期间' + ,nl: 'Actieve tijdelijk basaal duur' } ,'Active temp basal remaining' : { cs:'Zbývající dočasný bazál' @@ -9048,8 +8501,7 @@ function init() { ,bg: 'Оставащ Активен временен базал' ,ko: '남아 있는 활성 임시 basal' ,it: 'Attiva residuo basale temp' - ,nl: 'Actieve tijdelijke basaal resteert' - ,zh_cn: '当前临时基础率剩余' + ,nl: 'Actieve tijdelijke basaal resteert' } ,'Basal profile value' : { cs:'Základní hodnota bazálu' @@ -9063,8 +8515,7 @@ function init() { ,bg: 'Базален профил стойност' ,ko: 'Basal 프로파일 값' ,it: 'Valore profilo basale' - ,nl: 'Basaal profiel waarde' - ,zh_cn: '基础率配置文件值' + ,nl: 'Basaal profiel waarde' } ,'Active combo bolus' : { cs:'Aktivní kombinovaný bolus' @@ -9078,8 +8529,7 @@ function init() { ,bg: '' ,ko: '활성 콤보 bolus' ,it: 'Attiva Combo bolo' - ,nl: 'Actieve combo bolus' - ,zh_cn: '当前双波大剂量' + ,nl: 'Actieve combo bolus' } ,'Active combo bolus start' : { cs:'Začátek kombinovaného bolusu' @@ -9094,7 +8544,6 @@ function init() { ,ko: '활성 콤보 bolus 시작' ,it: 'Attivo inizio Combo bolo' ,nl: 'Actieve combo bolus start' - ,zh_cn: '当前双波大剂量开始' } ,'Active combo bolus duration' : { cs:'Trvání kombinovaného bolusu' @@ -9108,8 +8557,7 @@ function init() { ,bg: 'Продължителност на активния комбиниран болус' ,ko: '활성 콤보 bolus 기간' ,it: 'Attivo durata Combo bolo' - ,nl: 'Avtieve combo bolus duur' - ,zh_cn: '当前双波大剂量期间' + ,nl: 'Avtieve combo bolus duur' } ,'Active combo bolus remaining' : { cs:'Zbývající kombinovaný bolus' @@ -9124,7 +8572,6 @@ function init() { ,ko: '남아 있는 활성 콤보 bolus' ,it: 'Attivo residuo Combo bolo' ,nl: 'Actieve combo bolus resteert' - ,zh_cn: '当前双波大剂量剩余' } ,'BG Delta' : { cs:'Změna glykémie' @@ -9138,9 +8585,7 @@ function init() { ,bg: 'Изменение КЗ' ,ko: '혈당 차이' ,it: 'BG Delta' - ,nl: 'BG Delta' - ,zh_cn: '血糖增量' - ,zh_tw: '血糖增量' + ,nl: 'BG Delta' } ,'Elapsed Time' : { cs:'Dosažený čas' @@ -9154,9 +8599,7 @@ function init() { ,bg: 'Изминало време' ,ko: '경과 시간' ,it: 'Tempo Trascorso' - ,nl: 'Verstreken tijd' - ,zh_cn: '所需时间' - ,zh_tw: '所需時間' + ,nl: 'Verstreken tijd' } ,'Absolute Delta' : { cs:'Absolutní rozdíl' @@ -9170,9 +8613,7 @@ function init() { ,bg: 'Абсолютно изменение' ,ko: '절대적인 차이' ,it: 'Delta Assoluto' - ,nl: 'Abslute delta' - ,zh_cn: '绝对增量' - ,zh_tw: '絕對增量' + ,nl: 'Abslute delta' } ,'Interpolated' : { cs:'Interpolováno' @@ -9186,9 +8627,7 @@ function init() { ,bg: 'Интерполирано' ,ko: '삽입됨' ,it: 'Interpolata' - ,nl: 'Geinterpoleerd' - ,zh_cn: '插值' - ,zh_tw: '插值' + ,nl: 'Geinterpoleerd' } ,'BWP' : { // Bolus Wizard Preview cs:'KALK' @@ -9202,9 +8641,7 @@ function init() { ,bg: 'БП' ,ko: 'BWP' ,it: 'BWP' - ,nl: 'BWP' - ,zh_cn: 'BWP' - ,zh_tw: 'BWP' + ,nl: 'BWP' } ,'Urgent' : { cs:'Urgentní' @@ -9218,9 +8655,7 @@ function init() { ,bg: 'Спешно' ,ko: '긴급' ,it: 'Urgente' - ,nl: 'Urgent' - ,zh_cn: '紧急' - ,zh_tw: '緊急' + ,nl: 'Urgent' } ,'Warning' : { cs:'Varování' @@ -9234,9 +8669,7 @@ function init() { ,bg: 'Предупреждение' ,ko: '경고' ,it: 'Avviso' - ,nl: 'Waarschuwing' - ,zh_cn: '警告' - ,zh_tw: '警告' + ,nl: 'Waarschuwing' } ,'Info' : { cs:'Informativní' @@ -9250,9 +8683,7 @@ function init() { ,bg: 'Информация' ,ko: '정보' ,it: 'Info' - ,nl: 'Info' - ,zh_cn: '信息' - ,zh_tw: '資訊' + ,nl: 'Info' } ,'Lowest' : { cs:'Nejnižší' @@ -9266,9 +8697,7 @@ function init() { ,bg: 'Най-ниско' ,ko: '가장 낮은' ,it: 'Minore' - ,nl: 'Laagste' - ,zh_cn: '血糖极低' - ,zh_tw: '血糖極低' + ,nl: 'Laagste' } ,'Snoozing high alarm since there is enough IOB' : { cs:'Vypínání alarmu vyskoké glykémie, protože je dostatek IOB' @@ -9281,8 +8710,7 @@ function init() { ,pt: 'Ignorar alarme de hiper em função de IOB suficiente' ,sk: 'Odloženie alarmu vysokej glykémie, pretože je dostatok IOB' ,it: 'Addormenta allarme alto poiché non vi è sufficiente IOB' - ,nl: 'Snooze hoog alarm, er is genoeg IOB' - ,zh_cn: '有足够的IOB(活性胰岛素),暂停高血糖警报' + ,nl: 'Snooze hoog alarm, er is genoeg IOB' } ,'Check BG, time to bolus?' : { cs:'Zkontrolovat glykémii, čas na bolus?' @@ -9294,9 +8722,8 @@ function init() { ,fi: 'Tarkista VS, aika bolustaa?' ,pt: 'Meça a glicemia, hora de bolus de correção?' ,sk: 'Skontrolovať glykémiu, čas na bolus?' - ,it: 'Controllare BG, il tempo del bolo?' - ,nl: 'Controleer BG, tijd om te bolussen?' - ,zh_cn: '测量血糖,该输注大剂量了?' + ,it: 'Controllare BG, il tempo del bolo?' + ,nl: 'Controleer BG, tijd om te bolussen?' } ,'Notice' : { cs:'Poznámka' @@ -9309,7 +8736,6 @@ function init() { ,pt: 'Nota' ,sk: 'Poznámka' ,it: 'Preavviso' - ,zh_cn: '提示' } ,'required info missing' : { cs:'chybějící informace' @@ -9322,7 +8748,6 @@ function init() { ,sk: 'chýbajúca informácia' ,it: 'richiesta informazioni mancanti' ,nl: 'vereiste gegevens ontbreken' - ,zh_cn: '所需信息不全' } ,'Insulin on Board' : { cs:'Aktivní inzulín' @@ -9335,8 +8760,7 @@ function init() { ,pt: 'Insulina ativa' ,sk: 'Aktívny inzulín (IOB)' ,it: 'IOB - Insulina Attiva' - ,nl: 'IOB - Inuline on board' - ,zh_cn: '活性胰岛素(IOB)' + ,nl: 'IOB - Inuline on board' } ,'Current target' : { cs:'Aktuální cílová hodnota' @@ -9349,8 +8773,7 @@ function init() { ,pt: 'Meta atual' ,sk: 'Aktuálny cieľ' ,it: 'Obiettivo attuale' - ,nl: 'huidig doel' - ,zh_cn: '当前目标' + ,nl: 'huidig doel' } ,'Expected effect' : { cs:'Očekávaný efekt' @@ -9363,8 +8786,7 @@ function init() { ,pt: 'Efeito esperado' ,sk: 'Očakávaný efekt' ,it: 'Effetto Previsto' - ,nl: 'verwacht effect' - ,zh_cn: '预期效果' + ,nl: 'verwacht effect' } ,'Expected outcome' : { cs:'Očekávaný výsledek' @@ -9378,7 +8800,6 @@ function init() { ,sk: 'Očakávaný výsledok' ,it: 'Risultato previsto' ,nl: 'Veracht resultaat' - ,zh_cn: '预期结果' } ,'Carb Equivalent' : { cs:'Ekvivalent v sacharidech' @@ -9391,20 +8812,18 @@ function init() { ,pt: 'Equivalente em carboidratos' ,sk: 'Sacharidový ekvivalent' ,it: 'Carb equivalenti' - ,zh_cn: '碳水当量' } ,'Excess insulin equivalent %1U more than needed to reach low target, not accounting for carbs' : { cs:'Nadbytek inzulínu: o %1U více, než na dosažení spodní hranice cíle. Nepočítáno se sacharidy.' ,ro: 'Insulină în exces: %1U mai mult decât este necesar pentru a atinge ținta inferioară, fără a ține cont de carbohidrați' ,bg: 'Излишният инсулин %1U е повече от необходимия за достигане до долната граница, ВХ не се вземат под внимание' ,ru: 'Избыток инсулина равного %1U, необходимого для достижения нижнего целевого значения, углеводы не будут учтены' - ,sv: 'Överskott av insulin motsvarande %1U mer än nödvändigt för att nå lågt målvärde, kolhydrater ej medräknade' + ,sv: 'Överskott av insulin motsvarande %1U mer än nödvändigt för att nå lågt målvärde, kolhydrater ej medräknade' ,nb: 'Insulin tilsvarende %1U mer enn det trengs for å nå lavt mål, karbohydrater ikke medregnet' ,fi: 'Liikaa insuliinia: %1U enemmän kuin tarvitaan tavoitteeseen pääsyyn (huomioimatta hiilihydraatteja)' ,pt: 'Excesso de insulina equivalente a %1U além do necessário para atingir a meta inferior, sem levar em conta carboidratos' ,sk: 'Nadbytok inzulínu o %1U viac ako je potrebné na dosiahnutie spodnej cieľovej hranice. Neráta sa so sacharidmi.' - ,it: 'L\'eccesso d\'insulina equivalente %1U più che necessari per raggiungere l\'obiettivo basso, non rappresentano i carboidrati.' - ,zh_cn: '胰岛素超过至血糖下限目标所需剂量%1单位,不计算碳水化合物' + ,it: 'L\'eccesso d\'insulina equivalente %1U più che necessari per raggiungere l\'obiettivo basso, non rappresentano i carboidrati.' } ,'Excess insulin equivalent %1U more than needed to reach low target, MAKE SURE IOB IS COVERED BY CARBS' : { cs:'Nadbytek inzulínu: o %1U více, než na dosažení spodní hranice cíle. UJISTĚTE SE, ŽE JE TO POKRYTO SACHARIDY' @@ -9416,8 +8835,7 @@ function init() { ,fi: 'Liikaa insuliinia: %1U enemmän kuin tarvitaan tavoitteeseen pääsyyn, VARMISTA RIITTÄVÄ HIILIHYDRAATTIEN SAANTI' ,pt: 'Excesso de insulina equivalente a %1U além do necessário para atingir a meta inferior. ASSEGURE-SE DE QUE A IOB ESTEJA COBERTA POR CARBOIDRATOS' ,sk: 'Nadbytok inzulínu o %1U viac ako je potrebné na dosiahnutie spodnej cieľovej hranice. UISTITE SA, ŽE JE TO POKRYTÉ SACHARIDMI' - ,it: 'L\'eccesso d\'insulina equivalente %1U più che necessario per raggiungere l\'obiettivo basso, ASSICURARSI IOB SIA COPERTO DA CARBOIDRATI' - ,zh_cn: '胰岛素超过至血糖下限目标所需剂量%1单位,确认IOB(活性胰岛素)被碳水化合物覆盖' + ,it: 'L\'eccesso d\'insulina equivalente %1U più che necessario per raggiungere l\'obiettivo basso, ASSICURARSI IOB SIA COPERTO DA CARBOIDRATI' } ,'%1U reduction needed in active insulin to reach low target, too much basal?' : { cs:'Nutné snížení aktivního inzulínu o %1U k dosažení spodního cíle. Příliž mnoho bazálu?' @@ -9429,8 +8847,7 @@ function init() { ,fi: 'Pääset tavoitteesen vähentämällä %1U aktiivista insuliinia, liikaa basaalia?' ,pt: 'Necessária redução de %1U na insulina ativa para atingir a meta inferior, excesso de basal?' ,sk: 'Nutné zníženie aktívneho inzulínu o %1U pre dosiahnutie spodnej cieľovej hranice. Príliš veľa bazálu?' - ,it: 'Riduzione 1U% necessaria d\'insulina attiva per raggiungere l\'obiettivo basso, troppa basale?' - ,zh_cn: '活性胰岛素已可至血糖下限目标,需减少%1单位,基础率过高?' + ,it: 'Riduzione 1U% necessaria d\'insulina attiva per raggiungere l\'obiettivo basso, troppa basale?' } ,'basal adjustment out of range, give carbs?' : { cs:'úprava změnou bazálu není možná. Podat sacharidy?' @@ -9443,8 +8860,7 @@ function init() { ,pt: 'ajuste de basal fora da meta, dar carboidrato?' ,sk: 'úprava pomocou zmeny bazálu nie je možná. Podať sacharidy?' ,it: 'regolazione basale fuori campo, dare carboidrati?' - ,nl: 'basaal aanpassing buiten bereik, geef KH?' - ,zh_cn: '基础率调整在范围之外,需要碳水化合物?' + ,nl: 'basaal aanpassing buiten bereik, geef KH?' } ,'basal adjustment out of range, give bolus?' : { cs:'úprava změnou bazálu není možná. Podat bolus?' @@ -9457,8 +8873,7 @@ function init() { ,pt: 'ajuste de basal fora da meta, dar bolus de correção?' ,sk: 'úprava pomocou zmeny bazálu nie je možná. Podať bolus?' ,it: 'regolazione basale fuori campo, dare bolo?' - ,nl: 'basaal aanpassing buiten bereik, bolus?' - ,zh_cn: '基础率调整在范围之外,需要大剂量?' + ,nl: 'basaal aanpassing buiten bereik, bolus?' } ,'above high' : { cs:'nad horním' @@ -9471,9 +8886,7 @@ function init() { ,pt: 'acima do limite superior' ,sk: 'nad horným' ,it: 'sopra alto' - ,nl: 'boven hoog' - ,zh_cn: '血糖过高' - ,zh_tw: '血糖過高' + ,nl: 'boven hoog' } ,'below low' : { cs:'pod spodním' @@ -9486,9 +8899,7 @@ function init() { ,pt: 'abaixo do limite inferior' ,sk: 'pod spodným' ,it: 'sotto bassa' - ,nl: 'onder laag' - ,zh_cn: '血糖过低' - ,zh_tw: '血糖過低' + ,nl: 'onder laag' } ,'Projected BG %1 target' : { cs:'Předpokládaná glykémie %1 cílem' @@ -9502,7 +8913,6 @@ function init() { ,sk: 'Predpokladaná glykémia %1 cieľ' ,it: 'Proiezione BG %1 obiettivo' ,nl: 'Verwachte BG %1 doel' - ,zh_cn: '预计血糖%1目标' } ,'aiming at' : { cs:'s cílem' @@ -9516,7 +8926,6 @@ function init() { ,sk: 'cieľom' ,it: 'puntare a' ,nl: 'doel is' - ,zh_cn: '目标在' } ,'Bolus %1 units' : { cs:'Bolus %1 jednotek' @@ -9529,8 +8938,7 @@ function init() { ,pt: 'Bolus %1 unidades' ,sk: 'Bolus %1 jednotiek' ,it: 'Bolo %1 unità' - ,nl: 'Bolus %1 eenheden' - ,zh_cn: '大剂量%1单位' + ,nl: 'Bolus %1 eenheden' } ,'or adjust basal' : { cs:'nebo úprava bazálu' @@ -9543,8 +8951,7 @@ function init() { ,pt: 'ou ajuste basal' ,sk: 'alebo úprava bazálu' ,it: 'o regolare basale' - ,nl: 'of pas basaal aan' - ,zh_cn: '或调整基础率' + ,nl: 'of pas basaal aan' } ,'Check BG using glucometer before correcting!' : { cs:'Před korekcí zkontrolujte glukometrem glykémii!' @@ -9557,8 +8964,7 @@ function init() { ,pt: 'Verifique glicemia de ponta de dedo antes de corrigir!' ,sk: 'Pred korekciou skontrolujte glykémiu glukometrom!' ,it: 'Controllare BG utilizzando glucometro prima di correggere!' - ,nl: 'Controleer BG met bloeddruppel voor correctie!' - ,zh_cn: '校正前请使用血糖仪测量血糖!' + ,nl: 'Controleer BG met bloeddruppel voor correctie!' } ,'Basal reduction to account %1 units:' : { cs:'Úprava bazálu pro náhradu bolusu %1 U ' @@ -9571,8 +8977,7 @@ function init() { ,pt: 'Redução de basal para compensar %1 unidades:' ,sk: 'Úprava bazálu pre výpočet %1 jednotiek:' ,it: 'Riduzione basale per conto %1 unità:' - ,nl: 'Basaal verlaagd voor %1 eenheden' - ,zh_cn: '基础率减少到%1单位' + ,nl: 'Basaal verlaagd voor %1 eenheden' } ,'30m temp basal' : { cs:'30ti minutový dočasný bazál' @@ -9585,8 +8990,7 @@ function init() { ,pt: 'Basal temp 30m' ,sk: '30 minutový dočasný bazál' ,it: '30m basale temp' - ,nl: '30 minuten tijdelijke basaal' - ,zh_cn: '30分钟临时基础率' + ,nl: '30 minuten tijdelijke basaal' } ,'1h temp basal' : { cs:'hodinový dočasný bazál' @@ -9599,8 +9003,7 @@ function init() { ,pt: 'Basal temp 1h' ,sk: 'hodinový dočasný bazál' ,it: '1h basale temp' - ,nl: '1 uur tijdelijke basaal' - ,zh_cn: '1小时临时基础率' + ,nl: '1 uur tijdelijke basaal' } ,'Cannula change overdue!' : { cs:'Čas na výměnu set vypršel!' @@ -9613,7 +9016,6 @@ function init() { ,pt: 'Substituição de catéter vencida!' ,sk: 'Výmena kanyli po lehote!' ,it: 'Cambio Cannula in ritardo!' - ,zh_cn: '超过更换管路的时间' } ,'Time to change cannula' : { cs:'Čas na výměnu setu' @@ -9626,8 +9028,7 @@ function init() { ,pt: 'Hora de subistituir catéter' ,sk: 'Čas na výmenu kanyli' ,it: 'Tempo di cambiare la cannula' - ,nl: 'Verwissel canule' - ,zh_cn: '已到更换管路的时间' + ,nl: 'Verwissel canule' } ,'Change cannula soon' : { cs:'Blíží se čas na výměnu setu' @@ -9641,7 +9042,6 @@ function init() { ,sk: 'Čoskoro bude potrebné vymeniť kanylu' ,it: 'Cambio cannula prossimamente' ,nl: 'Verwissel canule binnenkort' - ,zh_cn: '接近更换管路的时间' } ,'Cannula age %1 hours' : { cs:'Stáří setu %1 hodin' @@ -9654,8 +9054,7 @@ function init() { ,pt: 'Idade do catéter %1 horas' ,sk: 'Vek kanyli %1 hodín' ,it: 'Durata Cannula %1 ore' - ,nl: 'Canule leeftijd %1 uren' - ,zh_cn: '管路已使用%1小时' + ,nl: 'Canule leeftijd %1 uren' } ,'Inserted' : { cs:'Nasazený' @@ -9668,9 +9067,7 @@ function init() { ,pt: 'Inserido' ,sk: 'Zavedený' ,it: 'Inserito' - ,nl: 'Ingezet' - ,zh_cn: '已植入' - ,zh_tw: '已植入' + ,nl: 'Ingezet' } ,'CAGE' : { cs:'SET' @@ -9683,9 +9080,7 @@ function init() { ,pt: 'ICAT' ,sk: 'SET' ,it: 'CAGE' - ,nl: 'CAGE' - ,zh_cn: '管路' - ,zh_tw: '管路' + ,nl: 'CAGE' } ,'COB' : { cs:'SACH' @@ -9698,8 +9093,7 @@ function init() { ,pt: 'COB' ,sk: 'SACH' ,it: 'COB' - ,nl: 'COB' - ,zh_cn: '活性碳水COB' + ,nl: 'COB' } ,'Last Carbs' : { cs:'Poslední sacharidy' @@ -9712,8 +9106,7 @@ function init() { ,pt: 'Último carboidrato' ,sk: 'Posledné sacharidy' ,it: 'Ultimi carboidrati' - ,nl: 'Laatse KH' - ,zh_cn: '上次碳水' + ,nl: 'Laatse KH' } ,'IAGE' : { cs:'INZ' @@ -9726,9 +9119,7 @@ function init() { ,pt: 'IddI' ,sk: 'INZ' ,it: 'IAGE' - ,nl: 'IAGE' - ,zh_cn: '胰岛素' - ,zh_tw: '胰島素' + ,nl: 'IAGE' } ,'Insulin reservoir change overdue!' : { cs:'Čas na výměnu zásobníku vypršel!' @@ -9741,8 +9132,7 @@ function init() { ,pt: 'Substituição de reservatório vencida!' ,sk: 'Čas na výmenu inzulínu po lehote!' ,it: 'Cambio serbatoio d\'insulina in ritardo!' - ,nl: 'Verwissel insulinereservoir nu!' - ,zh_cn: '超过更换胰岛素储液器的时间' + ,nl: 'Verwissel insulinereservoir nu!' } ,'Time to change insulin reservoir' : { cs:'Čas na výměnu zásobníku' @@ -9755,8 +9145,7 @@ function init() { ,pt: 'Hora de substituir reservatório' ,sk: 'Čas na výmenu inzulínu' ,it: 'Momento di cambiare serbatoio d\'insulina' - ,nl: 'Verwissel insuline reservoir' - ,zh_cn: '已到更换胰岛素储液器的时间' + ,nl: 'Verwissel insuline reservoir' } ,'Change insulin reservoir soon' : { cs:'Blíží se čas na výměnu zásobníku' @@ -9769,13 +9158,11 @@ function init() { ,pt: 'Substituir reservatório em brave' ,sk: 'Čoskoro bude potrebné vymeniť inzulín' ,it: 'Cambiare serbatoio d\'insulina prossimamente' - ,nl: 'Verwissel insuline reservoir binnenkort' - ,zh_cn: '接近更换胰岛素储液器的时间' + ,nl: 'Verwissel insuline reservoir binnenkort' } ,'Insulin reservoir age %1 hours' : { cs:'Stáří zásobníku %1 hodin' ,ro: 'Vârsta reservorului de insulină %1 ore' - ,ru: 'Картридж инсулина отработал %1часов' ,bg: 'Резервоарът е на %1 часа' ,sv: 'Insulinreservoarsålder %1 timmar' ,nb: 'Insulinreservoaralder %1 timer' @@ -9784,12 +9171,10 @@ function init() { ,sk: 'Vek inzulínu %1 hodín' ,it: 'IAGE - Durata Serbatoio d\'insulina %1 ore' ,nl: 'Insuline reservoir leeftijd %1 uren' - ,zh_cn: '胰岛素储液器已使用%1小时' } ,'Changed' : { cs:'Vyměněno' ,ro: 'Schimbat' - ,ru: 'Замена произведена' ,bg: 'Сменен' ,sv: 'Bytt' ,nb: 'Byttet' @@ -9797,13 +9182,12 @@ function init() { ,pt: 'Substituído' ,sk: 'Vymenený' ,it: 'Cambiato' - ,nl: 'veranderd' - ,zh_cn: '已更换' + ,nl: 'veranderd' + } ,'IOB' : { cs:'IOB' ,ro: 'IOB' - ,ru: 'Активный Инсулин' ,bg: 'АИ' ,sv: 'IOB' ,nb: 'Aktivt insulin' @@ -9811,13 +9195,11 @@ function init() { ,pt: 'IOB' ,sk: 'IOB' ,it: 'IOB' - ,nl: 'IOB' - ,zh_cn: '活性胰岛素IOB' + ,nl: 'IOB' } ,'Careportal IOB' : { cs:'IOB z ošetření' ,ro: 'IOB în Careportal' - ,ru: 'Активн Инс на портале назначений' ,bg: 'АИ от Кеърпортал' ,sv: 'IOB i Careportal' ,nb: 'Aktivt insulin i Careportal' @@ -9825,13 +9207,11 @@ function init() { ,pt: 'IOB do Careportal' ,sk: 'IOB z portálu starostlivosti' ,it: 'IOB Somministrazioni' - ,nl: 'Careportal IOB' - ,zh_cn: '服务面板IOB(活性胰岛素)' + ,nl: 'Careportal IOB' } ,'Last Bolus' : { cs:'Poslední bolus' ,ro: 'Ultimul bolus' - ,ru: 'Прошлый болюс' ,bg: 'Последен болус' ,sv: 'Senaste Bolus' ,nb: 'Siste Bolus' @@ -9839,13 +9219,11 @@ function init() { ,pt: 'Último bolus' ,sk: 'Posledný bolus' ,it: 'Ultimo bolo' - ,nl: 'Laatste bolus' - ,zh_cn: '上次大剂量' + ,nl: 'Laatste bolus' } ,'Basal IOB' : { cs:'IOB z bazálů' ,ro: 'IOB bazală' - ,ru: 'Активн Базал' ,bg: 'Базален АИ' ,sv: 'Basal IOB' ,nb: 'Basal Aktivt Insulin' @@ -9853,13 +9231,11 @@ function init() { ,pt: 'IOB basal' ,sk: 'Bazálny IOB' ,it: 'Basale IOB' - ,nl: 'Basaal IOB' - ,zh_cn: '基础率IOB(活性胰岛素)' + ,nl: 'Basaal IOB' } ,'Source' : { cs:'Zdroj' ,ro: 'Sursă' - ,ru: 'Источник' ,bg: 'Източник' ,sv: 'Källa' ,nb: 'Kilde' @@ -9867,13 +9243,11 @@ function init() { ,pt: 'Fonte' ,sk: 'Zdroj' ,it: 'Fonte' - ,nl: 'bron' - ,zh_cn: '来源' + ,nl: 'bron' } ,'Stale data, check rig?' : { cs:'Zastaralá data, zkontrolovat mobil?' ,ro: 'Date învechite, verificați uploaderul!' - ,ru: 'Устаревшие данные, проверьте загрузчик' ,bg: 'Стари данни, провери телефона' ,sv: 'Gammal data, kontrollera rigg?' ,nb: 'Gamle data, sjekk rigg?' @@ -9881,13 +9255,11 @@ function init() { ,pt: 'Dados antigos, verificar uploader?' ,sk: 'Zastaralé dáta, skontrolujte uploader' ,it: 'dati non aggiornati, controllare il telefono?' - ,nl: 'Geen data, controleer uploader' - ,zh_cn: '数据过期,检查一下设备?' + ,nl: 'Geen data, controleer uploader' } ,'Last received:' : { cs:'Naposledy přijato:' ,ro: 'Ultimile date:' - ,ru: 'Предыдущий полученный' ,bg: 'Последно получени' ,sv: 'Senast mottagen:' ,nb: 'Sist mottatt:' @@ -9896,12 +9268,10 @@ function init() { ,sk: 'Naposledy prijaté:' ,it: 'Ultime ricevute:' ,nl: 'laatste ontvangen' - ,zh_cn: '上次接收:' } ,'%1m ago' : { cs:'%1m zpět' ,ro: 'acum %1 minute' - ,ru: 'мин назад' ,bg: 'преди %1 мин.' ,sv: '%1m sedan' ,nb: '%1m siden' @@ -9909,13 +9279,11 @@ function init() { ,pt: '%1m atrás' ,sk: 'pred %1m' ,it: '%1m fa' - ,nl: '%1m geleden' - ,zh_cn: '%1分钟前' + ,nl: '%1m geleden' } ,'%1h ago' : { cs:'%1h zpět' ,ro: 'acum %1 ore' - ,ru: 'час назад' ,bg: 'преди %1 час' ,sv: '%1h sedan' ,nb: '%1h siden' @@ -9924,139 +9292,119 @@ function init() { ,sk: 'pred %1h' ,it: '%1h fa' ,nl: '%1u geleden' - ,zh_cn: '%1小时前' } ,'%1d ago' : { cs:'%1d zpět' ,ro: 'acum %1 zile' - ,ru: 'дн назад' ,bg: 'преди %1 ден' ,sv: '%1d sedan' ,nb: '%1d siden' ,fi: '%1d sitten' - ,pt: '%1d atrás' + ,pt: '%1d atrás' ,sk: 'pred %1d' - ,it: '%1d fa' + ,it: '%1d fa' ,nl: '%1d geleden' - ,zh_cn: '%1天前' } ,'RETRO' : { cs:'RETRO' ,ro: 'VECHI' - ,ru: 'РЕТРО' ,bg: 'РЕТРО' ,sv: 'RETRO' ,nb: 'GAMMELT' ,fi: 'RETRO' - ,pt: 'RETRO' + ,pt: 'RETRO' ,sk: 'RETRO' ,it: 'RETRO' ,nl: 'RETRO' - ,zh_cn: '历史数据' } ,'SAGE' : { cs:'SENZ' ,ro: 'VS' - ,ru: 'Сенсор проработал' ,bg: 'ВС' ,sv: 'Sensor' ,nb: 'Sensoralder' ,fi: 'SIKÄ' - ,pt: 'IddS' + ,pt: 'IddS' ,sk: 'SENZ' ,it: 'SAGE' ,nl: 'SAGE' - ,zh_cn: '探头' - ,zh_tw: '探頭' } ,'Sensor change/restart overdue!' : { cs:'Čas na výměnu senzoru vypršel!' ,ro: 'Depășire termen schimbare/restart senzor!' - ,ru: 'Рестарт сенсора просрочен' ,bg: 'Смяната/рестартът на сензора са пресрочени' ,sv: 'Sensor byte/omstart överskriden!' ,nb: 'Sensor bytte/omstart overskredet!' ,fi: 'Sensorin vaihto/uudelleenkäynnistys yli määräajan!' - ,pt: 'Substituição/reinício de sensor vencido' + ,pt: 'Substituição/reinício de sensor vencido' ,sk: 'Čas na výmenu/reštart sensoru uplynul!' ,it: 'Cambio/riavvio del sensore in ritardo!' ,nl: 'Sensor vevang/hertstart tijd gepasseerd' - ,zh_cn: '超过更换/重启探头的时间' } ,'Time to change/restart sensor' : { cs:'Čas na výměnu senzoru' ,ro: 'Este timpul pentru schimbarea senzorului' - ,ru: 'Время замены/рестарта сенсора' ,bg: 'Време за смяна/рестарт на сензора' ,sv: 'Dags att byta/starta om sensorn' ,nb: 'På tide å bytte/restarte sensoren' ,fi: 'Aika vaihtaa / käynnistää sensori uudelleen' - ,pt: 'Hora de substituir/reiniciar sensor' + ,pt: 'Hora de substituir/reiniciar sensor' ,sk: 'Čas na výmenu/reštart senzoru' ,it: 'Tempo di cambiare/riavvio sensore' - ,nl: 'Sensor vervangen of herstarten' - ,zh_cn: '已到更换/重启探头的时间' + ,nl: 'Sensor vervangen of herstarten' } ,'Change/restart sensor soon' : { cs:'Blíží se čas na výměnu senzoru' ,ro: 'Schimbați/restartați senzorul în curând' - ,ru: 'Приближается срок замены/рестарта сенсора' ,bg: 'Смени/рестартирай сензора скоро' ,sv: 'Byt/starta om sensorn snart' ,nb: 'Bytt/restarta sensoren snart' ,fi: 'Vaihda/käynnistä sensori uudelleen pian' - ,pt: 'Mudar/reiniciar sensor em breve' + ,pt: 'Mudar/reiniciar sensor em breve' ,sk: 'Čoskoro bude potrebné vymeniť/reštartovať senzor' ,it: 'Modifica/riavvio sensore prossimamente' ,nl: 'Herstart of vervang sensor binnenkort' - ,zh_cn: '接近更换/重启探头的时间' + } ,'Sensor age %1 days %2 hours' : { cs:'Stáří senzoru %1 dní %2 hodin' ,ro: 'Senzori vechi de %1 zile și %2 ore' - ,ru: 'Сенсор проработал % дн % час' ,bg: 'Сензорът е на %1 дни %2 часа ' ,sv: 'Sensorålder %1 dagar %2 timmar' ,nb: 'Sensoralder %1 dag %2 timer' ,fi: 'Sensorin ikä %1 päivää, %2 tuntia' - ,pt: 'Idade do sensor %1 dias %2 horas' + ,pt: 'Idade do sensor %1 dias %2 horas' ,sk: 'Vek senzoru %1 dní %2 hodín' ,it: 'Durata Sensore %1 giorni %2 ore' ,nl: 'Sensor leeftijd %1 dag(en) en %2 uur' - ,zh_cn: '探头使用了%1天%2小时' } ,'Sensor Insert' : { cs: 'Výměna sensoru' ,ro: 'Inserția senzorului' - ,ru: 'Установка сенсора' ,bg: 'Поставяне на сензора' ,sv: 'Sensor insättning' ,nb: 'Sensor satt inn' ,fi: 'Sensorin Vaihto' - ,pt: 'Inserção de sensor' + ,pt: 'Inserção de sensor' ,sk: 'Výmena senzoru' ,it: 'SAGE - inserimento sensore' - ,nl: 'Sensor ingebracht' - ,zh_cn: '植入探头' + ,nl: 'Sensor ingebracht' } ,'Sensor Start' : { cs: 'Znovuspuštění sensoru' ,ro: 'Pornirea senzorului' - ,ru: 'Запуск сенсора' ,bg: 'Стартиране на сензора' ,sv: 'Sensorstart' ,nb: 'Sensorstart' ,fi: 'Sensorin Aloitus' - ,pt: 'Início de sensor' + ,pt: 'Início de sensor' ,sk: 'Štart senzoru' ,it: 'SAGE - partenza sensore' ,nl: 'Sensor start' - ,zh_cn: '启动探头' } ,'days' : { cs: 'dní' ,ro: 'zile' - ,ru: 'дн' ,bg: 'дни' ,sv: 'dagar' ,nb: 'dager' @@ -10065,507 +9413,6 @@ function init() { ,sk: 'dní' ,it: 'giorni' ,nl: 'dagen' - ,zh_cn: '天' - } - ,'Insulin distribution' : { - cs: 'Rozložení inzulínu' - ,ro: 'Distribuția de insulină' - ,ru: 'распределение инсулина' - ,fi: 'Insuliinijakauma' - ,it: 'Distribuzione di insulina' - } - ,'To see this report, press SHOW while in this view' : { - cs: 'Pro zobrazení toho výkazu stiskněte Zobraz na této záložce' - ,ro: 'Pentru a vedea acest raport, apăsați butonul SHOW' - ,ru: 'чтобы увидеть отчет, нажмите show/показать' - ,fi: 'Nähdäksesi tämän raportin, paina NÄYTÄ tässä näkymässä' - ,it: 'Per guardare questo report, premere SHOW all\'interno della finestra' - } - ,'AR2 Forecast' : { - cs: 'AR2 predikci' - ,ro: 'Predicție AR2' - ,ru: 'прогноз AR2' - ,fi: 'AR2 Ennusteet' - ,it: 'Previsione AR2' - } - ,'OpenAPS Forecasts' : { - cs: 'OpenAPS predikci' - ,ro: 'Predicții OpenAPS' - ,ru: 'прогнозы OpenAPS' - ,fi: 'OpenAPS Ennusteet' - ,it: 'Previsione OpenAPS' - } - ,'Temporary Target' : { - cs: 'Dočasný cíl glykémie' - ,ro: 'Țintă temporară' - ,ru: 'промежуточная цель' - ,fi: 'Tilapäinen tavoite' - ,it: 'Obbiettivo temporaneo' - } - ,'Temporary Target Cancel' : { - cs: 'Dočasný cíl glykémie konec' - ,ro: 'Renunțare la ținta temporară' - ,ru: 'отмена промежуточной цели' - ,fi: 'Peruuta tilapäinen tavoite' - ,it: 'Obbiettivo temporaneo cancellato' - } - ,'OpenAPS Offline' : { - cs: 'OpenAPS vypnuto' - ,ro: 'OpenAPS deconectat' - ,ru: 'OpenAPS вне сети' - ,fi: 'OpenAPS poissa verkosta' - ,it: 'OpenAPS disconnesso' - } - ,'Profiles' : { - cs: 'Profily' - ,ro: 'Profile' - ,ru: 'профили' - ,fi: 'Profiilit' - ,it: 'Profili' - } - ,'Time in fluctuation' : { - fi: 'Aika muutoksessa' - ,it: 'Tempo in fluttuazione' - ,ro: 'Timp în fluctuație' - ,ru: 'время флуктуаций' - } - ,'Time in rapid fluctuation' : { - fi: 'Aika nopeassa muutoksessa' - ,it: 'Tempo in rapida fluttuazione' - ,ro: 'Timp în fluctuație rapidă' - ,ru: 'время быстрых флуктуаций' - } - ,'This is only a rough estimation that can be very inaccurate and does not replace actual blood testing. The formula used is taken from:' : { - fi: 'Tämä on epätarkka arvio joka saattaa heittää huomattavasti mittaustuloksesta, eikä korvaa laboratoriotestiä. Laskentakaava on otettu artikkelista: ' - ,it: 'Questa è solo un\'approssimazione che può essere molto inaccurata e che non sostituisce la misurazione capillare. La formula usata è presa da:' - ,ro: 'Aceasta este doar o aproximare brută, care poate fi foarte imprecisă și nu ține loc de testare capilară. Formula matematică folosită este luată din:' - ,ru: 'Это приблизительная оценка не заменяющая фактический анализ крови. Используемая формула взята из:' - } - , 'Filter by hours' : { - fi: 'Huomioi raportissa seuraavat tunnit' - ,it: 'Filtra per ore' - ,ro: 'Filtrare pe ore' - ,ru: 'почасовой фильтр' - } - , 'Time in fluctuation and Time in rapid fluctuation measure the % of time during the examined period, during which the blood glucose has been changing relatively fast or rapidly. Lower values are better.' : { - fi: 'Aika Muutoksessa ja Aika Nopeassa Muutoksessa mittaa osuutta tarkkailtavasta aikaperiodista, jolloin glukoosi on ollut nopeassa tai hyvin nopeassa muutoksessa. Pienempi arvo on parempi.' - ,it: 'Tempo in fluttuazione e Tempo in rapida fluttuazione misurano la % di tempo durante il periodo esaminato, durante il quale la glicemia stà variando velocemente o rapidamente. Bassi valori sono migliori.' - ,ro: 'Timpul în fluctuație și timpul în fluctuație rapidă măsoară procentul de timp, din perioada examinată, în care glicemia din sânge a avut o variație relativ rapidă sau rapidă. Valorile mici sunt de preferat.' - ,ru: 'время флуктуаций и время быстрых флуктуаций означает % времени в рассматриваемый период в течение которого СК менялся относительно быстро или просто быстро. Более низкие значения предпочтительней' - } - , 'Mean Total Daily Change is a sum of the absolute value of all glucose excursions for the examined period, divided by the number of days. Lower is better.' : { - fi: 'Keskimääräinen Kokonaismuutos kertoo kerkimääräisen päivätason verensokerimuutoksien yhteenlasketun arvon. Pienempi arvo on parempi.' - ,it: 'Media Totale Giornaliera Variazioni è la somma dei valori assoluti di tutte le escursioni glicemiche per il periodo esaminato, diviso per il numero di giorni. Bassi valori sono migliori.' - ,ro: 'Schimbarea medie totală zilnică este suma valorilor absolute ale tuturor excursiilor glicemice din perioada examinată, împărțite la numărul de zile. Valorile mici sunt de preferat.' - ,ru: 'усредненное ежедневное изменение это сумма абсолютных величин всех отклонений СК в рассматриваемый период, деленное на количество дней. Меньшая величина предпочтительней' - } - , 'Mean Hourly Change is a sum of the absolute value of all glucose excursions for the examined period, divided by the number of hours in the period. Lower is better.' : { - fi: 'Keskimääräinen tunti kertoo kerkimääräisen tuntitason verensokerimuutoksien yhteenlasketun arvon. Pienempi arvo on parempi.' - ,it: 'Media Oraria Variazioni è la somma del valore assoluto di tutte le escursioni glicemiche per il periodo esaminato, diviso per il numero di ore. Bassi valori sono migliori.' - ,ro: 'Variația media orară este suma valorilor absolute ale tuturor excursiilor glicemice din perioada examinată, împărțite la numărul de ore din aceeași perioadă. Valorile mici sunt de preferat.' - ,ru: 'усредненное часовое изменение это сумма абсолютных величин всех отклонений СК в рассматриваемый период, деленное на количество часов в этот период. Более низкое предпочтительней' - } - , 'GVI and PGS are measures developed by Dexcom, detailed here.' : { - fi: 'GVI ja PGS ovat Dexcom-yrityksen kehittämiä mittaustapoja, joista voit lukea lisää täällä..' - ,it: 'GVI e PGS sono misure sviluppate da Dexcom, dettagliate qui.' - ,ro: 'GVI și PGS sunt caracteristici de măsurare inventate de Dexcom, ale căror detalii le găsiți aici.' - ,ru: 'вариабельность гликемии и статус гликемии больного это величины, разработанные декскомом, подробнее here.' - } - , 'Mean Total Daily Change' : { - fi: 'Keskimääräinen Kokonaismuutos' - ,it: 'Media Totale Giornaliera Variazioni' - ,ro: 'Variația medie totală zilnică' - ,ru: 'усредненное изменение за день' - } - , 'Mean Hourly Change' : { - fi: 'Keskimääräinen tuntimuutos' - ,it: 'Media Oraria Variazioni' - ,ro: 'Variația medie orară' - ,ru: 'усредненное изменение за час' - } - , 'FortyFiveDown': { - bg: 'slightly dropping' - , cs: 'slightly dropping' - , de: 'leicht sinkend' - , dk: 'slightly dropping' - , el: 'slightly dropping' - , en: 'slightly dropping' - , es: 'slightly dropping' - , fi: 'slightly dropping' - , fr: 'slightly dropping' - , he: 'slightly dropping' - , hr: 'slightly dropping' - , it: 'slightly dropping' - , ko: 'slightly dropping' - , nb: 'slightly dropping' - , pl: 'slightly dropping' - , pt: 'slightly dropping' - , ro: 'slightly dropping' - , ru: 'незначительное падение' - , sk: 'slightly dropping' - , sv: 'slightly dropping' - , zh_cn: 'slightly dropping' - , zh_tw: 'slightly dropping' - }, - 'FortyFiveUp': { - bg: 'slightly rising' - , cs: 'slightly rising' - , de: 'leicht fallend' - , dk: 'slightly rising' - , el: 'slightly rising' - , en: 'slightly rising' - , es: 'slightly rising' - , fi: 'slightly rising' - , fr: 'slightly rising' - , he: 'slightly rising' - , hr: 'slightly rising' - , it: 'slightly rising' - , ko: 'slightly rising' - , nb: 'slightly rising' - , pl: 'slightly rising' - , pt: 'slightly rising' - , ro: 'slightly rising' - , ru: 'незначительный подъем' - , sk: 'slightly rising' - , sv: 'slightly rising' - , zh_cn: 'slightly rising' - , zh_tw: 'slightly rising' - }, - 'Flat': { - bg: 'holding' - , cs: 'holding' - , de: 'gleichbleibend' - , dk: 'holding' - , el: 'holding' - , en: 'holding' - , es: 'holding' - , fi: 'holding' - , fr: 'holding' - , he: 'holding' - , hr: 'holding' - , it: 'holding' - , ko: 'holding' - , nb: 'holding' - , pl: 'holding' - , pt: 'holding' - , ro: 'holding' - , ru: 'ровный' - , sk: 'holding' - , sv: 'holding' - , zh_cn: 'holding' - , zh_tw: 'holding' - }, - 'SingleUp': { - bg: 'rising' - , cs: 'rising' - , de: 'steigend' - , dk: 'rising' - , el: 'rising' - , en: 'rising' - , es: 'rising' - , fi: 'rising' - , fr: 'rising' - , he: 'rising' - , hr: 'rising' - , it: 'rising' - , ko: 'rising' - , nb: 'rising' - , pl: 'rising' - , pt: 'rising' - , ro: 'rising' - , ru: 'растет' - , sk: 'rising' - , sv: 'rising' - , zh_cn: 'rising' - , zh_tw: 'rising' - }, - 'SingleDown': { - bg: 'dropping' - , cs: 'dropping' - , de: 'sinkend' - , dk: 'dropping' - , el: 'dropping' - , en: 'dropping' - , es: 'dropping' - , fi: 'dropping' - , fr: 'dropping' - , he: 'dropping' - , hr: 'dropping' - , it: 'dropping' - , ko: 'dropping' - , nb: 'dropping' - , pl: 'dropping' - , pt: 'dropping' - , ro: 'dropping' - , ru: 'падает' - , sk: 'dropping' - , sv: 'dropping' - , zh_cn: 'dropping' - , zh_tw: 'dropping' - }, - 'DoubleDown': { - bg: 'rapidly dropping' - , cs: 'rapidly dropping' - , de: 'schnell sinkend' - , dk: 'rapidly dropping' - , el: 'rapidly dropping' - , en: 'rapidly dropping' - , es: 'rapidly dropping' - , fi: 'rapidly dropping' - , fr: 'rapidly dropping' - , he: 'rapidly dropping' - , hr: 'rapidly dropping' - , it: 'rapidly dropping' - , ko: 'rapidly dropping' - , nb: 'rapidly dropping' - , pl: 'rapidly dropping' - , pt: 'rapidly dropping' - , ro: 'rapidly dropping' - , ru: 'быстро падает' - , sk: 'rapidly dropping' - , sv: 'rapidly dropping' - , zh_cn: 'rapidly dropping' - , zh_tw: 'rapidly dropping' - }, - 'DoubleUp': { - bg: 'rapidly rising' - , cs: 'rapidly rising' - , de: 'schnell steigend' - , dk: 'rapidly rising' - , el: 'rapidly rising' - , en: 'rapidly rising' - , es: 'rapidly rising' - , fi: 'rapidly rising' - , fr: 'rapidly rising' - , he: 'rapidly rising' - , hr: 'rapidly rising' - , it: 'rapidly rising' - , ko: 'rapidly rising' - , nb: 'rapidly rising' - , pl: 'rapidly rising' - , pt: 'rapidly rising' - , ro: 'rapidly rising' - , ru: 'быстро растет' - , sk: 'rapidly rising' - , sv: 'rapidly rising' - , zh_cn: 'rapidly rising' - , zh_tw: 'rapidly rising' - }, - 'alexaStatus': { - bg: '%1 and %2 as of %3.' - , cs: '%1 and %2 as of %3.' - , de: '%1 und bis %3 %2.' - , dk: '%1 and %2 as of %3.' - , el: '%1 and %2 as of %3.' - , en: '%1 and %2 as of %3.' - , es: '%1 and %2 as of %3.' - , fi: '%1 and %2 as of %3.' - , fr: '%1 and %2 as of %3.' - , he: '%1 and %2 as of %3.' - , hr: '%1 and %2 as of %3.' - , it: '%1 and %2 as of %3.' - , ko: '%1 and %2 as of %3.' - , nb: '%1 and %2 as of %3.' - , pl: '%1 and %2 as of %3.' - , pt: '%1 and %2 as of %3.' - , ro: '%1 and %2 as of %3.' - , ru: '%1 и %2 начиная с %3.' - , sk: '%1 and %2 as of %3.' - , sv: '%1 and %2 as of %3.' - , zh_cn: '%1 and %2 as of %3.' - , zh_tw: '%1 and %2 as of %3.' - }, - 'alexaBasal': { - bg: '%1 current basal is %2 units per hour' - , cs: '%1 current basal is %2 units per hour' - , de: '%1 aktuelle Basalrate ist %2 Einheiten je Stunde' - , dk: '%1 current basal is %2 units per hour' - , el: '%1 current basal is %2 units per hour' - , en: '%1 current basal is %2 units per hour' - , es: '%1 current basal is %2 units per hour' - , fi: '%1 current basal is %2 units per hour' - , fr: '%1 current basal is %2 units per hour' - , he: '%1 current basal is %2 units per hour' - , hr: '%1 current basal is %2 units per hour' - , it: '%1 current basal is %2 units per hour' - , ko: '%1 current basal is %2 units per hour' - , nb: '%1 current basal is %2 units per hour' - , pl: '%1 current basal is %2 units per hour' - , pt: '%1 current basal is %2 units per hour' - , ro: '%1 current basal is %2 units per hour' - , ru: '%1 текущий базал %2 ед в час' - , sk: '%1 current basal is %2 units per hour' - , sv: '%1 current basal is %2 units per hour' - , zh_cn: '%1 current basal is %2 units per hour' - , zh_tw: '%1 current basal is %2 units per hour' - }, - 'alexaBasalTemp': { - bg: '%1 temp basal of %2 units per hour will end %3' - , cs: '%1 temp basal of %2 units per hour will end %3' - , de: '%1 temporäre Basalrate von %2 Einheiten endet in %3' - , dk: '%1 temp basal of %2 units per hour will end %3' - , el: '%1 temp basal of %2 units per hour will end %3' - , en: '%1 temp basal of %2 units per hour will end %3' - , es: '%1 temp basal of %2 units per hour will end %3' - , fi: '%1 temp basal of %2 units per hour will end %3' - , fr: '%1 temp basal of %2 units per hour will end %3' - , he: '%1 temp basal of %2 units per hour will end %3' - , hr: '%1 temp basal of %2 units per hour will end %3' - , it: '%1 temp basal of %2 units per hour will end %3' - , ko: '%1 temp basal of %2 units per hour will end %3' - , nb: '%1 temp basal of %2 units per hour will end %3' - , pl: '%1 temp basal of %2 units per hour will end %3' - , pt: '%1 temp basal of %2 units per hour will end %3' - , ro: '%1 temp basal of %2 units per hour will end %3' - , ru: '%1 временный базал %2 ед в час закончится в %3' - , sk: '%1 temp basal of %2 units per hour will end %3' - , sv: '%1 temp basal of %2 units per hour will end %3' - , zh_cn: '%1 temp basal of %2 units per hour will end %3' - , zh_tw: '%1 temp basal of %2 units per hour will end %3' - }, - 'alexaIob': { - bg: 'and you have %1 insulin on board.' - , cs: 'and you have %1 insulin on board.' - , de: 'und du hast %1 Insulin wirkend.' - , dk: 'and you have %1 insulin on board.' - , el: 'and you have %1 insulin on board.' - , en: 'and you have %1 insulin on board.' - , es: 'and you have %1 insulin on board.' - , fi: 'and you have %1 insulin on board.' - , fr: 'and you have %1 insulin on board.' - , he: 'and you have %1 insulin on board.' - , hr: 'and you have %1 insulin on board.' - , it: 'and you have %1 insulin on board.' - , ko: 'and you have %1 insulin on board.' - , nb: 'and you have %1 insulin on board.' - , pl: 'and you have %1 insulin on board.' - , pt: 'and you have %1 insulin on board.' - , ro: 'and you have %1 insulin on board.' - , ru: 'и вы имеете %1 инсулина в организме.' - , sk: 'and you have %1 insulin on board.' - , sv: 'and you have %1 insulin on board.' - , zh_cn: 'and you have %1 insulin on board.' - , zh_tw: 'and you have %1 insulin on board.' - }, - 'alexaIobIntent': { - bg: 'You have %1 insulin on board' - , cs: 'You have %1 insulin on board' - , de: 'Du hast noch %1 Insulin wirkend' - , dk: 'You have %1 insulin on board' - , el: 'You have %1 insulin on board' - , en: 'You have %1 insulin on board' - , es: 'You have %1 insulin on board' - , fi: 'You have %1 insulin on board' - , fr: 'You have %1 insulin on board' - , he: 'You have %1 insulin on board' - , hr: 'You have %1 insulin on board' - , it: 'You have %1 insulin on board' - , ko: 'You have %1 insulin on board' - , nb: 'You have %1 insulin on board' - , pl: 'You have %1 insulin on board' - , pt: 'You have %1 insulin on board' - , ro: 'You have %1 insulin on board' - , ru: 'вы имеете %1 инсулина в организме' - , sk: 'You have %1 insulin on board' - , sv: 'You have %1 insulin on board' - , zh_cn: 'You have %1 insulin on board' - , zh_tw: 'You have %1 insulin on board' - }, - 'alexaIobUnits': { - bg: '%1 units of' - , cs: '%1 units of' - , de: 'noch %1 Einheiten' - , dk: '%1 units of' - , el: '%1 units of' - , en: '%1 units of' - , es: '%1 units of' - , fi: '%1 units of' - , fr: '%1 units of' - , he: '%1 units of' - , hr: '%1 units of' - , it: '%1 units of' - , ko: '%1 units of' - , nb: '%1 units of' - , pl: '%1 units of' - , pt: '%1 units of' - , ro: '%1 units of' - , ru: '%1 единиц' - , sk: '%1 units of' - , sv: '%1 units of' - , zh_cn: '%1 units of' - , zh_tw: '%1 units of' - }, - 'alexaPreamble': { - bg: 'Your' - , cs: 'Your' - , de: 'Deine' - , dk: 'Your' - , el: 'Your' - , en: 'Your' - , es: 'Your' - , fi: 'Your' - , fr: 'Your' - , he: 'Your' - , hr: 'Your' - , it: 'Your' - , ko: 'Your' - , nb: 'Your' - , pl: 'Your' - , pt: 'Your' - , ro: 'Your' - , ru: 'ваш' - , sk: 'Your' - , sv: 'Your' - , zh_cn: 'Your' - , zh_tw: 'Your' - }, - 'alexaPreamble3person': { - bg: '%1 has a ' - , cs: '%1 has a ' - , de: '%1 hat eine' - , dk: '%1 has a ' - , el: '%1 has a ' - , en: '%1 has a ' - , es: '%1 has a ' - , fi: '%1 has a ' - , fr: '%1 has a ' - , he: '%1 has a ' - , hr: '%1 has a ' - , it: '%1 has a ' - , ko: '%1 has a ' - , nb: '%1 has a ' - , pl: '%1 has a ' - , pt: '%1 has a ' - , ro: '%1 имеет ' - , ru: '%1 has a ' - , sk: '%1 has a ' - , sv: '%1 has a ' - , zh_cn: '%1 has a ' - , zh_tw: '%1 has a ' - }, - 'alexaNoInsulin': { - bg: 'no' - , cs: 'no' - , de: 'kein' - , dk: 'no' - , el: 'no' - , en: 'no' - , es: 'no' - , fi: 'no' - , fr: 'no' - , he: 'no' - , hr: 'no' - , it: 'no' - , ko: 'no' - , nb: 'no' - , pl: 'no' - , pt: 'no' - , ro: 'no' - , ru: 'нет' - , sk: 'no' - , sv: 'no' - , zh_cn: 'no' - , zh_tw: 'no' } }; diff --git a/lib/plugins/alexa.js b/lib/plugins/alexa.js index 38ae449c2495..7be0dfe52580 100644 --- a/lib/plugins/alexa.js +++ b/lib/plugins/alexa.js @@ -66,7 +66,7 @@ function init(env, ctx) { // status = _.orderBy(status, ['priority'], ['asc']) }; - alexa.getRollup = function(rollupGroup, sbx, slots, locale, callback) { + alexa.getRollup = function(rollupGroup, sbx, slots, callback) { var handlers = _.map(rollup[rollupGroup], 'handler'); console.log('Rollup array for ', rollupGroup); console.log(rollup[rollupGroup]); diff --git a/lib/plugins/basalprofile.js b/lib/plugins/basalprofile.js index db47e2bf2798..d82421a25795 100644 --- a/lib/plugins/basalprofile.js +++ b/lib/plugins/basalprofile.js @@ -101,38 +101,19 @@ function init (ctx) { }; function basalMessage(slots, sbx) { - var basalValue = sbx.data.profile.getTempBasal(sbx.time); - var response = 'Unable to determine current basal'; - var preamble = ''; - if (basalValue.treatment) { - preamble = (slots && slots.pwd && slots.pwd.value) ? translate('alexaPreamble3person', { - params: [ - slots.pwd.value - ] - }) : translate('alexaPreamble'); - var minutesLeft = moment(basalValue.treatment.endmills).from(moment(sbx.time)); - response = translate('alexaBasalTemp', { - params: [ - preamble, - basalValue.totalbasal, - minutesLeft - ] - }); - } else { - preamble = (slots && slots.pwd && slots.pwd.value) ? translate('alexaPreamble3person', { - params: [ - slots.pwd.value - ] - }) : translate('alexaPreamble'); - response = translate('alexaBasal', { - params: [ - preamble, - basalValue.totalbasal - ] - }); - } - return response; + var basalValue = sbx.data.profile.getTempBasal(sbx.time); + var response = 'Unable to determine current basal'; + var preamble = ''; + if (basalValue.treatment) { + preamble = (slots && slots.pwd && slots.pwd.value) ? slots.pwd.value + ' has a ' : 'Your '; + var minutesLeft = moment(basalValue.treatment.endmills).from(moment(sbx.time)); + response = preamble + 'temp basal of ' + basalValue.totalbasal + ' units per hour will end ' + minutesLeft; + } else { + preamble = (slots && slots.pwd && slots.pwd.value) ? slots.pwd.value + ' ' : 'Your '; + response = preamble + 'current basal is ' + basalValue.totalbasal + ' units per hour'; } + return response; + } function alexaRollupCurrentBasalHandler (slots, sbx, callback) { callback(null, {results: basalMessage(slots, sbx), priority: 1}); diff --git a/lib/plugins/bgnow.js b/lib/plugins/bgnow.js index 2f9b39b5e822..a930f3893a1f 100644 --- a/lib/plugins/bgnow.js +++ b/lib/plugins/bgnow.js @@ -1,7 +1,6 @@ 'use strict'; var _ = require('lodash'); -var moment = require('moment'); var times = require('../times'); var offset = times.mins(2.5).msecs; @@ -10,7 +9,6 @@ var bucketFields = ['index', 'fromMills', 'toMills']; function init (ctx) { var translate = ctx.language.translate; - var utils = require('../utils')(ctx); var bgnow = { name: 'bgnow' @@ -179,7 +177,6 @@ function init (ctx) { }; bgnow.updateVisualisation = function updateVisualisation (sbx) { - var prop = sbx.properties.bgnow; var delta = sbx.properties.delta; var info = []; @@ -192,55 +189,6 @@ function init (ctx) { info.push({label: translate('Interpolated'), value: sbx.roundBGToDisplayFormat(sbx.scaleMgdl(delta.mean5MinsAgo)) + ' ' + sbx.unitsLabel}); } - var deviceInfos = { }; - - if (prop.sgvs) { - _.forEach(prop.sgvs, function deviceAndValue(entry) { - var device = utils.deviceName(entry.device); - deviceInfos[device] = { - time: utils.timeFormat(moment(entry.mills), sbx) - , value: sbx.scaleEntry(entry) - , recent: entry - }; - }); - } - - if (delta && delta.previous && delta.previous.sgvs) { - _.forEach(delta.previous.sgvs, function deviceAndValue(entry) { - var device = utils.deviceName(entry.device); - var deviceInfo = deviceInfos[device]; - if (deviceInfo) { - var deviceDelta = bgnow.calcDelta( - { mills: deviceInfo.recent.mills , mean: deviceInfo.recent.mgdl} - , { mills: entry.mills, mean: entry.mgdl} - , sbx - ); - - if (deviceDelta) { - deviceInfo.delta = deviceDelta.display - } - } else { - deviceInfos[device] = { - time: utils.timeFormat(moment(entry.mills), sbx) - , value: sbx.scaleEntry(entry) - }; - } - }); - - if (_.keys(deviceInfos).length > 1) { - _.forIn(deviceInfos, function addInfo(deviceInfo, name) { - var display = deviceInfo.value; - if (deviceInfo.delta) { - display += ' ' + deviceInfo.delta; - } - - display += ' (' + deviceInfo.time + ')'; - - info.push({label: name, value: display}); - }); - } - } - sbx.pluginBase.updatePillText({ name: 'delta' , label: translate('BG Delta') @@ -249,10 +197,11 @@ function init (ctx) { }, { value: display , label: sbx.unitsLabel - , info: _.isEmpty(info) ? null : info + , info: info }); }; + return bgnow; } diff --git a/lib/plugins/bridge.js b/lib/plugins/bridge.js index dc47f13aa9b3..9b8fb76fcf32 100644 --- a/lib/plugins/bridge.js +++ b/lib/plugins/bridge.js @@ -2,9 +2,6 @@ var engine = require('share2nightscout-bridge'); -// Track the most recently seen record -var mostRecentRecord; - function init (env) { if (env.extendedSettings.bridge && env.extendedSettings.bridge.userName && env.extendedSettings.bridge.password) { return create(env); @@ -18,13 +15,6 @@ function bridged (entries) { if (err) { console.error('Bridge error: ', err); } else { - if (glucose) { - for (var i = 0; i < glucose.length; i++) { - if (glucose[i].date > mostRecentRecord) { - mostRecentRecord = glucose[i].date; - } - } - } entries.create(glucose, function stored (err) { if (err) { console.error('Bridge storage error: ', err); @@ -63,19 +53,11 @@ function create (env) { var opts = options(env); var interval = opts.interval; - mostRecentRecord = new Date().getTime() - opts.fetch.minutes * 60000 - bridge.startEngine = function startEngine (entries) { opts.callback = bridged(entries); - setInterval(function () { - opts.fetch.minutes = parseInt((new Date() - mostRecentRecord) / 60000); - opts.fetch.maxCount = parseInt((opts.fetch.minutes / 5) + 1); - opts.firstFetchCount = opts.fetch.maxCount - console.log("Fetching Share Data: ", 'minutes', opts.fetch.minutes, 'maxCount', opts.fetch.maxCount); - engine(opts); - }, interval); + setInterval(engine(opts), interval); }; return bridge; diff --git a/lib/plugins/careportal.js b/lib/plugins/careportal.js index e65277074cf3..15d47ce598f1 100644 --- a/lib/plugins/careportal.js +++ b/lib/plugins/careportal.js @@ -79,11 +79,11 @@ function init() { } , { val: 'Temp Basal End' , name: 'Temp Basal End' - , bg: true, insulin: false, carbs: false, prebolus: false, duration: true, percent: false, absolute: false, profile: false, split: false + , bg: true, insulin: false, carbs: false, prebolus: false, duration: false, percent: false, absolute: false, profile: false, split: false } , { val: 'Profile Switch' , name: 'Profile Switch' - , bg: true, insulin: false, carbs: false, prebolus: false, duration: true, percent: false, absolute: false, profile: true, split: false + , bg: true, insulin: false, carbs: false, prebolus: false, duration: false, percent: false, absolute: false, profile: true, split: false } , { val: 'D.A.D. Alert' , name: 'D.A.D. Alert' diff --git a/lib/plugins/cob.js b/lib/plugins/cob.js index 3858e7948489..e1bd8c4660e3 100644 --- a/lib/plugins/cob.js +++ b/lib/plugins/cob.js @@ -48,7 +48,7 @@ function init(ctx) { if (_.isEmpty(result)) { result = treatmentCOB; result.source = 'Care Portal'; - } else if (treatmentCOB) { + } else if (treatmentCOB.cob) { result.treatmentCOB = treatmentCOB; } @@ -67,40 +67,19 @@ function init(ctx) { }); } - cob.isDeviceStatusAvailable = function isDeviceStatusAvailable (devicestatus) { - - return _.chain(devicestatus) - .map(cob.fromDeviceStatus) - .reject(_.isEmpty) - .value() - .length > 0; - }; - cob.lastCOBDeviceStatus = function lastCOBDeviceStatus (devicestatus, time) { var futureMills = time + times.mins(5).msecs; //allow for clocks to be a little off var recentMills = time - cob.RECENCY_THRESHOLD; return _.chain(devicestatus) - .filter(function (cobStatus) { - return cobStatus.mills <= futureMills && cobStatus.mills >= recentMills; - }) .map(cob.fromDeviceStatus) .reject(_.isEmpty) - .sortBy('mills') - .last() - .value(); - }; - - cob.COBDeviceStatusesInTimeRange = function COBDeviceStatusesInTimeRange (devicestatus, from, to) { - - return _.chain(devicestatus) .filter(function (cobStatus) { - return cobStatus.mills > from && cobStatus.mills < to; + return cobStatus.mills <= futureMills && cobStatus.mills >= recentMills; }) - .map(cob.fromDeviceStatus) - .reject(_.isEmpty) .sortBy('mills') + .last() .value(); }; @@ -111,7 +90,7 @@ function init(ctx) { var suggested = devicestatusEntry.openaps.suggested; var enacted = devicestatusEntry.openaps.enacted; - var lastCOB = null; + var lastCOB = 0; var lastMoment = null; if (suggested && enacted) { @@ -132,7 +111,7 @@ function init(ctx) { lastMoment = moment(suggested.timestamp); } - if (lastCOB === null || !lastMoment) { + if (lastCOB === 0 || !lastMoment) { return {}; } @@ -273,16 +252,16 @@ function init(ctx) { var displayCob = Math.round(prop.cob * 10) / 10; - var info = [ ]; - if (prop.treatmentCOB !== undefined && prop.treatmentCOB.cob) { + var info = null; + if (prop.treatmentCOB !== undefined) { + info = [ ]; info.push({label: translate('Careportal COB'), value: Math.round(prop.treatmentCOB.cob * 10) / 10}); - } - var lastCarbs = prop.lastCarbs || (prop.treatmentCOB && prop.treatmentCOB.lastCarbs); - if (lastCarbs) { - var when = new Date(lastCarbs.mills).toLocaleString(); - var amount = lastCarbs.carbs + 'g'; - info.push({label: translate('Last Carbs'), value: amount + ' @ ' + when}); + if (prop.treatmentCOB.lastCarbs) { + var when = new Date(prop.treatmentCOB.lastCarbs.mills).toLocaleString(); + var amount = prop.treatmentCOB.lastCarbs.carbs + 'g'; + info.push({label: translate('Last Carbs'), value: amount + ' @ ' + when}); + } } sbx.pluginBase.updatePillText(sbx, { diff --git a/lib/plugins/iob.js b/lib/plugins/iob.js index dcc0c4504a91..8ee20b518ca5 100644 --- a/lib/plugins/iob.js +++ b/lib/plugins/iob.js @@ -2,12 +2,12 @@ var _ = require('lodash') , moment = require('moment') - , times = require('../times'); + , times = require('../times') + , utils = require('../utils')(); function init(ctx) { var translate = ctx.language.translate; - var utils = require('../utils')(ctx); - + var iob = { name: 'iob' , label: 'Insulin-on-Board' @@ -51,15 +51,6 @@ function init(ctx) { }); } - iob.isDeviceStatusAvailable = function isDeviceStatusAvailable (devicestatus) { - - return _.chain(devicestatus) - .map(iob.fromDeviceStatus) - .reject(_.isEmpty) - .value() - .length > 0; - }; - iob.lastIOBDeviceStatus = function lastIOBDeviceStatus(devicestatus, time) { if (time && time.getTime) { time = time.getTime(); @@ -69,11 +60,11 @@ function init(ctx) { // All IOBs var iobs = _.chain(devicestatus) + .map(iob.fromDeviceStatus) + .reject(_.isEmpty) .filter(function (iobStatus) { return iobStatus.mills <= futureMills && iobStatus.mills >= recentMills; }) - .map(iob.fromDeviceStatus) - .reject(_.isEmpty) .sortBy('mills'); // Loop IOBs @@ -85,55 +76,43 @@ function init(ctx) { return loopIOBs.last().value() || iobs.last().value(); }; - iob.IOBDeviceStatusesInTimeRange = function IOBDeviceStatusesInTimeRange (devicestatus, from, to) { - - return _.chain(devicestatus) - .filter(function (iobStatus) { - return iobStatus.mills > from && iobStatus.mills < to; - }) - .map(iob.fromDeviceStatus) - .reject(_.isEmpty) - .sortBy('mills') - .value(); - }; - iob.fromDeviceStatus = function fromDeviceStatus(devicestatusEntry) { - var iobOpenAPS = _.get(devicestatusEntry, 'openaps.iob'); - var iobLoop = _.get(devicestatusEntry, 'loop.iob'); - var iobPump = _.get(devicestatusEntry, 'pump.iob'); - - if (_.isObject(iobOpenAPS)) { + var iobObj; + if (_.get(devicestatusEntry, 'openaps.iob') !== undefined) { //hacks to support AMA iob array with time fields instead of timestamp fields - iobOpenAPS = _.isArray(iobOpenAPS) ? iobOpenAPS[0] : iobOpenAPS; + iobObj = _.isArray(devicestatusEntry.openaps.iob) ? devicestatusEntry.openaps.iob[0] : devicestatusEntry.openaps.iob; // array could still be empty, handle as null - if (_.isEmpty(iobOpenAPS)) { + if (_.isEmpty(iobObj)) { return {}; } - if (iobOpenAPS.time) { - iobOpenAPS.timestamp = iobOpenAPS.time; + if (iobObj.time) { + iobObj.timestamp = iobObj.time; } return { - iob: iobOpenAPS.iob - , basaliob: iobOpenAPS.basaliob - , activity: iobOpenAPS.activity + iob: iobObj.iob + , basaliob: iobObj.basaliob + , activity: iobObj.activity , source: 'OpenAPS' , device: devicestatusEntry.device - , mills: moment(iobOpenAPS.timestamp).valueOf( ) + , mills: moment(iobObj.timestamp).valueOf( ) }; - } else if (_.isObject(iobLoop)) { + } else if (_.get(devicestatusEntry, 'loop.iob') !== undefined) { + iobObj = devicestatusEntry.loop.iob; return { - iob: iobLoop.iob + iob: iobObj.iob , source: 'Loop' , device: devicestatusEntry.device - , mills: moment(iobLoop.timestamp).valueOf( ) + , mills: moment(iobObj.timestamp).valueOf( ) }; - } else if (_.isObject(iobPump)) { + } else if (_.get(devicestatusEntry, 'pump.iob') !== undefined) { + iobObj = devicestatusEntry.pump.iob.iob; + iobObj = iobObj !== undefined ? iobObj : devicestatusEntry.pump.iob.bolusiob; return { - iob: iobPump.iob || iobPump.bolusiob + iob: iobObj , source: devicestatusEntry.connect !== undefined ? 'MM Connect' : undefined , device: devicestatusEntry.device , mills: devicestatusEntry.mills @@ -244,42 +223,21 @@ function init(ctx) { }; function alexaIOBIntentHandler (callback, slots, sbx) { - var preamble = - (slots && slots.pwd && slots.pwd.value) ? - translate('alexaPreamble3person', { - params: [ - slots.pwd.value.replace('\'s', '') - ] - }) : - translate('alexaPreamble'); - - var message = translate('alexaIobIntent', { - params: [ - //preamble, - getIob(sbx) - ] - }); - //preamble + + ' insulin on board'; + var preamble = (slots && slots.pwd && slots.pwd.value) ? slots.pwd.value.replace('\'s', '') + ' has ' : 'You have '; + var message = preamble + getIob(sbx) + ' insulin on board'; callback('Current IOB', message); } function alexaIOBRollupHandler (slots, sbx, callback) { - var iob = getIob(sbx); - var message = translate('alexaIob', { - params: [iob] - }); + var message = 'and you have ' + getIob(sbx) + ' insulin on board.'; callback(null, {results: message, priority: 2}); } function getIob(sbx) { if (sbx.properties.iob && sbx.properties.iob.iob !== 0) { - return translate('alexaIobUnits', { - params: [ - utils.toFixed(sbx.properties.iob.iob) - ] - }); + return utils.toFixed(sbx.properties.iob.iob) + ' units of'; } - return translate('alexaNoInsulin'); + return 'no'; } iob.alexa = { diff --git a/lib/plugins/loop.js b/lib/plugins/loop.js index 12d89bd5296e..0bd75255c285 100644 --- a/lib/plugins/loop.js +++ b/lib/plugins/loop.js @@ -9,7 +9,6 @@ var levels = require('../levels'); function init(ctx) { var timeago = require('./timeago')(ctx); - var utils = require('../utils')(ctx); var loop = { name: 'loop' @@ -154,7 +153,7 @@ function init(ctx) { sbx.notifications.requestNotify({ level: level , title: 'Loop isn\'t looping' - , message: 'Last Loop: ' + utils.formatAgo(prop.lastOkMoment, now.valueOf()) + , message: 'Last Loop: ' + formatAgo(prop.lastLoop.moment, now.valueOf()) , pushoverSound: 'echo' , group: 'Loop' , plugin: loop @@ -194,36 +193,6 @@ function init(ctx) { } } - function addRSSI() { - - var lastTuned = ""; - var RSSI = ""; - - _.forEach(sbx.data.devicestatus, function(entry) { - if (entry.radioAdapter) { - var entryMoment = moment(entry.radioAdapter.lastTuned); - if (lastTuned == "") { - lastTuned = entryMoment; - RSSI = entry.radioAdapter.pumpRSSI; - } - if (lastTuned < entryMoment) { - lastTuned = entryMoment; - RSSI = entry.radioAdapter.pumpRSSI; - } - } - }); - - if (RSSI != "") { - - RSSI = "Pump RSSI: " + RSSI; - - events.push({ - time: lastTuned - , value: RSSI - }); - } - } - function addLastEnacted() { if (prop.lastEnacted) { var canceled = prop.lastEnacted.rate === 0 && prop.lastEnacted.duration === 0; @@ -261,7 +230,7 @@ function init(ctx) { if (prop.lastLoop && prop.lastLoop.cob) { var cob = prop.lastLoop.cob; var cob = prop.lastLoop.cob.cob; - cob = Math.round(cob); + cob = Math.round(cob); valueParts = valueParts.concat([ ', COB: ' , cob + 'g' @@ -313,10 +282,8 @@ function init(ctx) { } else if ('looping' === prop.display.code) { addLastEnacted(); } else { - addRecommendedTempBasal(); + addRecommendedTempBasal(); } - - addRSSI(); var sorted = _.sortBy(events, function toMill(event) { return event.time.valueOf(); @@ -324,7 +291,7 @@ function init(ctx) { var info = _.map(sorted, function eventToInfo (event) { return { - label: utils.timeAt(false, sbx) + utils.timeFormat(event.time, sbx) + label: timeAt(false, sbx) + timeFormat(event.time, sbx) , value: event.value }; }); @@ -340,7 +307,7 @@ function init(ctx) { var lastLoopMoment = prop.lastLoop ? prop.lastLoop.moment : null; sbx.pluginBase.updatePillText(loop, { - value: utils.timeFormat(lastLoopMoment, sbx) + value: timeFormat(lastLoopMoment, sbx) , label: label , info: info , pillClass: statusClass(prop, prefs, sbx) @@ -435,6 +402,29 @@ function init(ctx) { return level; } + function timeFormat (m, sbx) { + + var when; + if (m && sbx.data.inRetroMode) { + when = m.format('LT'); + } else if (m) { + when = formatAgo(m, sbx.time); + } else { + when = 'unknown'; + } + + return when; + } + + function formatAgo (m, nowMills) { + var ago = timeago.calcDisplay({mills: m.valueOf()}, nowMills); + return (ago.value ? ago.value : '') + ago.shortLabel + (ago.shortLabel.length === 1 ? ' ago' : ''); + } + + function timeAt (prefix, sbx) { + return sbx.data.inRetroMode ? (prefix ? ' ' : '') + '@ ' : (prefix ? ', ' : ''); + } + return loop; } diff --git a/lib/plugins/openaps.js b/lib/plugins/openaps.js index 9e3273825ef2..99431611326d 100644 --- a/lib/plugins/openaps.js +++ b/lib/plugins/openaps.js @@ -9,7 +9,7 @@ var levels = require('../levels'); function init(ctx) { var timeago = require('./timeago')(ctx); - var utils = require('../utils')(ctx); + var translate = ctx.language.translate; var openaps = { name: 'openaps' @@ -96,7 +96,7 @@ function init(ctx) { if (!device) { device = { - name: utils.deviceName(uri) + name: uri.indexOf('openaps://') === 0 ? uri.substring('openaps://'.length) : uri , uri: uri }; @@ -108,8 +108,8 @@ function init(ctx) { function toMoments (status) { return { when: moment(status.mills) - , enacted: status.openaps.enacted && status.openaps.enacted.timestamp && (status.openaps.enacted.recieved || status.openaps.enacted.received) && moment(status.openaps.enacted.timestamp) - , notEnacted: status.openaps.enacted && status.openaps.enacted.timestamp && !(status.openaps.enacted.recieved || status.openaps.enacted.received) && moment(status.openaps.enacted.timestamp) + , enacted: status.openaps.enacted && status.openaps.enacted.timestamp && status.openaps.enacted.recieved && moment(status.openaps.enacted.timestamp) + , notEnacted: status.openaps.enacted && status.openaps.enacted.timestamp && !status.openaps.enacted.recieved && moment(status.openaps.enacted.timestamp) , suggested: status.openaps.suggested && status.openaps.suggested.timestamp && moment(status.openaps.suggested.timestamp) , iob: status.openaps.iob && status.openaps.iob.timestamp && moment(status.openaps.iob.timestamp) }; @@ -264,7 +264,7 @@ function init(ctx) { sbx.notifications.requestNotify({ level: level , title: 'OpenAPS isn\'t looping' - , message: 'Last Loop: ' + utils.formatAgo(prop.lastLoopMoment, now.valueOf()) + , message: 'Last Loop: ' + formatAgo(prop.lastLoopMoment, now.valueOf()) , pushoverSound: 'echo' , group: 'OpenAPS' , plugin: openaps @@ -355,9 +355,6 @@ function init(ctx) { if (prop.lastPredBGs.COB) { points = points.concat(_.map(prop.lastPredBGs.COB, toPoints(7000))); } - if (prop.lastPredBGs.UAM) { - points = points.concat(_.map(prop.lastPredBGs.UAM, toPoints(9000))); - } } return points; @@ -423,7 +420,7 @@ function init(ctx) { var info = _.map(sorted, function eventToInfo (event) { return { - label: utils.timeAt(false, sbx) + utils.timeFormat(event.time, sbx) + label: timeAt(false, sbx) + timeFormat(event.time, sbx) , value: event.value }; }); @@ -434,7 +431,7 @@ function init(ctx) { } sbx.pluginBase.updatePillText(openaps, { - value: utils.timeFormat(prop.lastLoopMoment, sbx) + value: timeFormat(prop.lastLoopMoment, sbx) , label: label , info: info , pillClass: statusClass(prop, prefs, sbx) @@ -496,8 +493,31 @@ function init(ctx) { return level; } + function timeFormat (m, sbx) { + + var when; + if (m && sbx.data.inRetroMode) { + when = m.format('LT'); + } else if (m) { + when = formatAgo(m, sbx.time); + } else { + when = 'unknown'; + } + + return when; + } + + function formatAgo (m, nowMills) { + var ago = timeago.calcDisplay({mills: m.valueOf()}, nowMills); + return translate('%1' + ago.shortLabel + (ago.shortLabel.length === 1 ? ' ago' : ''), { params: [(ago.value ? ago.value : '')]}); + } + + function timeAt (prefix, sbx) { + return sbx.data.inRetroMode ? (prefix ? ' ' : '') + '@ ' : (prefix ? ', ' : ''); + } + return openaps; } -module.exports = init; +module.exports = init; \ No newline at end of file diff --git a/lib/plugins/pluginbase.js b/lib/plugins/pluginbase.js index e3f0f66b8e79..adb59a7644f0 100644 --- a/lib/plugins/pluginbase.js +++ b/lib/plugins/pluginbase.js @@ -97,8 +97,6 @@ function init (majorPills, minorPills, statusPills, bgStatus, tooltip) { .duration(200) .style('opacity', 0); }); - } else { - pill.off('mouseover'); } }; diff --git a/lib/plugins/pump.js b/lib/plugins/pump.js index 1f8dd9580058..bf278a575b88 100644 --- a/lib/plugins/pump.js +++ b/lib/plugins/pump.js @@ -45,7 +45,6 @@ function init (ctx) { , urgentBattV: sbx.extendedSettings.urgentBattV || 1.3 , warnBattP: sbx.extendedSettings.warnBattP || 30 , urgentBattP: sbx.extendedSettings.urgentBattP || 20 - , warnOnSuspend: sbx.extendedSettings.warnOnSuspend || false , enableAlerts: sbx.extendedSettings.enableAlerts || false }; }; @@ -80,8 +79,6 @@ function init (ctx) { var prefs = pump.getPrefs(sbx); if (!prefs.enableAlerts) { return; } - - pump.warnOnSuspend = prefs.warnOnSuspend; var data = prepareData(sbx.properties.pump, prefs, sbx); @@ -252,10 +249,6 @@ function init (ctx) { status = 'bolusing'; } else if (pump.status.suspended) { status = 'suspended'; - if (pump.warnOnSuspend && pump.status.suspended) { - result.status.level = levels.WARN; - result.status.message = 'Pump Suspended'; - }; } result.status = { value: status, display: status, label: translate('Status') }; } diff --git a/lib/plugins/treatmentnotify.js b/lib/plugins/treatmentnotify.js index 98d609bf4da1..a0224306cc45 100644 --- a/lib/plugins/treatmentnotify.js +++ b/lib/plugins/treatmentnotify.js @@ -123,7 +123,6 @@ function init() { (lastTreatment.targetTop ? '\nTarget Top: ' + lastTreatment.targetTop : '') + (lastTreatment.targetBottom ? '\nTarget Bottom: ' + lastTreatment.targetBottom : '') + (lastTreatment.carbs ? '\nCarbs: ' + lastTreatment.carbs + 'g' : '') + - (lastTreatment.absorptionTime > 0 ? '\nAbsorption Time: ' + (Math.round(lastTreatment.absorptionTime / 60.0 * 10) / 10) + 'h' : '') + (lastTreatment.insulin ? '\nInsulin: ' + sbx.roundInsulinForDisplayFormat(lastTreatment.insulin) + 'U' : '')+ (lastTreatment.duration ? '\nDuration: ' + lastTreatment.duration + ' min' : '')+ @@ -148,4 +147,4 @@ function isCurrent(last) { return ago !== -1 && ago < times.mins(10).msecs; } -module.exports = init; +module.exports = init; \ No newline at end of file diff --git a/lib/plugins/upbat.js b/lib/plugins/upbat.js index eda42a3901ff..d1491f7b6e13 100644 --- a/lib/plugins/upbat.js +++ b/lib/plugins/upbat.js @@ -198,18 +198,10 @@ function init() { info.value += ' (' + device.min.voltageDisplay + ')'; } - if (device.min && device.min.temperature) { - info.value += ' ' + device.min.temperature; - } return info; }); - } else { - if (prop.min && prop.min.battery && prop.min.voltageDisplay) { - infos = [{label: 'Voltage', value: prop.min.voltageDisplay}]; - } - if (prop.min && prop.min.temperature) { - infos.push({label: 'Temp', value : prop.min.temperature}); - } + } else if (prop.min && prop.min.battery && prop.min.voltageDisplay) { + infos = [{label: 'Voltage', value: prop.min.voltageDisplay}]; } sbx.pluginBase.updatePillText(upbat, { diff --git a/lib/profilefunctions.js b/lib/profilefunctions.js index 582dca2a375a..8dc3fc32912b 100644 --- a/lib/profilefunctions.js +++ b/lib/profilefunctions.js @@ -70,18 +70,6 @@ function init (profileData) { profile.getValueByTime = function getValueByTime (time, valueType, spec_profile) { if (!time) { time = Date.now(); } - // CircadianPercentageProfile support - var timeshift = 0; - var percentage = 100; - var activeTreatment = profile.activeProfileTreatmentToTime(time); - var isCcpProfile = !spec_profile && activeTreatment && activeTreatment.CircadianPercentageProfile; - if (isCcpProfile) { - percentage = activeTreatment.percentage; - timeshift = activeTreatment.timeshift; // in hours - } - var offset = timeshift % 24; - time = time + offset * times.hours(offset).msecs; - //round to the minute for better caching var minuteTime = Math.round(time / 60000) * 60000; @@ -100,7 +88,7 @@ function init (profileData) { // TODO: Better warnings to user for missing configuration var t = profile.getTimezone(spec_profile) ? moment(minuteTime).tz(profile.getTimezone(spec_profile)) : moment(minuteTime); - + // Convert to seconds from midnight var mmtMidnight = t.clone().startOf('day'); var timeAsSecondsFromMidnight = t.clone().diff(mmtMidnight, 'seconds'); @@ -117,20 +105,7 @@ function init (profileData) { }); } - if (returnValue) { - returnValue = parseFloat(returnValue); - if (isCcpProfile) { - switch (valueType) { - case "sens": - case "carbratio": - returnValue = returnValue * 100 / percentage; - break; - case "basal": - returnValue = returnValue * percentage / 100; - break; - } - } - } + if (returnValue) { returnValue = parseFloat(returnValue); } profile.timeValueCache[cacheKey] = returnValue; @@ -157,31 +132,31 @@ function init (profileData) { }; profile.getDIA = function getDIA (time, spec_profile) { - return profile.getValueByTime(Number(time), 'dia', spec_profile); + return profile.getValueByTime(time, 'dia', spec_profile); }; profile.getSensitivity = function getSensitivity (time, spec_profile) { - return profile.getValueByTime(Number(time), 'sens', spec_profile); + return profile.getValueByTime(time, 'sens', spec_profile); }; profile.getCarbRatio = function getCarbRatio (time, spec_profile) { - return profile.getValueByTime(Number(time), 'carbratio', spec_profile); + return profile.getValueByTime(time, 'carbratio', spec_profile); }; profile.getCarbAbsorptionRate = function getCarbAbsorptionRate (time, spec_profile) { - return profile.getValueByTime(Number(time), 'carbs_hr', spec_profile); + return profile.getValueByTime(time, 'carbs_hr', spec_profile); }; profile.getLowBGTarget = function getLowBGTarget (time, spec_profile) { - return profile.getValueByTime(Number(time), 'target_low', spec_profile); + return profile.getValueByTime(time, 'target_low', spec_profile); }; profile.getHighBGTarget = function getHighBGTarget (time, spec_profile) { - return profile.getValueByTime(Number(time), 'target_high', spec_profile); + return profile.getValueByTime(time, 'target_high', spec_profile); }; profile.getBasal = function getBasal (time, spec_profile) { - return profile.getValueByTime(Number(time), 'basal', spec_profile); + return profile.getValueByTime(time, 'basal', spec_profile); }; profile.updateTreatments = function updateTreatments (profiletreatments, tempbasaltreatments, combobolustreatments) { @@ -209,9 +184,9 @@ function init (profileData) { profile.activeProfileToTime = function activeProfileToTime (time) { if (profile.hasData()) { var timeprofile = profile.data[0].defaultProfile; - time = Number(time) || new Date().getTime(); + time = time || new Date().getTime(); var treatment = profile.activeProfileTreatmentToTime(time); - if (treatment && profile.data[0].store && profile.data[0].store[treatment.profile]) { + if (treatment) { timeprofile = treatment.profile; } return timeprofile; @@ -221,8 +196,7 @@ function init (profileData) { profile.activeProfileTreatmentToTime = function activeProfileTreatmentToTime (time) { var cacheKey = 'profile' + time + profile.profiletreatments_hash; - //var returnValue = profile.timeValueCache[cacheKey]; - var returnValue; + var returnValue = profile.timeValueCache[cacheKey]; if (returnValue) { return returnValue; @@ -231,14 +205,8 @@ function init (profileData) { var treatment = null; if (profile.hasData()) { profile.profiletreatments.forEach( function eachTreatment (t) { - if (time >= t.mills && t.mills >= profile.data[0].mills) { - var duration = times.mins(t.duration || 0).msecs; - if (duration != 0 && time < t.mills + duration) { - treatment = t; - } - if (duration == 0) { - treatment = t; - } + if (time > t.mills && t.mills > profile.data[0].mills) { + treatment = t; } }); } diff --git a/lib/report_plugins/dailystats.js b/lib/report_plugins/dailystats.js index 4cfd99f8450f..5449b136a2e1 100644 --- a/lib/report_plugins/dailystats.js +++ b/lib/report_plugins/dailystats.js @@ -45,7 +45,7 @@ dailystats.report = function report_dailystats(datastorage,sorteddaystoshow,opti var todo = []; var report = $('#dailystats-report'); - var minForDay, maxForDay, sum; + var minForDay, maxForDay; report.empty(); var table = $('
'); @@ -59,7 +59,6 @@ dailystats.report = function report_dailystats(datastorage,sorteddaystoshow,opti $('').appendTo(thead); $('').appendTo(thead); $('').appendTo(thead); - $('').appendTo(thead); $('').appendTo(thead); $('').appendTo(thead); $('').appendTo(thead); @@ -81,8 +80,6 @@ dailystats.report = function report_dailystats(datastorage,sorteddaystoshow,opti minForDay = daysRecords[0].sgv; maxForDay = daysRecords[0].sgv; - sum = 0; - var stats = daysRecords.reduce(function(out, record) { record.sgv = parseFloat(record.sgv); if (record.sgv < options.targetLow) { @@ -98,15 +95,12 @@ dailystats.report = function report_dailystats(datastorage,sorteddaystoshow,opti if (maxForDay < record.sgv) { maxForDay = record.sgv; } - sum += record.sgv; return out; }, { lows: 0, normal: 0, highs: 0 }); - var average = sum / daysRecords.length; - var bgValues = daysRecords.map(function(r) { return r.sgv; }); $('').appendTo(tr); @@ -117,8 +111,7 @@ dailystats.report = function report_dailystats(datastorage,sorteddaystoshow,opti $('').appendTo(tr); $('').appendTo(tr); $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); + $('').appendTo(tr); $('').appendTo(tr); $('').appendTo(tr); $('').appendTo(tr); diff --git a/lib/report_plugins/daytoday.js b/lib/report_plugins/daytoday.js index 69392d56e13a..6d0673729c35 100644 --- a/lib/report_plugins/daytoday.js +++ b/lib/report_plugins/daytoday.js @@ -20,7 +20,7 @@ module.exports = init; daytoday.html = function html(client) { var translate = client.translate; var ret = - '

' + translate('Day to day') + '

' + '

' + translate('Day to Day') + '

' + '' + translate('To see this report, press SHOW while in this view') + '
' + translate('Display') + ': ' + ''+translate('Insulin')+'' @@ -32,7 +32,6 @@ daytoday.html = function html(client) { + ''+translate('IOB')+'' + ''+translate('COB')+'' + ''+translate('OpenAPS')+'' - + ''+translate('Insulin distribution')+'' + ' '+translate('Size') + '
'+translate('Readings')+''+translate('Min')+''+translate('Max')+''+translate('Average')+''+translate('StDev')+''+translate('25%')+''+translate('Median')+'
' + daysRecords.length +'' + minForDay +'' + maxForDay +'' + average.toFixed(1) +'' + ss.standard_deviation(bgValues).toFixed(1) + '' + Math.round(ss.standard_deviation(bgValues)) + '' + ss.quantile(bgValues, 0.25).toFixed(1) + '' + ss.quantile(bgValues, 0.5).toFixed(1) + '' + ss.quantile(bgValues, 0.75).toFixed(1) + '
'); $('').appendTo(table); @@ -711,12 +651,8 @@ daytoday.report = function report_daytoday(datastorage,sorteddaystoshow,options) $('#daytodaystatchart-' + day).append(table); var chartData = [ - { - label: translate('Basal'), - count: totalBasalInsulin, - pct: (totalBasalInsulin / totalDailyInsulin * 100).toFixed(0) - }, - {label: translate('Bolus'), count: bolusInsulin, pct: (bolusInsulin / totalDailyInsulin * 100).toFixed(0)} + { label: translate('Basal'), count: totalBasalInsulin, pct: (totalBasalInsulin / totalDailyInsulin * 100).toFixed(0) }, + { label: translate('Bolus'), count: bolusInsulin, pct: (bolusInsulin / totalDailyInsulin * 100).toFixed(0) } ]; // Insulin distribution chart @@ -724,130 +660,95 @@ daytoday.report = function report_daytoday(datastorage,sorteddaystoshow,options) var height = 120; var radius = Math.min(width, height) / 2; - var color = d3.scale.ordinal().range([basalcolor, boluscolor]); - + var color = d3.scale.ordinal().range([basalcolor, boluscolor]); + var labelArc = d3.svg.arc() - .outerRadius(radius / 2) - .innerRadius(radius / 2); + .outerRadius(radius / 2) + .innerRadius(radius / 2); var svg = d3.select('#daytodaystatinsulinpiechart-' + day) - .append('svg') - .attr('width', width) - .attr('height', height) - .append('g') - .attr('transform', 'translate(' + (width / 2) + - ',' + (height / 2) + ')'); + .append('svg') + .attr('width', width) + .attr('height', height) + .append('g') + .attr('transform', 'translate(' + (width / 2) + + ',' + (height / 2) + ')'); var arc = d3.svg.arc() - .outerRadius(radius); + .outerRadius(radius); var pie = d3.layout.pie() - .value(function (d) { - return d.count; - }) - .sort(null); + .value(function(d) { return d.count; }) + .sort(null); var insulg = svg.selectAll('.insulinarc') - .data(pie(chartData)) - .enter() - .append('g') - .attr('class', 'insulinarc'); - + .data(pie(chartData)) + .enter() + .append('g') + .attr('class', 'insulinarc'); + insulg.append('path') - .attr('d', arc) - .attr('opacity', '0.5') - .attr('fill', function (d) { - return color(d.data.label); - }); - + .attr('d', arc) + .attr('opacity', '0.5') + .attr('fill', function(d) { + return color(d.data.label); + }); + insulg.append('text') - .attr('transform', function (d) { - return 'translate(' + labelArc.centroid(d) + ')'; - }) - .attr('dy', '.15em') - .style('font-weight', 'bold') - .attr('text-anchor', 'middle') - .text(function (d) { - return d.data.pct + '%'; - }); - + .attr('transform', function(d) { return 'translate(' + labelArc.centroid(d) + ')'; }) + .attr('dy', '.15em') + .style('font-weight', 'bold') + .attr('text-anchor', 'middle') + .text(function(d) { + return d.data.pct + '%'; + }); + // Carbs pie chart - - var carbscolor = d3.scale.ordinal().range(['red']); + + var carbscolor = d3.scale.ordinal().range(['red']); var carbsData = [ - {label: translate('Carbs'), count: data.dailyCarbs} + { label: translate('Carbs'), count: data.dailyCarbs } ]; - + var carbssvg = d3.select('#daytodaystatcarbspiechart-' + day) - .append('svg') - .attr('width', width) - .attr('height', height) - .append('g') - .attr('transform', 'translate(' + (width / 2) + - ',' + (height / 2) + ')'); + .append('svg') + .attr('width', width) + .attr('height', height) + .append('g') + .attr('transform', 'translate(' + (width / 2) + + ',' + (height / 2) + ')'); var carbsarc = d3.svg.arc() - .outerRadius(radius * data.dailyCarbs / options.maxDailyCarbsValue); + .outerRadius(radius * data.dailyCarbs / options.maxDailyCarbsValue); var carbspie = d3.layout.pie() - .value(function (d) { - return d.count; - }) - .sort(null); + .value(function(d) { return d.count; }) + .sort(null); var carbsg = carbssvg.selectAll('.carbsarc') - .data(carbspie(carbsData)) - .enter() - .append('g') - .attr('class', 'carbsarc'); - + .data(carbspie(carbsData)) + .enter() + .append('g') + .attr('class', 'carbsarc'); + carbsg.append('path') - .attr('d', carbsarc) - .attr('opacity', '0.5') - .attr('fill', function (d) { - return carbscolor(d.data.label); - }); - + .attr('d', carbsarc) + .attr('opacity', '0.5') + .attr('fill', function(d) { + return carbscolor(d.data.label); + }); + carbsg.append('text') - .attr('transform', function () { - return 'translate(0,0)'; - }) - .attr('dy', '.15em') - .style('font-weight', 'bold') - .attr('text-anchor', 'middle') - .text(function (d) { - return d.data.count + 'g'; - }); - } - - appendProfileSwitch(context, { - //eventType: 'Profile Switch' - profile: client.profilefunctions.activeProfileToTime(from) - , mills: from + times.mins(15).msecs - , first: true - }); - - function appendProfileSwitch(context, treatment) { - var sign = treatment.first ? '▲▲▲' : '▬▬▬'; - var text; - if (treatment.cutting) { - text = sign + ' ' + treatment.cutting + ' ' + '►►►' + ' ' + treatment.profile + ' ' + sign; - } else { - text = sign + ' ' + treatment.profile + ' ' + sign; - } - context.append('text') - .style('font-size', 12) + .attr('transform', function() { return 'translate(0,0)'; }) + .attr('dy', '.15em') .style('font-weight', 'bold') - .attr('fill', '#0099ff') - .attr('text-anchor', 'start') - .attr('dy', '.35em') - .attr('transform', 'rotate(-90 ' + (xScale2(treatment.mills) + padding.left) + ',' + (yScaleBasals(0) + padding.top - 10) + ') ' + - 'translate(' + (xScale2(treatment.mills) + padding.left) + ',' + (yScaleBasals(0) + padding.top - 10) + ')') - .text(text); - } + .attr('text-anchor', 'middle') + .text(function(d) { + return d.data.count + 'g'; + }); - console.log("Rendering " + day, new Date().getTime() - timestart.getTime(), "msecs"); + } } function hideTooltip ( ) { diff --git a/lib/report_plugins/glucosedistribution.js b/lib/report_plugins/glucosedistribution.js index 7b0175a73ca1..b6c6e0c35ecf 100644 --- a/lib/report_plugins/glucosedistribution.js +++ b/lib/report_plugins/glucosedistribution.js @@ -1,444 +1,166 @@ 'use strict'; var glucosedistribution = { - name: 'glucosedistribution', - label: 'Distribution', - pluginType: 'report' + name: 'glucosedistribution' + , label: 'Distribution' + , pluginType: 'report' }; function init() { - return glucosedistribution; + return glucosedistribution; } module.exports = init; glucosedistribution.html = function html(client) { - var translate = client.translate; - var ret = - '

' + - translate('Glucose distribution') + - ' (' + - ' ' + - ' )' + - '

' + - '
' + translate('Bolus insulin:') + '' + bolusInsulin.toFixed(1) + 'U
' + - '' + - '' + - '' + - '' + - '
' + - '
' + - '
' + - '
' + - '* ' + translate('This is only a rough estimation that can be very inaccurate and does not replace actual blood testing. The formula used is taken from:') + - 'Nathan, David M., et al. "Translating the A1C assay into estimated average glucose values." Diabetes care 31.8 (2008): 1473-1478.' + '

' + - translate('Time in fluctuation and Time in rapid fluctuation measure the % of time during the examined period, during which the blood glucose has been changing relatively fast or rapidly. Lower values are better.') + '

' + - translate('Mean Total Daily Change is a sum of the absolute value of all glucose excursions for the examined period, divided by the number of days. Lower is better.')+ '

' + - translate('Mean Hourly Change is a sum of the absolute value of all glucose excursions for the examined period, divided by the number of hours in the period. Lower is better.')+ '

' + - translate('GVI and PGS are measures developed by Dexcom, detailed here.')+ - '


' + - translate('Filter by hours') + ':' + - '
' + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + - '6' + - '7' + - '8' + - '9' + - '10' + - '11' + - '12' + - '13' + - '14' + - '15' + - '16' + - '17' + - '18' + - '19' + - '20' + - '21' + - '22' + - '23' - + var translate = client.translate; + var ret = + '

' + + translate('Glucose distribution') + + ' (' + + ' ' + + ' )' + + '

' + + '
' + + '
' + + '
' + + '
' + + '* ' + translate('This is only a rough estimation that can be very inaccurate and does not replace actual blood testing. The formula used is taken from: Nathan, David M., et al. "Translating the A1C assay into estimated average glucose values." Diabetes care 31.8 (2008): 1473-1478.') ; - return ret; + return ret; }; glucosedistribution.css = - '#glucosedistribution-overviewchart {' + - ' width: 2.4in;' + - ' height: 2.4in;' + - '}' + - '#glucosedistribution-placeholder .tdborder {' + - ' width:80px;' + - ' border: 1px #ccc solid;' + - ' margin: 0;' + - ' padding: 1px;' + - ' text-align:center;' + - '}'; - - - -glucosedistribution.report = function report_glucosedistribution(datastorage, sorteddaystoshow, options) { - var Nightscout = window.Nightscout; - var client = Nightscout.client; - var translate = client.translate; - - var ss = require('simple-statistics'); - - var colors = ['#f88', '#8f8', '#ff8']; - var tablecolors = { - Low: '#f88', - Normal: '#8f8', - High: '#ff8' - }; - - var enabledHours = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]; - - var report = $('#glucosedistribution-report'); - report.empty(); - - var stability = $('#glucosedistribution-stability'); - stability.empty(); - - var stats = []; - var table = $(''); - var thead = $(''); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - thead.appendTo(table); - - var data = datastorage.allstatsrecords; - var days = datastorage.alldays; - - $('#glucosedistribution-days').text(days + ' ' + translate('days total')); - - for (var i = 0; i < 23; i++) { - $('#glucosedistribution-' + i).unbind('click').click(onClick); - enabledHours[i] = $('#glucosedistribution-' + i).is(':checked'); - } - console.log(enabledHours); - - var result = {}; - - // Filter data for noise - - var glucose_data = [data[0]]; - - // data cleaning pass 1 - add interpolated missing points - - for (var i = 0; i < data.length - 2; i++) { - - var entry = data[i]; - var nextEntry = data[i + 1]; - - var timeDelta = nextEntry.displayTime.getTime() - entry.displayTime.getTime(); - - if (timeDelta < 9 * 60 * 1000 ||  timeDelta > 25 * 60 * 1000) { - glucose_data.push(entry); - continue; - } - - var missingRecords = Math.floor(timeDelta / (5 * 60 * 990)) -1; - - var timePatch = Math.floor(timeDelta / (missingRecords + 1)); - var bgDelta = (nextEntry.bgValue - entry.bgValue) / (missingRecords + 1); - - glucose_data.push(entry); - - for (var j = 1; j <= missingRecords; j++) { - - var bg = Math.floor(entry.bgValue + bgDelta * j); - var t = new Date(entry.displayTime.getTime() + j * timePatch); - var newEntry = { - bgValue: bg, - displayTime: t - }; - glucose_data.push(newEntry); - } - - } - - // data cleaning pass 2 - replace single jumpy measures with interpolated values - - var glucose_data2 = [glucose_data[0]]; - - var prevEntry = glucose_data[0]; - - for (var i = 1; i < glucose_data.length-2; i++) { - -// var prevEntry = glucose_data[i-1]; - var entry = glucose_data[i]; - var nextEntry = glucose_data[i+1]; - - var timeDelta = nextEntry.displayTime.getTime() - entry.displayTime.getTime(); - var timeDelta2 = entry.displayTime.getTime() - nextEntry.displayTime.getTime(); - - var maxGap = (5 * 60 * 1000) + 10000; - - if (timeDelta > maxGap || timeDelta2 > maxGap ) { - glucose_data2.push(entry); - prevEntry = entry; - continue; - } - - var delta1 = entry.bgValue - prevEntry.bgValue; - var delta2 = nextEntry.bgValue - entry.bgValue; - - if (delta1 <= 8 && delta2 <= 8) { - glucose_data2.push(entry); - prevEntry = entry; - continue; - } - - - if ((delta1 > 0 && delta2 <0) || (delta1 < 0 && delta2 > 0)) { - var d = (nextEntry.bgValue - prevEntry.bgValue) / 2; - var newEntry = { - bgValue: prevEntry.bgValue + d, - displayTime: entry.displayTime - }; - glucose_data2.push(newEntry); - prevEntry = newEntry; - continue; - - } - - glucose_data2.push(entry); - prevEntry = entry; - } - - glucose_data = data = glucose_data2.filter(function(r) { - return enabledHours[new Date(r.displayTime).getHours()] + '#glucosedistribution-overviewchart {' + + ' width: 2.4in;' + + ' height: 2.4in;' + + ' float:left;' + + '}' + + '#glucosedistribution-placeholder .tdborder {' + + ' width:80px;' + + ' border: 1px #ccc solid;' + + ' margin: 0;' + + ' padding: 1px;' + + ' text-align:center;' + + '}' + ; + + + +glucosedistribution.report = function report_glucosedistribution(datastorage,sorteddaystoshow,options) { + var Nightscout = window.Nightscout; + var client = Nightscout.client; + var translate = client.translate; + + var ss = require('simple-statistics'); + + var colors = ['#f88', '#8f8', '#ff8']; + var tablecolors = { Low:'#f88', Normal: '#8f8', High: '#ff8' }; + + var report = $('#glucosedistribution-report'); + report.empty(); + var stats = []; + var table = $('
' + translate('Range') + '' + translate('% of Readings') + '' + translate('# of Readings') + '' + translate('Average') + '' + translate('Median') + '' + translate('Standard Deviation') + '' + translate('A1c estimation*') + '
'); + var thead = $(''); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + thead.appendTo(table); + + var data = datastorage.allstatsrecords; + var days = datastorage.alldays; + + $('#glucosedistribution-days').text(days+' '+translate('days total')); + + var result = { }; + + ['Low', 'Normal', 'High'].forEach(function(range) { + result[range] = { }; + var r = result[range]; + r.rangeRecords = data.filter(function(r) { + if (range === 'Low') { + return r.sgv > 0 && r.sgv < options.targetLow; + } else if (range === 'Normal') { + return r.sgv >= options.targetLow && r.sgv < options.targetHigh; + } else { + return r.sgv >= options.targetHigh; + } }); - - ['Low', 'Normal', 'High'].forEach(function(range) { - result[range] = {}; - var r = result[range]; - r.rangeRecords = glucose_data.filter(function(r) { - if (range === 'Low') { - return r.sgv > 0 && r.sgv < options.targetLow; - } else if (range === 'Normal') { - return r.sgv >= options.targetLow && r.sgv < options.targetHigh; - } else { - return r.sgv >= options.targetHigh; - } - }); - stats.push(r.rangeRecords.length); - r.rangeRecords.sort(function(a, b) { - return a.sgv - b.sgv; - }); - r.localBgs = r.rangeRecords.map(function(r) { - return r.sgv; - }).filter(function(bg) { - return !!bg; - }); - r.midpoint = Math.floor(r.rangeRecords.length / 2); - r.readingspct = (100 * r.rangeRecords.length / data.length).toFixed(1); - if (r.rangeRecords.length > 0) { - r.mean = Math.floor(10 * ss.mean(r.localBgs)) / 10; - r.median = r.rangeRecords[r.midpoint].sgv; - r.stddev = Math.floor(ss.standard_deviation(r.localBgs) * 10) / 10; - } + stats.push(r.rangeRecords.length); + r.rangeRecords.sort(function(a,b) { + return a.sgv - b.sgv; }); - - // make sure we have total 100% - result.Normal.readingspct = (100 - result.Low.readingspct - result.High.readingspct).toFixed(1); - - ['Low', 'Normal', 'High'].forEach(function(range) { - var tr = $(''); - var r = result[range]; - - var rangeExp = ''; - - if (range == 'Low') { - rangeExp = ' (<' + options.targetLow + ')'; - } - if (range == 'High') { - rangeExp = ' (>=' + options.targetHigh + ')'; - } - - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - if (r.rangeRecords.length > 0) { - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - } else { - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - } - - table.append(tr); - }); - + r.localBgs = r.rangeRecords.map(function(r) { return r.sgv; }).filter(function(bg) { return !!bg; }); + r.midpoint = Math.floor(r.rangeRecords.length / 2); + r.readingspct = Math.floor(100 * r.rangeRecords.length / data.length); + if (r.rangeRecords.length > 0) { + r.mean = Math.floor(10*ss.mean(r.localBgs))/10; + r.median = r.rangeRecords[r.midpoint].sgv; + r.stddev = Math.floor(ss.standard_deviation(r.localBgs)*10)/10; + } + }); + + // make sure we have total 100% + result.Normal.readingspct = 100 - result.Low.readingspct - result.High.readingspct; + + ['Low', 'Normal', 'High'].forEach(function(range) { var tr = $(''); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - if (glucose_data.length > 0) { - var localBgs = glucose_data.map(function(r) { - return r.sgv; - }).filter(function(bg) { - return !!bg; - }); - var mgDlBgs = glucose_data.map(function(r) { - return r.bgValue; - }).filter(function(bg) { - return !!bg; - }); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); + var r = result[range]; + + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + if (r.rangeRecords.length > 0) { + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); } else { - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); } - table.append(tr); - report.append(table); - - - // Stability - - var t1 = 6; - var t2 = 11; - var t1count = 0; - var t2count = 0; - - var total = 0; - var events = 0; - - var GVITotal = 0; - var GVIIdeal = 0; - - var usedRecords = 0; - var glucoseTotal = 0; - var deltaTotal = 0; - - for (var i = 0; i < glucose_data.length - 2; i++) { - - var entry = glucose_data[i]; - var nextEntry = glucose_data[i + 1]; - - var timeDelta = nextEntry.displayTime.getTime() - entry.displayTime.getTime(); - - if (timeDelta > 6 * 60 * 1000) { -// console.log("Record skipped"); - continue; - } - - usedRecords += 1; - - var delta = Math.abs(nextEntry.bgValue - entry.bgValue); - - deltaTotal += delta; - - total += delta; - events += 1; - - if (delta >= t1) { - t1count += 1; - } - - if (delta >= t2) { - t2count += 1; - } - - GVITotal += Math.sqrt(25 + Math.pow(delta, 2)); - glucoseTotal += entry.bgValue; - - } - - var GVIDelta = Math.floor(glucose_data[0].bgValue,glucose_data[glucose_data.length-1].bgValue); - - GVIIdeal = Math.sqrt(Math.pow(usedRecords*5,2) + Math.pow(GVIDelta,2)); - - var GVI = Math.round(GVITotal / GVIIdeal * 100) / 100; - - console.log('GVI',GVI,'GVIIdeal',GVIIdeal,'GVITotal',GVITotal); - - var glucoseMean = Math.floor(glucoseTotal / usedRecords); - - var tirMultiplier = result.Normal.readingspct / 100.0; - - var PGS = Math.round(GVI * glucoseMean * (1-tirMultiplier) * 100) / 100; - - console.log('glucoseMean', glucoseMean,'tirMultiplier',tirMultiplier, 'PGS',PGS); - var days = (glucose_data[glucose_data.length-1].displayTime.getTime() - glucose_data[0].displayTime.getTime()) / (24*60*60*1000.0); - - var TDC = deltaTotal / days; - var TDCHourly = TDC / 24.0; - -// console.log('TADC',TDC,'days',days); - - var timeInT1 = Math.round(100 * t1count / events).toFixed(1); - var timeInT2 = Math.round(100 * t2count / events).toFixed(1); - var mac = (total / events).toFixed(1); - - var unitString = ' mg/dl'; - - if (client.settings.units == 'mmol') { - mac = (total / events / 18.0).toFixed(2); - TDC = TDC / 18.0; - TDCHourly = TDCHourly / 18.0; - unitString = ' mmol/L'; - } - - TDC = Math.round(TDC * 100) / 100; - TDCHourly = Math.round(TDCHourly * 100) / 100; - - - var stabilitytable = $('
'+translate('Range')+''+translate('% of Readings')+''+translate('# of Readings')+''+translate('Mean')+''+translate('Median')+''+translate('Standard Deviation')+''+translate('A1c estimation*')+'
' + translate(range) + rangeExp + ': ' + r.readingspct + '%' + r.rangeRecords.length + '' + r.mean.toFixed(1) + '' + r.median.toFixed(1) + '' + r.stddev.toFixed(1) + ' N/AN/AN/A
' + translate('Overall') + ': ' + glucose_data.length + '' + (Math.round(10 * ss.mean(localBgs)) / 10).toFixed(1) + '' + (Math.round(10 * ss.quantile(localBgs, 0.5)) / 10).toFixed(1) + '' + (Math.round(ss.standard_deviation(localBgs) * 10) / 10).toFixed(1) + '
' + (Math.round(10 * (ss.mean(mgDlBgs) + 46.7) / 28.7) / 10).toFixed(1) + '%DCCT | ' + Math.round(((ss.mean(mgDlBgs) + 46.7) / 28.7 - 2.15) * 10.929) + 'IFCC
' + translate(range) + ': ' + r.readingspct + '%' + r.rangeRecords.length + '' + r.mean.toFixed(1) + '' + r.median.toFixed(1) + '' + r.stddev.toFixed(1) + ' N/AN/AN/AN/AN/AN/AN/A
'); - - var t1exp = '>5 mg/dl/5m'; - var t2exp = '>10 mg/dl/5m'; - - if (client.settings.units == 'mmol') { - t1exp = '>0.27 mmol/l/5m'; - t2exp = '>0.55 mmol/l/5m'; - } - - $('').appendTo(stabilitytable); - $('').appendTo(stabilitytable); - - $('').appendTo(stabilitytable); - $('').appendTo(stabilitytable); - - stabilitytable.appendTo(stability); - - setTimeout(function() { - $.plot( - '#glucosedistribution-overviewchart', - stats, { - series: { - pie: { - show: true - } - }, - colors: colors - } - ); - }); - - function onClick() { - report_glucosedistribution(datastorage, sorteddaystoshow, options); - } - -}; \ No newline at end of file + table.append(tr); + }); + + var tr = $(''); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + if (data.length > 0) { + var localBgs = data.map(function(r) { return r.sgv; }).filter(function(bg) { return !!bg; }); + var mgDlBgs = data.map(function(r) { return r.bgValue; }).filter(function(bg) { return !!bg; }); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + } else { + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + } + table.append(tr); + report.append(table); + + setTimeout(function() { + $.plot( + '#glucosedistribution-overviewchart', + stats, + { + series: { + pie: { + show: true + } + }, + colors: colors + } + ); + }); +}; diff --git a/lib/report_plugins/hourlystats.js b/lib/report_plugins/hourlystats.js index 12a4412666ba..ee7b4af3bf99 100644 --- a/lib/report_plugins/hourlystats.js +++ b/lib/report_plugins/hourlystats.js @@ -18,21 +18,21 @@ hourlystats.html = function html(client) { var translate = client.translate; var ret = '

' + translate('Hourly stats') + '

' - + '
' - + '
' + + '
' + + '
' ; return ret; }; hourlystats.css = - '#hourlystats-overviewchart {' + '#hourlystats-overviewchart {' + ' width: 100%;' + ' min-width: 6.5in;' + ' height: 5in;' + '}' + '#hourlystats-placeholder td {' + ' text-align:center;' - + '}'; + + '}' ; hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, options) { //console.log(window); @@ -40,62 +40,45 @@ hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, var Nightscout = window.Nightscout; var client = Nightscout.client; var translate = client.translate; - var report_plugins = Nightscout.report_plugins; var report = $('#hourlystats-report'); var stats = []; var pivotedByHour = {}; var data = datastorage.allstatsrecords; - + for (var i = 0; i < 24; i++) { pivotedByHour[i] = []; } - - data = data.filter(function(o) { return !isNaN(o.sgv);}); - data.forEach(function(record) { - var d = new Date(record.displayTime); - record.sgv = Number(record.sgv); pivotedByHour[d.getHours()].push(record); }); - var table = $('
' + translate('Mean Total Daily Change') + '' + translate('Time in fluctuation') + '
(' + t1exp + ')
' + translate('Time in rapid fluctuation') + '
(' + t2exp + ')
' + TDC + unitString + '' + timeInT1 + '%' + timeInT2 + '%
' + translate('Mean Hourly Change') + 'GVIPGS
' + TDCHourly + unitString + '' + GVI + '' + PGS + '
'+translate('Overall')+': ' + data.length + '' + (Math.round(10*ss.mean(localBgs))/10).toFixed(1) + '' + (Math.round(10*ss.quantile(localBgs, 0.5))/10).toFixed(1) + '' + (Math.round(ss.standard_deviation(localBgs)*10)/10).toFixed(1) + '
' + (Math.round(10*(ss.mean(mgDlBgs)+46.7)/28.7)/10).toFixed(1) + '%DCCT | ' + Math.round(((ss.mean(mgDlBgs)+46.7)/28.7 - 2.15)*10.929) + 'IFCC
N/AN/AN/AN/A
'); var thead = $(''); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); - $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); + $('').appendTo(thead); thead.appendTo(table); - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23].forEach(function (hour) { + [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23].forEach(function(hour) { var tr = $(''); - var display = new Date(0, 0, 1, hour, 0, 0, 0).toLocaleTimeString().replace(/([\d]+:[\d]{2})(:[\d]{2})(.*)/, '$1$3'); + var display = new Date(0, 0 , 1, hour, 0, 0, 0).toLocaleTimeString().replace(/([\d]+:[\d]{2})(:[\d]{2})(.*)/, '$1$3'); - var avg = Math.floor(pivotedByHour[hour].map(function (r) { - return r.sgv; - }).reduce(function (o, v) { - return o + v; - }, 0) / pivotedByHour[hour].length); + var avg = Math.floor(pivotedByHour[hour].map(function(r) { return r.sgv; }).reduce(function(o,v){ return o+v; }, 0) / pivotedByHour[hour].length); var d = new Date(times.hours(hour).msecs); - var dev = ss.standard_deviation(pivotedByHour[hour].map(function (r) { - return r.sgv; - })); + var dev = ss.standard_deviation(pivotedByHour[hour].map(function(r) { return r.sgv; })); stats.push([ new Date(d), - ss.quantile(pivotedByHour[hour].map(function (r) { - return r.sgv; - }), 0.25), - ss.quantile(pivotedByHour[hour].map(function (r) { - return r.sgv; - }), 0.75), + ss.quantile(pivotedByHour[hour].map(function(r) { return r.sgv; }), 0.25), + ss.quantile(pivotedByHour[hour].map(function(r) { return r.sgv; }), 0.75), avg - dev, avg + dev ]); @@ -103,22 +86,12 @@ hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, $('').appendTo(tr); $('').appendTo(tr); $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); - $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); + $('').appendTo(tr); table.append(tr); }); @@ -128,8 +101,8 @@ hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, $.plot( '#hourlystats-overviewchart', [{ - data: stats, - candle: true + data:stats, + candle:true }], { series: { @@ -144,7 +117,7 @@ hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, }, yaxis: { min: 0, - max: options.units === 'mmol' ? 22 : 400, + max: options.units === 'mmol' ? 22: 400, show: true }, grid: { @@ -152,66 +125,4 @@ hourlystats.report = function report_hourlystats(datastorage, sorteddaystoshow, } } ); - - var totalPositive = []; - var totalNegative = []; - var positivesCount = []; - var negativesCount = []; - var totalNet = []; - var days = 0; - table = $('
' + translate('Time') + '' + translate('Readings') + '' + translate('Average') + '' + translate('Min') + '' + translate('Quartile') + ' 25' + translate('Median') + '' + translate('Quartile') + ' 75' + translate('Max') + '' + translate('Standard Deviation') + ''+translate('Time')+''+translate('Readings')+''+translate('Average')+''+translate('Min')+''+translate('Quartile')+' 25'+translate('Median')+''+translate('Quartile')+' 75'+translate('Max')+''+translate('Standard Deviation')+'
' + display + '' + pivotedByHour[hour].length + ' (' + Math.floor(100 * pivotedByHour[hour].length / data.length) + '%)' + avg + '' + Math.min.apply(Math, pivotedByHour[hour].map(function (r) { - return r.sgv; - })) + '' + ((tmp = ss.quantile(pivotedByHour[hour].map(function (r) { - return r.sgv; - }), 0.25)) ? tmp.toFixed(1) : 0 ) + '' + ((tmp = ss.quantile(pivotedByHour[hour].map(function (r) { - return r.sgv; - }), 0.5)) ? tmp.toFixed(1) : 0 ) + '' + ((tmp = ss.quantile(pivotedByHour[hour].map(function (r) { - return r.sgv; - }), 0.75)) ? tmp.toFixed(1) : 0 ) + '' + Math.max.apply(Math, pivotedByHour[hour].map(function (r) { - return r.sgv; - })) + '' + Math.floor(dev * 10) / 10 + '' + Math.min.apply(Math, pivotedByHour[hour].map(function(r) { return r.sgv; })) + '' + ((tmp=ss.quantile(pivotedByHour[hour].map(function(r) { return r.sgv; }), 0.25)) ? tmp.toFixed(1) : 0 ) + '' + ((tmp=ss.quantile(pivotedByHour[hour].map(function(r) { return r.sgv; }), 0.5)) ? tmp.toFixed(1) : 0 ) + '' + ((tmp=ss.quantile(pivotedByHour[hour].map(function(r) { return r.sgv; }), 0.75)) ? tmp.toFixed(1) : 0 ) + '' + Math.max.apply(Math, pivotedByHour[hour].map(function(r) { return r.sgv; })) + '' + Math.floor(dev*10)/10 + '
'); - thead = $(''); - ["", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23].forEach(function (hour) { - $('').appendTo(thead); - totalPositive[hour] = 0; - totalNegative[hour] = 0; - positivesCount[hour] = 0; - negativesCount[hour] = 0; - totalNet[hour] = 0; - }); - thead.appendTo(table); - - sorteddaystoshow.forEach(function (day) { - if (datastorage[day].netBasalPositive) { - days++; - var tr = $(''); - $('').appendTo(tr); - for (var h = 0; h < 24; h++) { - var positive = datastorage[day].netBasalPositive[h]; - var negative = datastorage[day].netBasalNegative[h]; - var net = positive + negative; - totalPositive[h] += positive; - totalNegative[h] += negative; - if (positive + negative > 0) positivesCount[h] += 1; - else if (positive + negative < 0) negativesCount[h] += 1; - totalNet[h] += net; - var color = Math.abs(net) < 0.019 ? "black" : (net < 0 ? "red" : "lightgreen"); - $('').appendTo(tr); - } - table.append(tr); - } - }); - if (days > 0) { - var tr = $(''); - $('').appendTo(tr); - for (var h = 0; h < 24; h++) { - var color = Math.abs(totalNet[h]) < 0.01 ? "white" : (totalNet[h] < 0 ? "red" : "lightgreen"); - $('').appendTo(tr); - } - table.append(tr); - } - - report.append('
'); - report.append('

' + translate('netIOB stats') + '

'); - report.append(translate('(temp basals must be rendered to display this report)')); - report.append('

'); - report.append(table); }; diff --git a/lib/report_plugins/index.js b/lib/report_plugins/index.js index 12cd024bdd23..b9566913b5cf 100644 --- a/lib/report_plugins/index.js +++ b/lib/report_plugins/index.js @@ -18,7 +18,6 @@ function init() { , require('./success')() , require('./calibrations')() , require('./treatments')() - , require('./profiles')() ]; consts.scaleYFromSettings = function scaleYFromSettings (client) { @@ -39,13 +38,8 @@ function init() { plugins.consts = consts; - plugins.utils = require('./utils')({ - //TODO: refactor so all this happens after init somehow - // until then use some defaults so things don't blow up - language: require('../language')() - , settings: {} - }); - + plugins.utils = require('./utils')(); + plugins.addHtmlFromPlugins = function addHtmlFromPlugins(client) { plugins.eachPlugin(function addHtml(p) { // add main plugin html diff --git a/lib/report_plugins/profiles.js b/lib/report_plugins/profiles.js deleted file mode 100644 index df055b525b39..000000000000 --- a/lib/report_plugins/profiles.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; - -var profiles = { - name: 'profiles' - , label: 'Profiles' - , pluginType: 'report' -}; - -function init() { - return profiles; -} - -module.exports = init; - -profiles.html = function html(client) { - var translate = client.translate; - var a = translate('Database records'); - var ret = - '

' + translate('Profiles') + '

' - + '
' + translate('Database records') + ' ' - + '
' - + '
' - + '
' - + '
' - ; - return ret; -}; - -profiles.css = - '#profiles-chart {' - + ' width: 100%;' - + ' height: 100%;' - + '}' - ; - -profiles.report = function report_profiles(datastorage, sorteddaystoshow, options) { - var Nightscout = window.Nightscout; - var client = Nightscout.client; - var translate = client.translate; - - var profileRecords = datastorage.profiles; - var databaseRecords = $('#profiles-databaserecords'); - - databaseRecords.empty(); - for (var r = 0; r < profileRecords.length; r++ ) { - databaseRecords.append(''); - } - databaseRecords.unbind().bind('change',recordChange); - - recordChange(); - - function recordChange (event) { - if ($('#profiles-databaserecords option').length < 1) - return; - var currentindex = databaseRecords.val(); - var currentrecord = profileRecords[currentindex]; - - var table = $('
' + hour + '
' + report_plugins.utils.localeDate(day) + '' + - '' + negative.toFixed(2) + '' + '
' + - '' + positive.toFixed(2) + '' + '
' + - '' + net.toFixed(2) + '' + - '
' + '' + translate('Average') + " " + days + " " + translate('days') + '' + '' + - '' + (totalNegative[h] / days).toFixed(2) + ' (' + negativesCount[h] + ')' + '' + '
' + - '' + (totalPositive[h] / days).toFixed(2) + ' (' + positivesCount[h] + ')' + '' + '
' + - '' + (totalNet[h] / days).toFixed(2) + '' + - '
'); - var tr = $(''); - - $('#profiles-default').val(currentrecord.defaultProfile); - for (var key in currentrecord.store) { - if (currentrecord.store.hasOwnProperty(key)) { - tr.append(displayRecord(currentrecord.store[key], key)) - } - } - - table.append(tr); - - $('#profiles-chart').empty().append(table); - - if (event) { - event.preventDefault(); - } - } - - function displayRecord(record, name) { - var td = $('
'); - var table = $(''); - - table.append($('').append($('').append($('').append($('').append($('').append($('').append($('').append($('').append($('').append($('').should.be.greaterThan(-1); //dailystats - result.indexOf('td class="tdborder" style="background-color:#8f8">Normal: ').should.be.greaterThan(-1); // distribution + result.indexOf('td class="tdborder" style="background-color:#8f8">Normal: ').should.be.greaterThan(-1); // distribution result.indexOf('').should.be.greaterThan(-1); // hourlystats result.indexOf('
').should.be.greaterThan(-1); //success result.indexOf('CAL: Scale: 1.10 Intercept: 31102 Slope: 776.91').should.be.greaterThan(-1); //calibrations diff --git a/tests/utils.test.js b/tests/utils.test.js index be0b298290d3..86ea7ea12a06 100644 --- a/tests/utils.test.js +++ b/tests/utils.test.js @@ -3,13 +3,12 @@ require('should'); describe('utils', function ( ) { - var utils = require('../lib/utils')({ - language: require('../lib/language')() - , settings: { - alarmTimeagoUrgentMins: 30 - , alarmTimeagoWarnMins: 15 - } - }); + var settings = { + alarmTimeagoUrgentMins: 30 + , alarmTimeagoWarnMins: 15 + }; + + var utils = require('../lib/utils')(settings); it('format numbers', function () { utils.toFixed(5.499999999).should.equal('5.50'); diff --git a/views/clock-color.html b/views/clock-color.html deleted file mode 100644 index 06c0fb9ba829..000000000000 --- a/views/clock-color.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - Nightscout - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
- - - - - - - diff --git a/views/clock.html b/views/clock.html deleted file mode 100644 index 95f56a1e3f5a..000000000000 --- a/views/clock.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Nightscout BG NOW - - - - - -
-
-

-
-
- - - - - - diff --git a/views/nightscout.appcache b/views/nightscout.appcache deleted file mode 100644 index 70716f344875..000000000000 --- a/views/nightscout.appcache +++ /dev/null @@ -1,34 +0,0 @@ -CACHE MANIFEST - -/images/launch.png -/images/apple-touch-icon-57x57.png -/images/apple-touch-icon-60x60.png -/images/apple-touch-icon-72x72.png -/images/apple-touch-icon-76x76.png -/images/apple-touch-icon-114x114.png -/images/apple-touch-icon-120x120.png -/images/apple-touch-icon-144x144.png -/images/apple-touch-icon-152x152.png -/images/apple-touch-icon-180x180.png -/images/favicon-32x32.png -/images/android-chrome-192x192.png -/images/favicon-96x96.png -/images/favicon-16x16.png -/manifest.json -/images/favicon.ico -/images/mstile-144x144.png -/css/ui-darkness/jquery-ui.min.css -/audio/alarm.mp3 -/audio/alarm2.mp3 -/css/ui-darkness/images/ui-icons_ffffff_256x240.png -/css/ui-darkness/images/ui-icons_cccccc_256x240.png -/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png -/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png -/css/main.css?v=<%= locals.cachebuster %> -/js/bundle.js?v=<%= locals.cachebuster %> -/socket.io/socket.io.js?v=<%= locals.cachebuster %> -/js/client.js?v=<%= locals.cachebuster %> -/images/logo2.png - -NETWORK: -* diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index a8e969c1e337..000000000000 --- a/webpack.config.js +++ /dev/null @@ -1,108 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); - -var pluginArray = []; - -if (process.env.NODE_ENV !== 'development') { - - console.log('Production environment detected, enabling UglifyJsPlugin'); - - var uglify = new webpack.optimize.UglifyJsPlugin({ - compress: { - warnings: false - }, - output: { - comments: false - } - }); - - pluginArray.push(uglify); - -} - -if (process.env.NODE_ENV === 'development') { - - - console.log('Development environment detected, enabling Bundle Analyzer'); - - var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; - - pluginArray.push(new BundleAnalyzerPlugin({ - // Can be `server`, `static` or `disabled`. - // In `server` mode analyzer will start HTTP server to show bundle report. - // In `static` mode single HTML file with bundle report will be generated. - // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`. - analyzerMode: 'static', - // Host that will be used in `server` mode to start HTTP server. - analyzerHost: '127.0.0.1', - // Port that will be used in `server` mode to start HTTP server. - analyzerPort: 8888, - // Path to bundle report file that will be generated in `static` mode. - // Relative to bundles output directory. - reportFilename: 'bundle_report.html', - // Module sizes to show in report by default. - // Should be one of `stat`, `parsed` or `gzip`. - // See "Definitions" section for more information. - defaultSizes: 'parsed', - // Automatically open report in default browser - openAnalyzer: true, - // If `true`, Webpack Stats JSON file will be generated in bundles output directory - generateStatsFile: false, - // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`. - // Relative to bundles output directory. - statsFilename: 'stats.json', - // Options for `stats.toJson()` method. - // For example you can exclude sources of your modules from stats file with `source: false` option. - // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21 - statsOptions: null, - // Log level. Can be 'info', 'warn', 'error' or 'silent'. - logLevel: 'info' - })); - -} - -var jq = new webpack.ProvidePlugin({ - $: "jquery", - jQuery: "jquery", - "window.jQuery": "jquery'", - "window.$": "jquery" -}); - -pluginArray.push(jq); - -module.exports = { - context: path.resolve(__dirname, '.'), - entry: { - app: './bundle/bundle.source.js' - }, - output: { - path: path.resolve(__dirname, './tmp'), - publicPath: '/', - filename: 'js/bundle.js' - }, - devtool: "#inline-source-map", - plugins: pluginArray, - module: { - rules: [{ - test: /\.(jpe?g|png|gif)$/i, - loader: "file-loader", - query: { - name: '[name].[ext]', - outputPath: 'images/' - //the images will be emmited to public/assets/images/ folder - //the images will be put in the DOM + + + diff --git a/static/images/DoubleUp.svg b/static/images/DoubleUp.svg new file mode 100755 index 000000000000..bff31cd42bb1 --- /dev/null +++ b/static/images/DoubleUp.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/static/images/Flat.svg b/static/images/Flat.svg new file mode 100755 index 000000000000..a80fb5365db0 --- /dev/null +++ b/static/images/Flat.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/FortyFiveDown.svg b/static/images/FortyFiveDown.svg new file mode 100755 index 000000000000..d37223969cae --- /dev/null +++ b/static/images/FortyFiveDown.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/FortyFiveUp.svg b/static/images/FortyFiveUp.svg new file mode 100755 index 000000000000..00c8df99f7ee --- /dev/null +++ b/static/images/FortyFiveUp.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/NONE.svg b/static/images/NONE.svg new file mode 100644 index 000000000000..397da4d77fea --- /dev/null +++ b/static/images/NONE.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/SingleDown.svg b/static/images/SingleDown.svg new file mode 100755 index 000000000000..479323b7ada0 --- /dev/null +++ b/static/images/SingleDown.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/SingleUp.svg b/static/images/SingleUp.svg new file mode 100755 index 000000000000..d8a47c702651 --- /dev/null +++ b/static/images/SingleUp.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/images/launch.png b/static/images/launch.png new file mode 100644 index 0000000000000000000000000000000000000000..50087db9a96198aa7f0ddb57117af4ab00db75ca GIT binary patch literal 3111 zcmbVOdpJ~iA0L%+o61TmVGJpZxf#Qm%vg+Dj9i9}2xDdljhSY~Wn7jnDyv$T!ivo+ zgeEn`iY2`6qe9l84JD-_$%HN89bNW)|JY~$c+c~k^ZWh2=kxjAzt1@-Zmtecr5#ET z2n6cnNcNDeS*y3gTG>;1^jME<+0M5E`JU`xel(5Cgjh4!K}?tvix$H4VA2?Zqn%7k z2xKiMlnU}eiVK0xW+7>-7-S5KBV$7#mR2zw8aPX&?->o4PiewR8|z)5i*+|$zn$E zoybJE>(!@Hm{UwT%T9u)tvK%mH&da~o?s7K1TIlks-u-*o&P*A9=x0(g6C z3sc-@uC=Kdo@{Ch;B4$M=4N>OH?C6zk57xBGr!plmD&Bu1^$ssu;nsod^VTLW*_<1 z0d9xcd^Yben*+18U9Gq|Y!8J-4~$ zYk|X=V9l|36C49=W)g%CqM4wXbW=K>W@>=}Fz~N@#{ZK&l*}R2YMcB|+k6wrdU198 z*AU1Ke~l3{LN+^G*^rE;bEjnkhIVtI+I4nzW@l#)4i1);m8q(#*3{G_Cns~cTuVz! zUteDX1B2Pw*@=k>IXSuI1~8a{bjZ#dAjI-XBgGQg7H=J{(uRC)Xt~+u!~k7Xa;q{u73W5gzp%G< z-Y4hGZM=qkd6~-2U_x>%^u`+&lIwh6OzAbSd~b8bQE;)o(a(n}|9j^5qj>>E3DEUc z)MjR5Zag4y2g@1?@8*h`T?f3brBcBjfmdxoY_gpl>b6dD)o2@~x-3fJ7s?_A9PvDC ztq?yA8-qPvi7c*l%v2nb-WDtZcG5CGK61Zl6usE~$;c~{tKfVp`dtT?Q|iO+C8tTH z8OR)0VLPmM;S54@E52KQAIj+V_r1pxabCgt+0}Ku03DH^49NHy|2AoTzwh$T9pG7IPYBulAGwL zM(8cj5Z$M>HA6aUJFSt!r{%9oaB-d$;-xo`B#D%Fwt};kk|HtI7@A$voa|6bb zR_>f%-z`#kj4ioxJ$tur>Tg+>2%;?%A}u*0}{6$m8>(4;3_}fWeTh% zk~eIH-tAzNVK~~U%7_VWx?ppb!tEo981C=sikYX@*BFX__HaGll+mKbmj?gr41_$5o*a$GS2qSuy`oL; z()HHeeJszXJy337-8>zxpZ{c9Mf6~tF;_#`mF3!;EwqsnZG4{Oahddik~$i z6hqN@965LKUvE?>kx$Dkdfrs*4qimEZrlxS&uNR+nAY~LJmd#>U4(`kE&4QUie_D0 zk~h4rQtGAA+sD}P5k}PxJ1}(9-Zuic2K&WRy}y;9>0K3a=Gpm%)GXEGc?GrZ;CfVz zf22N8w0Y67)qZX;uxzxbTXSQc-%JsAi^N?%>Y?er`5B`i>y`FD)3uzM=87i8*mF?q zq)R=1NWU#oKRGG;Mdlz^(bq8lVPVe1SudUVYFcuAR-CXoRyWUGyzNm`t@w$1icYG! zt$%*hCoiw1&@0iUt!qTm%If6Gs*RVbe0-|F8BGl*sgrS=$^!M!N~1Nat57bb?aDZh zwa@s4KIZbL7-1>$Lp-FVLwZ-ea6*{$M}hDlqM)LuX6&5B%Z8!4w#AgwrHC=BW9t3# ziw@@=%x~L^QLMA-XgPSnYq(fhx=vmRAvzvWED_f(_76O2fhTaguBPuXwvMS z(V0;2L$(9S!Xh{3;Gb%sw);kK3H%i*shGbUTVUV|!aIpVz)W{Rr&)Yybc>LnE7j7@ z%6*+wqGde!!wCxP)8mtcOFpf5ghkGU32Ap#OU>D8Qyx*hnNk!>6Ag8cG#+C!DA&7D^`6QZsSCri7!bH? zVrYjHbY4`$C4i)WrSAkUkC|JQV%HgK4(V*oZ>djt{?;<%(vYEa6Q@@C2i08kJwxS-)M(LnZ(F~=A*qaNff7MBvPa*gi&0eqBW^WziStDOJ?QDX zGbDwUYX+xzhx(RCS=|Xu&jy`^wk2^Jyniv6t|wv-jAY-;=p>VORD8S6 z8PrB;jEI#Sf&{1Ads?6|4X!BfM=mp@`|ko;Y-(b)Bo>Gq-XMmWfYLLvL4Q=m@4%3knh)XdeJu_G&U l?!u=7Uq0)~1Bq)?Ad5wh1b{H}&FZhalbtKM!Y1(ee*jJIRXG3v literal 0 HcmV?d00001 diff --git a/static/js/client.js b/static/js/client.js index df43f5229d8d..179edcf68dfe 100644 --- a/static/js/client.js +++ b/static/js/client.js @@ -1,3 +1,11 @@ 'use strict'; -window.Nightscout.client.init(); +$(document).on('online', function() { + console.log('Application got online event, reloading'); + window.location.reload(); +}); + +$(document).ready(function() { + console.log('Application got ready event'); + window.Nightscout.client.init(); +}); \ No newline at end of file diff --git a/static/radio.html b/static/radio.html deleted file mode 100644 index 57af18927ef4..000000000000 --- a/static/radio.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Nightscout radio - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Nightscout

-
- -
-

Audio

-

- Convert glucose to frequency. - -

-
- -
- -
- Authentication status: - - - - - - - - - - - diff --git a/static/report/compare.html b/static/report/compare.html index 532c8c3f2f32..76fdcd7e528d 100644 --- a/static/report/compare.html +++ b/static/report/compare.html @@ -23,10 +23,10 @@ - + - +

Nightscout performance comparison

@@ -112,8 +112,10 @@

Nightscout performance Authentication status: - + + + diff --git a/static/report/js/flotcandle.js b/static/report/js/flotcandle.js index 3ac641d1cf58..cdf6a5faa0a2 100644 --- a/static/report/js/flotcandle.js +++ b/static/report/js/flotcandle.js @@ -84,4 +84,4 @@ name: 'candle', version: '1.0' }); -})(jQuery); \ No newline at end of file +})($); diff --git a/static/report/js/report.js b/static/report/js/report.js index 8c337ae70d83..60d70af16204 100644 --- a/static/report/js/report.js +++ b/static/report/js/report.js @@ -223,6 +223,7 @@ options.notes = $('#rp_optionsnotes').is(':checked'); options.food = $('#rp_optionsfood').is(':checked'); options.insulin = $('#rp_optionsinsulin').is(':checked'); + options.insulindistribution = $('#rp_optionsdistribution').is(':checked'); options.carbs = $('#rp_optionscarbs').is(':checked'); options.scale = ( $('#rp_linear').is(':checked') ? report_plugins.consts.SCALE_LINEAR : report_plugins.consts.SCALE_LOG ); options.order = ( $('#rp_oldestontop').is(':checked') ? report_plugins.consts.ORDER_OLDESTONTOP : report_plugins.consts.ORDER_NEWESTONTOP ); @@ -445,10 +446,14 @@ if (options.order === report_plugins.consts.ORDER_NEWESTONTOP) { sorteddaystoshow.reverse(); } - loadProfileSwitch(from, function loadProfileSwitchCallback() { - $('#info > b').html(''+translate('Rendering')+' ...'); - window.setTimeout(function () {showreports(options); }, 0); + loadProfileSwitch(function loadProfileSwitchCallback() { + loadProfiles(function loadProfilesCallback() { + $('#info > b').html('' + translate('Rendering') + ' ...'); + window.setTimeout(function () { + showreports(options); + }, 0); }); + }); } } @@ -484,6 +489,7 @@ datastorage.tempbasalTreatments = datastorage.tempbasalTreatments.concat(datastorage[day].tempbasalTreatments); }); datastorage.tempbasalTreatments = Nightscout.client.ddata.processDurations(datastorage.tempbasalTreatments); + datastorage.treatments.sort(function sort(a, b) {return a.mills - b.mills; }); for (var d in daystoshow) { if (daystoshow.hasOwnProperty(d)) { @@ -539,7 +545,7 @@ function loadData(day, options, callback) { // check for loaded data - if (options.openAps && datastorage[day] && !datastorage[day].devicestatus) { + if ((options.openAps || options.iob || options.cob) && datastorage[day] && !datastorage[day].devicestatus.length) { // OpenAPS requested but data not loaded. Load anyway ... } else if (datastorage[day] && day !== moment().format('YYYY-MM-DD')) { callback(day); @@ -596,7 +602,7 @@ }); } else if (element.type === 'cal') { calData.push({ - mills: element.date + mills: element.date + 1 , d: element.dateString , scale: element.scale , intercept: element.intercept @@ -676,7 +682,7 @@ }); } - function loadProfileSwitch(from, callback) { + function loadProfileSwitch(callback) { $('#info > b').html(''+translate('Loading profile switch data') + ' ...'); var tquery = '?find[eventType]=Profile Switch'; $.ajax('/api/v1/treatments.json'+tquery, { @@ -694,7 +700,21 @@ callback(); }); } - + + function loadProfiles(callback) { + $('#info > b').html(''+translate('Loading profiles') + ' ...'); + $.ajax('/api/v1/profile.json', { + headers: client.headers() + , success: function (records) { + datastorage.profiles = records; + } + , error: function () { + datastorage.profiles = []; + } + }).done(callback); + } + + function processData(data, day, options, callback) { if (daystoshow[day].treatmentsonly) { datastorage[day] = data; diff --git a/tests/admintools.test.js b/tests/admintools.test.js index 59230ff71a2f..a2374ff1ff2e 100644 --- a/tests/admintools.test.js +++ b/tests/admintools.test.js @@ -57,11 +57,15 @@ var someData = { describe('admintools', function ( ) { var self = this; - + this.timeout(30000); before(function (done) { benv.setup(function() { - self.$ = require('jquery'); - self.$.localStorage = require('./fixtures/localstorage'); + + benv.require(__dirname + '/../tmp/js/bundle.js'); + + self.$ = $; + + self.localCookieStorage = self.localStorage = self.$.localStorage = require('./fixtures/localstorage'); self.$.fn.tipsy = function mockTipsy ( ) { }; @@ -79,7 +83,7 @@ describe('admintools', function ( ) { }); }; - var indexHtml = read(__dirname + '/../static/admin/index.html', 'utf8'); + var indexHtml = read(__dirname + '/../views/adminindex.html', 'utf8'); self.$('body').html(indexHtml); //var filesys = require('fs'); @@ -90,7 +94,7 @@ describe('admintools', function ( ) { url = url.url; } //logfile.write(url+'\n'); - //console.log(url,opts); + //console.log('Mock ajax:',url,opts); if (opts && opts.success && opts.success.call) { if (url.indexOf('/api/v1/treatments.json?&find[created_at][$gte]=')===0) { url = '/api/v1/treatments.json?&find[created_at][$gte]='; @@ -136,12 +140,17 @@ describe('admintools', function ( ) { var d3 = require('d3'); //disable all d3 transitions so most of the other code can run with jsdom d3.timer = function mockTimer() { }; + + var cookieStorageType = self.localStorage._type benv.expose({ $: self.$ , jQuery: self.$ , d3: d3 , serverSettings: serverSettings + , localCookieStorage: self.localStorage + , cookieStorageType: self.localStorage + , localStorage: self.localStorage , io: { connect: function mockConnect ( ) { return { @@ -162,7 +171,7 @@ describe('admintools', function ( ) { } }); - benv.require(__dirname + '/../bundle/bundle.source.js'); + //benv.require(__dirname + '/../bundle/bundle.source.js'); benv.require(__dirname + '/../static/admin/js/admin.js'); done(); @@ -194,6 +203,7 @@ describe('admintools', function ( ) { }; client.init(); + client.dataUpdate(nowData); //var result = $('body').html(); diff --git a/tests/api.treatments.test.js b/tests/api.treatments.test.js index 6a1608158c47..34600b66cb04 100644 --- a/tests/api.treatments.test.js +++ b/tests/api.treatments.test.js @@ -1,11 +1,12 @@ 'use strict'; +var _ = require('lodash'); var request = require('supertest'); var should = require('should'); var language = require('../lib/language')(); describe('Treatment API', function ( ) { - this.timeout(2000); + this.timeout(10000); var self = this; var api = require('../lib/api/'); @@ -30,36 +31,8 @@ describe('Treatment API', function ( ) { }); it('post single treatments', function (done) { - var doneCalled = false; - - self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { - self.ctx.ddata.treatments.length.should.equal(3); - self.ctx.ddata.treatments[0].mgdl.should.equal(100); - should.not.exist(self.ctx.ddata.treatments[0].eventTime); - should.not.exist(self.ctx.ddata.treatments[0].notes); - - should.not.exist(self.ctx.ddata.treatments[1].eventTime); - self.ctx.ddata.treatments[1].insulin.should.equal(2); - self.ctx.ddata.treatments[2].carbs.should.equal(30); - - //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted - if (!doneCalled) { done(); } - - doneCalled = true; - }); self.ctx.treatments().remove({ }, function ( ) { - request(self.app) - .post('/api/treatments/') - .set('api-secret', self.env.api_secret || '') - .send({eventType: 'BG Check', glucose: 100, preBolus: '0', glucoseType: 'Finger', units: 'mg/dl', notes: ''}) - .expect(200) - .end(function (err) { - if (err) { - done(err); - } - }); - request(self.app) .post('/api/treatments/') .set('api-secret', self.env.api_secret || '') @@ -68,6 +41,19 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); + } else { + self.ctx.treatments.list({}, function (err, list) { + var sorted = _.sortBy(list, function (treatment) { + return treatment.created_at; + }); + sorted.length.should.equal(2); + sorted[0].glucose.should.equal(100); + should.not.exist(sorted[0].eventTime); + sorted[0].insulin.should.equal(2); + sorted[1].carbs.should.equal(30); + + done(); + }); } }); @@ -75,19 +61,6 @@ describe('Treatment API', function ( ) { }); it('post a treatment array', function (done) { - var doneCalled = false; - - self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { - self.ctx.ddata.treatments.length.should.equal(3); - should.not.exist(self.ctx.ddata.treatments[0].eventTime); - should.not.exist(self.ctx.ddata.treatments[1].eventTime); - - //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted - if (!doneCalled) { done(); } - - doneCalled = true; - }); - self.ctx.treatments().remove({ }, function ( ) { request(self.app) .post('/api/treatments/') @@ -100,24 +73,20 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); + } else { + self.ctx.treatments.list({}, function (err, list) { + list.length.should.equal(3); + should.not.exist(list[0].eventTime); + should.not.exist(list[1].eventTime); + + done(); + }); } }); }); }); it('post a treatment array and dedupe', function (done) { - var doneCalled = false; - - self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { - self.ctx.ddata.treatments.length.should.equal(3); - self.ctx.ddata.treatments[0].mgdl.should.equal(100); - - //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted - if (!doneCalled) { done(); } - - doneCalled = true; - }); - self.ctx.treatments().remove({ }, function ( ) { var now = (new Date()).toISOString(); request(self.app) @@ -138,6 +107,20 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); + } else { + self.ctx.treatments.list({}, function (err, list) { + var sorted = _.sortBy(list, function (treatment) { + return treatment.created_at; + }); + + if (sorted.length !== 3) { + console.info('unexpected result length, sorted treatments:', sorted); + } + sorted.length.should.equal(3); + sorted[0].glucose.should.equal(100); + + done(); + }); } }); }); diff --git a/tests/ar2.test.js b/tests/ar2.test.js index 28ec4f5579ea..94c494869c90 100644 --- a/tests/ar2.test.js +++ b/tests/ar2.test.js @@ -147,6 +147,9 @@ describe('ar2', function ( ) { }); it('should handle alexa requests', function (done) { + var now = Date.now(); + var before = now - FIVE_MINS; + ctx.ddata.sgvs = [{mgdl: 100, mills: before}, {mgdl: 105, mills: now}]; var sbx = prepareSandbox(); diff --git a/tests/basalprofileplugin.test.js b/tests/basalprofileplugin.test.js index 40ac9563b23f..0bcfd3bc268f 100644 --- a/tests/basalprofileplugin.test.js +++ b/tests/basalprofileplugin.test.js @@ -8,6 +8,7 @@ describe('basalprofile', function ( ) { settings: {} , language: require('../lib/language')() }; + ctx.language.set('en'); ctx.ddata = require('../lib/data/ddata')(); ctx.notifications = require('../lib/notifications')(env, ctx); @@ -66,7 +67,7 @@ describe('basalprofile', function ( ) { , language: require('../lib/language')() }; - var time = new Date('2015-06-21T00:00:00').getTime(); + var time = new Date('2015-06-21T00:00:00+00:00').getTime(); var sbx = sandbox.clientInit(ctx, time, data); @@ -85,7 +86,7 @@ describe('basalprofile', function ( ) { , language: require('../lib/language')() }; - var time = new Date('2015-06-21T00:00:00').getTime(); + var time = new Date('2015-06-21T00:00:00+00:00').getTime(); var sbx = sandbox.clientInit(ctx, time, data); diff --git a/tests/bgnow.test.js b/tests/bgnow.test.js index 7a21da64acc6..233f1c13dbc5 100644 --- a/tests/bgnow.test.js +++ b/tests/bgnow.test.js @@ -1,7 +1,7 @@ 'use strict'; -require('should'); -var _ =require('lodash'); +var should = require('should'); +var _ = require('lodash'); var FIVE_MINS = 300000; var SIX_MINS = 360000; @@ -23,7 +23,7 @@ describe('BG Now', function ( ) { updatePillText: function mockedUpdatePillText (plugin, options) { options.label.should.equal(ctx.settings.units); options.value.should.equal('+5'); - options.info.length.should.equal(0); + should.not.exist(options.info); done(); } , language: { translate: function(text) { return text; } } diff --git a/tests/careportal.test.js b/tests/careportal.test.js index 83a3ce2ee416..1241ebe703a2 100644 --- a/tests/careportal.test.js +++ b/tests/careportal.test.js @@ -35,8 +35,9 @@ describe('client', function ( ) { }); it ('open careportal, and enter a treatment', function (done) { - var client = require('../lib/client'); + var client = window.Nightscout.client; + var hashauth = require('../lib/hashauth'); hashauth.init(client,$); hashauth.verifyAuthentication = function mockVerifyAuthentication(next) { @@ -49,7 +50,6 @@ describe('client', function ( ) { client.dataUpdate(nowData); client.careportal.prepareEvents(); - client.careportal.toggleDrawer(); $('#eventType').val('Snack Bolus'); $('#glucoseValue').val('100'); diff --git a/tests/fixtures/headless.js b/tests/fixtures/headless.js index 6606fdb689b2..567262ad04de 100644 --- a/tests/fixtures/headless.js +++ b/tests/fixtures/headless.js @@ -10,12 +10,19 @@ function headless (benv, binding) { function init (opts, callback) { var localStorage = opts.localStorage || './localstorage'; - var htmlFile = opts.htmlFile || __dirname + '/../../static/index.html'; + var htmlFile = opts.htmlFile || __dirname + '/../../views/index.html'; var serverSettings = opts.serverSettings || require('./default-server-settings'); var someData = opts.mockAjax || { }; benv.setup(function() { - self.$ = require('jquery'); - self.$.localStorage = require(localStorage); + + benv.require(__dirname + '/../../tmp/js/bundle.js'); + + self.$ = $; + + self.localCookieStorage = self.localStorage = self.$.localStorage = require('./localstorage'); + + //self.$ = require('jquery'); + //self.$.localStorage = require(localStorage); self.$.fn.tipsy = function mockTipsy ( ) { }; @@ -123,6 +130,9 @@ function headless (benv, binding) { , jQuery: self.$ , d3: d3 , serverSettings: serverSettings + , localCookieStorage: self.localStorage + , cookieStorageType: self.localStorage + , localStorage: self.localStorage , io: { connect: function mockConnect ( ) { return { @@ -162,4 +172,3 @@ function headless (benv, binding) { } module.exports = headless; - diff --git a/tests/fixtures/localstorage.js b/tests/fixtures/localstorage.js index 0942cc2fffc0..d1b463e49283 100644 --- a/tests/fixtures/localstorage.js +++ b/tests/fixtures/localstorage.js @@ -6,12 +6,21 @@ var localstorage = { get: function Get(item) { return browserStorage[item] || null; } + , getItem: function Get(item) { + return browserStorage[item] || null; + } , set: function Set(item, value) { browserStorage[item] = value; } + , setItem: function Set(item, value) { + browserStorage[item] = value; + } , remove: function Remove(item) { delete browserStorage[item]; } + , removeItem: function Remove(item) { + delete browserStorage[item]; + } , removeAll: function RemoveAll() { browserStorage = []; } diff --git a/tests/hashauth.test.js b/tests/hashauth.test.js index 46073983a5f0..21f249a57a70 100644 --- a/tests/hashauth.test.js +++ b/tests/hashauth.test.js @@ -63,6 +63,7 @@ describe('hashauth', function ( ) { */ it ('should make module unauthorized', function () { + this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -74,13 +75,14 @@ describe('hashauth', function ( ) { client.init(); - hashauth.inlineCode().indexOf('Not authorized').should.be.greaterThan(0); + hashauth.inlineCode().indexOf('Unauthorized').should.be.greaterThan(0); hashauth.isAuthenticated().should.equal(false); var testnull = (hashauth.hash()===null); testnull.should.equal(true); }); it ('should make module authorized', function () { + this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -97,6 +99,9 @@ describe('hashauth', function ( ) { }); it ('should store hash and the remove authentication', function () { + + this.timeout(50000); + var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); var localStorage = require('./fixtures/localstorage'); diff --git a/tests/iob.test.js b/tests/iob.test.js index 39968f25f4dd..30872e4fb4d9 100644 --- a/tests/iob.test.js +++ b/tests/iob.test.js @@ -6,6 +6,7 @@ var should = require('should'); describe('IOB', function() { var ctx = {}; ctx.language = require('../lib/language')(); + ctx.language.set('en'); var iob = require('../lib/plugins/iob')(ctx); @@ -191,6 +192,14 @@ describe('IOB', function() { }); }); + it('should not blow up with null IOB data from openaps', function () { + var devicestatus = [_.merge(OPENAPS_DEVICESTATUS, { mills: time - 1, openaps: {iob: null } })]; + iob.calcTotal(treatments, devicestatus, profile, time).should.containEql({ + source: 'Care Portal', + display: '3.00' + }); + }); + it('should return IOB data from openaps post AMA (an array)', function () { var devicestatus = [_.merge(OPENAPS_DEVICESTATUS, { mills: time - 1, openaps: {iob: [{ iob: 0.047, diff --git a/tests/openaps-storage.test.js b/tests/openaps-storage.test.js index d40a034b836d..48c2eb7764d0 100644 --- a/tests/openaps-storage.test.js +++ b/tests/openaps-storage.test.js @@ -65,8 +65,6 @@ describe('openaps storage', function () { should.not.exist(err); should.exist(results); - console.info('>>>devicestatus results', results); - results.length.should.equal(1); results[0].openaps.enacted.eventualBG.should.equal(82); diff --git a/tests/openaps.test.js b/tests/openaps.test.js index 7a106041dbff..798e3519960e 100644 --- a/tests/openaps.test.js +++ b/tests/openaps.test.js @@ -124,6 +124,121 @@ var statuses = [{ tick: '+1' } } +} +,{ + "_id": { + "$oid": "59aef8cb444d1500109fc8fd" + }, + "device": "openaps://edi1", + "openaps": { + "iob": { + "iob": 1.016, + "activity": 0.0143, + "bolussnooze": 0, + "basaliob": 0.893, + "netbasalinsulin": 0.7, + "hightempinsulin": 2.5, + "microBolusInsulin": 1.7, + "microBolusIOB": 0.933, + "lastBolusTime": 1504638182000, + "timestamp": "2017-09-05T19:18:31.000Z" + }, + "suggested": { + "insulinReq": -0.06, + "bg": 117, + "reservoir": "104.5", + "temp": "absolute", + "snoozeBG": 80, + "rate": 0.75, + "minPredBG": 78, + "IOB": 1.016, + "reason": "COB: 0, Dev: -6, BGI: -2.22, ISF: 31, Target: 80, minPredBG 78, IOBpredBG 78; Eventual BG 80 >= 80, insulinReq -0.06. temp 0.2<0.75U/hr. ", + "COB": 0, + "eventualBG": 80, + "duration": 30, + "tick": -3, + "deliverAt": "2017-09-05T19:18:43.563Z", + "timestamp": "2017-09-05T19:18:43.000Z" + }, + "enacted": { + "insulinReq": -0.06, + "received": true, + "bg": 117, + "reservoir": "104.5", + "temp": "absolute", + "snoozeBG": 80, + "timestamp": "2017-09-05T19:18:49.000Z", + "predBGs": { + "IOB": [ + 117, + 114, + 111, + 108, + 106, + 104, + 102, + 100, + 98, + 97, + 96, + 95, + 94, + 93, + 92, + 91, + 90, + 89, + 88, + 87, + 86, + 86, + 85, + 84, + 83, + 83, + 82, + 81, + 81, + 81, + 80, + 80, + 79, + 79, + 79, + 79, + 78 + ] + }, + "minPredBG": 78, + "deliverAt": "2017-09-05T19:18:43.563Z", + "duration": 30, + "rate": 0.75, + "COB": 0, + "eventualBG": 80, + "reason": "COB: 0, Dev: -6, BGI: -2.22, ISF: 31, Target: 80, minPredBG 78, IOBpredBG 78; Eventual BG 80 >= 80, insulinReq -0.06. temp 0.2<0.75U/hr. ", + "tick": -3, + "IOB": 1.016 + } + }, + "pump": { + "clock": "2017-09-05T21:18:31+02:00", + "battery": { + "status": "normal", + "voltage": 1.55 + }, + "reservoir": 104.5, + "status": { + "status": "normal", + "bolusing": false, + "suspended": false, + "timestamp": "2017-09-05T19:18:29.000Z" + } + }, + "uploader": { + "batteryVoltage": 4131, + "battery": 95 + }, + "created_at": "2017-09-05T19:19:39.899Z" }]; var now = moment(statuses[0].created_at); diff --git a/tests/profileeditor.test.js b/tests/profileeditor.test.js index ba68dde6c87e..4791b139544f 100644 --- a/tests/profileeditor.test.js +++ b/tests/profileeditor.test.js @@ -71,7 +71,7 @@ var someData = { describe('Profile editor', function ( ) { - var self = this; + this.timeout(30000); var headless = require('./fixtures/headless')(benv, this); before(function (done) { @@ -84,12 +84,11 @@ describe('Profile editor', function ( ) { beforeEach(function (done) { var opts = { - htmlFile: __dirname + '/../static/profile/index.html' + htmlFile: __dirname + '/../views/profileindex.html' , mockProfileEditor: true , mockAjax: someData , benvRequires: [ - __dirname + '/../bundle/bundle.source.js' - , __dirname + '/../static/profile/js/profileeditor.js' + __dirname + '/../static/profile/js/profileeditor.js' ] }; headless.setup(opts, done); diff --git a/tests/reports.test.js b/tests/reports.test.js index b49ccd065af2..710b043c4b0e 100644 --- a/tests/reports.test.js +++ b/tests/reports.test.js @@ -174,7 +174,8 @@ exampleProfile[0].startDate.setMilliseconds(0); describe('reports', function ( ) { var self = this; var headless = require('./fixtures/headless')(benv, this); - + this.timeout(80000); + before(function (done) { done( ); }); @@ -185,13 +186,12 @@ describe('reports', function ( ) { beforeEach(function (done) { var opts = { - htmlFile: __dirname + '/../static/report/index.html' + htmlFile: __dirname + '/../views/reportindex.html' , mockProfileEditor: true , serverSettings: serverSettings , mockSimpleAjax: someData , benvRequires: [ - __dirname + '/../bundle/bundle.source.js' - , __dirname + '/../static/report/js/report.js' + __dirname + '/../static/report/js/report.js' ] }; headless.setup(opts, done); @@ -204,7 +204,7 @@ describe('reports', function ( ) { it ('should produce some html', function (done) { - var client = require('../lib/client'); + var client = window.Nightscout.client; var hashauth = require('../lib/hashauth'); hashauth.init(client,$); @@ -228,6 +228,8 @@ describe('reports', function ( ) { client.init(function afterInit ( ) { client.dataUpdate(nowData); + console.log('Sending profile to client'); + // Load profile, we need to operate in UTC client.sbx.data.profile.loadData(exampleProfile); @@ -261,12 +263,10 @@ describe('reports', function ( ) { //var logfile = filesys.createWriteStream('out.txt', { flags: 'a'} ) //logfile.write($('body').html()); - // console.log(result); - result.indexOf('Milk now').should.be.greaterThan(-1); // daytoday result.indexOf('50 g (1.67U)').should.be.greaterThan(-1); // daytoday result.indexOf('

').should.be.greaterThan(-1); //dailystats - result.indexOf('td class="tdborder" style="background-color:#8f8">Normal: ').should.be.greaterThan(-1); // distribution + result.indexOf('td class="tdborder" style="background-color:#8f8">Normal: ').should.be.greaterThan(-1); // distribution result.indexOf('').should.be.greaterThan(-1); // hourlystats result.indexOf('
').should.be.greaterThan(-1); //success result.indexOf('CAL: Scale: 1.10 Intercept: 31102 Slope: 776.91').should.be.greaterThan(-1); //calibrations diff --git a/tests/utils.test.js b/tests/utils.test.js index 86ea7ea12a06..be0b298290d3 100644 --- a/tests/utils.test.js +++ b/tests/utils.test.js @@ -3,12 +3,13 @@ require('should'); describe('utils', function ( ) { - var settings = { - alarmTimeagoUrgentMins: 30 - , alarmTimeagoWarnMins: 15 - }; - - var utils = require('../lib/utils')(settings); + var utils = require('../lib/utils')({ + language: require('../lib/language')() + , settings: { + alarmTimeagoUrgentMins: 30 + , alarmTimeagoWarnMins: 15 + } + }); it('format numbers', function () { utils.toFixed(5.499999999).should.equal('5.50'); diff --git a/static/admin/index.html b/views/adminindex.html similarity index 82% rename from static/admin/index.html rename to views/adminindex.html index 692575dd1b57..8a0f97b21964 100644 --- a/static/admin/index.html +++ b/views/adminindex.html @@ -25,10 +25,10 @@ - + - +
@@ -45,11 +45,8 @@

Admin Tools

Authentication status: - - - - - - + + + diff --git a/static/clock.html b/views/bgclock.html similarity index 83% rename from static/clock.html rename to views/bgclock.html index 149265cfb13d..0657c9e94c62 100644 --- a/static/clock.html +++ b/views/bgclock.html @@ -14,7 +14,7 @@ h1 { padding: 0; margin: 0; - font-size: 3500%; + font-size: 1500%; } html, body { padding: 0; @@ -38,10 +38,10 @@

+

- - + + + + + + diff --git a/views/clock.html b/views/clock.html new file mode 100644 index 000000000000..95f56a1e3f5a --- /dev/null +++ b/views/clock.html @@ -0,0 +1,78 @@ + + + + + Nightscout BG NOW + + + + + +
+
+

+
+
+ + + + + + diff --git a/static/food/index.html b/views/foodindex.html similarity index 92% rename from static/food/index.html rename to views/foodindex.html index 232e9829ea5b..cc506a46bb86 100644 --- a/static/food/index.html +++ b/views/foodindex.html @@ -24,11 +24,11 @@ - + - +
@@ -110,11 +110,8 @@

Food Editor

- - - - - - + + + diff --git a/static/index.html b/views/index.html similarity index 83% rename from static/index.html rename to views/index.html index e868d0cbe056..237c0297a5ce 100644 --- a/static/index.html +++ b/views/index.html @@ -1,56 +1,136 @@ - + + + + Nightscout - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - +
+
+

+

Loading the client

+
+
+
+
+
+
+
-
- - - - - - +
Nightscout
-
- +
+
-
+
-
+
-
+
-
-
').append('' + name + ''))); - table.append($('
').append('' + translate('Units') + ': ' + record.units))); - table.append($('
').append('' + translate('DIA') + ': ' + record.dia))); - table.append($('
').append('' + translate('Timezone') + ': ' + record.timezone))); - table.append($('
').append('' + translate('Carbs activity / absorption rate') + ': ' + record.carbs_hr))); - table.append($('
').append('' + translate('Insulin to carb ratio (I:C)') + ': ' + '
' + displayRanges(record.carbratio)))); - table.append($('
').append('' + translate('Insulin Sensitivity Factor (ISF)') + ': ' + '
' + displayRanges(record.sens)))); - table.append($('
').append('' + translate('Basal rates [unit/hour]') + ': ' + '
' + displayRanges(record.basal)))); - table.append($('
').append('' + translate('Target BG range [mg/dL,mmol/L]') + ': ' + '
' + displayRanges(record.target_low, record.target_high)))); - - td.append(table); - return td; - } - - function displayRanges(array, array2) { - var text = ''; - for (var i = 0; i < array.length; i++) { - text += array[i].time + ' : ' + array[i].value + (array2 ? ' - ' + array2[i].value : '') + '
'; - } - - return text; - } -}; diff --git a/lib/report_plugins/treatments.js b/lib/report_plugins/treatments.js index e6221c8b656c..f4743592427a 100644 --- a/lib/report_plugins/treatments.js +++ b/lib/report_plugins/treatments.js @@ -309,7 +309,7 @@ treatments.report = function report_treatments(datastorage, sorteddaystoshow, op .append($('
').attr('align','center').append(tr.glucose ? tr.glucose + ' ('+translate(tr.glucoseType)+')' : '')) .append($('').attr('align','center').append(tr.insulin ? tr.insulin.toFixed(2) : '')) .append($('').attr('align','center').append(tr.carbs ? tr.carbs : '')) - .append($('').attr('align','center').append(tr.duration ? tr.duration.toFixed(0) : '')) + .append($('').attr('align','center').append(tr.duration ? tr.duration : '')) .append($('').attr('align','center').append(tr.percent ? tr.percent : '')) .append($('').attr('align','center').append('absolute' in tr ? tr.absolute.toFixed(2) : '')) .append($('').attr('align','center').append(tr.profile ? tr.profile : '')) diff --git a/lib/treatments.js b/lib/treatments.js index 0ad9f4e8451a..61ce1b8e59a8 100644 --- a/lib/treatments.js +++ b/lib/treatments.js @@ -1,8 +1,6 @@ 'use strict'; var _ = require('lodash'); -var async = require('async'); - var find_options = require('./query'); function storage (env, ctx) { @@ -17,16 +15,18 @@ function storage (env, ctx) { if (_.isArray(objOrArray)) { var allDocs = []; - var errs = []; - async.eachSeries(objOrArray, function (obj, callback) { + var totalReturn = 0; + _.forEach(objOrArray, function (obj) { + var errs = []; upsert(obj, function upserted (err, docs) { + totalReturn++; allDocs = allDocs.concat(docs); errs.push(err); - callback(err, docs) + if (totalReturn === objOrArray.length) { + errs = _.compact(errs); + done(errs.length > 0 ? errs : null, allDocs); + } }); - }, function (err, docs) { - errs = _.compact(errs); - done(errs.length > 0 ? errs : null, allDocs); }); } else { upsert(objOrArray, function upserted (err, docs) { @@ -127,10 +127,6 @@ function storage (env, ctx) { , 'enteredBy' , 'boluscalc.foods._id' , 'notes' - , 'NSCLIENT_ID' - , 'percent' - , 'absolute' - , 'duration' ]; api.remove = remove; diff --git a/lib/utils.js b/lib/utils.js index da53e7002941..509208ddfc6e 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,15 +1,10 @@ 'use strict'; -var _ = require('lodash'); var moment = require('moment-timezone'); var units = require('./units')(); -function init(ctx) { - - var settings = ctx.settings; - var translate = ctx.language.translate; - var timeago = require('./plugins/timeago')(ctx); +function init(settings) { var utils = { }; @@ -39,35 +34,7 @@ function init(ctx) { return moment(datestring + ' ' + timestring, 'YYYY-MM-D HH:mm'); }; - - utils.deviceName = function deviceName (device) { - var last = device ? _.last(device.split('://')) : 'unknown'; - return _.first(last.split('/')); - }; - - utils.timeFormat = function timeFormat (m, sbx) { - var when; - if (m && sbx.data.inRetroMode) { - when = m.format('LT'); - } else if (m) { - when = utils.formatAgo(m, sbx.time); - } else { - when = 'unknown'; - } - - return when; - }; - - utils.formatAgo = function formatAgo (m, nowMills) { - var ago = timeago.calcDisplay({mills: m.valueOf()}, nowMills); - return translate('%1' + ago.shortLabel + (ago.shortLabel.length === 1 ? ' ago' : ''), { params: [(ago.value ? ago.value : '')]}); - }; - - utils.timeAt = function timeAt (prefix, sbx) { - return sbx.data.inRetroMode ? (prefix ? ' ' : '') + '@ ' : (prefix ? ', ' : ''); - }; - - return utils; + return utils; } module.exports = init; \ No newline at end of file diff --git a/lib/websocket.js b/lib/websocket.js index 1c49c82edf92..f790be3d3d72 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -106,12 +106,17 @@ function init (env, ctx, server) { } } + function pingClients ( ) { + io.to('PingReceivers').emit('ping'); + } + function listeners ( ) { io.sockets.on('connection', function onConnection (socket) { var socketAuthorization = null; var clientType = null; var timeDiff; var history; + var pingme; var remoteIP = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress; console.log(LOG_WS + 'Connection from client ID: ', socket.client.id, ' IP: ', remoteIP); @@ -262,16 +267,11 @@ function init (env, ctx, server) { // treatments deduping if (data.collection === 'treatments') { - var query; - if (data.data.NSCLIENT_ID) { - query = { NSCLIENT_ID: data.data.NSCLIENT_ID }; - } else { - query = { - created_at: data.data.created_at - , eventType: data.data.eventType - }; - } - + var query = { + created_at: data.data.created_at + , eventType: data.data.eventType + }; + // try to find exact match ctx.store.collection(collection).find(query).toArray(function findResult (err, array) { if (err || array.length > 0) { @@ -342,14 +342,9 @@ function init (env, ctx, server) { }); // devicestatus deduping } else if (data.collection === 'devicestatus') { - var queryDev; - if (data.data.NSCLIENT_ID) { - queryDev = { NSCLIENT_ID: data.data.NSCLIENT_ID }; - } else { - queryDev = { - created_at: data.data.created_at - }; - } + var queryDev = { + created_at: data.data.created_at + }; // try to find exact match ctx.store.collection(collection).find(queryDev).toArray(function findResult (err, array) { @@ -415,20 +410,16 @@ function init (env, ctx, server) { socketAuthorization = authorization; clientType = message.client; history = message.history || 48; //default history is 48 hours - var from = message.from; + pingme = message.pingme; if (socketAuthorization.read) { socket.join('DataReceivers'); - var filterTreatments = false; - var msecHistory = times.hours(history).msecs; - // if `from` is received, it's a reconnection and full data is not needed - if (from && from > 0) { - filterTreatments = true; - msecHistory = Math.min(new Date().getTime() - from, msecHistory); + if (pingme) { + socket.join('PingReceivers'); } // send all data upon new connection if (lastData && lastData.splitRecent) { - var split = lastData.splitRecent(Date.now(), times.hours(3).msecs, msecHistory, filterTreatments); + var split = lastData.splitRecent(Date.now(), times.hours(3).msecs, times.hours(history).msecs); if (message.status) { split.first.status = status(split.first.profiles); } @@ -495,6 +486,7 @@ function init (env, ctx, server) { start( ); listeners( ); + setInterval(pingClients, 60000); return websocket(); } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7b54e8e7d5a7..000000000000 --- a/package-lock.json +++ /dev/null @@ -1,7241 +0,0 @@ -{ - "name": "Nightscout", - "version": "0.10.1-release-20171016", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "6.0.83", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.83.tgz", - "integrity": "sha512-Q92+tkWnX7nmT0ZG+/wFxzJr+idr00T12MgsY3p0sZIu8nfvYF8i5pbY3BVZw6ad6yS2MLF71sfMr+ySatc2Gw==", - "dev": true - }, - "abab": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", - "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "requires": { - "mime-types": "2.1.15", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "requires": { - "acorn": "4.0.13" - } - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - }, - "dependencies": { - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "requires": { - "colour": "0.7.1", - "optjs": "3.2.2" - } - }, - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000726", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" - }, - "base64url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "benv": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/benv/-/benv-3.3.0.tgz", - "integrity": "sha1-c3XsAalaAAM+uYCESINmKFKCJDU=", - "dev": true, - "requires": { - "jsdom": "11.1.0", - "rewire": "2.5.2" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=" - }, - "bl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", - "integrity": "sha1-/FQhoo/UImA2w7OJGmaiW8ZNIm4=", - "requires": { - "readable-stream": "2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "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" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" - }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.0.tgz", - "integrity": "sha1-07Ik1Gf6LOjUNYnAJFBDJnwJNjQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.2", - "debug": "2.6.8", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.18", - "on-finished": "2.3.0", - "qs": "6.5.0", - "raw-body": "2.3.1", - "type-is": "1.6.15" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" - } - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "bootevent": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bootevent/-/bootevent-0.0.1.tgz", - "integrity": "sha1-yNkAtymk0S+yU2wW+hfwYvzPxqg=", - "requires": { - "chainsaw": "0.1.0" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "requires": { - "expand-range": "0.1.1" - } - }, - "broadway": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz", - "integrity": "sha1-fb7waLlUt5B5Jf1USWO1eKkCuno=", - "requires": { - "cliff": "0.1.9", - "eventemitter2": "0.4.14", - "nconf": "0.6.9", - "utile": "0.2.1", - "winston": "0.8.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "cliff": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz", - "integrity": "sha1-ohHgnGo947oa8n0EnTASUNGIErw=", - "requires": { - "colors": "0.6.2", - "eyes": "0.1.8", - "winston": "0.8.0" - } - }, - "winston": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz", - "integrity": "sha1-YdCDD6aZcGISIGsKK1ymmpMENmg=", - "requires": { - "async": "0.2.10", - "colors": "0.6.2", - "cycle": "1.0.3", - "eyes": "0.1.8", - "pkginfo": "0.3.1", - "stack-trace": "0.0.10" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", - "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "requires": { - "browserify-aes": "1.0.8", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "0.2.9" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "1.0.30000726", - "electron-to-chromium": "1.3.21" - } - }, - "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "bufferview": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bufferview/-/bufferview-1.0.1.tgz", - "integrity": "sha1-ev10pF+Tf6QiodM4wIu/3HbNcl0=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytebuffer": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-3.1.1.tgz", - "integrity": "sha1-KGuLPxZz43kPX7K+Iu+l61uW25A=", - "requires": { - "bufferview": "1.0.1", - "long": "1.2.3" - }, - "dependencies": { - "long": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-1.2.3.tgz", - "integrity": "sha1-EX/i4rHEU9g+Mid2yNRwY5+qK38=" - } - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "caller": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/caller/-/caller-0.0.1.tgz", - "integrity": "sha1-83odbqEOgp2UchrimpC7T7Uqt2c=", - "requires": { - "tape": "2.3.3" - }, - "dependencies": { - "deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=" - }, - "tape": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz", - "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=", - "requires": { - "deep-equal": "0.1.2", - "defined": "0.0.0", - "inherits": "2.0.3", - "jsonify": "0.0.0", - "resumer": "0.0.0", - "through": "2.3.8" - } - } - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000726", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } - }, - "caniuse-db": { - "version": "1.0.30000726", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000726.tgz", - "integrity": "sha1-m7dC+NAmpi34c7wDwGhD0iVbYNc=" - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": "0.3.9" - }, - "dependencies": { - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.0", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "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" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "clap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", - "requires": { - "chalk": "1.1.3" - } - }, - "clear-require": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clear-require/-/clear-require-2.0.0.tgz", - "integrity": "sha1-qgH1w1WJMmvVXphp6r2kj4ZEfes=", - "dev": true, - "requires": { - "caller-path": "2.0.0", - "resolve-from": "2.0.0" - } - }, - "cliff": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", - "integrity": "sha1-U74z6p9ZvshWCe4wCsQgdgPlIBM=", - "requires": { - "colors": "1.0.3", - "eyes": "0.1.8", - "winston": "0.8.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "1.5.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "1.0.2", - "color-convert": "1.9.0", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" - } - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, - "common": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/common/-/common-0.2.5.tgz", - "integrity": "sha1-PHGC9ni9HjaBzVzDSMdZ/o3SI5Q=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", - "requires": { - "mime-db": "1.29.0" - }, - "dependencies": { - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" - } - } - }, - "compression": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", - "requires": { - "accepts": "1.3.3", - "bytes": "2.5.0", - "compressible": "2.0.11", - "debug": "2.6.8", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.1" - }, - "dependencies": { - "bytes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" - }, - "content-type-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.2.14" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssmin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.4.3.tgz", - "integrity": "sha1-yRlAd+Dr2s1pHV9ZAVudgZ840BU=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "1.2.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.30" - } - }, - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-equal": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", - "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=" - }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.0", - "randombytes": "2.0.5" - } - }, - "director": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", - "integrity": "sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM=" - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", - "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", - "requires": { - "base64url": "2.0.0", - "safe-buffer": "5.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" - }, - "electron-to-chromium": { - "version": "1.3.21", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz", - "integrity": "sha1-qWfr3P6O0Ag/wkTRiUAiqOgRPqI=" - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" - }, - "engine.io": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.4.tgz", - "integrity": "sha1-d7zhK4Dl1gQpM3/sOw2vaR68kAM=", - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.4" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - } - } - }, - "engine.io-client": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz", - "integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "requires": { - "prr": "0.0.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "0.2.1" - } - }, - "errorhandler": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.0.tgz", - "integrity": "sha1-6rpkyl1UKjEayUX1gt78M2Fl2fQ=", - "requires": { - "accepts": "1.3.3", - "escape-html": "1.0.3" - } - }, - "es5-ext": { - "version": "0.10.30", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "escodegen": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.15.tgz", - "integrity": "sha1-/9qcsmtws098wZ8diHVlOa+1Q70=", - "dev": true, - "requires": { - "esprima": "1.0.2", - "source-map": "0.1.43" - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.2.tgz", - "integrity": "sha1-gDm/nOrE2dLBX2IyZPspK1UCzq8=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" - }, - "dependencies": { - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - } - } - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "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" - } - }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "expose-loader": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.3.tgz", - "integrity": "sha1-NfvTZZeJ5PqoH1nei36fw55GbVE=" - }, - "express": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", - "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", - "requires": { - "accepts": "1.3.3", - "array-flatten": "1.1.1", - "content-disposition": "0.5.2", - "content-type": "1.0.2", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.8", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.0", - "finalhandler": "1.0.4", - "fresh": "0.5.0", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.1", - "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", - "range-parser": "1.2.0", - "send": "0.15.4", - "serve-static": "1.12.4", - "setprototypeof": "1.0.3", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.0", - "vary": "1.1.1" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" - } - } - }, - "express-extension-to-accept": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/express-extension-to-accept/-/express-extension-to-accept-0.0.2.tgz", - "integrity": "sha1-+4Bc0DrTZ1sZiDmZz/9DE0l1N04=", - "requires": { - "mime": "1.2.11" - }, - "dependencies": { - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" - } - } - }, - "express-minify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/express-minify/-/express-minify-0.2.0.tgz", - "integrity": "sha1-aedLxA2DLgqXyEcqO7HwjhscYkU=", - "requires": { - "cssmin": "0.4.3", - "on-headers": "1.0.1", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" - }, - "file-loader": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", - "requires": { - "loader-utils": "1.1.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "filesize": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", - "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - }, - "dependencies": { - "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" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - } - } - }, - "finalhandler": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.4.tgz", - "integrity": "sha512-16l/r8RgzlXKmFOhZpHBztvye+lAhC5SU7hXavnerC9UfZqZxxXl3BzL8MhffPT3kF61lj9Oav2LKEzh0ei7tg==", - "requires": { - "debug": "2.6.8", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.1", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "2.0.0" - } - }, - "flatiron": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz", - "integrity": "sha1-JIz3mj2n19w3nioRySonGcu1QPY=", - "requires": { - "broadway": "0.3.6", - "director": "1.2.7", - "optimist": "0.6.0", - "prompt": "0.2.14" - }, - "dependencies": { - "optimist": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "integrity": "sha1-aUJIJvNAX3nxQub8PZrljU27kgA=", - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - } - } - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - }, - "flot": { - "version": "0.8.0-alpha", - "resolved": "https://registry.npmjs.org/flot/-/flot-0.8.0-alpha.tgz", - "integrity": "sha1-nLvHFHwQpH0lSduQvSmH7BunhLo=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "1.0.2" - } - }, - "forever": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/forever/-/forever-0.15.3.tgz", - "integrity": "sha1-d9nX4V/S9RGtnYShEMfdj8js68I=", - "requires": { - "cliff": "0.1.10", - "clone": "1.0.2", - "colors": "0.6.2", - "flatiron": "0.4.3", - "forever-monitor": "1.7.1", - "nconf": "0.6.9", - "nssocket": "0.5.3", - "object-assign": "3.0.0", - "optimist": "0.6.1", - "path-is-absolute": "1.0.1", - "prettyjson": "1.2.1", - "shush": "1.0.0", - "timespan": "2.3.0", - "utile": "0.2.1", - "winston": "0.8.3" - }, - "dependencies": { - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "forever-monitor": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-1.7.1.tgz", - "integrity": "sha1-XYIPSjp42y2BriZx8Vi56GoJG7g=", - "requires": { - "broadway": "0.3.6", - "chokidar": "1.7.0", - "minimatch": "3.0.4", - "ps-tree": "0.0.3", - "utile": "0.2.1" - } - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "requires": { - "async": "2.5.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, - "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" - }, - "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": 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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "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" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "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.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": 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", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "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" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "requires": { - "is-property": "1.0.2" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "git-rev": { - "version": "git://github.com/bewest/git-rev.git#cb4a1955728e3534805d3ffcbf17077b87c829cd" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "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" - } - }, - "glob-base": { - "version": "0.3.0", - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - }, - "dependencies": { - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - } - } - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "0.9.2", - "optimist": "0.5.2", - "source-map": "0.1.43", - "uglify-js": "2.8.29" - }, - "dependencies": { - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "integrity": "sha1-2DhCsOtMQ1lgrrEIoGejqpTA7rI=", - "requires": { - "bluebird": "2.11.0", - "chalk": "1.1.3", - "commander": "2.11.0", - "is-my-json-valid": "2.16.1" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, - "html-encoding-sniffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", - "dev": true, - "requires": { - "whatwg-encoding": "1.0.1" - } - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - } - }, - "http-signature": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", - "integrity": "sha1-F5bPZ6ABrVzWhJ3KCZFIXwkIn+Y=", - "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "i": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz", - "integrity": "sha1-HSuFQVjsgWkRPGy39raAHpniEdU=" - }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "1.8.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "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-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "0.9.2", - "escodegen": "0.0.15", - "esprima": "1.0.2", - "glob": "7.1.2", - "handlebars": "4.0.10", - "js-yaml": "3.9.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "0.3.1", - "supports-color": "2.0.0", - "which": "1.2.14", - "wordwrap": "0.0.3" - } - }, - "joi": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", - "requires": { - "hoek": "2.16.3", - "isemail": "1.2.0", - "moment": "2.18.1", - "topo": "1.1.0" - } - }, - "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" - }, - "jquery-ui-bundle": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jquery-ui-bundle/-/jquery-ui-bundle-1.12.1.tgz", - "integrity": "sha1-1r4uTDd0lOI3ixyuKSCpHRGC2MQ=" - }, - "jquery.tipsy": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/jquery.tipsy/-/jquery.tipsy-1.0.3.tgz", - "integrity": "sha1-ZI86kCXTQr4ccoDyO3DEGDWoWxM=", - "requires": { - "jquery": "2.2.4" - } - }, - "js-base64": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.2.0.tgz", - "integrity": "sha1-XoqNGTqQgZjdI9FwSCbSB7DlqPY=" - }, - "js-storage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-storage/-/js-storage-1.0.1.tgz", - "integrity": "sha1-O1t/z0xIDwiVsXKYlL/Ohi+PjN8=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", - "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "1.0.2" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsdom": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.1.0.tgz", - "integrity": "sha512-vKKDU+Xh9O6VgzdOYf5Rmqbgp+Yz4YTBC19gaLtctXch33EmNucA395KJGGboldafPW1vv9XLuiprO4+wXfl0g==", - "dev": true, - "requires": { - "abab": "1.0.3", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.1", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "0.0.15", - "html-encoding-sniffer": "1.0.1", - "nwmatcher": "1.4.1", - "parse5": "3.0.2", - "pn": "1.0.0", - "request": "2.81.0", - "request-promise-native": "1.0.4", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.2", - "webidl-conversions": "4.0.1", - "whatwg-encoding": "1.0.1", - "whatwg-url": "6.1.0", - "xml-name-validator": "2.0.1" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "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=", - "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", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" - }, - "jsonwebtoken": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", - "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", - "requires": { - "joi": "6.10.1", - "jws": "3.1.4", - "lodash.once": "4.1.1", - "ms": "2.0.0", - "xtend": "4.0.1" - } - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "jwa": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", - "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", - "requires": { - "base64url": "2.0.0", - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.9", - "safe-buffer": "5.1.1" - } - }, - "jws": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", - "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", - "requires": { - "base64url": "2.0.0", - "jwa": "1.1.5", - "safe-buffer": "5.1.1" - } - }, - "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.5" - } - }, - "lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mfb": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/mfb/-/mfb-0.12.0.tgz", - "integrity": "sha1-E+HUekDyF04sLEcFJKh8BNXKY38=" - }, - "micromatch": { - "version": "2.3.11", - "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.3" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "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": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "2.2.3" - } - } - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "requires": { - "mime-db": "1.27.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimed-connect-to-nightscout": { - "version": "git://github.com/mddub/minimed-connect-to-nightscout.git#23c03c6eda4a29886cc5f65185399cc48f7e6abf", - "requires": { - "common": "0.2.5", - "lodash": "3.10.1", - "request": "2.64.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - }, - "qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=" - }, - "request": { - "version": "2.64.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.64.0.tgz", - "integrity": "sha1-lqWCQjzptLXDTpsjLkgBc/FLpgg=", - "requires": { - "aws-sign2": "0.5.0", - "bl": "1.0.3", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "1.0.1", - "har-validator": "1.8.0", - "hawk": "3.1.3", - "http-signature": "0.11.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "5.1.0", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3" - } - } - } - }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.1.2.tgz", - "integrity": "sha1-Ufk7Qyv34bF1/8Iog8zQvjLbprU=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "2.6.7", - "diff": "1.4.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "2.0.0" - } - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" - }, - "moment-timezone": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz", - "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=", - "requires": { - "moment": "2.18.1" - } - }, - "mongodb": { - "version": "2.2.31", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", - "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.15", - "readable-stream": "2.2.7" - }, - "dependencies": { - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - } - } - }, - "mongodb-core": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", - "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - }, - "mongomock": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mongomock/-/mongomock-0.1.2.tgz", - "integrity": "sha1-M4aFA9yqVJ4AaGcVz2qk+R+3Dnk=", - "requires": { - "bson": "1.0.4" - } - }, - "mqtt": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-0.3.13.tgz", - "integrity": "sha1-9l++MjkBtmRCe0cWWEKNz6HVvuQ=", - "requires": { - "readable-stream": "1.0.34" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "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=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "optional": true - }, - "nconf": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz", - "integrity": "sha1-lXDvFe1vmuays8jV5xtm0xk81mE=", - "requires": { - "async": "0.2.9", - "ini": "1.3.4", - "optimist": "0.6.0" - }, - "dependencies": { - "async": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", - "integrity": "sha1-32MGD789Myhqdqr21Vophtn/hhk=" - }, - "optimist": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "integrity": "sha1-aUJIJvNAX3nxQub8PZrljU27kgA=", - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - } - } - } - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "node-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.1.1.tgz", - "integrity": "sha1-CFJGRe5AOd7cPcwd18a5eeBhnkQ=", - "requires": { - "clone": "2.1.1", - "lodash": "4.17.4" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" - } - } - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.0.9" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "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=", - "requires": { - "path-key": "2.0.1" - } - }, - "nssocket": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.5.3.tgz", - "integrity": "sha1-iDyi7GBfXtZKTVGQsmJUAZKPj40=", - "requires": { - "eventemitter2": "0.4.14", - "lazy": "1.0.11" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwmatcher": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", - "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "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=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "object.omit": { - "version": "2.0.1", - "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" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", - "dev": true - }, - "optimist": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.5.2.tgz", - "integrity": "sha1-hcjBRUszFeSniUfoV7HfAzRQv7w=", - "dev": true, - "requires": { - "wordwrap": "0.0.3" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" - }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.1.0" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.8", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-duration": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.1.1.tgz", - "integrity": "sha1-ExFN3JiRwezSgANiRFVN5DZHoiY=" - }, - "parse-glob": { - "version": "3.0.4", - "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" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.1" - } - }, - "parse5": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", - "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", - "dev": true, - "requires": { - "@types/node": "6.0.83" - } - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "requires": { - "better-assert": "1.0.2" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "1.0.2" - } - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "0.11.10", - "util": "0.10.3" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "2.3.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "requires": { - "through": "2.3.8" - } - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" - }, - "pn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.0.0.tgz", - "integrity": "sha1-HPWjCw2AbNGPiPxBprXUrWFbO6k=", - "dev": true - }, - "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", - "requires": { - "chalk": "1.1.3", - "js-base64": "2.2.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "5.2.17", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "requires": { - "postcss": "5.2.17", - "uniqid": "4.1.1" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "prettyjson": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.1.tgz", - "integrity": "sha1-/P+rQdGcq0365eV15kJGYZsS0ok=", - "requires": { - "colors": "1.1.2", - "minimist": "1.2.0" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "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=" - }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", - "requires": { - "pkginfo": "0.3.1", - "read": "1.0.7", - "revalidator": "0.1.8", - "utile": "0.2.1", - "winston": "0.8.3" - } - }, - "protobufjs": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-3.2.4.tgz", - "integrity": "sha1-k/kbBym7yHTtywAr3xrY+OxXAdo=", - "requires": { - "ascli": "1.0.1", - "bytebuffer": "3.1.1" - } - }, - "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", - "requires": { - "forwarded": "0.1.0", - "ipaddr.js": "1.4.0" - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - }, - "ps-tree": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-0.0.3.tgz", - "integrity": "sha1-2/jXUqf+Ivp9WGNWiUmWEOknbdw=", - "requires": { - "event-stream": "0.5.3" - }, - "dependencies": { - "event-stream": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.5.3.tgz", - "integrity": "sha1-t3uTCfcQet3+q2PwwOr9jbC9jBw=", - "requires": { - "optimist": "0.2.8" - } - }, - "optimist": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", - "requires": { - "wordwrap": "0.0.3" - } - } - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "pushover-notifications": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/pushover-notifications/-/pushover-notifications-0.2.4.tgz", - "integrity": "sha1-icuU+RgsNqpZqaxnROSa2K/00Gc=" - }, - "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "random-token": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/random-token/-/random-token-0.0.8.tgz", - "integrity": "sha1-HPhFrz+zHlf3yqS5oXNHjEZIO2E=" - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "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.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.1.tgz", - "integrity": "sha512-sxkd1uqaSj41SG5Vet9sNAxBMCMsmZ3LVhRkDlK8SbCpelTUB7JiMGHG70AZS6cFiCRgfNQhU2eLnTHYRFf7LA==", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.18", - "unpipe": "1.0.0" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "requires": { - "mute-stream": "0.0.7" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "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.3", - "set-immediate-shim": "1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=" - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "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.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - } - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "request-promise-native": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.4.tgz", - "integrity": "sha1-hpiOyO7kCORVefzoO/0Fs635oVU=", - "dev": true, - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" - } - }, - "resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", - "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "2.3.8" - } - }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" - }, - "rewire": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", - "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "requires": { - "ajv": "5.2.2" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - } - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "send": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", - "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", - "requires": { - "debug": "2.6.8", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.0", - "fresh": "0.5.0", - "http-errors": "1.6.2", - "mime": "1.3.4", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - } - } - } - }, - "serve-static": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", - "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.15.4" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sgvdata": { - "version": "git://github.com/ktind/sgvdata.git#150873bc92e80bf645796ee19f13c6cff79d5630", - "requires": { - "event-stream": "3.1.7", - "protobufjs": "3.2.4" - }, - "dependencies": { - "event-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", - "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.2.10", - "stream-combiner": "0.0.4", - "through": "2.3.8" - } - }, - "split": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", - "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", - "requires": { - "through": "2.3.8" - } - } - } - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "2.0.3" - } - }, - "share2nightscout-bridge": { - "version": "git://github.com/bewest/share2nightscout-bridge.git#34e3c59567b6d74c0d543b234f354bea1cf807e1", - "requires": { - "request": "2.53.0" - }, - "dependencies": { - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "requires": { - "readable-stream": "1.0.34" - } - }, - "caseless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", - "integrity": "sha1-t7Zc5r8UE4hlOc/VM/CzDv+pz4g=" - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "requires": { - "delayed-stream": "0.0.5" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" - }, - "form-data": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", - "requires": { - "async": "0.9.2", - "combined-stream": "0.0.7", - "mime-types": "2.0.14" - } - }, - "hawk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "requires": { - "mime-db": "1.12.0" - } - }, - "oauth-sign": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", - "integrity": "sha1-fb6uRPbKRU4fFoRR1jB0ZzWBPOM=" - }, - "qs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", - "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "request": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.53.0.tgz", - "integrity": "sha1-GAo66St7Y5gC5PlUXdj83rcddgw=", - "requires": { - "aws-sign2": "0.5.0", - "bl": "0.9.5", - "caseless": "0.9.0", - "combined-stream": "0.0.7", - "forever-agent": "0.5.2", - "form-data": "0.2.0", - "hawk": "2.3.1", - "http-signature": "0.10.1", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.0.14", - "node-uuid": "1.4.8", - "oauth-sign": "0.6.0", - "qs": "2.3.3", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shiro-trie": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/shiro-trie/-/shiro-trie-0.3.13.tgz", - "integrity": "sha1-pKZrVJjWm5RgLnqYsAVzFbO1x0Q=" - }, - "should": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/should/-/should-11.1.2.tgz", - "integrity": "sha1-PK2cb8YA/+LhVH2Ui+MoTphNqUY=", - "dev": true, - "requires": { - "should-equal": "1.0.1", - "should-format": "3.0.3", - "should-type": "1.4.0", - "should-type-adaptors": "1.0.1", - "should-util": "1.0.0" - } - }, - "should-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-1.0.1.tgz", - "integrity": "sha1-C26VFvJgGp+wuy3MNpr6HH4gCvc=", - "dev": true, - "requires": { - "should-type": "1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "1.4.0", - "should-type-adaptors": "1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz", - "integrity": "sha1-7+VVPN9oz/ZuXF9RtxLcNRx3vqo=", - "dev": true, - "requires": { - "should-type": "1.4.0", - "should-util": "1.0.0" - } - }, - "should-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "shush": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shush/-/shush-1.0.0.tgz", - "integrity": "sha1-wnQVqeRY8v7TmyfPjrN8ADeCtDE=", - "requires": { - "caller": "0.0.1", - "strip-json-comments": "0.1.3" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-statistics": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-0.7.0.tgz", - "integrity": "sha1-xQ8Tu9yX6aT9ICVjgtoX5o7asco=" - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "socket.io": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", - "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.4", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.4", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - } - } - }, - "socket.io-client": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", - "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.4", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "requires": { - "through": "2.3.8" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "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", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "requires": { - "duplexer": "0.1.1" - }, - "dependencies": { - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - } - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz", - "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=" - }, - "style-loader": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - } - }, - "sugar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sugar/-/sugar-1.5.0.tgz", - "integrity": "sha1-2dP7oQ96iH4G5q37B4onrLH8BVY=" - }, - "superagent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", - "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "cookiejar": "2.1.1", - "debug": "2.6.7", - "extend": "3.0.1", - "form-data": "1.0.0-rc4", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.3.4", - "qs": "6.4.0", - "readable-stream": "2.3.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "dev": true, - "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - } - } - }, - "supertest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-2.0.1.tgz", - "integrity": "sha1-oFgIHXiPFRXUcA11Aogea3WeRM0=", - "dev": true, - "requires": { - "methods": "1.1.2", - "superagent": "2.3.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "sync-exec": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.6.2.tgz", - "integrity": "sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU=" - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", - "requires": { - "setimmediate": "1.0.5" - } - }, - "timespan": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", - "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=" - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "topo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", - "requires": { - "hoek": "2.16.3" - } - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.15" - } - }, - "uglify-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.0.tgz", - "integrity": "sha512-PGUXuTJ5AkrfPsyg0L9/LD+BWYm9feVngbWpW5bg7Q3B7hqDM3xz00tNby4yY0CqjrLTF6CP9wpb/aNITRuSXg==", - "requires": { - "commander": "2.11.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "requires": { - "macaddress": "0.2.8" - } - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "requires": { - "async": "0.2.10", - "deep-equal": "0.0.0", - "i": "0.3.5", - "mkdirp": "0.5.1", - "ncp": "0.4.2", - "rimraf": "2.6.1" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" - }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "requires": { - "extsprintf": "1.0.2" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "requires": { - "async": "2.5.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "webidl-conversions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", - "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=", - "dev": true - }, - "webpack": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.6.tgz", - "integrity": "sha512-sXnxfx6KoZVrFAGLjdhCCwDtDwkYMfwm8mJjkQv3thr5pjTlbxopVlr/kJwc9Bz317gL+gNjvz++ir9TgG1MDg==", - "requires": { - "acorn": "5.1.2", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", - "ajv-keywords": "2.1.0", - "async": "2.5.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.0.3", - "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.0.0", - "source-map": "0.5.7", - "supports-color": "4.4.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", - "yargs": "8.0.2" - }, - "dependencies": { - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==" - }, - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", - "requires": { - "lodash": "4.17.4" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.0.tgz", - "integrity": "sha1-tYvDTMMLJ//brz0AvyerpvopxuM=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "chalk": "1.1.3", - "commander": "2.11.0", - "ejs": "2.5.7", - "express": "4.15.4", - "filesize": "3.5.10", - "gzip-size": "3.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "opener": "1.4.3", - "ws": "2.3.1" - }, - "dependencies": { - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - }, - "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=", - "dev": true - }, - "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", - "dev": true, - "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "whatwg-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", - "dev": true, - "requires": { - "iconv-lite": "0.4.13" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.1.0.tgz", - "integrity": "sha1-X8gnm5PXVIO5ztiyYjmFSEehhXg=", - "dev": true, - "requires": { - "lodash.sortby": "4.7.0", - "tr46": "0.0.3", - "webidl-conversions": "4.0.1" - } - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", - "requires": { - "async": "0.2.10", - "colors": "0.6.2", - "cycle": "1.0.3", - "eyes": "0.1.8", - "isstream": "0.1.2", - "pkginfo": "0.3.1", - "stack-trace": "0.0.10" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz", - "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=", - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "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" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/package.json b/package.json index 0d80c4a98720..8c977db33917 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Nightscout", - "version": "0.10.1-release-20171016", + "version": "0.9.2", "description": "Nightscout acts as a web-based CGM (Continuous Glucose Montinor) to allow multiple caregivers to remotely view a patients glucose data in realtime.", "license": "AGPL-3.0", "author": "Nightscout Team", @@ -27,10 +27,7 @@ "start": "node server.js", "test": "make test", "env": "env", - "postinstall": "webpack --config webpack.config.js && npm run-script update-buster", - "bundle": "webpack --config webpack.config.js && npm run-script update-buster", - "bower": "node node_modules/bower/bin/bower --allow-root install && ", - "update-buster": "node bin/generateCacheBuster.js >tmp/cacheBusterToken" + "postinstall": "node node_modules/bower/bin/bower --allow-root install" }, "config": { "blanket": { @@ -47,70 +44,52 @@ } }, "engines": { - "node": "8.5.0" + "node": "0.10.x" }, "dependencies": { - "ajv": "^5.2.2", - "async": "^0.9.2", - "body-parser": "^1.18.0", + "async": "^0.9.0", + "body-parser": "^1.14.1", "bootevent": "0.0.1", - "compression": "^1.7.0", - "css-loader": "^0.28.7", - "cssmin": "^0.4.3", - "d3": "^3.5.17", - "ejs": "^2.5.7", - "errorhandler": "^1.5.0", - "event-stream": "^3.3.4", - "expand-braces": "^0.1.2", - "expose-loader": "^0.7.3", - "express": "^4.15.4", + "bower": "^1.3.8", + "browserify-express": "^0.1.4", + "compression": "^1.4.2", + "crossfilter": "^1.3.12", + "d3": "^3.5.6", + "errorhandler": "^1.1.1", + "event-stream": "~3.1.5", + "expand-braces": "^0.1.1", + "express": "^4.6.1", "express-extension-to-accept": "0.0.2", - "express-minify": "^0.2.0", - "file-loader": "^0.11.2", - "flot": "^0.8.0-alpha", - "forever": "^0.15.3", + "forever": "~0.13.0", "git-rev": "git://github.com/bewest/git-rev.git", - "jquery": "^2.2.4", - "jquery-ui-bundle": "^1.12.1", - "jquery.tipsy": "^1.0.3", - "js-storage": "^1.0.1", - "jsonwebtoken": "^7.4.3", - "lodash": "^4.17.4", - "long": "^3.2.0", + "jquery": "^2.1.4", + "jsonwebtoken": "7.1.9", + "lodash": "^4.0.0", + "long": "~2.2.3", "mfb": "^0.12.0", - "minimed-connect-to-nightscout": "git://github.com/mddub/minimed-connect-to-nightscout.git#v1.1.0", - "moment": "^2.18.1", - "moment-timezone": "^0.5.13", - "mongodb": "^2.2.31", + "minimed-connect-to-nightscout": "git://github.com/mddub/minimed-connect-to-nightscout#v1.1.0", + "moment": "2.10.6", + "moment-timezone": "^0.4.0", + "mongodb": "2.1.18", "mongomock": "^0.1.2", - "mqtt": "^0.3.13", - "node-cache": "^4.1.1", + "mqtt": "~0.3.11", + "node-cache": "^3.0.0", "parse-duration": "^0.1.1", - "path": "^0.12.7", - "prettyjson": "^1.2.1", - "pushover-notifications": "^0.2.4", - "random-token": "0.0.8", - "request": "^2.81.0", + "pushover-notifications": "0.2.0", + "request": "^2.58.0", "sgvdata": "git://github.com/ktind/sgvdata.git#wip/protobuf", "share2nightscout-bridge": "git://github.com/bewest/share2nightscout-bridge.git#wip/generalize", - "shiro-trie": "^0.3.13", - "simple-statistics": "^0.7.0", - "socket.io": "^1.7.4", - "style-loader": "^0.18.2", - "sugar": "^1.5.0", - "sync-exec": "^0.6.2", - "traverse": "^0.6.6", - "uglify-js": "^3.1.0", - "uuid": "^3.1.0", - "webpack": "^3.5.6" + "shiro-trie": "^0.3.7", + "simple-statistics": "~0.7.0", + "socket.io": "^1.3.5", + "sugar": "^1.4.1", + "traverse": "^0.6.6" }, "devDependencies": { - "benv": "3.3.0", - "clear-require": "^2.0.0", - "istanbul": "~0.4.5", - "mocha": "~3.1.2", - "should": "~11.1.1", - "supertest": "~2.0.0", - "webpack-bundle-analyzer": "^2.9.0" + "istanbul": "~0.3.5", + "mocha": "~1.20.1", + "should": "~4.0.4", + "supertest": "~0.13.0", + "benv": "^1.1.0" } } diff --git a/views/adminindex.html b/static/admin/index.html similarity index 82% rename from views/adminindex.html rename to static/admin/index.html index 8a0f97b21964..692575dd1b57 100644 --- a/views/adminindex.html +++ b/static/admin/index.html @@ -25,10 +25,10 @@ - + - +
@@ -45,8 +45,11 @@

Admin Tools

Authentication status: - - - + + + + + + diff --git a/views/bgclock.html b/static/clock.html similarity index 83% rename from views/bgclock.html rename to static/clock.html index 0657c9e94c62..149265cfb13d 100644 --- a/views/bgclock.html +++ b/static/clock.html @@ -14,7 +14,7 @@ h1 { padding: 0; margin: 0; - font-size: 1500%; + font-size: 3500%; } html, body { padding: 0; @@ -38,10 +38,10 @@

-

+ - + - - + + + + + + diff --git a/static/glyphs/demo.html b/static/glyphs/demo.html index eedc1ca63f0d..c4efb3c641ab 100755 --- a/static/glyphs/demo.html +++ b/static/glyphs/demo.html @@ -336,4 +336,4 @@

- + \ No newline at end of file diff --git a/static/images/DoubleDown.svg b/static/images/DoubleDown.svg deleted file mode 100755 index 4a7b5a4cceac..000000000000 --- a/static/images/DoubleDown.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/static/images/DoubleUp.svg b/static/images/DoubleUp.svg deleted file mode 100755 index bff31cd42bb1..000000000000 --- a/static/images/DoubleUp.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/static/images/Flat.svg b/static/images/Flat.svg deleted file mode 100755 index a80fb5365db0..000000000000 --- a/static/images/Flat.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/FortyFiveDown.svg b/static/images/FortyFiveDown.svg deleted file mode 100755 index d37223969cae..000000000000 --- a/static/images/FortyFiveDown.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/FortyFiveUp.svg b/static/images/FortyFiveUp.svg deleted file mode 100755 index 00c8df99f7ee..000000000000 --- a/static/images/FortyFiveUp.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/NONE.svg b/static/images/NONE.svg deleted file mode 100644 index 397da4d77fea..000000000000 --- a/static/images/NONE.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/SingleDown.svg b/static/images/SingleDown.svg deleted file mode 100755 index 479323b7ada0..000000000000 --- a/static/images/SingleDown.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/SingleUp.svg b/static/images/SingleUp.svg deleted file mode 100755 index d8a47c702651..000000000000 --- a/static/images/SingleUp.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/static/images/launch.png b/static/images/launch.png deleted file mode 100644 index 50087db9a96198aa7f0ddb57117af4ab00db75ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3111 zcmbVOdpJ~iA0L%+o61TmVGJpZxf#Qm%vg+Dj9i9}2xDdljhSY~Wn7jnDyv$T!ivo+ zgeEn`iY2`6qe9l84JD-_$%HN89bNW)|JY~$c+c~k^ZWh2=kxjAzt1@-Zmtecr5#ET z2n6cnNcNDeS*y3gTG>;1^jME<+0M5E`JU`xel(5Cgjh4!K}?tvix$H4VA2?Zqn%7k z2xKiMlnU}eiVK0xW+7>-7-S5KBV$7#mR2zw8aPX&?->o4PiewR8|z)5i*+|$zn$E zoybJE>(!@Hm{UwT%T9u)tvK%mH&da~o?s7K1TIlks-u-*o&P*A9=x0(g6C z3sc-@uC=Kdo@{Ch;B4$M=4N>OH?C6zk57xBGr!plmD&Bu1^$ssu;nsod^VTLW*_<1 z0d9xcd^Yben*+18U9Gq|Y!8J-4~$ zYk|X=V9l|36C49=W)g%CqM4wXbW=K>W@>=}Fz~N@#{ZK&l*}R2YMcB|+k6wrdU198 z*AU1Ke~l3{LN+^G*^rE;bEjnkhIVtI+I4nzW@l#)4i1);m8q(#*3{G_Cns~cTuVz! zUteDX1B2Pw*@=k>IXSuI1~8a{bjZ#dAjI-XBgGQg7H=J{(uRC)Xt~+u!~k7Xa;q{u73W5gzp%G< z-Y4hGZM=qkd6~-2U_x>%^u`+&lIwh6OzAbSd~b8bQE;)o(a(n}|9j^5qj>>E3DEUc z)MjR5Zag4y2g@1?@8*h`T?f3brBcBjfmdxoY_gpl>b6dD)o2@~x-3fJ7s?_A9PvDC ztq?yA8-qPvi7c*l%v2nb-WDtZcG5CGK61Zl6usE~$;c~{tKfVp`dtT?Q|iO+C8tTH z8OR)0VLPmM;S54@E52KQAIj+V_r1pxabCgt+0}Ku03DH^49NHy|2AoTzwh$T9pG7IPYBulAGwL zM(8cj5Z$M>HA6aUJFSt!r{%9oaB-d$;-xo`B#D%Fwt};kk|HtI7@A$voa|6bb zR_>f%-z`#kj4ioxJ$tur>Tg+>2%;?%A}u*0}{6$m8>(4;3_}fWeTh% zk~eIH-tAzNVK~~U%7_VWx?ppb!tEo981C=sikYX@*BFX__HaGll+mKbmj?gr41_$5o*a$GS2qSuy`oL; z()HHeeJszXJy337-8>zxpZ{c9Mf6~tF;_#`mF3!;EwqsnZG4{Oahddik~$i z6hqN@965LKUvE?>kx$Dkdfrs*4qimEZrlxS&uNR+nAY~LJmd#>U4(`kE&4QUie_D0 zk~h4rQtGAA+sD}P5k}PxJ1}(9-Zuic2K&WRy}y;9>0K3a=Gpm%)GXEGc?GrZ;CfVz zf22N8w0Y67)qZX;uxzxbTXSQc-%JsAi^N?%>Y?er`5B`i>y`FD)3uzM=87i8*mF?q zq)R=1NWU#oKRGG;Mdlz^(bq8lVPVe1SudUVYFcuAR-CXoRyWUGyzNm`t@w$1icYG! zt$%*hCoiw1&@0iUt!qTm%If6Gs*RVbe0-|F8BGl*sgrS=$^!M!N~1Nat57bb?aDZh zwa@s4KIZbL7-1>$Lp-FVLwZ-ea6*{$M}hDlqM)LuX6&5B%Z8!4w#AgwrHC=BW9t3# ziw@@=%x~L^QLMA-XgPSnYq(fhx=vmRAvzvWED_f(_76O2fhTaguBPuXwvMS z(V0;2L$(9S!Xh{3;Gb%sw);kK3H%i*shGbUTVUV|!aIpVz)W{Rr&)Yybc>LnE7j7@ z%6*+wqGde!!wCxP)8mtcOFpf5ghkGU32Ap#OU>D8Qyx*hnNk!>6Ag8cG#+C!DA&7D^`6QZsSCri7!bH? zVrYjHbY4`$C4i)WrSAkUkC|JQV%HgK4(V*oZ>djt{?;<%(vYEa6Q@@C2i08kJwxS-)M(LnZ(F~=A*qaNff7MBvPa*gi&0eqBW^WziStDOJ?QDX zGbDwUYX+xzhx(RCS=|Xu&jy`^wk2^Jyniv6t|wv-jAY-;=p>VORD8S6 z8PrB;jEI#Sf&{1Ads?6|4X!BfM=mp@`|ko;Y-(b)Bo>Gq-XMmWfYLLvL4Q=m@4%3knh)XdeJu_G&U l?!u=7Uq0)~1Bq)?Ad5wh1b{H}&FZhalbtKM!Y1(ee*jJIRXG3v diff --git a/views/index.html b/static/index.html similarity index 83% rename from views/index.html rename to static/index.html index 237c0297a5ce..e868d0cbe056 100644 --- a/views/index.html +++ b/static/index.html @@ -1,136 +1,56 @@ - + - - - Nightscout - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + + + -
-
-

-

Loading the client

-
-
-
-
-
-
-
- -
- +
+
-
+
-
-
-
BG: - + @@ -463,7 +383,7 @@ Carbs: - g + g @@ -666,12 +586,15 @@
- - + +
- - - + + + + + + diff --git a/static/js/client.js b/static/js/client.js index 179edcf68dfe..df43f5229d8d 100644 --- a/static/js/client.js +++ b/static/js/client.js @@ -1,11 +1,3 @@ 'use strict'; -$(document).on('online', function() { - console.log('Application got online event, reloading'); - window.location.reload(); -}); - -$(document).ready(function() { - console.log('Application got ready event'); - window.Nightscout.client.init(); -}); \ No newline at end of file +window.Nightscout.client.init(); diff --git a/views/profileindex.html b/static/profile/index.html similarity index 96% rename from views/profileindex.html rename to static/profile/index.html index 7b1ff2d5b4c7..7fee3f106f61 100644 --- a/views/profileindex.html +++ b/static/profile/index.html @@ -25,10 +25,10 @@ - + - +
@@ -173,8 +173,11 @@

Profile Editor

- - - + + + + + + diff --git a/static/radio.html b/static/radio.html new file mode 100644 index 000000000000..57af18927ef4 --- /dev/null +++ b/static/radio.html @@ -0,0 +1,59 @@ + + + + + + Nightscout radio + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Nightscout

+
+ +
+

Audio

+

+ Convert glucose to frequency. + +

+
+ +
+ +
+ Authentication status: + + + + + + + + + + + diff --git a/static/report/compare.html b/static/report/compare.html index 76fdcd7e528d..532c8c3f2f32 100644 --- a/static/report/compare.html +++ b/static/report/compare.html @@ -23,10 +23,10 @@ - + - +

Nightscout performance comparison

@@ -112,10 +112,8 @@

Nightscout performance Authentication status: - + - - + diff --git a/views/reportindex.html b/static/report/index.html similarity index 85% rename from views/reportindex.html rename to static/report/index.html index 6236cf51078f..bb67dd1520af 100644 --- a/views/reportindex.html +++ b/static/report/index.html @@ -23,9 +23,8 @@ - - - + +

Nightscout reporting

@@ -117,9 +116,16 @@

Nightscout reporting Authentication status: - - - - + + + + + + + + + + + diff --git a/static/report/js/flotcandle.js b/static/report/js/flotcandle.js index cdf6a5faa0a2..3ac641d1cf58 100644 --- a/static/report/js/flotcandle.js +++ b/static/report/js/flotcandle.js @@ -84,4 +84,4 @@ name: 'candle', version: '1.0' }); -})($); +})(jQuery); \ No newline at end of file diff --git a/static/report/js/report.js b/static/report/js/report.js index 60d70af16204..8c337ae70d83 100644 --- a/static/report/js/report.js +++ b/static/report/js/report.js @@ -223,7 +223,6 @@ options.notes = $('#rp_optionsnotes').is(':checked'); options.food = $('#rp_optionsfood').is(':checked'); options.insulin = $('#rp_optionsinsulin').is(':checked'); - options.insulindistribution = $('#rp_optionsdistribution').is(':checked'); options.carbs = $('#rp_optionscarbs').is(':checked'); options.scale = ( $('#rp_linear').is(':checked') ? report_plugins.consts.SCALE_LINEAR : report_plugins.consts.SCALE_LOG ); options.order = ( $('#rp_oldestontop').is(':checked') ? report_plugins.consts.ORDER_OLDESTONTOP : report_plugins.consts.ORDER_NEWESTONTOP ); @@ -446,14 +445,10 @@ if (options.order === report_plugins.consts.ORDER_NEWESTONTOP) { sorteddaystoshow.reverse(); } - loadProfileSwitch(function loadProfileSwitchCallback() { - loadProfiles(function loadProfilesCallback() { - $('#info > b').html('' + translate('Rendering') + ' ...'); - window.setTimeout(function () { - showreports(options); - }, 0); + loadProfileSwitch(from, function loadProfileSwitchCallback() { + $('#info > b').html(''+translate('Rendering')+' ...'); + window.setTimeout(function () {showreports(options); }, 0); }); - }); } } @@ -489,7 +484,6 @@ datastorage.tempbasalTreatments = datastorage.tempbasalTreatments.concat(datastorage[day].tempbasalTreatments); }); datastorage.tempbasalTreatments = Nightscout.client.ddata.processDurations(datastorage.tempbasalTreatments); - datastorage.treatments.sort(function sort(a, b) {return a.mills - b.mills; }); for (var d in daystoshow) { if (daystoshow.hasOwnProperty(d)) { @@ -545,7 +539,7 @@ function loadData(day, options, callback) { // check for loaded data - if ((options.openAps || options.iob || options.cob) && datastorage[day] && !datastorage[day].devicestatus.length) { + if (options.openAps && datastorage[day] && !datastorage[day].devicestatus) { // OpenAPS requested but data not loaded. Load anyway ... } else if (datastorage[day] && day !== moment().format('YYYY-MM-DD')) { callback(day); @@ -602,7 +596,7 @@ }); } else if (element.type === 'cal') { calData.push({ - mills: element.date + 1 + mills: element.date , d: element.dateString , scale: element.scale , intercept: element.intercept @@ -682,7 +676,7 @@ }); } - function loadProfileSwitch(callback) { + function loadProfileSwitch(from, callback) { $('#info > b').html(''+translate('Loading profile switch data') + ' ...'); var tquery = '?find[eventType]=Profile Switch'; $.ajax('/api/v1/treatments.json'+tquery, { @@ -700,21 +694,7 @@ callback(); }); } - - function loadProfiles(callback) { - $('#info > b').html(''+translate('Loading profiles') + ' ...'); - $.ajax('/api/v1/profile.json', { - headers: client.headers() - , success: function (records) { - datastorage.profiles = records; - } - , error: function () { - datastorage.profiles = []; - } - }).done(callback); - } - - + function processData(data, day, options, callback) { if (daystoshow[day].treatmentsonly) { datastorage[day] = data; diff --git a/views/translationsindex.html b/static/translations/index.html similarity index 79% rename from views/translationsindex.html rename to static/translations/index.html index 9c394cc0374c..ce0eb8dd81f8 100644 --- a/views/translationsindex.html +++ b/static/translations/index.html @@ -24,7 +24,7 @@ - +

Nightscout translations

@@ -33,10 +33,12 @@

Nightscout translations
Authentication status: - - - - + + + + + + diff --git a/tests/admintools.test.js b/tests/admintools.test.js index a2374ff1ff2e..59230ff71a2f 100644 --- a/tests/admintools.test.js +++ b/tests/admintools.test.js @@ -57,15 +57,11 @@ var someData = { describe('admintools', function ( ) { var self = this; - this.timeout(30000); + before(function (done) { benv.setup(function() { - - benv.require(__dirname + '/../tmp/js/bundle.js'); - - self.$ = $; - - self.localCookieStorage = self.localStorage = self.$.localStorage = require('./fixtures/localstorage'); + self.$ = require('jquery'); + self.$.localStorage = require('./fixtures/localstorage'); self.$.fn.tipsy = function mockTipsy ( ) { }; @@ -83,7 +79,7 @@ describe('admintools', function ( ) { }); }; - var indexHtml = read(__dirname + '/../views/adminindex.html', 'utf8'); + var indexHtml = read(__dirname + '/../static/admin/index.html', 'utf8'); self.$('body').html(indexHtml); //var filesys = require('fs'); @@ -94,7 +90,7 @@ describe('admintools', function ( ) { url = url.url; } //logfile.write(url+'\n'); - //console.log('Mock ajax:',url,opts); + //console.log(url,opts); if (opts && opts.success && opts.success.call) { if (url.indexOf('/api/v1/treatments.json?&find[created_at][$gte]=')===0) { url = '/api/v1/treatments.json?&find[created_at][$gte]='; @@ -140,17 +136,12 @@ describe('admintools', function ( ) { var d3 = require('d3'); //disable all d3 transitions so most of the other code can run with jsdom d3.timer = function mockTimer() { }; - - var cookieStorageType = self.localStorage._type benv.expose({ $: self.$ , jQuery: self.$ , d3: d3 , serverSettings: serverSettings - , localCookieStorage: self.localStorage - , cookieStorageType: self.localStorage - , localStorage: self.localStorage , io: { connect: function mockConnect ( ) { return { @@ -171,7 +162,7 @@ describe('admintools', function ( ) { } }); - //benv.require(__dirname + '/../bundle/bundle.source.js'); + benv.require(__dirname + '/../bundle/bundle.source.js'); benv.require(__dirname + '/../static/admin/js/admin.js'); done(); @@ -203,7 +194,6 @@ describe('admintools', function ( ) { }; client.init(); - client.dataUpdate(nowData); //var result = $('body').html(); diff --git a/tests/api.treatments.test.js b/tests/api.treatments.test.js index 34600b66cb04..6a1608158c47 100644 --- a/tests/api.treatments.test.js +++ b/tests/api.treatments.test.js @@ -1,12 +1,11 @@ 'use strict'; -var _ = require('lodash'); var request = require('supertest'); var should = require('should'); var language = require('../lib/language')(); describe('Treatment API', function ( ) { - this.timeout(10000); + this.timeout(2000); var self = this; var api = require('../lib/api/'); @@ -31,8 +30,36 @@ describe('Treatment API', function ( ) { }); it('post single treatments', function (done) { + var doneCalled = false; + + self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { + self.ctx.ddata.treatments.length.should.equal(3); + self.ctx.ddata.treatments[0].mgdl.should.equal(100); + should.not.exist(self.ctx.ddata.treatments[0].eventTime); + should.not.exist(self.ctx.ddata.treatments[0].notes); + + should.not.exist(self.ctx.ddata.treatments[1].eventTime); + self.ctx.ddata.treatments[1].insulin.should.equal(2); + self.ctx.ddata.treatments[2].carbs.should.equal(30); + + //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted + if (!doneCalled) { done(); } + + doneCalled = true; + }); self.ctx.treatments().remove({ }, function ( ) { + request(self.app) + .post('/api/treatments/') + .set('api-secret', self.env.api_secret || '') + .send({eventType: 'BG Check', glucose: 100, preBolus: '0', glucoseType: 'Finger', units: 'mg/dl', notes: ''}) + .expect(200) + .end(function (err) { + if (err) { + done(err); + } + }); + request(self.app) .post('/api/treatments/') .set('api-secret', self.env.api_secret || '') @@ -41,19 +68,6 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); - } else { - self.ctx.treatments.list({}, function (err, list) { - var sorted = _.sortBy(list, function (treatment) { - return treatment.created_at; - }); - sorted.length.should.equal(2); - sorted[0].glucose.should.equal(100); - should.not.exist(sorted[0].eventTime); - sorted[0].insulin.should.equal(2); - sorted[1].carbs.should.equal(30); - - done(); - }); } }); @@ -61,6 +75,19 @@ describe('Treatment API', function ( ) { }); it('post a treatment array', function (done) { + var doneCalled = false; + + self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { + self.ctx.ddata.treatments.length.should.equal(3); + should.not.exist(self.ctx.ddata.treatments[0].eventTime); + should.not.exist(self.ctx.ddata.treatments[1].eventTime); + + //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted + if (!doneCalled) { done(); } + + doneCalled = true; + }); + self.ctx.treatments().remove({ }, function ( ) { request(self.app) .post('/api/treatments/') @@ -73,20 +100,24 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); - } else { - self.ctx.treatments.list({}, function (err, list) { - list.length.should.equal(3); - should.not.exist(list[0].eventTime); - should.not.exist(list[1].eventTime); - - done(); - }); } }); }); }); it('post a treatment array and dedupe', function (done) { + var doneCalled = false; + + self.ctx.bus.on('data-loaded', function dataWasLoaded ( ) { + self.ctx.ddata.treatments.length.should.equal(3); + self.ctx.ddata.treatments[0].mgdl.should.equal(100); + + //if travis is slow the 2 posts take long enough that 2 data-loaded events are emitted + if (!doneCalled) { done(); } + + doneCalled = true; + }); + self.ctx.treatments().remove({ }, function ( ) { var now = (new Date()).toISOString(); request(self.app) @@ -107,20 +138,6 @@ describe('Treatment API', function ( ) { .end(function (err) { if (err) { done(err); - } else { - self.ctx.treatments.list({}, function (err, list) { - var sorted = _.sortBy(list, function (treatment) { - return treatment.created_at; - }); - - if (sorted.length !== 3) { - console.info('unexpected result length, sorted treatments:', sorted); - } - sorted.length.should.equal(3); - sorted[0].glucose.should.equal(100); - - done(); - }); } }); }); diff --git a/tests/ar2.test.js b/tests/ar2.test.js index 94c494869c90..28ec4f5579ea 100644 --- a/tests/ar2.test.js +++ b/tests/ar2.test.js @@ -147,9 +147,6 @@ describe('ar2', function ( ) { }); it('should handle alexa requests', function (done) { - var now = Date.now(); - var before = now - FIVE_MINS; - ctx.ddata.sgvs = [{mgdl: 100, mills: before}, {mgdl: 105, mills: now}]; var sbx = prepareSandbox(); diff --git a/tests/basalprofileplugin.test.js b/tests/basalprofileplugin.test.js index 0bcfd3bc268f..40ac9563b23f 100644 --- a/tests/basalprofileplugin.test.js +++ b/tests/basalprofileplugin.test.js @@ -8,7 +8,6 @@ describe('basalprofile', function ( ) { settings: {} , language: require('../lib/language')() }; - ctx.language.set('en'); ctx.ddata = require('../lib/data/ddata')(); ctx.notifications = require('../lib/notifications')(env, ctx); @@ -67,7 +66,7 @@ describe('basalprofile', function ( ) { , language: require('../lib/language')() }; - var time = new Date('2015-06-21T00:00:00+00:00').getTime(); + var time = new Date('2015-06-21T00:00:00').getTime(); var sbx = sandbox.clientInit(ctx, time, data); @@ -86,7 +85,7 @@ describe('basalprofile', function ( ) { , language: require('../lib/language')() }; - var time = new Date('2015-06-21T00:00:00+00:00').getTime(); + var time = new Date('2015-06-21T00:00:00').getTime(); var sbx = sandbox.clientInit(ctx, time, data); diff --git a/tests/bgnow.test.js b/tests/bgnow.test.js index 233f1c13dbc5..7a21da64acc6 100644 --- a/tests/bgnow.test.js +++ b/tests/bgnow.test.js @@ -1,7 +1,7 @@ 'use strict'; -var should = require('should'); -var _ = require('lodash'); +require('should'); +var _ =require('lodash'); var FIVE_MINS = 300000; var SIX_MINS = 360000; @@ -23,7 +23,7 @@ describe('BG Now', function ( ) { updatePillText: function mockedUpdatePillText (plugin, options) { options.label.should.equal(ctx.settings.units); options.value.should.equal('+5'); - should.not.exist(options.info); + options.info.length.should.equal(0); done(); } , language: { translate: function(text) { return text; } } diff --git a/tests/careportal.test.js b/tests/careportal.test.js index 1241ebe703a2..83a3ce2ee416 100644 --- a/tests/careportal.test.js +++ b/tests/careportal.test.js @@ -35,9 +35,8 @@ describe('client', function ( ) { }); it ('open careportal, and enter a treatment', function (done) { + var client = require('../lib/client'); - var client = window.Nightscout.client; - var hashauth = require('../lib/hashauth'); hashauth.init(client,$); hashauth.verifyAuthentication = function mockVerifyAuthentication(next) { @@ -50,6 +49,7 @@ describe('client', function ( ) { client.dataUpdate(nowData); client.careportal.prepareEvents(); + client.careportal.toggleDrawer(); $('#eventType').val('Snack Bolus'); $('#glucoseValue').val('100'); diff --git a/tests/fixtures/headless.js b/tests/fixtures/headless.js index 567262ad04de..6606fdb689b2 100644 --- a/tests/fixtures/headless.js +++ b/tests/fixtures/headless.js @@ -10,19 +10,12 @@ function headless (benv, binding) { function init (opts, callback) { var localStorage = opts.localStorage || './localstorage'; - var htmlFile = opts.htmlFile || __dirname + '/../../views/index.html'; + var htmlFile = opts.htmlFile || __dirname + '/../../static/index.html'; var serverSettings = opts.serverSettings || require('./default-server-settings'); var someData = opts.mockAjax || { }; benv.setup(function() { - - benv.require(__dirname + '/../../tmp/js/bundle.js'); - - self.$ = $; - - self.localCookieStorage = self.localStorage = self.$.localStorage = require('./localstorage'); - - //self.$ = require('jquery'); - //self.$.localStorage = require(localStorage); + self.$ = require('jquery'); + self.$.localStorage = require(localStorage); self.$.fn.tipsy = function mockTipsy ( ) { }; @@ -130,9 +123,6 @@ function headless (benv, binding) { , jQuery: self.$ , d3: d3 , serverSettings: serverSettings - , localCookieStorage: self.localStorage - , cookieStorageType: self.localStorage - , localStorage: self.localStorage , io: { connect: function mockConnect ( ) { return { @@ -172,3 +162,4 @@ function headless (benv, binding) { } module.exports = headless; + diff --git a/tests/fixtures/localstorage.js b/tests/fixtures/localstorage.js index d1b463e49283..0942cc2fffc0 100644 --- a/tests/fixtures/localstorage.js +++ b/tests/fixtures/localstorage.js @@ -6,21 +6,12 @@ var localstorage = { get: function Get(item) { return browserStorage[item] || null; } - , getItem: function Get(item) { - return browserStorage[item] || null; - } , set: function Set(item, value) { browserStorage[item] = value; } - , setItem: function Set(item, value) { - browserStorage[item] = value; - } , remove: function Remove(item) { delete browserStorage[item]; } - , removeItem: function Remove(item) { - delete browserStorage[item]; - } , removeAll: function RemoveAll() { browserStorage = []; } diff --git a/tests/hashauth.test.js b/tests/hashauth.test.js index 21f249a57a70..46073983a5f0 100644 --- a/tests/hashauth.test.js +++ b/tests/hashauth.test.js @@ -63,7 +63,6 @@ describe('hashauth', function ( ) { */ it ('should make module unauthorized', function () { - this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -75,14 +74,13 @@ describe('hashauth', function ( ) { client.init(); - hashauth.inlineCode().indexOf('Unauthorized').should.be.greaterThan(0); + hashauth.inlineCode().indexOf('Not authorized').should.be.greaterThan(0); hashauth.isAuthenticated().should.equal(false); var testnull = (hashauth.hash()===null); testnull.should.equal(true); }); it ('should make module authorized', function () { - this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -99,9 +97,6 @@ describe('hashauth', function ( ) { }); it ('should store hash and the remove authentication', function () { - - this.timeout(50000); - var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); var localStorage = require('./fixtures/localstorage'); diff --git a/tests/iob.test.js b/tests/iob.test.js index 30872e4fb4d9..39968f25f4dd 100644 --- a/tests/iob.test.js +++ b/tests/iob.test.js @@ -6,7 +6,6 @@ var should = require('should'); describe('IOB', function() { var ctx = {}; ctx.language = require('../lib/language')(); - ctx.language.set('en'); var iob = require('../lib/plugins/iob')(ctx); @@ -192,14 +191,6 @@ describe('IOB', function() { }); }); - it('should not blow up with null IOB data from openaps', function () { - var devicestatus = [_.merge(OPENAPS_DEVICESTATUS, { mills: time - 1, openaps: {iob: null } })]; - iob.calcTotal(treatments, devicestatus, profile, time).should.containEql({ - source: 'Care Portal', - display: '3.00' - }); - }); - it('should return IOB data from openaps post AMA (an array)', function () { var devicestatus = [_.merge(OPENAPS_DEVICESTATUS, { mills: time - 1, openaps: {iob: [{ iob: 0.047, diff --git a/tests/openaps-storage.test.js b/tests/openaps-storage.test.js index 48c2eb7764d0..d40a034b836d 100644 --- a/tests/openaps-storage.test.js +++ b/tests/openaps-storage.test.js @@ -65,6 +65,8 @@ describe('openaps storage', function () { should.not.exist(err); should.exist(results); + console.info('>>>devicestatus results', results); + results.length.should.equal(1); results[0].openaps.enacted.eventualBG.should.equal(82); diff --git a/tests/openaps.test.js b/tests/openaps.test.js index 798e3519960e..7a106041dbff 100644 --- a/tests/openaps.test.js +++ b/tests/openaps.test.js @@ -124,121 +124,6 @@ var statuses = [{ tick: '+1' } } -} -,{ - "_id": { - "$oid": "59aef8cb444d1500109fc8fd" - }, - "device": "openaps://edi1", - "openaps": { - "iob": { - "iob": 1.016, - "activity": 0.0143, - "bolussnooze": 0, - "basaliob": 0.893, - "netbasalinsulin": 0.7, - "hightempinsulin": 2.5, - "microBolusInsulin": 1.7, - "microBolusIOB": 0.933, - "lastBolusTime": 1504638182000, - "timestamp": "2017-09-05T19:18:31.000Z" - }, - "suggested": { - "insulinReq": -0.06, - "bg": 117, - "reservoir": "104.5", - "temp": "absolute", - "snoozeBG": 80, - "rate": 0.75, - "minPredBG": 78, - "IOB": 1.016, - "reason": "COB: 0, Dev: -6, BGI: -2.22, ISF: 31, Target: 80, minPredBG 78, IOBpredBG 78; Eventual BG 80 >= 80, insulinReq -0.06. temp 0.2<0.75U/hr. ", - "COB": 0, - "eventualBG": 80, - "duration": 30, - "tick": -3, - "deliverAt": "2017-09-05T19:18:43.563Z", - "timestamp": "2017-09-05T19:18:43.000Z" - }, - "enacted": { - "insulinReq": -0.06, - "received": true, - "bg": 117, - "reservoir": "104.5", - "temp": "absolute", - "snoozeBG": 80, - "timestamp": "2017-09-05T19:18:49.000Z", - "predBGs": { - "IOB": [ - 117, - 114, - 111, - 108, - 106, - 104, - 102, - 100, - 98, - 97, - 96, - 95, - 94, - 93, - 92, - 91, - 90, - 89, - 88, - 87, - 86, - 86, - 85, - 84, - 83, - 83, - 82, - 81, - 81, - 81, - 80, - 80, - 79, - 79, - 79, - 79, - 78 - ] - }, - "minPredBG": 78, - "deliverAt": "2017-09-05T19:18:43.563Z", - "duration": 30, - "rate": 0.75, - "COB": 0, - "eventualBG": 80, - "reason": "COB: 0, Dev: -6, BGI: -2.22, ISF: 31, Target: 80, minPredBG 78, IOBpredBG 78; Eventual BG 80 >= 80, insulinReq -0.06. temp 0.2<0.75U/hr. ", - "tick": -3, - "IOB": 1.016 - } - }, - "pump": { - "clock": "2017-09-05T21:18:31+02:00", - "battery": { - "status": "normal", - "voltage": 1.55 - }, - "reservoir": 104.5, - "status": { - "status": "normal", - "bolusing": false, - "suspended": false, - "timestamp": "2017-09-05T19:18:29.000Z" - } - }, - "uploader": { - "batteryVoltage": 4131, - "battery": 95 - }, - "created_at": "2017-09-05T19:19:39.899Z" }]; var now = moment(statuses[0].created_at); diff --git a/tests/profileeditor.test.js b/tests/profileeditor.test.js index 4791b139544f..ba68dde6c87e 100644 --- a/tests/profileeditor.test.js +++ b/tests/profileeditor.test.js @@ -71,7 +71,7 @@ var someData = { describe('Profile editor', function ( ) { - this.timeout(30000); + var self = this; var headless = require('./fixtures/headless')(benv, this); before(function (done) { @@ -84,11 +84,12 @@ describe('Profile editor', function ( ) { beforeEach(function (done) { var opts = { - htmlFile: __dirname + '/../views/profileindex.html' + htmlFile: __dirname + '/../static/profile/index.html' , mockProfileEditor: true , mockAjax: someData , benvRequires: [ - __dirname + '/../static/profile/js/profileeditor.js' + __dirname + '/../bundle/bundle.source.js' + , __dirname + '/../static/profile/js/profileeditor.js' ] }; headless.setup(opts, done); diff --git a/tests/reports.test.js b/tests/reports.test.js index 710b043c4b0e..b49ccd065af2 100644 --- a/tests/reports.test.js +++ b/tests/reports.test.js @@ -174,8 +174,7 @@ exampleProfile[0].startDate.setMilliseconds(0); describe('reports', function ( ) { var self = this; var headless = require('./fixtures/headless')(benv, this); - this.timeout(80000); - + before(function (done) { done( ); }); @@ -186,12 +185,13 @@ describe('reports', function ( ) { beforeEach(function (done) { var opts = { - htmlFile: __dirname + '/../views/reportindex.html' + htmlFile: __dirname + '/../static/report/index.html' , mockProfileEditor: true , serverSettings: serverSettings , mockSimpleAjax: someData , benvRequires: [ - __dirname + '/../static/report/js/report.js' + __dirname + '/../bundle/bundle.source.js' + , __dirname + '/../static/report/js/report.js' ] }; headless.setup(opts, done); @@ -204,7 +204,7 @@ describe('reports', function ( ) { it ('should produce some html', function (done) { - var client = window.Nightscout.client; + var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); hashauth.init(client,$); @@ -228,8 +228,6 @@ describe('reports', function ( ) { client.init(function afterInit ( ) { client.dataUpdate(nowData); - console.log('Sending profile to client'); - // Load profile, we need to operate in UTC client.sbx.data.profile.loadData(exampleProfile); @@ -263,10 +261,12 @@ describe('reports', function ( ) { //var logfile = filesys.createWriteStream('out.txt', { flags: 'a'} ) //logfile.write($('body').html()); + // console.log(result); + result.indexOf('Milk now').should.be.greaterThan(-1); // daytoday result.indexOf('50 g (1.67U)').should.be.greaterThan(-1); // daytoday result.indexOf('

0%100%0%264.7%638%616 (100%)0%100%0%238%664.7%616 (100%) BG: - + @@ -383,7 +463,7 @@ Carbs: - g + g @@ -586,15 +666,12 @@
- - + +
- - - - - - + + + diff --git a/views/nightscout.appcache b/views/nightscout.appcache new file mode 100644 index 000000000000..70716f344875 --- /dev/null +++ b/views/nightscout.appcache @@ -0,0 +1,34 @@ +CACHE MANIFEST + +/images/launch.png +/images/apple-touch-icon-57x57.png +/images/apple-touch-icon-60x60.png +/images/apple-touch-icon-72x72.png +/images/apple-touch-icon-76x76.png +/images/apple-touch-icon-114x114.png +/images/apple-touch-icon-120x120.png +/images/apple-touch-icon-144x144.png +/images/apple-touch-icon-152x152.png +/images/apple-touch-icon-180x180.png +/images/favicon-32x32.png +/images/android-chrome-192x192.png +/images/favicon-96x96.png +/images/favicon-16x16.png +/manifest.json +/images/favicon.ico +/images/mstile-144x144.png +/css/ui-darkness/jquery-ui.min.css +/audio/alarm.mp3 +/audio/alarm2.mp3 +/css/ui-darkness/images/ui-icons_ffffff_256x240.png +/css/ui-darkness/images/ui-icons_cccccc_256x240.png +/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png +/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png +/css/main.css?v=<%= locals.cachebuster %> +/js/bundle.js?v=<%= locals.cachebuster %> +/socket.io/socket.io.js?v=<%= locals.cachebuster %> +/js/client.js?v=<%= locals.cachebuster %> +/images/logo2.png + +NETWORK: +* diff --git a/static/profile/index.html b/views/profileindex.html similarity index 96% rename from static/profile/index.html rename to views/profileindex.html index 7fee3f106f61..7b1ff2d5b4c7 100644 --- a/static/profile/index.html +++ b/views/profileindex.html @@ -25,10 +25,10 @@ - + - +
@@ -173,11 +173,8 @@

Profile Editor

- - - - - - + + + diff --git a/static/report/index.html b/views/reportindex.html similarity index 85% rename from static/report/index.html rename to views/reportindex.html index bb67dd1520af..6236cf51078f 100644 --- a/static/report/index.html +++ b/views/reportindex.html @@ -23,8 +23,9 @@ - - + + +

Nightscout reporting

@@ -116,16 +117,9 @@

Nightscout reporting Authentication status: - - - - - - - - - - - + + + + diff --git a/static/translations/index.html b/views/translationsindex.html similarity index 79% rename from static/translations/index.html rename to views/translationsindex.html index ce0eb8dd81f8..9c394cc0374c 100644 --- a/static/translations/index.html +++ b/views/translationsindex.html @@ -24,7 +24,7 @@ - +

Nightscout translations

@@ -33,12 +33,10 @@

Nightscout translations
Authentication status: + + - - - - - - + + diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000000..a8e969c1e337 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,108 @@ +const path = require('path'); +const webpack = require('webpack'); + +var pluginArray = []; + +if (process.env.NODE_ENV !== 'development') { + + console.log('Production environment detected, enabling UglifyJsPlugin'); + + var uglify = new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + }, + output: { + comments: false + } + }); + + pluginArray.push(uglify); + +} + +if (process.env.NODE_ENV === 'development') { + + + console.log('Development environment detected, enabling Bundle Analyzer'); + + var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + + pluginArray.push(new BundleAnalyzerPlugin({ + // Can be `server`, `static` or `disabled`. + // In `server` mode analyzer will start HTTP server to show bundle report. + // In `static` mode single HTML file with bundle report will be generated. + // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`. + analyzerMode: 'static', + // Host that will be used in `server` mode to start HTTP server. + analyzerHost: '127.0.0.1', + // Port that will be used in `server` mode to start HTTP server. + analyzerPort: 8888, + // Path to bundle report file that will be generated in `static` mode. + // Relative to bundles output directory. + reportFilename: 'bundle_report.html', + // Module sizes to show in report by default. + // Should be one of `stat`, `parsed` or `gzip`. + // See "Definitions" section for more information. + defaultSizes: 'parsed', + // Automatically open report in default browser + openAnalyzer: true, + // If `true`, Webpack Stats JSON file will be generated in bundles output directory + generateStatsFile: false, + // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`. + // Relative to bundles output directory. + statsFilename: 'stats.json', + // Options for `stats.toJson()` method. + // For example you can exclude sources of your modules from stats file with `source: false` option. + // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21 + statsOptions: null, + // Log level. Can be 'info', 'warn', 'error' or 'silent'. + logLevel: 'info' + })); + +} + +var jq = new webpack.ProvidePlugin({ + $: "jquery", + jQuery: "jquery", + "window.jQuery": "jquery'", + "window.$": "jquery" +}); + +pluginArray.push(jq); + +module.exports = { + context: path.resolve(__dirname, '.'), + entry: { + app: './bundle/bundle.source.js' + }, + output: { + path: path.resolve(__dirname, './tmp'), + publicPath: '/', + filename: 'js/bundle.js' + }, + devtool: "#inline-source-map", + plugins: pluginArray, + module: { + rules: [{ + test: /\.(jpe?g|png|gif)$/i, + loader: "file-loader", + query: { + name: '[name].[ext]', + outputPath: 'images/' + //the images will be emmited to public/assets/images/ folder + //the images will be put in the DOM