diff --git a/.gitignore b/.gitignore index e088fce0240..2cb28800650 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules/ bundle/bundle.out.js +.vscode/ .idea/ *.iml my.env @@ -22,4 +23,4 @@ coverage/ npm-debug.log *.heapsnapshot -/tmp \ No newline at end of file +/tmp diff --git a/.nvmrc b/.nvmrc index ac2895c5967..eec6dacbd48 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -8.1.4 +8.8.1 diff --git a/.travis.yml b/.travis.yml index c4e348952a8..b795df9bc3e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,8 @@ language: node_js sudo: required +dist: trusty node_js: - - "8.5.0" + - "8.8.1" matrix: fast_finish: true services: diff --git a/Dockerfile.example b/Dockerfile.example index d6f6f0f8821..24caa59b55c 100644 --- a/Dockerfile.example +++ b/Dockerfile.example @@ -1,4 +1,4 @@ -FROM node:8.5.0 +FROM node:8.8.1 MAINTAINER Nightscout Contributors diff --git a/Makefile b/Makefile index 34f9030cb34..b3748228830 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ all: test coverage: NODE_ENV=test ${MONGO_SETTINGS} \ - ${ISTANBUL} cover ${MOCHA} -- --timeout 30000 -R tap ${TESTS} + ${ISTANBUL} cover ${MOCHA} -- --timeout 15000 -R tap ${TESTS} report: test -f ${ANALYZED} && \ @@ -45,7 +45,7 @@ test: travis: NODE_ENV=test ${MONGO_SETTINGS} \ - ${ISTANBUL} cover ${MOCHA} --report lcovonly -- --timeout 50000 -R tap ${TESTS} + ${ISTANBUL} cover ${MOCHA} --report lcovonly -- --timeout 5000 -R tap ${TESTS} docker_release: # Get the version from the package.json file diff --git a/README.md b/README.md index cdb941efbf9..ffb9b6d7f7b 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Community maintained fork of the Requirements: -- [Node.js](http://nodejs.org/) +- [Node.js](http://nodejs.org/) 8.8.1 (use [Install instructions for Node](https://nodejs.org/en/download/package-manager/) or `setup.sh`) Clone this repo then install dependencies into the root of the project: @@ -113,7 +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. +If deploying the software to Microsoft Azure, you must set *WEBSITE_NODE_DEFAULT_VERSION* in the app settings to *8.8.1* **before** you deploy the latest Nightscout or the site deployment will likely fail. Other hosting environments do not require this setting. # Usage diff --git a/app.js b/app.js index 1bdacc65369..a073eff8f80 100644 --- a/app.js +++ b/app.js @@ -166,7 +166,7 @@ function create(env, ctx) { json_match: /json/, uglifyJS: myUglifyJS, cssmin: myCssmin, - cache: __dirname + '/cache', + cache: __dirname + '/tmp', onerror: undefined, })); diff --git a/scripts/generateCacheBuster.js b/bin/generateCacheBuster.js similarity index 100% rename from scripts/generateCacheBuster.js rename to bin/generateCacheBuster.js diff --git a/bower.json b/bower.json index 80cdd2a58c1..7dcdfdf6717 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "nightscout", - "version": "0.10.0-dev-20170716", + "version": "0.10.2-release-20171026", "dependencies": { "colorbrewer": "~1.0.0", "jQuery-Storage-API": "~1.7.2", diff --git a/lib/api/entries/index.js b/lib/api/entries/index.js index ffecef92f78..425fee4f7a1 100644 --- a/lib/api/entries/index.js +++ b/lib/api/entries/index.js @@ -86,7 +86,7 @@ function configure (app, wares, ctx) { var ifModifiedSince = req.get('If-Modified-Since'); if (!ifModifiedSince) { return next(); } - if (lastEntryDate <= new Date(ifModifiedSince)) { + if (lastEntryDate.getTime() <= new Date(ifModifiedSince).getTime()) { res.status(304).send({status:304, message: 'Not modified', type:'internal'}); return; } diff --git a/lib/api/treatments/index.js b/lib/api/treatments/index.js index 5b0c0500b77..842c26df800 100644 --- a/lib/api/treatments/index.js +++ b/lib/api/treatments/index.js @@ -2,6 +2,7 @@ var _ = require('lodash'); var consts = require('../../constants'); +var moment = require('moment'); function configure(app, wares, ctx) { var express = require('express') @@ -39,16 +40,26 @@ function configure(app, wares, ctx) { t.carbs = Number(t.carbs); t.insulin = Number(t.insulin); - var d2 = new Date(t.timestamp); + var d2 = null; - if (d1 == null || d2 > d1) { + if (t.hasOwnProperty('created_at')) { + d2 = new Date(t.created_at); + } else { + if (t.hasOwnProperty('timestamp')) { + d2 = new Date(t.timestamp); + } + } + + if (d2 == null) { return; } + + if (d1 == null || d2.getTime() > d1.getTime()) { d1 = d2; } }); if (!_.isNil(d1)) res.setHeader('Last-Modified', d1.toUTCString()); - if (ifModifiedSince && d1 <= new Date(ifModifiedSince)) { + if (ifModifiedSince && d1.getTime() <= moment(ifModifiedSince).valueOf()) { res.status(304).send({ status: 304 , message: 'Not modified' diff --git a/lib/client/boluscalc.js b/lib/client/boluscalc.js index d9999599094..5c83f478f57 100644 --- a/lib/client/boluscalc.js +++ b/lib/client/boluscalc.js @@ -621,41 +621,41 @@ function init(client, $) { boluscalc.loadFoodDatabase = function loadFoodDatabase(event, callback) { categories = []; foodlist = []; - $.ajax('/api/v1/food/regular.json', { - headers: client.headers() - , success: function (records) { - records.forEach(function (r) { - foodlist.push(r); - if (r.category && !categories[r.category]) { - categories[r.category] = {}; - } - if (r.category && r.subcategory) { - categories[r.category][r.subcategory] = true; - } - }); - databaseloaded = true; - console.log('Food database loaded'); - fillForm(); + var records = client.sbx.data.food || []; + records.forEach(function (r) { + if (r.type == 'food') { + foodlist.push(r); + if (r.category && !categories[r.category]) { + categories[r.category] = {}; + } + if (r.category && r.subcategory) { + categories[r.category][r.subcategory] = true; + } } - }).done(function() { if (callback) { callback(); } }); + }); + databaseloaded = true; + console.log('Food database loaded'); + fillForm(); maybePrevent(event); + if (callback) { callback(); } }; boluscalc.loadFoodQuickpicks = function loadFoodQuickpicks( ) { // Load quickpicks - $.ajax('/api/v1/food/quickpicks.json', { - headers: client.headers() - , success: function (records) { - quickpicks = records; - $('#bc_quickpick').empty().append(''); - for (var i=0; i' + r.name + ' (' + r.carbs + ' g)'); - }; - $('#bc_quickpick').val(-1); - $('#bc_quickpick').change(quickpickChange); + quickpicks = []; + var records = client.sbx.data.food || []; + records.forEach(function (r) { + if (r.type == 'quickpick') { + quickpicks.push(r); } }); + $('#bc_quickpick').empty().append(''); + for (var i=0; i' + r.name + ' (' + r.carbs + ' g)'); + }; + $('#bc_quickpick').val(-1); + $('#bc_quickpick').change(quickpickChange); }; function fillForm(event) { diff --git a/lib/client/receiveddata.js b/lib/client/receiveddata.js index aa05fe2e31a..e80b971710f 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(true); + ddata.processTreatments(false); // 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 ca263bac6f1..122a50abfb8 100644 --- a/lib/client/renderer.js +++ b/lib/client/renderer.js @@ -1075,9 +1075,9 @@ function init (client, d3) { var sign = t.first ? '▲▲▲' : '▬▬▬'; var ret; if (t.cutting) { - ret = sign + ' ' + t.cutting + ' ' + '►►►' + ' ' + t.profile + ' ' + sign; + ret = sign + ' ' + client.profilefunctions.profileSwitchName(t.cutting) + ' ' + '►►►' + ' ' + client.profilefunctions.profileSwitchName(t.profile) + ' ' + sign; } else { - ret = sign + ' ' + t.profile + ' ' + sign; + ret = sign + ' ' + client.profilefunctions.profileSwitchName(t.profile) + ' ' + sign; } return ret; }; diff --git a/lib/data/dataloader.js b/lib/data/dataloader.js index 7a28abf190c..541e32a9c38 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(false); + ddata.processTreatments(true); var counts = []; _.forIn(ddata, function each (value, key) { @@ -66,6 +66,7 @@ function init(env, ctx) { , loadProfileSwitchTreatments.bind(null, ddata, ctx) , loadSensorAndInsulinTreatments.bind(null, ddata, ctx) , loadProfile.bind(null, ddata, ctx) + , loadFood.bind(null, ddata, ctx) , loadDeviceStatus.bind(null, ddata, env, ctx) ], loadComplete); @@ -249,7 +250,16 @@ function loadProfile (ddata, ctx, callback) { }); } -function loadDeviceStatus (ddata, env, ctx, callback) { + function loadFood (ddata, ctx, callback) { + ctx.food.list(function (err, results) { + if (!err && results) { + ddata.food = results; + } + callback(); + }); + } + + function loadDeviceStatus (ddata, env, ctx, callback) { var dateRange = { $gte: new Date(ddata.lastUpdated - ONE_DAY).toISOString() }; diff --git a/lib/data/ddata.js b/lib/data/ddata.js index 08350a268e2..49f874cb2d1 100644 --- a/lib/data/ddata.js +++ b/lib/data/ddata.js @@ -14,6 +14,7 @@ function init( ) { , cals: [] , profiles: [] , devicestatus: [] + , food: [] , lastUpdated: 0 }; @@ -63,9 +64,20 @@ function init( ) { result.first.sgvs = ddata.sgvs.filter(filterMax); result.first.cals = ddata.cals; - result.first.profiles = ddata.profiles; + + var profiles = _.cloneDeep(ddata.profiles); + if (profiles && profiles[0]) + for (var k in profiles[0].store) { + if (profiles[0].store.hasOwnProperty(k)) { + if (k.indexOf('@@@@@') > 0) { + delete profiles[0].store[k]; + } + } + } + result.first.profiles = profiles; result.rest.mbgs = ddata.mbgs.filter(filterMax); + result.rest.food = ddata.food; console.log('results.first size', JSON.stringify(result.first).length,'bytes'); console.log('results.rest size', JSON.stringify(result.rest).length,'bytes'); @@ -163,7 +175,7 @@ function init( ) { } }; - ddata.processTreatments = function processTreatments (callProcessDurations ) { + ddata.processTreatments = function processTreatments (preserveOrignalTreatments ) { // filter & prepare 'Site Change' events ddata.sitechangeTreatments = ddata.treatments.filter( function filterSensor (t) { @@ -184,8 +196,9 @@ function init( ) { var profileTreatments = ddata.treatments.filter( function filterProfiles (t) { return t.eventType === 'Profile Switch'; }).sort(function (a,b) { return a.mills > b.mills; }); - if (callProcessDurations) - ddata.profileTreatments = ddata.processDurations(profileTreatments, true); + if (preserveOrignalTreatments) + profileTreatments = _.cloneDeep(profileTreatments); + ddata.profileTreatments = ddata.processDurations(profileTreatments, true); // filter & prepare 'Combo Bolus' events ddata.combobolusTreatments = ddata.treatments.filter( function filterComboBoluses (t) { @@ -196,15 +209,17 @@ function init( ) { var tempbasalTreatments = ddata.treatments.filter( function filterBasals (t) { return t.eventType && t.eventType.indexOf('Temp Basal') > -1; }); - if (callProcessDurations) - ddata.tempbasalTreatments = ddata.processDurations(tempbasalTreatments, false); + if (preserveOrignalTreatments) + tempbasalTreatments = _.cloneDeep(tempbasalTreatments); + ddata.tempbasalTreatments = ddata.processDurations(tempbasalTreatments, false); // filter temp target var tempTargetTreatments = ddata.treatments.filter( function filterTargets (t) { return t.eventType && t.eventType.indexOf('Temporary Target') > -1; }); - if (callProcessDurations) - ddata.tempTargetTreatments = ddata.processDurations(tempTargetTreatments, false); + if (preserveOrignalTreatments) + tempTargetTreatments = _.cloneDeep(tempTargetTreatments); + ddata.tempTargetTreatments = ddata.processDurations(tempTargetTreatments, false); }; diff --git a/lib/language.js b/lib/language.js index 263529f5bad..6b2482d4cfa 100644 --- a/lib/language.js +++ b/lib/language.js @@ -8210,7 +8210,7 @@ function init() { ,de: 'Insulin-Alter' ,bg: 'Възраст на инсулина (ВИ)' ,ro: 'Vechimea insulinei' - ,ru: 'Возраст инсулина' + ,ru: 'инсулин проработал' ,nl: 'Insuline leeftijd (IAGE)' ,ko: '인슐린 사용 기간' ,fi: 'Insuliinin ikä' @@ -8633,7 +8633,7 @@ function init() { 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)' @@ -10201,7 +10201,7 @@ function init() { , pl: 'slightly dropping' , pt: 'slightly dropping' , ro: 'slightly dropping' - , ru: 'slightly dropping' + , ru: 'незначительное падение' , sk: 'slightly dropping' , sv: 'slightly dropping' , zh_cn: 'slightly dropping' @@ -10225,7 +10225,7 @@ function init() { , pl: 'slightly rising' , pt: 'slightly rising' , ro: 'slightly rising' - , ru: 'slightly rising' + , ru: 'незначительный подъем' , sk: 'slightly rising' , sv: 'slightly rising' , zh_cn: 'slightly rising' @@ -10249,7 +10249,7 @@ function init() { , pl: 'holding' , pt: 'holding' , ro: 'holding' - , ru: 'holding' + , ru: 'ровный' , sk: 'holding' , sv: 'holding' , zh_cn: 'holding' @@ -10273,7 +10273,7 @@ function init() { , pl: 'rising' , pt: 'rising' , ro: 'rising' - , ru: 'rising' + , ru: 'растет' , sk: 'rising' , sv: 'rising' , zh_cn: 'rising' @@ -10297,7 +10297,7 @@ function init() { , pl: 'dropping' , pt: 'dropping' , ro: 'dropping' - , ru: 'dropping' + , ru: 'падает' , sk: 'dropping' , sv: 'dropping' , zh_cn: 'dropping' @@ -10321,7 +10321,7 @@ function init() { , pl: 'rapidly dropping' , pt: 'rapidly dropping' , ro: 'rapidly dropping' - , ru: 'rapidly dropping' + , ru: 'быстро падает' , sk: 'rapidly dropping' , sv: 'rapidly dropping' , zh_cn: 'rapidly dropping' @@ -10345,7 +10345,7 @@ function init() { , pl: 'rapidly rising' , pt: 'rapidly rising' , ro: 'rapidly rising' - , ru: 'rapidly rising' + , ru: 'быстро растет' , sk: 'rapidly rising' , sv: 'rapidly rising' , zh_cn: 'rapidly rising' @@ -10369,7 +10369,7 @@ function init() { , pl: '%1 and %2 as of %3.' , pt: '%1 and %2 as of %3.' , ro: '%1 and %2 as of %3.' - , ru: '%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.' @@ -10393,7 +10393,7 @@ function init() { , 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 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' @@ -10417,7 +10417,7 @@ function init() { , 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 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' @@ -10441,7 +10441,7 @@ function init() { , 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: '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.' @@ -10465,7 +10465,7 @@ function init() { , pl: 'You have %1 insulin on board' , pt: 'You have %1 insulin on board' , ro: 'You have %1 insulin on board' - , ru: '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' @@ -10489,7 +10489,7 @@ function init() { , pl: '%1 units of' , pt: '%1 units of' , ro: '%1 units of' - , ru: '%1 units of' + , ru: '%1 единиц' , sk: '%1 units of' , sv: '%1 units of' , zh_cn: '%1 units of' @@ -10513,7 +10513,7 @@ function init() { , pl: 'Your' , pt: 'Your' , ro: 'Your' - , ru: 'Your' + , ru: 'ваш' , sk: 'Your' , sv: 'Your' , zh_cn: 'Your' @@ -10536,7 +10536,7 @@ function init() { , nb: '%1 has a ' , pl: '%1 has a ' , pt: '%1 has a ' - , ro: '%1 has a ' + , ro: '%1 имеет ' , ru: '%1 has a ' , sk: '%1 has a ' , sv: '%1 has a ' @@ -10561,11 +10561,20 @@ function init() { , pl: 'no' , pt: 'no' , ro: 'no' - , ru: 'no' + , ru: 'нет' , sk: 'no' , sv: 'no' , zh_cn: 'no' , zh_tw: 'no' + }, + 'Fat [g]': { + cs: 'Tuk [g]' + }, + 'Protein [g]': { + cs: 'Proteiny [g]' + }, + 'Energy [kJ]': { + cs: 'Energie [kJ]' } }; diff --git a/lib/plugins/loop.js b/lib/plugins/loop.js index b2d092856f2..12d89bd5296 100644 --- a/lib/plugins/loop.js +++ b/lib/plugins/loop.js @@ -194,6 +194,36 @@ 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; @@ -283,8 +313,10 @@ 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(); diff --git a/lib/profilefunctions.js b/lib/profilefunctions.js index 582dca2a375..b7f85537ac0 100644 --- a/lib/profilefunctions.js +++ b/lib/profilefunctions.js @@ -235,9 +235,23 @@ function init (profileData) { var duration = times.mins(t.duration || 0).msecs; if (duration != 0 && time < t.mills + duration) { treatment = t; + // if profile switch contains json of profile inject it in to store to be findable by profile name + if (treatment.profileJson && !profile.data[0].store[treatment.profile]) { + if (treatment.profile.indexOf("@@@@@") < 0) + treatment.profile += "@@@@@" + treatment.mills; + var json = JSON.parse(treatment.profileJson); + profile.data[0].store[treatment.profile] = json; + } } if (duration == 0) { treatment = t; + // if profile switch contains json of profile inject it in to store to be findable by profile name + if (treatment.profileJson && !profile.data[0].store[treatment.profile]) { + if (treatment.profile.indexOf("@@@@@") < 0) + treatment.profile += "@@@@@" + treatment.mills; + var json = JSON.parse(treatment.profileJson); + profile.data[0].store[treatment.profile] = json; + } } } }); @@ -248,6 +262,12 @@ function init (profileData) { return returnValue; }; + profile.profileSwitchName = function profileSwitchName(name) { + var index = name.indexOf("@@@@@"); + if (index < 0) return name; + else return name.substring(0, index); + } + profile.tempBasalTreatment = function tempBasalTreatment (time) { // Most queries for the data in reporting will match the latest found value, caching that hugely improves performance diff --git a/lib/report_plugins/daytoday.js b/lib/report_plugins/daytoday.js index 69392d56e13..3f66a29de44 100644 --- a/lib/report_plugins/daytoday.js +++ b/lib/report_plugins/daytoday.js @@ -832,9 +832,9 @@ daytoday.report = function report_daytoday(datastorage,sorteddaystoshow,options) var sign = treatment.first ? '▲▲▲' : '▬▬▬'; var text; if (treatment.cutting) { - text = sign + ' ' + treatment.cutting + ' ' + '►►►' + ' ' + treatment.profile + ' ' + sign; + text = sign + ' ' + client.profilefunctions.profileSwitchName(treatment.cutting) + ' ' + '►►►' + ' ' + client.profilefunctions.profileSwitchName(treatment.profile) + ' ' + sign; } else { - text = sign + ' ' + treatment.profile + ' ' + sign; + text = sign + ' ' + client.profilefunctions.profileSwitchName(treatment.profile) + ' ' + sign; } context.append('text') .style('font-size', 12) diff --git a/lib/report_plugins/glucosedistribution.js b/lib/report_plugins/glucosedistribution.js index a2c5c6de6d6..7b0175a73ca 100644 --- a/lib/report_plugins/glucosedistribution.js +++ b/lib/report_plugins/glucosedistribution.js @@ -217,17 +217,14 @@ glucosedistribution.report = function report_glucosedistribution(datastorage, so prevEntry = entry; } - glucose_data = data = glucose_data2; - - - var hourlyFilteredData = data.filter(function(r) { + glucose_data = data = glucose_data2.filter(function(r) { return enabledHours[new Date(r.displayTime).getHours()] }); ['Low', 'Normal', 'High'].forEach(function(range) { result[range] = {}; var r = result[range]; - r.rangeRecords = hourlyFilteredData.filter(function(r) { + r.rangeRecords = glucose_data.filter(function(r) { if (range === 'Low') { return r.sgv > 0 && r.sgv < options.targetLow; } else if (range === 'Normal') { @@ -291,14 +288,14 @@ glucosedistribution.report = function report_glucosedistribution(datastorage, so var tr = $(''); $('' + translate('Overall') + ': ').appendTo(tr); $(' ').appendTo(tr); - $('' + hourlyFilteredData.length + '').appendTo(tr); - if (hourlyFilteredData.length > 0) { - var localBgs = hourlyFilteredData.map(function(r) { + $('' + glucose_data.length + '').appendTo(tr); + if (glucose_data.length > 0) { + var localBgs = glucose_data.map(function(r) { return r.sgv; }).filter(function(bg) { return !!bg; }); - var mgDlBgs = hourlyFilteredData.map(function(r) { + var mgDlBgs = glucose_data.map(function(r) { return r.bgValue; }).filter(function(bg) { return !!bg; diff --git a/package-lock.json b/npm-shrinkwrap.json similarity index 94% rename from package-lock.json rename to npm-shrinkwrap.json index 4142d0f9e65..3bf32f1760e 100644 --- a/package-lock.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "Nightscout", - "version": "0.10.0-release-20170922", + "version": "0.10.2-release-20171026", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -59,14 +59,14 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -173,15 +173,6 @@ "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", @@ -369,34 +360,34 @@ "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=", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.2", - "debug": "2.6.8", + "content-type": "1.0.4", + "debug": "2.6.9", "depd": "1.1.1", "http-errors": "1.6.2", - "iconv-lite": "0.4.18", + "iconv-lite": "0.4.19", "on-finished": "2.3.0", - "qs": "6.5.0", - "raw-body": "2.3.1", + "qs": "6.5.1", + "raw-body": "2.3.2", "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=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" } } }, @@ -944,31 +935,48 @@ } }, "compression": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", "requires": { - "accepts": "1.3.3", - "bytes": "2.5.0", + "accepts": "1.3.4", + "bytes": "3.0.0", "compressible": "2.0.11", - "debug": "2.6.8", + "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.1" + "vary": "1.1.2" }, "dependencies": { - "bytes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } } } }, @@ -996,9 +1004,9 @@ "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=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "content-type-parser": { "version": "1.0.1", @@ -1674,9 +1682,9 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", @@ -1699,13 +1707,6 @@ "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": { @@ -1774,57 +1775,81 @@ "integrity": "sha1-NfvTZZeJ5PqoH1nei36fw55GbVE=" }, "express": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", - "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "requires": { - "accepts": "1.3.3", + "accepts": "1.3.4", "array-flatten": "1.1.1", + "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.2", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", - "debug": "2.6.8", + "debug": "2.6.9", "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", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", + "proxy-addr": "2.0.2", + "qs": "6.5.1", "range-parser": "1.2.0", - "send": "0.15.4", - "serve-static": "1.12.4", - "setprototypeof": "1.0.3", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", "statuses": "1.3.1", "type-is": "1.6.15", - "utils-merge": "1.0.0", - "vary": "1.1.1" + "utils-merge": "1.0.1", + "vary": "1.1.2" }, "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "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=" + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } }, "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, @@ -1854,16 +1879,16 @@ }, "dependencies": { "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + "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.6", + "source-map": "0.5.7", "uglify-to-browserify": "1.0.2", "yargs": "3.10.0" } @@ -1909,6 +1934,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "fastparse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", @@ -1961,23 +1991,23 @@ } }, "finalhandler": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.4.tgz", - "integrity": "sha512-16l/r8RgzlXKmFOhZpHBztvye+lAhC5SU7hXavnerC9UfZqZxxXl3BzL8MhffPT3kF61lj9Oav2LKEzh0ei7tg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "encodeurl": "1.0.1", "escape-html": "1.0.3", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "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=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -2114,14 +2144,14 @@ "dev": true }, "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from": { "version": "0.1.7", @@ -3028,12 +3058,18 @@ "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, "requires": { - "async": "0.9.2", + "async": "1.5.2", "optimist": "0.5.2", "source-map": "0.1.43", "uglify-js": "2.8.29" }, "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -3071,9 +3107,9 @@ } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "1.8.0", @@ -3221,9 +3257,9 @@ "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==" + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "icss-replace-symbols": { "version": "1.1.0", @@ -3331,9 +3367,9 @@ "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=" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" }, "is-absolute-url": { "version": "2.1.0", @@ -3494,7 +3530,7 @@ "dev": true, "requires": { "abbrev": "1.0.9", - "async": "0.9.2", + "async": "1.5.2", "escodegen": "0.0.15", "esprima": "1.0.2", "glob": "7.1.2", @@ -3507,6 +3543,14 @@ "supports-color": "2.0.0", "which": "1.2.14", "wordwrap": "0.0.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "joi": { @@ -3516,7 +3560,7 @@ "requires": { "hoek": "2.16.3", "isemail": "1.2.0", - "moment": "2.18.1", + "moment": "2.19.1", "topo": "1.1.0" } }, @@ -3587,7 +3631,7 @@ "nwmatcher": "1.4.1", "parse5": "3.0.2", "pn": "1.0.0", - "request": "2.81.0", + "request": "2.83.0", "request-promise-native": "1.0.4", "sax": "1.2.4", "symbol-tree": "3.2.2", @@ -4005,7 +4049,8 @@ "mime": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true }, "mime-db": { "version": "1.27.0", @@ -4056,6 +4101,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, "qs": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", @@ -4129,25 +4179,25 @@ } }, "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", + "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" }, "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" + "moment": "2.19.1" } }, "mongodb": { - "version": "2.2.31", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", - "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", "requires": { "es6-promise": "3.2.1", - "mongodb-core": "2.1.15", + "mongodb-core": "2.1.17", "readable-stream": "2.2.7" }, "dependencies": { @@ -4168,9 +4218,9 @@ } }, "mongodb-core": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", - "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", "requires": { "bson": "1.0.4", "require_optional": "1.0.1" @@ -4320,11 +4370,6 @@ } } }, - "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", @@ -4587,9 +4632,9 @@ } }, "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "path": { "version": "0.12.7", @@ -4654,9 +4699,9 @@ } }, "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", @@ -5250,15 +5295,26 @@ "requires": { "ascli": "1.0.1", "bytebuffer": "3.1.1" + }, + "dependencies": { + "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" + } + } } }, "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "requires": { - "forwarded": "0.1.0", - "ipaddr.js": "1.4.0" + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" } }, "prr": { @@ -5327,7 +5383,8 @@ "qs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true }, "query-string": { "version": "4.3.4", @@ -5411,13 +5468,13 @@ "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "requires": { "bytes": "3.0.0", "http-errors": "1.6.2", - "iconv-lite": "0.4.18", + "iconv-lite": "0.4.19", "unpipe": "1.0.0" } }, @@ -5558,89 +5615,154 @@ "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=", + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "requires": { - "aws-sign2": "0.6.0", + "aws-sign2": "0.7.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", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", + "mime-types": "2.1.17", "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", + "performance-now": "2.1.0", + "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.2", + "tough-cookie": "2.3.3", "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=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "mime-types": "2.1.17" } }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "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" - } - } + "ajv": "5.3.0", + "har-schema": "2.0.0" } }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "0.2.0", + "assert-plus": "1.0.0", "jsprim": "1.4.0", "sshpk": "1.13.1" } }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "sntp": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "requires": { + "hoek": "4.2.0" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5648,11 +5770,6 @@ "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==" } } }, @@ -5787,19 +5904,19 @@ "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=", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "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", + "etag": "1.8.1", + "fresh": "0.5.2", "http-errors": "1.6.2", - "mime": "1.3.4", + "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", "range-parser": "1.2.0", @@ -5807,40 +5924,29 @@ }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "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" - } + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, "serve-static": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", - "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "requires": { "encodeurl": "1.0.1", "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.15.4" + "parseurl": "1.3.2", + "send": "0.16.1" } }, "set-blocking": { @@ -5988,6 +6094,11 @@ "mime-db": "1.12.0" } }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, "oauth-sign": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", @@ -6673,18 +6784,18 @@ } }, "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.5.tgz", + "integrity": "sha512-tSqlO7/GZHAVSw6mbtJt2kz0ZcUrKUH7Xg92o52aE+gL0r6cXiASZY4dpHqQ7RVGXmoQuPA2qAkG4TkP59f8XA==", "requires": { "commander": "2.11.0", - "source-map": "0.5.7" + "source-map": "0.6.1" }, "dependencies": { "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -6817,9 +6928,9 @@ } }, "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.1.0", @@ -6836,9 +6947,9 @@ } }, "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { "version": "1.0.1", @@ -6888,13 +6999,13 @@ "dev": true }, "webpack": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.6.tgz", - "integrity": "sha512-sXnxfx6KoZVrFAGLjdhCCwDtDwkYMfwm8mJjkQv3thr5pjTlbxopVlr/kJwc9Bz317gL+gNjvz++ir9TgG1MDg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { "acorn": "5.1.2", "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", + "ajv": "5.3.0", "ajv-keywords": "2.1.0", "async": "2.5.0", "enhanced-resolve": "3.4.1", @@ -6908,7 +7019,7 @@ "mkdirp": "0.5.1", "node-libs-browser": "2.0.0", "source-map": "0.5.7", - "supports-color": "4.4.0", + "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", "watchpack": "1.4.0", @@ -6921,21 +7032,10 @@ "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=", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", "requires": { "lodash": "4.17.4" } @@ -6951,9 +7051,9 @@ "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==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { "has-flag": "2.0.0" } @@ -6970,7 +7070,7 @@ "chalk": "1.1.3", "commander": "2.11.0", "ejs": "2.5.7", - "express": "4.15.4", + "express": "4.16.2", "filesize": "3.5.10", "gzip-size": "3.0.0", "lodash": "4.17.4", diff --git a/package.json b/package.json index 50deae48e62..5fd8189df38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Nightscout", - "version": "0.10.1-dev-20170923", + "version": "0.10.2-release-20171026", "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", @@ -28,9 +28,9 @@ "test": "make test", "env": "env", "postinstall": "webpack --config webpack.config.js && npm run-script update-buster", - "bundle": "webpack --config webpack.config.js", + "bundle": "webpack --config webpack.config.js && npm run-script update-buster", "bower": "node node_modules/bower/bin/bower --allow-root install && ", - "update-buster": "node scripts/generateCacheBuster.js >tmp/cacheBusterToken" + "update-buster": "node bin/generateCacheBuster.js >tmp/cacheBusterToken" }, "config": { "blanket": { @@ -47,14 +47,14 @@ } }, "engines": { - "node": "8.5.0" + "node": "8.8.1" }, "dependencies": { - "ajv": "^5.2.2", + "ajv": "^5.3.0", "async": "^0.9.2", - "body-parser": "^1.18.0", + "body-parser": "^1.18.2", "bootevent": "0.0.1", - "compression": "^1.7.0", + "compression": "^1.7.1", "css-loader": "^0.28.7", "cssmin": "^0.4.3", "d3": "^3.5.17", @@ -63,7 +63,7 @@ "event-stream": "^3.3.4", "expand-braces": "^0.1.2", "expose-loader": "^0.7.3", - "express": "^4.15.4", + "express": "^4.16.2", "express-extension-to-accept": "0.0.2", "express-minify": "^0.2.0", "file-loader": "^0.11.2", @@ -79,9 +79,9 @@ "long": "^3.2.0", "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": "^2.19.1", "moment-timezone": "^0.5.13", - "mongodb": "^2.2.31", + "mongodb": "^2.2.33", "mongomock": "^0.1.2", "mqtt": "^0.3.13", "node-cache": "^4.1.1", @@ -90,7 +90,7 @@ "prettyjson": "^1.2.1", "pushover-notifications": "^0.2.4", "random-token": "0.0.8", - "request": "^2.81.0", + "request": "^2.83.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", @@ -100,9 +100,9 @@ "sugar": "^1.5.0", "sync-exec": "^0.6.2", "traverse": "^0.6.6", - "uglify-js": "^3.1.0", + "uglify-js": "^3.1.5", "uuid": "^3.1.0", - "webpack": "^3.5.6" + "webpack": "^3.8.1" }, "devDependencies": { "benv": "3.3.0", diff --git a/setup.sh b/setup.sh index e520a97a025..605696532ff 100755 --- a/setup.sh +++ b/setup.sh @@ -1,9 +1,9 @@ #!/bin/sh +curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get update -sudo apt-get install -y python-software-properties python g++ make git -sudo add-apt-repository ppa:chris-lea/node.js -sudo apt-get update -sudo apt-get install nodejs +sudo apt-get install -y nodejs +sudo apt-get install -y python-software-properties python git +sudo apt-get install -y build-essential npm install \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css index 246becf2c25..ea6541b876c 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -3,8 +3,8 @@ @font-face { font-family: 'nsicons'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), - url(data:application/font-svg;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtZXRhZGF0YT5Db3B5cmlnaHQgKEMpIDIwMTcgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbTwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0ibnNpY29ucyIgaG9yaXotYWR2LXg9IjEwMDAiID4KPGZvbnQtZmFjZSBmb250LWZhbWlseT0ibnNpY29ucyIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1zdHJldGNoPSJub3JtYWwiIHVuaXRzLXBlci1lbT0iMTAwMCIgYXNjZW50PSI4NTAiIGRlc2NlbnQ9Ii0xNTAiIC8+CjxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSIxMDAwIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0idm9sdW1lLXVwIiB1bmljb2RlPSImI3hlODAwOyIgZD0iTTQyOSA2NTR2LTYwOHEwLTE0LTExLTI1dC0yNS0xMC0yNSAxMGwtMTg2IDE4NmgtMTQ2cS0xNSAwLTI1IDExdC0xMSAyNXYyMTRxMCAxNSAxMSAyNXQyNSAxMWgxNDZsMTg2IDE4NnExMCAxMCAyNSAxMHQyNS0xMCAxMS0yNXogbTIxNC0zMDRxMC00Mi0yNC03OXQtNjMtNTJxLTUtMy0xNC0zLTE0IDAtMjUgMTB0LTEwIDI2cTAgMTIgNiAyMHQxNyAxNCAxOSAxMiAxNiAyMSA2IDMxLTYgMzItMTYgMjAtMTkgMTMtMTcgMTMtNiAyMHEwIDE1IDEwIDI2dDI1IDEwcTkgMCAxNC0zIDM5LTE1IDYzLTUydDI0LTc5eiBtMTQzIDBxMC04NS00OC0xNTh0LTEyNS0xMDVxLTctMy0xNC0zLTE1IDAtMjYgMTF0LTEwIDI1cTAgMjIgMjEgMzMgMzIgMTYgNDMgMjUgNDEgMzAgNjQgNzV0MjMgOTctMjMgOTctNjQgNzVxLTExIDktNDMgMjUtMjEgMTEtMjEgMzMgMCAxNCAxMCAyNXQyNSAxMXE4IDAgMTUtMyA3OC0zMyAxMjUtMTA1dDQ4LTE1OHogbTE0MyAwcTAtMTI4LTcxLTIzNnQtMTg5LTE1OHEtNy0zLTE0LTMtMTUgMC0yNSAxMXQtMTEgMjVxMCAyMCAyMiAzMyA0IDIgMTIgNnQxMyA2cTI1IDE0IDQ2IDI4IDY4IDUxIDEwNyAxMjd0MzggMTYxLTM4IDE2MS0xMDcgMTI3cS0yMSAxNS00NiAyOC00IDMtMTMgNnQtMTIgNnEtMjIgMTMtMjIgMzMgMCAxNSAxMSAyNXQyNSAxMXE3IDAgMTQtMyAxMTgtNTEgMTg5LTE1OHQ3MS0yMzZ6IiBob3Jpei1hZHYteD0iOTI4LjYiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0icGx1cyIgdW5pY29kZT0iJiN4ZTgwMTsiIGQ9Ik03ODYgNDM5di0xMDdxMC0yMi0xNi0zOHQtMzgtMTVoLTIzMnYtMjMzcTAtMjItMTYtMzd0LTM4LTE2aC0xMDdxLTIyIDAtMzggMTZ0LTE1IDM3djIzM2gtMjMycS0yMyAwLTM4IDE1dC0xNiAzOHYxMDdxMCAyMyAxNiAzOHQzOCAxNmgyMzJ2MjMycTAgMjIgMTUgMzh0MzggMTZoMTA3cTIzIDAgMzgtMTZ0MTYtMzh2LTIzMmgyMzJxMjMgMCAzOC0xNnQxNi0zOHoiIGhvcml6LWFkdi14PSI3ODUuNyIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJlZGl0IiB1bmljb2RlPSImI3hlODAyOyIgZD0iTTQ5NiAxODlsNjQgNjUtODUgODUtNjQtNjV2LTMxaDUzdi01NGgzMnogbTI0NSA0MDJxLTkgOS0xOCAwbC0xOTYtMTk2cS05LTkgMC0xOHQxOCAwbDE5NiAxOTZxOSA5IDAgMTh6IG00NS0zMzF2LTEwNnEwLTY3LTQ3LTExNHQtMTE0LTQ3aC00NjRxLTY3IDAtMTE0IDQ3dC00NyAxMTR2NDY0cTAgNjYgNDcgMTEzdDExNCA0OGg0NjRxMzUgMCA2NS0xNCA5LTQgMTAtMTMgMi0xMC01LTE2bC0yNy0yOHEtOC04LTE4LTQtMTMgMy0yNSAzaC00NjRxLTM3IDAtNjMtMjZ0LTI3LTYzdi00NjRxMC0zNyAyNy02M3Q2My0yN2g0NjRxMzcgMCA2MyAyN3QyNiA2M3Y3MHEwIDcgNSAxMmwzNiAzNnE4IDggMjAgNHQxMS0xNnogbS01NCA0MTFsMTYxLTE2MC0zNzUtMzc1aC0xNjF2MTYweiBtMjQ4LTczbC01MS01Mi0xNjEgMTYxIDUxIDUycTE2IDE1IDM4IDE1dDM4LTE1bDg1LTg1cTE2LTE2IDE2LTM4dC0xNi0zOHoiIGhvcml6LWFkdi14PSIxMDAwIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImxvY2siIHVuaWNvZGU9IiYjeGU4MDM7IiBkPSJNMTc5IDQyMWgyODV2MTA4cTAgNTktNDIgMTAxdC0xMDEgNDEtMTAxLTQxLTQxLTEwMXYtMTA4eiBtNDY0LTUzdi0zMjJxMC0yMi0xNi0zN3QtMzgtMTZoLTUzNXEtMjMgMC0zOCAxNnQtMTYgMzd2MzIycTAgMjIgMTYgMzh0MzggMTVoMTd2MTA4cTAgMTAyIDc0IDE3NnQxNzYgNzQgMTc3LTc0IDczLTE3NnYtMTA4aDE4cTIzIDAgMzgtMTV0MTYtMzh6IiBob3Jpei1hZHYteD0iNjQyLjkiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0ibWVudSIgdW5pY29kZT0iJiN4ZjBjOTsiIGQ9Ik04NTcgMTAwdi03MXEwLTE1LTEwLTI1dC0yNi0xMWgtNzg1cS0xNSAwLTI1IDExdC0xMSAyNXY3MXEwIDE1IDExIDI1dDI1IDExaDc4NXExNSAwIDI2LTExdDEwLTI1eiBtMCAyODZ2LTcycTAtMTQtMTAtMjV0LTI2LTEwaC03ODVxLTE1IDAtMjUgMTB0LTExIDI1djcycTAgMTQgMTEgMjV0MjUgMTBoNzg1cTE1IDAgMjYtMTB0MTAtMjV6IG0wIDI4NXYtNzFxMC0xNC0xMC0yNXQtMjYtMTFoLTc4NXEtMTUgMC0yNSAxMXQtMTEgMjV2NzFxMCAxNSAxMSAyNnQyNSAxMGg3ODVxMTUgMCAyNi0xMHQxMC0yNnoiIGhvcml6LWFkdi14PSI4NTcuMSIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJjYWxjIiB1bmljb2RlPSImI3hmMWVjOyIgZD0iTTIxNC03cTAgMjktMjEgNTB0LTUwIDIxLTUxLTIxLTIxLTUwIDIxLTUxIDUxLTIxIDUwIDIxIDIxIDUxeiBtMjE1IDBxMCAyOS0yMSA1MHQtNTEgMjEtNTAtMjEtMjEtNTAgMjEtNTEgNTAtMjEgNTEgMjEgMjEgNTF6IG0tMjE1IDIxNHEwIDMwLTIxIDUxdC01MCAyMS01MS0yMS0yMS01MSAyMS01MCA1MS0yMSA1MCAyMSAyMSA1MHogbTQyOS0yMTRxMCAyOS0yMSA1MHQtNTEgMjEtNTAtMjEtMjEtNTAgMjEtNTEgNTAtMjEgNTEgMjEgMjEgNTF6IG0tMjE0IDIxNHEwIDMwLTIxIDUxdC01MSAyMS01MC0yMS0yMS01MSAyMS01MCA1MC0yMSA1MSAyMSAyMSA1MHogbS0yMTUgMjE0cTAgMzAtMjEgNTF0LTUwIDIxLTUxLTIxLTIxLTUxIDIxLTUwIDUxLTIxIDUwIDIxIDIxIDUweiBtNDI5LTIxNHEwIDMwLTIxIDUxdC01MSAyMS01MC0yMS0yMS01MSAyMS01MCA1MC0yMSA1MSAyMSAyMSA1MHogbS0yMTQgMjE0cTAgMzAtMjEgNTF0LTUxIDIxLTUwLTIxLTIxLTUxIDIxLTUwIDUwLTIxIDUxIDIxIDIxIDUweiBtNDI4LTQyOHYyMTRxMCAyOS0yMSA1MHQtNTAgMjItNTAtMjItMjItNTB2LTIxNHEwLTI5IDIyLTUwdDUwLTIyIDUwIDIyIDIxIDUweiBtLTIxNCA0MjhxMCAzMC0yMSA1MXQtNTEgMjEtNTAtMjEtMjEtNTEgMjEtNTAgNTAtMjEgNTEgMjEgMjEgNTB6IG0yMTQgMTc5djE0M3EwIDE0LTEwIDI1dC0yNiAxMWgtNzE0cS0xNCAwLTI1LTExdC0xMS0yNXYtMTQzcTAtMTQgMTEtMjV0MjUtMTFoNzE0cTE1IDAgMjYgMTF0MTAgMjV6IG0wLTE3OXEwIDMwLTIxIDUxdC01MCAyMS01MS0yMS0yMS01MSAyMS01MCA1MS0yMSA1MCAyMSAyMSA1MHogbTcyIDM1OHYtODU4cTAtMjktMjItNTB0LTUwLTIxaC03ODZxLTI5IDAtNTAgMjF0LTIxIDUwdjg1OHEwIDI5IDIxIDUwdDUwIDIxaDc4NnEyOSAwIDUwLTIxdDIyLTUweiIgaG9yaXotYWR2LXg9IjEwMDAiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iYmF0dGVyeS00IiB1bmljb2RlPSImI3hmMjQwOyIgZD0iTTEwNzEgNTY0di00MjhoLTkyOHY0MjhoOTI4eiBtNzItMzIxaDcxdjIxNGgtNzF2MTYxcTAgOC01IDEzdC0xMyA1aC0xMDM2cS03IDAtMTItNXQtNi0xM3YtNTM2cTAtOCA2LTEzdDEyLTVoMTAzNnE4IDAgMTMgNXQ1IDEzdjE2MXogbTE0MyAyMTR2LTIxNHEwLTMwLTIxLTUxdC01MS0yMXYtODlxMC0zNy0yNi02M3QtNjMtMjZoLTEwMzZxLTM2IDAtNjMgMjZ0LTI2IDYzdjUzNnEwIDM3IDI2IDYzdDYzIDI2aDEwMzZxMzcgMCA2My0yNnQyNi02M3YtODlxMzAgMCA1MS0yMXQyMS01MXoiIGhvcml6LWFkdi14PSIxMjg1LjciIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iYmF0dGVyeS0zIiB1bmljb2RlPSImI3hmMjQxOyIgZD0iTTE0MyAxMzZ2NDI4aDcxNHYtNDI4aC03MTR6IG0xMDcxIDM5M3EzMCAwIDUxLTIxdDIxLTUxdi0yMTRxMC0zMC0yMS01MXQtNTEtMjF2LTg5cTAtMzctMjYtNjN0LTYzLTI2aC0xMDM2cS0zNiAwLTYzIDI2dC0yNiA2M3Y1MzZxMCAzNyAyNiA2M3Q2MyAyNmgxMDM2cTM3IDAgNjMtMjZ0MjYtNjN2LTg5eiBtMC0yODZ2MjE0aC03MXYxNjFxMCA4LTUgMTN0LTEzIDVoLTEwMzZxLTcgMC0xMi01dC02LTEzdi01MzZxMC04IDYtMTN0MTItNWgxMDM2cTggMCAxMyA1dDUgMTN2MTYxaDcxeiIgaG9yaXotYWR2LXg9IjEyODUuNyIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJiYXR0ZXJ5LTIiIHVuaWNvZGU9IiYjeGYyNDI7IiBkPSJNMTQzIDEzNnY0MjhoNTAwdi00MjhoLTUwMHogbTEwNzEgMzkzcTMwIDAgNTEtMjF0MjEtNTF2LTIxNHEwLTMwLTIxLTUxdC01MS0yMXYtODlxMC0zNy0yNi02M3QtNjMtMjZoLTEwMzZxLTM2IDAtNjMgMjZ0LTI2IDYzdjUzNnEwIDM3IDI2IDYzdDYzIDI2aDEwMzZxMzcgMCA2My0yNnQyNi02M3YtODl6IG0wLTI4NnYyMTRoLTcxdjE2MXEwIDgtNSAxM3QtMTMgNWgtMTAzNnEtNyAwLTEyLTV0LTYtMTN2LTUzNnEwLTggNi0xM3QxMi01aDEwMzZxOCAwIDEzIDV0NSAxM3YxNjFoNzF6IiBob3Jpei1hZHYteD0iMTI4NS43IiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImJhdHRlcnktMSIgdW5pY29kZT0iJiN4ZjI0MzsiIGQ9Ik0xNDMgMTM2djQyOGgyODZ2LTQyOGgtMjg2eiBtMTA3MSAzOTNxMzAgMCA1MS0yMXQyMS01MXYtMjE0cTAtMzAtMjEtNTF0LTUxLTIxdi04OXEwLTM3LTI2LTYzdC02My0yNmgtMTAzNnEtMzYgMC02MyAyNnQtMjYgNjN2NTM2cTAgMzcgMjYgNjN0NjMgMjZoMTAzNnEzNyAwIDYzLTI2dDI2LTYzdi04OXogbTAtMjg2djIxNGgtNzF2MTYxcTAgOC01IDEzdC0xMyA1aC0xMDM2cS03IDAtMTItNXQtNi0xM3YtNTM2cTAtOCA2LTEzdDEyLTVoMTAzNnE4IDAgMTMgNXQ1IDEzdjE2MWg3MXoiIGhvcml6LWFkdi14PSIxMjg1LjciIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iYmF0dGVyeS0wIiB1bmljb2RlPSImI3hmMjQ0OyIgZD0iTTEyMTQgNTI5cTMwIDAgNTEtMjF0MjEtNTF2LTIxNHEwLTMwLTIxLTUxdC01MS0yMXYtODlxMC0zNy0yNi02M3QtNjMtMjZoLTEwMzZxLTM2IDAtNjMgMjZ0LTI2IDYzdjUzNnEwIDM3IDI2IDYzdDYzIDI2aDEwMzZxMzcgMCA2My0yNnQyNi02M3YtODl6IG0wLTI4NnYyMTRoLTcxdjE2MXEwIDgtNSAxM3QtMTMgNWgtMTAzNnEtNyAwLTEyLTV0LTYtMTN2LTUzNnEwLTggNi0xM3QxMi01aDEwMzZxOCAwIDEzIDV0NSAxM3YxNjFoNzF6IiBob3Jpei1hZHYteD0iMTI4NS43IiAvPgo8L2ZvbnQ+CjwvZGVmcz4KPC9zdmc+) format('svg'); + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), + url(data:application/font-svg;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtZXRhZGF0YT5Db3B5cmlnaHQgKEMpIDIwMTcgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbTwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0ibnNpY29ucyIgaG9yaXotYWR2LXg9IjEwMDAiID4KPGZvbnQtZmFjZSBmb250LWZhbWlseT0ibnNpY29ucyIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1zdHJldGNoPSJub3JtYWwiIHVuaXRzLXBlci1lbT0iMTAwMCIgYXNjZW50PSI4NTAiIGRlc2NlbnQ9Ii0xNTAiIC8+CjxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSIxMDAwIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0idm9sdW1lLXVwIiB1bmljb2RlPSImI3hlODAwOyIgZD0iTTQyOSA2NTR2LTYwOHEwLTE0LTExLTI1dC0yNS0xMC0yNSAxMGwtMTg2IDE4NmgtMTQ2cS0xNSAwLTI1IDExdC0xMSAyNXYyMTRxMCAxNSAxMSAyNXQyNSAxMWgxNDZsMTg2IDE4NnExMCAxMCAyNSAxMHQyNS0xMCAxMS0yNXogbTIxNC0zMDRxMC00Mi0yNC03OXQtNjMtNTJxLTUtMy0xNC0zLTE0IDAtMjUgMTB0LTEwIDI2cTAgMTIgNiAyMHQxNyAxNCAxOSAxMiAxNiAyMSA2IDMxLTYgMzItMTYgMjAtMTkgMTMtMTcgMTMtNiAyMHEwIDE1IDEwIDI2dDI1IDEwcTkgMCAxNC0zIDM5LTE1IDYzLTUydDI0LTc5eiBtMTQzIDBxMC04NS00OC0xNTh0LTEyNS0xMDVxLTctMy0xNC0zLTE1IDAtMjYgMTF0LTEwIDI1cTAgMjIgMjEgMzMgMzIgMTYgNDMgMjUgNDEgMzAgNjQgNzV0MjMgOTctMjMgOTctNjQgNzVxLTExIDktNDMgMjUtMjEgMTEtMjEgMzMgMCAxNCAxMCAyNXQyNSAxMXE4IDAgMTUtMyA3OC0zMyAxMjUtMTA1dDQ4LTE1OHogbTE0MyAwcTAtMTI4LTcxLTIzNnQtMTg5LTE1OHEtNy0zLTE0LTMtMTUgMC0yNSAxMXQtMTEgMjVxMCAyMCAyMiAzMyA0IDIgMTIgNnQxMyA2cTI1IDE0IDQ2IDI4IDY4IDUxIDEwNyAxMjd0MzggMTYxLTM4IDE2MS0xMDcgMTI3cS0yMSAxNS00NiAyOC00IDMtMTMgNnQtMTIgNnEtMjIgMTMtMjIgMzMgMCAxNSAxMSAyNXQyNSAxMXE3IDAgMTQtMyAxMTgtNTEgMTg5LTE1OHQ3MS0yMzZ6IiBob3Jpei1hZHYteD0iOTI4LjYiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0icGx1cyIgdW5pY29kZT0iJiN4ZTgwMTsiIGQ9Ik03ODYgNDM5di0xMDdxMC0yMi0xNi0zOHQtMzgtMTVoLTIzMnYtMjMzcTAtMjItMTYtMzd0LTM4LTE2aC0xMDdxLTIyIDAtMzggMTZ0LTE1IDM3djIzM2gtMjMycS0yMyAwLTM4IDE1dC0xNiAzOHYxMDdxMCAyMyAxNiAzOHQzOCAxNmgyMzJ2MjMycTAgMjIgMTUgMzh0MzggMTZoMTA3cTIzIDAgMzgtMTZ0MTYtMzh2LTIzMmgyMzJxMjMgMCAzOC0xNnQxNi0zOHoiIGhvcml6LWFkdi14PSI3ODUuNyIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJlZGl0IiB1bmljb2RlPSImI3hlODAyOyIgZD0iTTQ5NiAxODlsNjQgNjUtODUgODUtNjQtNjV2LTMxaDUzdi01NGgzMnogbTI0NSA0MDJxLTkgOS0xOCAwbC0xOTYtMTk2cS05LTkgMC0xOHQxOCAwbDE5NiAxOTZxOSA5IDAgMTh6IG00NS0zMzF2LTEwNnEwLTY3LTQ3LTExNHQtMTE0LTQ3aC00NjRxLTY3IDAtMTE0IDQ3dC00NyAxMTR2NDY0cTAgNjYgNDcgMTEzdDExNCA0OGg0NjRxMzUgMCA2NS0xNCA5LTQgMTAtMTMgMi0xMC01LTE2bC0yNy0yOHEtOC04LTE4LTQtMTMgMy0yNSAzaC00NjRxLTM3IDAtNjMtMjZ0LTI3LTYzdi00NjRxMC0zNyAyNy02M3Q2My0yN2g0NjRxMzcgMCA2MyAyN3QyNiA2M3Y3MHEwIDcgNSAxMmwzNiAzNnE4IDggMjAgNHQxMS0xNnogbS01NCA0MTFsMTYxLTE2MC0zNzUtMzc1aC0xNjF2MTYweiBtMjQ4LTczbC01MS01Mi0xNjEgMTYxIDUxIDUycTE2IDE1IDM4IDE1dDM4LTE1bDg1LTg1cTE2LTE2IDE2LTM4dC0xNi0zOHoiIGhvcml6LWFkdi14PSIxMDAwIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImxvY2siIHVuaWNvZGU9IiYjeGU4MDM7IiBkPSJNMTc5IDQyMWgyODV2MTA4cTAgNTktNDIgMTAxdC0xMDEgNDEtMTAxLTQxLTQxLTEwMXYtMTA4eiBtNDY0LTUzdi0zMjJxMC0yMi0xNi0zN3QtMzgtMTZoLTUzNXEtMjMgMC0zOCAxNnQtMTYgMzd2MzIycTAgMjIgMTYgMzh0MzggMTVoMTd2MTA4cTAgMTAyIDc0IDE3NnQxNzYgNzQgMTc3LTc0IDczLTE3NnYtMTA4aDE4cTIzIDAgMzgtMTV0MTYtMzh6IiBob3Jpei1hZHYteD0iNjQyLjkiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iY2FuY2VsLWNpcmNsZWQyIiB1bmljb2RlPSImI3hlODA0OyIgZD0iTTYxMiAyNDhsLTgxLTgycS02LTUtMTMtNXQtMTMgNWwtNzYgNzctNzctNzdxLTUtNS0xMy01dC0xMiA1bC04MiA4MnEtNiA2LTYgMTN0NiAxM2w3NiA3Ni03NiA3N3EtNiA1LTYgMTJ0NiAxM2w4MiA4MnE1IDUgMTIgNXQxMy01bDc3LTc3IDc2IDc3cTYgNSAxMyA1dDEzLTVsODEtODJxNi01IDYtMTN0LTYtMTJsLTc2LTc3IDc2LTc2cTYtNiA2LTEzdC02LTEzeiBtMTIwIDEwMnEwIDgzLTQxIDE1MnQtMTEwIDExMS0xNTIgNDEtMTUzLTQxLTExMC0xMTEtNDEtMTUyIDQxLTE1MiAxMTAtMTExIDE1My00MSAxNTIgNDEgMTEwIDExMSA0MSAxNTJ6IG0xMjUgMHEwLTExNy01Ny0yMTV0LTE1Ni0xNTYtMjE1LTU4LTIxNiA1OC0xNTUgMTU2LTU4IDIxNSA1OCAyMTUgMTU1IDE1NiAyMTYgNTggMjE1LTU4IDE1Ni0xNTYgNTctMjE1eiIgaG9yaXotYWR2LXg9Ijg1Ny4xIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImNhbmNlbC1jaXJjbGVkIiB1bmljb2RlPSImI3hlODA1OyIgZD0iTTY0MSAyMjRxMCAxNC0xMCAyNWwtMTAxIDEwMSAxMDEgMTAxcTEwIDExIDEwIDI1IDAgMTUtMTAgMjZsLTUxIDUwcS0xMCAxMS0yNSAxMS0xNSAwLTI1LTExbC0xMDEtMTAxLTEwMSAxMDFxLTExIDExLTI1IDExLTE2IDAtMjYtMTFsLTUwLTUwcS0xMS0xMS0xMS0yNiAwLTE0IDExLTI1bDEwMS0xMDEtMTAxLTEwMXEtMTEtMTEtMTEtMjUgMC0xNSAxMS0yNmw1MC01MHExMC0xMSAyNi0xMSAxNCAwIDI1IDExbDEwMSAxMDEgMTAxLTEwMXExMC0xMSAyNS0xMSAxNSAwIDI1IDExbDUxIDUwcTEwIDExIDEwIDI2eiBtMjE2IDEyNnEwLTExNy01Ny0yMTV0LTE1Ni0xNTYtMjE1LTU4LTIxNiA1OC0xNTUgMTU2LTU4IDIxNSA1OCAyMTUgMTU1IDE1NiAyMTYgNTggMjE1LTU4IDE1Ni0xNTYgNTctMjE1eiIgaG9yaXotYWR2LXg9Ijg1Ny4xIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImNhbmNlbCIgdW5pY29kZT0iJiN4ZTgwNjsiIGQ9Ik03MjQgMTEycTAtMjItMTUtMzhsLTc2LTc2cS0xNi0xNS0zOC0xNXQtMzggMTVsLTE2NCAxNjUtMTY0LTE2NXEtMTYtMTUtMzgtMTV0LTM4IDE1bC03NiA3NnEtMTYgMTYtMTYgMzh0MTYgMzhsMTY0IDE2NC0xNjQgMTY0cS0xNiAxNi0xNiAzOHQxNiAzOGw3NiA3NnExNiAxNiAzOCAxNnQzOC0xNmwxNjQtMTY0IDE2NCAxNjRxMTYgMTYgMzggMTZ0MzgtMTZsNzYtNzZxMTUtMTUgMTUtMzh0LTE1LTM4bC0xNjQtMTY0IDE2NC0xNjRxMTUtMTUgMTUtMzh6IiBob3Jpei1hZHYteD0iNzg1LjciIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iY29nIiB1bmljb2RlPSImI3hlODA3OyIgZD0iTTU3MSAzNTBxMCA1OS00MSAxMDF0LTEwMSA0Mi0xMDEtNDItNDItMTAxIDQyLTEwMSAxMDEtNDIgMTAxIDQyIDQxIDEwMXogbTI4NiA2MXYtMTI0cTAtNy00LTEzdC0xMS03bC0xMDQtMTZxLTEwLTMwLTIxLTUxIDE5LTI3IDU5LTc3IDYtNiA2LTEzdC01LTEzcS0xNS0yMS01NS02MXQtNTMtMzlxLTcgMC0xNCA1bC03NyA2MHEtMjUtMTMtNTEtMjEtOS03Ni0xNi0xMDQtNC0xNi0yMC0xNmgtMTI0cS04IDAtMTQgNXQtNiAxMmwtMTYgMTAzcS0yNyA5LTUwIDIxbC03OS02MHEtNi01LTE0LTUtOCAwLTE0IDYtNzAgNjQtOTIgOTQtNCA1LTQgMTMgMCA2IDUgMTIgOCAxMiAyOCAzN3QzMCA0MHEtMTUgMjgtMjMgNTVsLTEwMiAxNXEtNyAxLTExIDd0LTUgMTN2MTI0cTAgNyA1IDEzdDEwIDdsMTA0IDE2cTggMjUgMjIgNTEtMjMgMzItNjAgNzctNiA3LTYgMTQgMCA1IDUgMTIgMTUgMjAgNTUgNjB0NTMgNDBxNyAwIDE1LTVsNzctNjBxMjQgMTMgNTAgMjEgOSA3NiAxNyAxMDQgMyAxNiAyMCAxNmgxMjRxNyAwIDEzLTV0Ny0xMmwxNS0xMDNxMjgtOSA1MS0yMGw3OSA1OXE1IDUgMTMgNSA3IDAgMTQtNSA3Mi02NyA5Mi05NSA0LTUgNC0xMiAwLTctNC0xMy05LTEyLTI5LTM3dC0zMC00MHExNS0yOCAyMy01NGwxMDItMTZxNy0xIDEyLTd0NC0xM3oiIGhvcml6LWFkdi14PSI4NTcuMSIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJoZWxwLWNpcmNsZWQiIHVuaWNvZGU9IiYjeGU4MDg7IiBkPSJNNTAwIDgydjEwN3EwIDgtNSAxM3QtMTMgNWgtMTA3cS04IDAtMTMtNXQtNS0xM3YtMTA3cTAtOCA1LTEzdDEzLTVoMTA3cTggMCAxMyA1dDUgMTN6IG0xNDMgMzc1cTAgNDktMzEgOTF0LTc3IDY1LTk1IDIzcS0xMzYgMC0yMDctMTE5LTktMTMgNC0yNGw3NC01NXE0LTQgMTAtNCA5IDAgMTQgNyAzMCAzOCA0OCA1MSAxOSAxNCA0OCAxNCAyNyAwIDQ4LTE1dDIxLTMzcTAtMjEtMTEtMzR0LTM4LTI1cS0zNS0xNS02NS00OHQtMjktNzB2LTIwcTAtOCA1LTEzdDEzLTVoMTA3cTggMCAxMyA1dDUgMTNxMCAxMCAxMiAyN3QzMCAyOHExOCAxMCAyOCAxNnQyNSAxOSAyNSAyNyAxNiAzNCA3IDQ1eiBtMjE0LTEwN3EwLTExNy01Ny0yMTV0LTE1Ni0xNTYtMjE1LTU4LTIxNiA1OC0xNTUgMTU2LTU4IDIxNSA1OCAyMTUgMTU1IDE1NiAyMTYgNTggMjE1LTU4IDE1Ni0xNTYgNTctMjE1eiIgaG9yaXotYWR2LXg9Ijg1Ny4xIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9InRpbnQiIHVuaWNvZGU9IiYjeGU4MDk7IiBkPSJNMjg2IDIwN3EwIDIwLTExIDM5LTEgMC05IDEydC0xNCAyMS0xNCAyNS0xMiAyOHEtMiA5LTEyIDl0LTExLTlxLTQtMTMtMTItMjh0LTE0LTI1LTE0LTIxLTktMTJxLTExLTE5LTExLTM5IDAtMjkgMjEtNTB0NTAtMjEgNTEgMjEgMjEgNTB6IG0yODUgNzJxMC0xMTktODMtMjAydC0yMDItODQtMjAyIDg0LTg0IDIwMnEwIDgxIDQ1IDE1MyA0IDUgMzUgNTF0NTYgODQgNTYgOTkgNDYgMTEzcTUgMTYgMTkgMjZ0MjkgOSAyOS05IDE4LTI2cTE2LTUyIDQ3LTExM3Q1NS05OSA1Ni04NCAzNS01MXE0NS03MSA0NS0xNTN6IiBob3Jpei1hZHYteD0iNTcxLjQiIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0ibWVudSIgdW5pY29kZT0iJiN4ZjBjOTsiIGQ9Ik04NTcgMTAwdi03MXEwLTE1LTEwLTI1dC0yNi0xMWgtNzg1cS0xNSAwLTI1IDExdC0xMSAyNXY3MXEwIDE1IDExIDI1dDI1IDExaDc4NXExNSAwIDI2LTExdDEwLTI1eiBtMCAyODZ2LTcycTAtMTQtMTAtMjV0LTI2LTEwaC03ODVxLTE1IDAtMjUgMTB0LTExIDI1djcycTAgMTQgMTEgMjV0MjUgMTBoNzg1cTE1IDAgMjYtMTB0MTAtMjV6IG0wIDI4NXYtNzFxMC0xNC0xMC0yNXQtMjYtMTFoLTc4NXEtMTUgMC0yNSAxMXQtMTEgMjV2NzFxMCAxNSAxMSAyNnQyNSAxMGg3ODVxMTUgMCAyNi0xMHQxMC0yNnoiIGhvcml6LWFkdi14PSI4NTcuMSIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJzb3J0LW51bWJlci11cCIgdW5pY29kZT0iJiN4ZjE2MjsiIGQ9Ik03NTEgMTE3cTAgMzYtMjQgNjV0LTU4IDMwcS0yOSAwLTQ2LTIxdC0xNy01MiAyMC01MyA1OC0yMnEyOCAwIDQ4IDE1dDE5IDM4eiBtLTM0MC03MXEwLTYtNi0xM2wtMTc4LTE3OHEtNS01LTEzLTUtNiAwLTEyIDVsLTE3OSAxNzlxLTggOS00IDE5IDQgMTEgMTcgMTFoMTA3djc2OHEwIDggNSAxM3QxMyA1aDEwN3E4IDAgMTMtNXQ1LTEzdi03NjhoMTA3cTggMCAxMy01dDUtMTN6IG00MTggMzlxMC0zNS03LTY4dC0yMy02NC0zOC01My01NS0zNi03MS0xNHEtMzUgMC02MCA5LTE0IDQtMjQgOGwyMiA2M3E5LTQgMTctNiAyMS03IDQyLTcgNDcgMCA3NSAzM3QzNyA4MWgtMXEtMTEtMTMtMzQtMjF0LTQ3LThxLTU5IDAtOTcgNDB0LTM3IDk3cTAgNTggNDAgOTl0MTAxIDQxcTY5IDAgMTE1LTUzdDQ1LTE0MXogbS0xNiA0MDB2LTY0aC0yNjJ2NjRoOTN2MjQxcTAgNCAwIDExdDEgOXY5aC0ybC0zLTdxLTUtNy0xNS0xN2wtMzUtMzItNDUgNDggMTA3IDEwM2g2OHYtMzY1aDkzeiIgaG9yaXotYWR2LXg9Ijg1Ny4xIiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImNhbGMiIHVuaWNvZGU9IiYjeGYxZWM7IiBkPSJNMjE0LTdxMCAyOS0yMSA1MHQtNTAgMjEtNTEtMjEtMjEtNTAgMjEtNTEgNTEtMjEgNTAgMjEgMjEgNTF6IG0yMTUgMHEwIDI5LTIxIDUwdC01MSAyMS01MC0yMS0yMS01MCAyMS01MSA1MC0yMSA1MSAyMSAyMSA1MXogbS0yMTUgMjE0cTAgMzAtMjEgNTF0LTUwIDIxLTUxLTIxLTIxLTUxIDIxLTUwIDUxLTIxIDUwIDIxIDIxIDUweiBtNDI5LTIxNHEwIDI5LTIxIDUwdC01MSAyMS01MC0yMS0yMS01MCAyMS01MSA1MC0yMSA1MSAyMSAyMSA1MXogbS0yMTQgMjE0cTAgMzAtMjEgNTF0LTUxIDIxLTUwLTIxLTIxLTUxIDIxLTUwIDUwLTIxIDUxIDIxIDIxIDUweiBtLTIxNSAyMTRxMCAzMC0yMSA1MXQtNTAgMjEtNTEtMjEtMjEtNTEgMjEtNTAgNTEtMjEgNTAgMjEgMjEgNTB6IG00MjktMjE0cTAgMzAtMjEgNTF0LTUxIDIxLTUwLTIxLTIxLTUxIDIxLTUwIDUwLTIxIDUxIDIxIDIxIDUweiBtLTIxNCAyMTRxMCAzMC0yMSA1MXQtNTEgMjEtNTAtMjEtMjEtNTEgMjEtNTAgNTAtMjEgNTEgMjEgMjEgNTB6IG00MjgtNDI4djIxNHEwIDI5LTIxIDUwdC01MCAyMi01MC0yMi0yMi01MHYtMjE0cTAtMjkgMjItNTB0NTAtMjIgNTAgMjIgMjEgNTB6IG0tMjE0IDQyOHEwIDMwLTIxIDUxdC01MSAyMS01MC0yMS0yMS01MSAyMS01MCA1MC0yMSA1MSAyMSAyMSA1MHogbTIxNCAxNzl2MTQzcTAgMTQtMTAgMjV0LTI2IDExaC03MTRxLTE0IDAtMjUtMTF0LTExLTI1di0xNDNxMC0xNCAxMS0yNXQyNS0xMWg3MTRxMTUgMCAyNiAxMXQxMCAyNXogbTAtMTc5cTAgMzAtMjEgNTF0LTUwIDIxLTUxLTIxLTIxLTUxIDIxLTUwIDUxLTIxIDUwIDIxIDIxIDUweiBtNzIgMzU4di04NThxMC0yOS0yMi01MHQtNTAtMjFoLTc4NnEtMjkgMC01MCAyMXQtMjEgNTB2ODU4cTAgMjkgMjEgNTB0NTAgMjFoNzg2cTI5IDAgNTAtMjF0MjItNTB6IiBob3Jpei1hZHYteD0iMTAwMCIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJjaGFydC1saW5lIiB1bmljb2RlPSImI3hmMjAxOyIgZD0iTTExNDMtN3YtNzJoLTExNDN2ODU4aDcxdi03ODZoMTA3MnogbS03MiA2OTZ2LTI0MnEwLTEyLTEwLTE3dC0yMCA0bC02OCA2OC0zNTMtMzUzcS02LTYtMTMtNnQtMTMgNmwtMTMwIDEzMC0yMzItMjMzLTEwNyAxMDggMzI3IDMyNnE1IDYgMTIgNnQxMy02bDEzMC0xMzAgMjU5IDI1OS02NyA2OHEtOSA4LTUgMTl0MTcgMTFoMjQzcTcgMCAxMi01dDUtMTN6IiBob3Jpei1hZHYteD0iMTE0Mi45IiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImJhdHRlcnktNCIgdW5pY29kZT0iJiN4ZjI0MDsiIGQ9Ik0xMDcxIDU2NHYtNDI4aC05Mjh2NDI4aDkyOHogbTcyLTMyMWg3MXYyMTRoLTcxdjE2MXEwIDgtNSAxM3QtMTMgNWgtMTAzNnEtNyAwLTEyLTV0LTYtMTN2LTUzNnEwLTggNi0xM3QxMi01aDEwMzZxOCAwIDEzIDV0NSAxM3YxNjF6IG0xNDMgMjE0di0yMTRxMC0zMC0yMS01MXQtNTEtMjF2LTg5cTAtMzctMjYtNjN0LTYzLTI2aC0xMDM2cS0zNiAwLTYzIDI2dC0yNiA2M3Y1MzZxMCAzNyAyNiA2M3Q2MyAyNmgxMDM2cTM3IDAgNjMtMjZ0MjYtNjN2LTg5cTMwIDAgNTEtMjF0MjEtNTF6IiBob3Jpei1hZHYteD0iMTI4NS43IiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImJhdHRlcnktMyIgdW5pY29kZT0iJiN4ZjI0MTsiIGQ9Ik0xNDMgMTM2djQyOGg3MTR2LTQyOGgtNzE0eiBtMTA3MSAzOTNxMzAgMCA1MS0yMXQyMS01MXYtMjE0cTAtMzAtMjEtNTF0LTUxLTIxdi04OXEwLTM3LTI2LTYzdC02My0yNmgtMTAzNnEtMzYgMC02MyAyNnQtMjYgNjN2NTM2cTAgMzcgMjYgNjN0NjMgMjZoMTAzNnEzNyAwIDYzLTI2dDI2LTYzdi04OXogbTAtMjg2djIxNGgtNzF2MTYxcTAgOC01IDEzdC0xMyA1aC0xMDM2cS03IDAtMTItNXQtNi0xM3YtNTM2cTAtOCA2LTEzdDEyLTVoMTAzNnE4IDAgMTMgNXQ1IDEzdjE2MWg3MXoiIGhvcml6LWFkdi14PSIxMjg1LjciIC8+Cgo8Z2x5cGggZ2x5cGgtbmFtZT0iYmF0dGVyeS0yIiB1bmljb2RlPSImI3hmMjQyOyIgZD0iTTE0MyAxMzZ2NDI4aDUwMHYtNDI4aC01MDB6IG0xMDcxIDM5M3EzMCAwIDUxLTIxdDIxLTUxdi0yMTRxMC0zMC0yMS01MXQtNTEtMjF2LTg5cTAtMzctMjYtNjN0LTYzLTI2aC0xMDM2cS0zNiAwLTYzIDI2dC0yNiA2M3Y1MzZxMCAzNyAyNiA2M3Q2MyAyNmgxMDM2cTM3IDAgNjMtMjZ0MjYtNjN2LTg5eiBtMC0yODZ2MjE0aC03MXYxNjFxMCA4LTUgMTN0LTEzIDVoLTEwMzZxLTcgMC0xMi01dC02LTEzdi01MzZxMC04IDYtMTN0MTItNWgxMDM2cTggMCAxMyA1dDUgMTN2MTYxaDcxeiIgaG9yaXotYWR2LXg9IjEyODUuNyIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJiYXR0ZXJ5LTEiIHVuaWNvZGU9IiYjeGYyNDM7IiBkPSJNMTQzIDEzNnY0MjhoMjg2di00MjhoLTI4NnogbTEwNzEgMzkzcTMwIDAgNTEtMjF0MjEtNTF2LTIxNHEwLTMwLTIxLTUxdC01MS0yMXYtODlxMC0zNy0yNi02M3QtNjMtMjZoLTEwMzZxLTM2IDAtNjMgMjZ0LTI2IDYzdjUzNnEwIDM3IDI2IDYzdDYzIDI2aDEwMzZxMzcgMCA2My0yNnQyNi02M3YtODl6IG0wLTI4NnYyMTRoLTcxdjE2MXEwIDgtNSAxM3QtMTMgNWgtMTAzNnEtNyAwLTEyLTV0LTYtMTN2LTUzNnEwLTggNi0xM3QxMi01aDEwMzZxOCAwIDEzIDV0NSAxM3YxNjFoNzF6IiBob3Jpei1hZHYteD0iMTI4NS43IiAvPgoKPGdseXBoIGdseXBoLW5hbWU9ImJhdHRlcnktMCIgdW5pY29kZT0iJiN4ZjI0NDsiIGQ9Ik0xMjE0IDUyOXEzMCAwIDUxLTIxdDIxLTUxdi0yMTRxMC0zMC0yMS01MXQtNTEtMjF2LTg5cTAtMzctMjYtNjN0LTYzLTI2aC0xMDM2cS0zNiAwLTYzIDI2dC0yNiA2M3Y1MzZxMCAzNyAyNiA2M3Q2MyAyNmgxMDM2cTM3IDAgNjMtMjZ0MjYtNjN2LTg5eiBtMC0yODZ2MjE0aC03MXYxNjFxMCA4LTUgMTN0LTEzIDVoLTEwMzZxLTcgMC0xMi01dC02LTEzdi01MzZxMC04IDYtMTN0MTItNWgxMDM2cTggMCAxMyA1dDUgMTN2MTYxaDcxeiIgaG9yaXotYWR2LXg9IjEyODUuNyIgLz4KCjxnbHlwaCBnbHlwaC1uYW1lPSJob3VyZ2xhc3MiIHVuaWNvZGU9IiYjeGYyNTQ7IiBkPSJNODM5LTQzcTggMCAxMy01dDUtMTN2LTcxcTAtOC01LTEzdC0xMy01aC04MjFxLTggMC0xMyA1dC01IDEzdjcxcTAgOCA1IDEzdDEzIDVoODIxeiBtLTc2NiAzNnExIDMxIDkgNjB0MTYgNTMgMjYgNDggMzAgNDMgMzYgMzggMzcgMzQgMzkgMzEgMzcgMjYgMzYgMjRxLTI0IDE2LTM2IDI0dC0zNyAyNy0zOSAzMC0zNyAzNC0zNiAzOS0zMCA0Mi0yNiA0OC0xNiA1My05IDYwaDcxMnEtMi0zMC05LTYwdC0xNy01My0yNi00OC0zMC00Mi0zNi0zOS0zNi0zNC00MC0zMC0zNy0yNy0zNi0yNHEyNC0xNiAzNi0yNHQzNy0yNiA0MC0zMSAzNi0zNCAzNi0zOCAzMC00MyAyNi00OCAxNy01MyA5LTYwaC03MTJ6IG03NjYgODU3cTggMCAxMy01dDUtMTN2LTcxcTAtOC01LTEzdC0xMy01aC04MjFxLTggMC0xMyA1dC01IDEzdjcxcTAgOCA1IDEzdDEzIDVoODIxeiIgaG9yaXotYWR2LXg9Ijg1Ny4xIiAvPgo8L2ZvbnQ+CjwvZGVmcz4KPC9zdmc+) format('svg'); font-weight: normal; font-style: normal; } @@ -44,17 +44,26 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-volume:before { content: '\e800'; } /* '' */ -.icon-plus:before { content: '\e801'; } /* '' */ -.icon-edit:before { content: '\e802'; } /* '' */ -.icon-lock:before { content: '\e803'; } /* '' */ -.icon-menu:before { content: '\f0c9'; } /* '' */ -.icon-calc:before { content: '\f1ec'; } /* '' */ -.icon-battery-100:before { content: '\f240'; } /* '' */ -.icon-battery-75:before { content: '\f241'; } /* '' */ -.icon-battery-50:before { content: '\f242'; } /* '' */ -.icon-battery-25:before { content: '\f243'; } /* '' */ -.icon-battery-0:before { content: '\f244'; } /* '' */ +.icon-volume:before { content: '\e800'; } +.icon-plus:before { content: '\e801'; } +.icon-edit:before { content: '\e802'; } +.icon-lock:before { content: '\e803'; } +.icon-menu:before { content: '\f0c9'; } +.icon-calc:before { content: '\f1ec'; } +.icon-battery-100:before { content: '\f240'; } +.icon-battery-75:before { content: '\f241'; } +.icon-battery-50:before { content: '\f242'; } +.icon-battery-25:before { content: '\f243'; } +.icon-battery-0:before { content: '\f244'; } +.icon-cancel-circled2:before { content: '\e804'; } +.icon-cancel-circled:before { content: '\e805'; } +.icon-cancel:before { content: '\e806'; } +.icon-cog:before { content: '\e807'; } +.icon-help-circled:before { content: '\e808'; } +.icon-tint:before { content: '\e809'; } +.icon-sort-numeric:before { content: '\f162'; } +.icon-chart-line:before { content: '\f201'; } +.icon-hourglass:before { content: '\f254'; } html, body { margin: 0; diff --git a/static/food/js/food.js b/static/food/js/food.js index d743994d598..2ffc78d2623 100644 --- a/static/food/js/food.js +++ b/static/food/js/food.js @@ -19,6 +19,9 @@ client.init(function loaded () { , name: '' , portion: 0 , carbs: 0 + , fat: 0 // in grams + , protein: 0 // in grams + , energy: 0 // in kJ , gi: 2 , unit: 'g' }; @@ -222,7 +225,10 @@ client.init(function loaded () { .append($('').attr('class','width100px').css('text-align','center').append(translate('Carbs'))) .append($('').attr('class','width100px').css('text-align','center').append(translate('GI')+' [1-3]')) .append($('').attr('class','width150px').append(translate('Category'))) - .append($('').attr('class','width150px').append(translate('Subcategory'))); + .append($('').attr('class','width150px').append(translate('Subcategory'))) + .append($('').attr('class','width100px').append(translate('Fat [g]'))) + .append($('').attr('class','width100px').append(translate('Protein [g]'))) + .append($('').attr('class','width100px').append(translate('Energy [kJ]'))); $('#fe_data').empty(); @@ -244,6 +250,9 @@ client.init(function loaded () { .append($('').addClass('width100px').css('text-align','center').append(foodlist[i].gi)) .append($('').addClass('width150px').append(foodlist[i].category)) .append($('').addClass('width150px').append(foodlist[i].subcategory)) + .append($('').addClass('width100px').append(foodlist[i].fat)) + .append($('').addClass('width100px').append(foodlist[i].protein)) + .append($('').addClass('width100px').append(foodlist[i].energy)) ); } @@ -465,9 +474,12 @@ client.init(function loaded () { $('#fe_name').val(foodrec.name); $('#fe_portion').val(foodrec.portion ? foodrec.portion : ''); $('#fe_unit').val(foodrec.unit); - $('#fe_carbs').val(foodrec.carbs ? foodrec.carbs : ''); - $('#fe_gi').val(foodrec.gi); - + $('#fe_carbs').val(foodrec.carbs ? foodrec.carbs : '') + $('#fe_gi').val(foodrec.gi) + $('#fe_fat').val(foodrec.fat ? foodrec.fat : '') + $('#fe_protein').val(foodrec.protein ? foodrec.protein : '') + $('#fe_energy').val(foodrec.energy ? foodrec.energy : ''); + $('#fe_quickpick_showhidden').prop('checked',showhidden); console.info(JSON.stringify(foodrec)); @@ -488,6 +500,12 @@ client.init(function loaded () { foodrec.unit = $('#fe_unit').val(); foodrec.carbs = parseInt($('#fe_carbs').val()); foodrec.carbs = foodrec.carbs || 0; + foodrec.fat = parseInt($('#fe_fat').val()); + foodrec.fat = foodrec.fat || 0; + foodrec.protein = parseInt($('#fe_protein').val()); + foodrec.protein = foodrec.protein || 0; + foodrec.energy = parseInt($('#fe_energy').val()); + foodrec.energy = foodrec.energy || 0; foodrec.gi = parseInt($('#fe_gi').val()); showhidden = $('#fe_quickpick_showhidden').is(':checked'); diff --git a/static/images/NONE.svg b/static/images/NONE.svg index 382f288a3e8..397da4d77fe 100644 --- a/static/images/NONE.svg +++ b/static/images/NONE.svg @@ -1,3 +1,9 @@ - - - \ No newline at end of file + + + + + + diff --git a/tests/admintools.test.js b/tests/admintools.test.js index a2374ff1ff2..f1851010bb1 100644 --- a/tests/admintools.test.js +++ b/tests/admintools.test.js @@ -57,7 +57,7 @@ var someData = { describe('admintools', function ( ) { var self = this; - this.timeout(30000); + this.timeout(30000); // TODO: see why this test takes longer on Travis to complete before(function (done) { benv.setup(function() { diff --git a/tests/careportal.test.js b/tests/careportal.test.js index 1241ebe703a..782bc4fa566 100644 --- a/tests/careportal.test.js +++ b/tests/careportal.test.js @@ -13,6 +13,8 @@ var nowData = { }; describe('client', function ( ) { + this.timeout(30000); // TODO: see why this test takes longer on Travis to complete + var self = this; var headless = require('./fixtures/headless')(benv, this); diff --git a/tests/client.renderer.test.js b/tests/client.renderer.test.js new file mode 100644 index 00000000000..ec70a627d4f --- /dev/null +++ b/tests/client.renderer.test.js @@ -0,0 +1,29 @@ +'use strict'; + +require('should'); +let _ = require('lodash'); + +let renderer = require('../lib/client/renderer'); +const MAX_DELTA = 0.0001; +const PREV_CHART_WIDTHS = [ + { width: 400, expectedScale: 3.5 } + , { width: 500, expectedScale: 2.625 } + , { width: 900, expectedScale: 1.75 } +]; + +describe('renderer', () => { + describe('bubbleScale', () => { + _.forEach(PREV_CHART_WIDTHS, (prev) => { + describe(`prevChartWidth < ${prev.width}`, () => { + let mockClient = { + utils: true + , chart: { prevChartWidth: prev.width } + , foucusRangeMS: true + }; + it('scales correctly', () => { + renderer(mockClient, {}).bubbleScale().should.be.approximately(prev.expectedScale, MAX_DELTA); + }); + }); + }); + }); +}); diff --git a/tests/hashauth.test.js b/tests/hashauth.test.js index 21f249a57a7..19fb50cc69e 100644 --- a/tests/hashauth.test.js +++ b/tests/hashauth.test.js @@ -6,6 +6,8 @@ var read = require('fs').readFileSync; var serverSettings = require('./fixtures/default-server-settings'); describe('hashauth', function ( ) { + this.timeout(40000); // TODO: see why this test takes longer on Travis to complete + var self = this; var headless = require('./fixtures/headless')(benv, this); @@ -63,7 +65,6 @@ describe('hashauth', function ( ) { */ it ('should make module unauthorized', function () { - this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -82,7 +83,6 @@ describe('hashauth', function ( ) { }); it ('should make module authorized', function () { - this.timeout(50000); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -99,9 +99,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/pluginbase.test.js b/tests/pluginbase.test.js index c04f0c802ce..d80a328648e 100644 --- a/tests/pluginbase.test.js +++ b/tests/pluginbase.test.js @@ -4,6 +4,8 @@ require('should'); var benv = require('benv'); describe('pluginbase', function ( ) { + this.timeout(40000); // TODO: see why this test takes longer on Travis to complete + var headless = require('./fixtures/headless')(benv, this); before(function (done) { diff --git a/tests/profileeditor.test.js b/tests/profileeditor.test.js index 4791b139544..9c915027c84 100644 --- a/tests/profileeditor.test.js +++ b/tests/profileeditor.test.js @@ -71,7 +71,7 @@ var someData = { describe('Profile editor', function ( ) { - this.timeout(30000); + this.timeout(40000); //TODO: see why this test takes longer on Travis to complete var headless = require('./fixtures/headless')(benv, this); before(function (done) { diff --git a/views/foodindex.html b/views/foodindex.html index cc506a46bb8..ea0d153958f 100644 --- a/views/foodindex.html +++ b/views/foodindex.html @@ -88,6 +88,15 @@

Food Editor


+ + Fat [g]:
+ + + Protein [g]:
+ + + Energy [kJ]:
+ diff --git a/views/index.html b/views/index.html index c8ff1731ca0..237c0297a5c 100644 --- a/views/index.html +++ b/views/index.html @@ -339,7 +339,7 @@