diff --git a/package-lock.json b/package-lock.json index 68bc1cd28f..33ee0a4c1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,14 @@ "csv": "~5.3.2", "csv-stringify": "~5.6.5", "d3": "~7.8.5", + "dompurify": "~3.2.6", "dotenv": "~16.4.5", "escape-html": "~1.0.3", "express": "~4.19.2", "express-rate-limit": "~7.2.0", "history": "~5.3.0", "ini": "~4.1.3", + "jsdom": "~26.1.0", "jsonschema": "~1.4.1", "jsonwebtoken": "~9.0.0", "lodash": "~4.17.21", @@ -98,6 +100,18 @@ "node": ">=0.10.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", @@ -186,6 +200,111 @@ "findup": "bin/findup.js" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -1373,6 +1492,12 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", @@ -1894,6 +2019,14 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3228,6 +3361,18 @@ "node": ">=4" } }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -3791,11 +3936,22 @@ "node": ">=12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3820,6 +3976,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -4023,6 +4185,14 @@ "url": "https://bevry.me/fund" } }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -4192,6 +4362,17 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/envinfo": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", @@ -5739,6 +5920,17 @@ "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==" }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -5754,12 +5946,36 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", "dev": true }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6211,6 +6427,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "node_modules/is-string-blank": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", @@ -6332,6 +6553,44 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -6648,6 +6907,11 @@ "get-func-name": "^2.0.1" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/make-event-props": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", @@ -7386,6 +7650,11 @@ "node": ">=0.10.0" } }, + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7612,6 +7881,17 @@ "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8254,7 +8534,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -9006,6 +9285,11 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9063,6 +9347,17 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -9760,6 +10055,11 @@ "svg-path-bounds": "^1.0.1" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -9917,6 +10217,22 @@ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -9983,6 +10299,28 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -10383,6 +10721,17 @@ "pbf": "^3.2.1" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -10409,6 +10758,14 @@ "get-canvas-context": "^1.0.1" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, "node_modules/webpack": { "version": "5.76.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", @@ -10573,6 +10930,48 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10690,6 +11089,35 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "engines": { + "node": ">=18" + } + }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -10710,6 +11138,11 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 934ad9dc2c..12b1b80f3c 100644 --- a/package.json +++ b/package.json @@ -67,12 +67,14 @@ "csv": "~5.3.2", "csv-stringify": "~5.6.5", "d3": "~7.8.5", + "dompurify": "~3.2.6", "dotenv": "~16.4.5", "escape-html": "~1.0.3", "express": "~4.19.2", "express-rate-limit": "~7.2.0", "history": "~5.3.0", "ini": "~4.1.3", + "jsdom": "~26.1.0", "jsonschema": "~1.4.1", "jsonwebtoken": "~9.0.0", "lodash": "~4.17.21", diff --git a/src/scripts/checkHeader.sh b/src/scripts/checkHeader.sh index ea53896aff..d12b1d064e 100755 --- a/src/scripts/checkHeader.sh +++ b/src/scripts/checkHeader.sh @@ -41,6 +41,8 @@ FILES=$(echo "$FILES" | grep -v "src\/server\/test\/web\/readingsData\/.*") FILES=$(echo "$FILES" | grep -v ".github\/**") # Filter out unit test files FILES=$(echo "$FILES" | grep -v "src\/server\/data\/unit\/.*") +# Filter out crossSite test files +FILES=$(echo "$FILES" | grep -v "src/server/test/crossSite/something.csv") # Counts the files listed in FILES NFILES=$(echo $FILES | wc -w) diff --git a/src/server/routes/response.js b/src/server/routes/response.js index e50371010e..6ba5473093 100644 --- a/src/server/routes/response.js +++ b/src/server/routes/response.js @@ -2,32 +2,31 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - // Functions to return a code and comment from an Express request. +// Functions to return a code and comment from an Express request. + +const DOMPurify = require('../services/utils/sanitizer'); /** - * Inform the client of a success (200 OK). - * - * @param res The Express response object - * @param comment Any additional data to be returned to the client as a string + * Inform the client of a success (200 OK) with sanitized content. * + * @param {express.Response} res The Express response object. + * @param {string} comment Any additional data to be returned to the client as a string. */ - function success(res, comment = '') { - res.status(200) // 200 OK - .send(comment); +function success(res, comment = '') { + const safeComment = DOMPurify.sanitize(comment); + res.status(200).send(safeComment); } /** - * Inform the client of a failure with provided code or 500. - * - * @param res The Express response object - * @param code The code number to send back for request - * @param comment Any additional data to be returned to the client as a string + * Inform the client of a failure with provided code or 500, using sanitized content. * + * @param {express.Response} res The Express response object. + * @param {number} code The code number to send back for the request. + * @param {string} comment Any additional data to be returned to the client as a string. */ function failure(res, code = 500, comment = '') { - res.status(code) - .send(comment); - + const safeComment = DOMPurify.sanitize(comment); + res.status(code).send(safeComment); } module.exports = { success, failure }; diff --git a/src/server/services/csvPipeline/success.js b/src/server/services/csvPipeline/success.js index 7da71555df..7b8945b2a0 100644 --- a/src/server/services/csvPipeline/success.js +++ b/src/server/services/csvPipeline/success.js @@ -2,35 +2,33 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -const express = require('express') /* needed to resolve types in JSDoc comments */ +const express = require('express'); +const DOMPurify = require('../utils/sanitizer'); /** - * Inform the client of a success (200 OK). + * Inform the client of a success (200 OK) with sanitized HTML content. * - * @param {express.Request} req The Express request object - * @param {express.Response} res The Express response object + * @param {express.Request} req The Express request object. + * @param {express.Response} res The Express response object. * @param {string} comment Any additional data to be returned to the client. - * */ function success(req, res, comment = '') { - res.status(200) // 200 OK - .send(`

SUCCESS

${comment}`); + const safeComment = DOMPurify.sanitize(comment); + res.status(200).send(`

SUCCESS

${safeComment}`); } /** - * Inform the client of a failure (400 OK). + * Inform the client of a failure (400 OK) with sanitized HTML content. * - * @param {express.Request} req The Express request object - * @param {express.Response} res The Express response object + * @param {express.Request} req The Express request object. + * @param {express.Response} res The Express response object. * @param {string} comment Any additional data to be returned to the client. - * */ function failure(req, res, comment = '') { + const safeComment = DOMPurify.sanitize(comment); // 400 is client error. There is a small chance the insert into the DB failed // but overlooking that. - res.status(400) - .send(`

FAILURE

${comment}`); - + res.status(400).send(`

FAILURE

${safeComment}`); } -module.exports = { success, failure }; +module.exports = { success, failure }; \ No newline at end of file diff --git a/src/server/services/utils/sanitizer.js b/src/server/services/utils/sanitizer.js new file mode 100644 index 0000000000..f2ade61895 --- /dev/null +++ b/src/server/services/utils/sanitizer.js @@ -0,0 +1,12 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const { JSDOM } = require('jsdom'); +const createDOMPurify = require('dompurify'); + +// Create jsdom window application and initialize +const window = new JSDOM('').window; +const DOMPurify = createDOMPurify(window); + +module.exports = DOMPurify; diff --git a/src/server/test/crossSite/crossSite.js b/src/server/test/crossSite/crossSite.js new file mode 100644 index 0000000000..43bd2fd294 --- /dev/null +++ b/src/server/test/crossSite/crossSite.js @@ -0,0 +1,59 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* This file tests the functionality of the DOMPurify library. It tests for XSS +vulnerabilities in HTML of user uploaded data.*/ + +/* Run in OED Docker web container terminal/shell: +npm run testsome src/server/test/crossSite/crossSite.js */ +const { chai, mocha, expect, app, testUser } = require('../common'); +const xssIndicators = [ + 'onerror', + 'alert', + 'document.domain', + ' { + + mocha.it('Test for sanitization of HTML', async () => { + const filePath = 'src/server/test/crossSite/readings.csv'; + + const res = await chai.request(app).post('/api/csv/readings') + .field('email', testUser.username) + .field('password', testUser.password) + /* This next line should produce: + res.text:

FAILURE

CSVPipelineError: + User Error: Meter with name '' not found. + */ + .field('meterName', '') + .field('gzip', "no") + .attach('csvfile', 'src/server/test/crossSite/something.csv'); + + expect(res).to.have.status(400); + expect(res.text).to.include(''); + + xssIndicators.forEach(indicator => { + expect(res.text, `Output should not contain ${indicator}`).to.not.include(indicator); + }); + }); + + mocha.it('Test for sanitization of login HTML in username', async () => { + const res = await chai.request(app) + .post('/api/login') + .send({ + username: '', + password: 'password123' + }); + expect(res).to.have.status(401); + + xssIndicators.forEach(indicator => { + expect(res.text, `Output should not contain ${indicator}`).to.not.include(indicator); + }); + }); +}); diff --git a/src/server/test/crossSite/something.csv b/src/server/test/crossSite/something.csv new file mode 100644 index 0000000000..3fde4e2023 --- /dev/null +++ b/src/server/test/crossSite/something.csv @@ -0,0 +1 @@ +1,2,3 \ No newline at end of file diff --git a/src/server/test/web/readingsCompareGroupFlow.js b/src/server/test/web/readingsCompareGroupFlow.js index 1b79ccd9ce..683f417d35 100644 --- a/src/server/test/web/readingsCompareGroupFlow.js +++ b/src/server/test/web/readingsCompareGroupFlow.js @@ -213,210 +213,13 @@ mocha.describe('readings API', () => { expectCompareToEqualExpected(res, expected, GROUP_ID); }); - mocha.it('CG17: 1 full day shift for 15 minute reading intervals and flow units & kW as kW ', async () => { - - const unitDatakW = [ - { - // u4 - name: 'kW', - identifier: '', - unitRepresent: Unit.unitRepresentType.FLOW, - secInRate: 3600, - typeOfUnit: Unit.unitType.UNIT, - suffix: '', - displayable: Unit.displayableType.ALL, - preferredDisplay: true, - note: 'kilowatts' - }, - { - // u5 - name: 'Electric', - identifier: '', - unitRepresent: Unit.unitRepresentType.FLOW, - secInRate: 3600, - typeOfUnit: Unit.unitType.METER, - suffix: '', - displayable: Unit.displayableType.NONE, - preferredDisplay: false, - note: 'special unit' - }, - ]; - // conversion data - const conversionDatakW = [ - { - // c4 - sourceName: 'Electric', - destinationName: 'kW', - bidirectional: false, - slope: 1, - intercept: 0, - note: 'Electric → kW' - } - ]; - // meter groups - const meterDatakWGroups = [ - { - name: 'meterDatakW', - unit: 'Electric', - defaultGraphicUnit: 'kW', - displayable: true, - gps: undefined, - note: 'special meter', - file: 'test/web/readingsData/readings_ri_15_days_75.csv', - deleteFile: false, - readingFrequency: '15 minutes', - id: METER_ID - }, - { - name: 'meterDatakWOther', - unit: 'Electric', - defaultGraphicUnit: 'kW', - displayable: true, - gps: undefined, - note: 'special meter', - file: 'test/web/readingsData/readings_ri_20_days_75.csv', - deleteFile: false, - readingFrequency: '20 minutes', - id: (METER_ID + 1) - } - ]; - // group data - const groupDatakW = [ - { - id: GROUP_ID, - name: 'meterDatakW + meterDatakWOther', - displayable: true, - note: 'special group', - defaultGraphicUnit: 'kW', - childMeters: ['meterDatakW', 'meterDatakWOther'], - childGroups: [], - } - ] - //load data into database - await prepareTest(unitDatakW, conversionDatakW, meterDatakWGroups, groupDatakW); - //get unit ID since the DB could use any value. - const unitId = await getUnitId('kW'); - const expected = [2380.19267225989, 2549.69370712913]; - //for compare, need the unitID, currentStart, currentEnd, shift - const res = await chai.request(app).get(`/api/compareReadings/groups/${GROUP_ID}`) - .query({ - curr_start: '2022-10-30 00:00:00', - curr_end: '2022-10-31 00:00:00', - shift: 'P1D', - graphicUnitId: unitId, - }); - expectCompareToEqualExpected(res, expected, GROUP_ID); - }) + // Add CG17 here // Add CG18 here // Add CG19 here - mocha.it('CG20: 28 day shift end 2022-10-31 17:12:34 (partial hour) for 15 minute reading intervals and flow units & kW as kW', async () => { - - const unitData = [ - { - // u4 - name: 'kW', - identifier: '', - unitRepresent: Unit.unitRepresentType.FLOW, - secInRate: 3600, - typeOfUnit: Unit.unitType.UNIT, - suffix: '', - displayable: Unit.displayableType.ALL, - preferredDisplay: true, - note: 'kilowatts', - }, - - { - - // u5 - name: 'Electric', - identifier: '', - unitRepresent: Unit.unitRepresentType.FLOW, - secInRate: 3600, - typeOfUnit: Unit.unitType.METER, - suffix: '', - displayable: Unit.displayableType.NONE, - preferredDisplay: false, - note: 'special unit' - - } - ]; - - const conversionDatakW = [ - { - // c4 - sourceName: 'Electric', - destinationName: 'kW', - bidirectional: false, - slope: 1, - intercept: 0, - note: 'Electric → kW' - - } - ]; - - const meterDatakWGroups = [ - { - name: 'meterDatakW', - unit: 'Electric', - defaultGraphicUnit: 'kW', - displayable: true, - gps: undefined, - note: 'special meter', - file: 'test/web/readingsData/readings_ri_15_days_75.csv', - deleteFile: false, - readingFrequency: '15 minutes', - id: METER_ID - }, - { - name: 'meterDatakWOther', - unit: 'Electric', - defaultGraphicUnit: 'kW', - displayable: true, - gps: undefined, - note: 'special meter', - file: 'test/web/readingsData/readings_ri_20_days_75.csv', - deleteFile: false, - readingFrequency: '20 minutes', - id: (METER_ID + 1) - } - ]; - - const groupDatakW = [ - { - id: GROUP_ID, - name: 'meterDatakW + meterDatakWOther', - displayable: true, - note: 'special group', - defaultGraphicUnit: 'kW', - childMeters: ['meterDatakW', 'meterDatakWOther'], - childGroups: [] - } - ]; - - // load data into database - await prepareTest(unitData, conversionDatakW, meterDatakWGroups, groupDatakW); - - // get unit ID because DB can use any value - const unitId = await getUnitId('kW'); - const expected = [54294.7361355451, 54544.4808583878]; - - // make API call to get results - const res = await chai.request(app).get(`/api/compareReadings/groups/${GROUP_ID}`) - .query({ - curr_start: '2022-10-09 00:00:00', - curr_end: '2022-10-31 17:12:34', - shift: 'P28D', - graphicUnitId: unitId, - }); - - // compare expected and res - expectCompareToEqualExpected(res, expected, GROUP_ID); - }); - - + // Add CG20 here }); }); }); diff --git a/src/server/test/web/readingsData/expected_bar_group_ri_15-20_mu_kWh_gu_kWh_st_-inf_et_inf_bd_7.csv b/src/server/test/web/readingsData/expected_bar_group_ri_15-20_mu_kWh_gu_kWh_st_-inf_et_inf_bd_7.csv index 04befedd0d..145260dc28 100644 --- a/src/server/test/web/readingsData/expected_bar_group_ri_15-20_mu_kWh_gu_kWh_st_-inf_et_inf_bd_7.csv +++ b/src/server/test/web/readingsData/expected_bar_group_ri_15-20_mu_kWh_gu_kWh_st_-inf_et_inf_bd_7.csv @@ -1,11 +1,11 @@ -reading,start time,end time -57744.5416303119,2022-08-23 00:00:00,2022-08-30 00:00:00 -58457.1956496669,2022-08-30 00:00:00,2022-09-06 00:00:00 -59276.647957841,2022-09-06 00:00:00,2022-09-13 00:00:00 -58879.1789750532,2022-09-13 00:00:00,2022-09-20 00:00:00 -58647.346330365,2022-09-20 00:00:00,2022-09-27 00:00:00 -58324.4920477014,2022-09-27 00:00:00,2022-10-04 00:00:00 -58177.8818425628,2022-10-04 00:00:00,2022-10-11 00:00:00 -58573.7982237878,2022-10-11 00:00:00,2022-10-18 00:00:00 -58642.2652124796,2022-10-18 00:00:00,2022-10-25 00:00:00 -58818.8114100034,2022-10-25 00:00:00,2022-11-01 00:00:00 +reading,start time,end time +57744.5416303119,2022-08-23 00:00:00,2022-08-30 00:00:00 +58457.1956496669,2022-08-30 00:00:00,2022-09-06 00:00:00 +59276.647957841,2022-09-06 00:00:00,2022-09-13 00:00:00 +58879.1789750532,2022-09-13 00:00:00,2022-09-20 00:00:00 +58647.346330365,2022-09-20 00:00:00,2022-09-27 00:00:00 +58324.4920477014,2022-09-27 00:00:00,2022-10-04 00:00:00 +58177.8818425628,2022-10-04 00:00:00,2022-10-11 00:00:00 +58573.7982237878,2022-10-11 00:00:00,2022-10-18 00:00:00 +58642.2652124796,2022-10-18 00:00:00,2022-10-25 00:00:00 +58818.8114100034,2022-10-25 00:00:00,2022-11-01 00:00:00 diff --git a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kW_gu_kW_st_-inf_et_inf_bd_1.csv b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kW_gu_kW_st_-inf_et_inf_bd_1.csv index cbf8834e38..5481206245 100644 --- a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kW_gu_kW_st_-inf_et_inf_bd_1.csv +++ b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kW_gu_kW_st_-inf_et_inf_bd_1.csv @@ -1,76 +1,76 @@ -reading,start time,end time -1244.4732821245,2022-08-18 00:00:00,2022-08-19 00:00:00 -988.315804920483,2022-08-19 00:00:00,2022-08-20 00:00:00 -1229.16913704567,2022-08-20 00:00:00,2022-08-21 00:00:00 -1214.90679769041,2022-08-21 00:00:00,2022-08-22 00:00:00 -1141.42617179595,2022-08-22 00:00:00,2022-08-23 00:00:00 -1173.22097628136,2022-08-23 00:00:00,2022-08-24 00:00:00 -1172.76622813581,2022-08-24 00:00:00,2022-08-25 00:00:00 -1217.29080157992,2022-08-25 00:00:00,2022-08-26 00:00:00 -1078.14650822547,2022-08-26 00:00:00,2022-08-27 00:00:00 -1195.102845216,2022-08-27 00:00:00,2022-08-28 00:00:00 -1156.49973049494,2022-08-28 00:00:00,2022-08-29 00:00:00 -1112.47501131559,2022-08-29 00:00:00,2022-08-30 00:00:00 -1192.86644903414,2022-08-30 00:00:00,2022-08-31 00:00:00 -1161.02765232201,2022-08-31 00:00:00,2022-09-01 00:00:00 -1152.18197026441,2022-09-01 00:00:00,2022-09-02 00:00:00 -1272.45260726068,2022-09-02 00:00:00,2022-09-03 00:00:00 -1217.82966175226,2022-09-03 00:00:00,2022-09-04 00:00:00 -1176.84658742283,2022-09-04 00:00:00,2022-09-05 00:00:00 -1125.57284174782,2022-09-05 00:00:00,2022-09-06 00:00:00 -1194.22329876519,2022-09-06 00:00:00,2022-09-07 00:00:00 -1171.71190809283,2022-09-07 00:00:00,2022-09-08 00:00:00 -1130.54158593037,2022-09-08 00:00:00,2022-09-09 00:00:00 -1236.92056317258,2022-09-09 00:00:00,2022-09-10 00:00:00 -1142.10449794792,2022-09-10 00:00:00,2022-09-11 00:00:00 -1340.16170552738,2022-09-11 00:00:00,2022-09-12 00:00:00 -1182.05404123472,2022-09-12 00:00:00,2022-09-13 00:00:00 -1248.84451712363,2022-09-13 00:00:00,2022-09-14 00:00:00 -1137.33538285512,2022-09-14 00:00:00,2022-09-15 00:00:00 -1221.31552272137,2022-09-15 00:00:00,2022-09-16 00:00:00 -1143.33626142129,2022-09-16 00:00:00,2022-09-17 00:00:00 -1225.3967032627,2022-09-17 00:00:00,2022-09-18 00:00:00 -1286.93091007234,2022-09-18 00:00:00,2022-09-19 00:00:00 -1110.56503545471,2022-09-19 00:00:00,2022-09-20 00:00:00 -1340.33530846461,2022-09-20 00:00:00,2022-09-21 00:00:00 -1123.21972183704,2022-09-21 00:00:00,2022-09-22 00:00:00 -1249.65113803395,2022-09-22 00:00:00,2022-09-23 00:00:00 -1131.23559326555,2022-09-23 00:00:00,2022-09-24 00:00:00 -1142.76238111977,2022-09-24 00:00:00,2022-09-25 00:00:00 -1210.92514071449,2022-09-25 00:00:00,2022-09-26 00:00:00 -1150.76698467275,2022-09-26 00:00:00,2022-09-27 00:00:00 -1152.78225650689,2022-09-27 00:00:00,2022-09-28 00:00:00 -1215.20127016486,2022-09-28 00:00:00,2022-09-29 00:00:00 -1273.79854318597,2022-09-29 00:00:00,2022-09-30 00:00:00 -1198.53270778934,2022-09-30 00:00:00,2022-10-01 00:00:00 -1165.80837300627,2022-10-01 00:00:00,2022-10-02 00:00:00 -1180.22585254585,2022-10-02 00:00:00,2022-10-03 00:00:00 -1112.62184179863,2022-10-03 00:00:00,2022-10-04 00:00:00 -1217.71687161273,2022-10-04 00:00:00,2022-10-05 00:00:00 -1199.38826568772,2022-10-05 00:00:00,2022-10-06 00:00:00 -1160.1762157385,2022-10-06 00:00:00,2022-10-07 00:00:00 -1269.25906753997,2022-10-07 00:00:00,2022-10-08 00:00:00 -1167.40579266569,2022-10-08 00:00:00,2022-10-09 00:00:00 -1058.18319043406,2022-10-09 00:00:00,2022-10-10 00:00:00 -1211.93520880573,2022-10-10 00:00:00,2022-10-11 00:00:00 -1152.7344011911,2022-10-11 00:00:00,2022-10-12 00:00:00 -1259.0249731428,2022-10-12 00:00:00,2022-10-13 00:00:00 -1192.12826970549,2022-10-13 00:00:00,2022-10-14 00:00:00 -1208.21671287911,2022-10-14 00:00:00,2022-10-15 00:00:00 -1155.22102759493,2022-10-15 00:00:00,2022-10-16 00:00:00 -1178.49984441914,2022-10-16 00:00:00,2022-10-17 00:00:00 -1221.29509976931,2022-10-17 00:00:00,2022-10-18 00:00:00 -1162.54298706786,2022-10-18 00:00:00,2022-10-19 00:00:00 -1128.36869126957,2022-10-19 00:00:00,2022-10-20 00:00:00 -1162.34721422175,2022-10-20 00:00:00,2022-10-21 00:00:00 -1243.61079923689,2022-10-21 00:00:00,2022-10-22 00:00:00 -1187.32006552077,2022-10-22 00:00:00,2022-10-23 00:00:00 -1203.7441556701,2022-10-23 00:00:00,2022-10-24 00:00:00 -1223.62767515703,2022-10-24 00:00:00,2022-10-25 00:00:00 -1347.85241257491,2022-10-25 00:00:00,2022-10-26 00:00:00 -1135.57752734976,2022-10-26 00:00:00,2022-10-27 00:00:00 -1091.91787954098,2022-10-27 00:00:00,2022-10-28 00:00:00 -1203.63545481652,2022-10-28 00:00:00,2022-10-29 00:00:00 -1349.13987250313,2022-10-29 00:00:00,2022-10-30 00:00:00 -1210.55315436926,2022-10-30 00:00:00,2022-10-31 00:00:00 -1072.65000056083,2022-10-31 00:00:00,2022-11-01 00:00:00 +reading,start time,end time +1244.4732821245,2022-08-18 00:00:00,2022-08-19 00:00:00 +988.315804920483,2022-08-19 00:00:00,2022-08-20 00:00:00 +1229.16913704567,2022-08-20 00:00:00,2022-08-21 00:00:00 +1214.90679769041,2022-08-21 00:00:00,2022-08-22 00:00:00 +1141.42617179595,2022-08-22 00:00:00,2022-08-23 00:00:00 +1173.22097628136,2022-08-23 00:00:00,2022-08-24 00:00:00 +1172.76622813581,2022-08-24 00:00:00,2022-08-25 00:00:00 +1217.29080157992,2022-08-25 00:00:00,2022-08-26 00:00:00 +1078.14650822547,2022-08-26 00:00:00,2022-08-27 00:00:00 +1195.102845216,2022-08-27 00:00:00,2022-08-28 00:00:00 +1156.49973049494,2022-08-28 00:00:00,2022-08-29 00:00:00 +1112.47501131559,2022-08-29 00:00:00,2022-08-30 00:00:00 +1192.86644903414,2022-08-30 00:00:00,2022-08-31 00:00:00 +1161.02765232201,2022-08-31 00:00:00,2022-09-01 00:00:00 +1152.18197026441,2022-09-01 00:00:00,2022-09-02 00:00:00 +1272.45260726068,2022-09-02 00:00:00,2022-09-03 00:00:00 +1217.82966175226,2022-09-03 00:00:00,2022-09-04 00:00:00 +1176.84658742283,2022-09-04 00:00:00,2022-09-05 00:00:00 +1125.57284174782,2022-09-05 00:00:00,2022-09-06 00:00:00 +1194.22329876519,2022-09-06 00:00:00,2022-09-07 00:00:00 +1171.71190809283,2022-09-07 00:00:00,2022-09-08 00:00:00 +1130.54158593037,2022-09-08 00:00:00,2022-09-09 00:00:00 +1236.92056317258,2022-09-09 00:00:00,2022-09-10 00:00:00 +1142.10449794792,2022-09-10 00:00:00,2022-09-11 00:00:00 +1340.16170552738,2022-09-11 00:00:00,2022-09-12 00:00:00 +1182.05404123472,2022-09-12 00:00:00,2022-09-13 00:00:00 +1248.84451712363,2022-09-13 00:00:00,2022-09-14 00:00:00 +1137.33538285512,2022-09-14 00:00:00,2022-09-15 00:00:00 +1221.31552272137,2022-09-15 00:00:00,2022-09-16 00:00:00 +1143.33626142129,2022-09-16 00:00:00,2022-09-17 00:00:00 +1225.3967032627,2022-09-17 00:00:00,2022-09-18 00:00:00 +1286.93091007234,2022-09-18 00:00:00,2022-09-19 00:00:00 +1110.56503545471,2022-09-19 00:00:00,2022-09-20 00:00:00 +1340.33530846461,2022-09-20 00:00:00,2022-09-21 00:00:00 +1123.21972183704,2022-09-21 00:00:00,2022-09-22 00:00:00 +1249.65113803395,2022-09-22 00:00:00,2022-09-23 00:00:00 +1131.23559326555,2022-09-23 00:00:00,2022-09-24 00:00:00 +1142.76238111977,2022-09-24 00:00:00,2022-09-25 00:00:00 +1210.92514071449,2022-09-25 00:00:00,2022-09-26 00:00:00 +1150.76698467275,2022-09-26 00:00:00,2022-09-27 00:00:00 +1152.78225650689,2022-09-27 00:00:00,2022-09-28 00:00:00 +1215.20127016486,2022-09-28 00:00:00,2022-09-29 00:00:00 +1273.79854318597,2022-09-29 00:00:00,2022-09-30 00:00:00 +1198.53270778934,2022-09-30 00:00:00,2022-10-01 00:00:00 +1165.80837300627,2022-10-01 00:00:00,2022-10-02 00:00:00 +1180.22585254585,2022-10-02 00:00:00,2022-10-03 00:00:00 +1112.62184179863,2022-10-03 00:00:00,2022-10-04 00:00:00 +1217.71687161273,2022-10-04 00:00:00,2022-10-05 00:00:00 +1199.38826568772,2022-10-05 00:00:00,2022-10-06 00:00:00 +1160.1762157385,2022-10-06 00:00:00,2022-10-07 00:00:00 +1269.25906753997,2022-10-07 00:00:00,2022-10-08 00:00:00 +1167.40579266569,2022-10-08 00:00:00,2022-10-09 00:00:00 +1058.18319043406,2022-10-09 00:00:00,2022-10-10 00:00:00 +1211.93520880573,2022-10-10 00:00:00,2022-10-11 00:00:00 +1152.7344011911,2022-10-11 00:00:00,2022-10-12 00:00:00 +1259.0249731428,2022-10-12 00:00:00,2022-10-13 00:00:00 +1192.12826970549,2022-10-13 00:00:00,2022-10-14 00:00:00 +1208.21671287911,2022-10-14 00:00:00,2022-10-15 00:00:00 +1155.22102759493,2022-10-15 00:00:00,2022-10-16 00:00:00 +1178.49984441914,2022-10-16 00:00:00,2022-10-17 00:00:00 +1221.29509976931,2022-10-17 00:00:00,2022-10-18 00:00:00 +1162.54298706786,2022-10-18 00:00:00,2022-10-19 00:00:00 +1128.36869126957,2022-10-19 00:00:00,2022-10-20 00:00:00 +1162.34721422175,2022-10-20 00:00:00,2022-10-21 00:00:00 +1243.61079923689,2022-10-21 00:00:00,2022-10-22 00:00:00 +1187.32006552077,2022-10-22 00:00:00,2022-10-23 00:00:00 +1203.7441556701,2022-10-23 00:00:00,2022-10-24 00:00:00 +1223.62767515703,2022-10-24 00:00:00,2022-10-25 00:00:00 +1347.85241257491,2022-10-25 00:00:00,2022-10-26 00:00:00 +1135.57752734976,2022-10-26 00:00:00,2022-10-27 00:00:00 +1091.91787954098,2022-10-27 00:00:00,2022-10-28 00:00:00 +1203.63545481652,2022-10-28 00:00:00,2022-10-29 00:00:00 +1349.13987250313,2022-10-29 00:00:00,2022-10-30 00:00:00 +1210.55315436926,2022-10-30 00:00:00,2022-10-31 00:00:00 +1072.65000056083,2022-10-31 00:00:00,2022-11-01 00:00:00 diff --git a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kWh_st_-inf_et_inf_bd_76.csv b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kWh_st_-inf_et_inf_bd_76.csv index f3f6b539f9..d33df9d25a 100644 --- a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kWh_st_-inf_et_inf_bd_76.csv +++ b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kWh_st_-inf_et_inf_bd_76.csv @@ -1 +1 @@ -reading,start time,end time +reading,start time,end time diff --git a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kgCO2_st_-inf_et_inf_bd_1.csv b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kgCO2_st_-inf_et_inf_bd_1.csv index 9ae94a6d49..4fd725d255 100644 --- a/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kgCO2_st_-inf_et_inf_bd_1.csv +++ b/src/server/test/web/readingsData/expected_bar_ri_15_mu_kWh_gu_kgCO2_st_-inf_et_inf_bd_1.csv @@ -1,76 +1,76 @@ -reading,start time,end time -3529.32622810508,2022-08-18 00:00:00,2022-08-19 00:00:00 -2802.86362275449,2022-08-19 00:00:00,2022-08-20 00:00:00 -3485.92367266153,2022-08-20 00:00:00,2022-08-21 00:00:00 -3445.47567824999,2022-08-21 00:00:00,2022-08-22 00:00:00 -3237.08462321332,2022-08-22 00:00:00,2022-08-23 00:00:00 -3327.25468873395,2022-08-23 00:00:00,2022-08-24 00:00:00 -3325.96502299317,2022-08-24 00:00:00,2022-08-25 00:00:00 -3452.23671328065,2022-08-25 00:00:00,2022-08-26 00:00:00 -3057.62349732744,2022-08-26 00:00:00,2022-08-27 00:00:00 -3389.31166903257,2022-08-27 00:00:00,2022-08-28 00:00:00 -3279.83323568366,2022-08-28 00:00:00,2022-08-29 00:00:00 -3154.97913209101,2022-08-29 00:00:00,2022-08-30 00:00:00 -3382.96924946082,2022-08-30 00:00:00,2022-08-31 00:00:00 -3292.67442198523,2022-08-31 00:00:00,2022-09-01 00:00:00 -3267.58806766986,2022-09-01 00:00:00,2022-09-02 00:00:00 -3608.67559419129,2022-09-02 00:00:00,2022-09-03 00:00:00 -3453.76492072941,2022-09-03 00:00:00,2022-09-04 00:00:00 -3337.53692193113,2022-09-04 00:00:00,2022-09-05 00:00:00 -3192.12457919682,2022-09-05 00:00:00,2022-09-06 00:00:00 -3386.81727529807,2022-09-06 00:00:00,2022-09-07 00:00:00 -3322.97497135126,2022-09-07 00:00:00,2022-09-08 00:00:00 -3206.21593769853,2022-09-08 00:00:00,2022-09-09 00:00:00 -3507.90671715743,2022-09-09 00:00:00,2022-09-10 00:00:00 -3239.0083561803,2022-09-10 00:00:00,2022-09-11 00:00:00 -3800.69859687566,2022-09-11 00:00:00,2022-09-12 00:00:00 -3352.30526094167,2022-09-12 00:00:00,2022-09-13 00:00:00 -3541.72305056262,2022-09-13 00:00:00,2022-09-14 00:00:00 -3225.48314577712,2022-09-14 00:00:00,2022-09-15 00:00:00 -3463.6508224378,2022-09-15 00:00:00,2022-09-16 00:00:00 -3242.50163739077,2022-09-16 00:00:00,2022-09-17 00:00:00 -3475.22505045303,2022-09-17 00:00:00,2022-09-18 00:00:00 -3649.73606096515,2022-09-18 00:00:00,2022-09-19 00:00:00 -3149.56244054955,2022-09-19 00:00:00,2022-09-20 00:00:00 -3801.19093480563,2022-09-20 00:00:00,2022-09-21 00:00:00 -3185.45113112985,2022-09-21 00:00:00,2022-09-22 00:00:00 -3544.01062746427,2022-09-22 00:00:00,2022-09-23 00:00:00 -3208.1841425011,2022-09-23 00:00:00,2022-09-24 00:00:00 -3240.87411285567,2022-09-24 00:00:00,2022-09-25 00:00:00 -3434.1836990663,2022-09-25 00:00:00,2022-09-26 00:00:00 -3263.57516853191,2022-09-26 00:00:00,2022-09-27 00:00:00 -3269.29047945354,2022-09-27 00:00:00,2022-09-28 00:00:00 -3446.31080218755,2022-09-28 00:00:00,2022-09-29 00:00:00 -3612.4926684754,2022-09-29 00:00:00,2022-09-30 00:00:00 -3399.03875929056,2022-09-30 00:00:00,2022-10-01 00:00:00 -3306.23254584579,2022-10-01 00:00:00,2022-10-02 00:00:00 -3347.12051782004,2022-10-02 00:00:00,2022-10-03 00:00:00 -3155.39554334092,2022-10-03 00:00:00,2022-10-04 00:00:00 -3453.44504789371,2022-10-04 00:00:00,2022-10-05 00:00:00 -3401.46512149036,2022-10-05 00:00:00,2022-10-06 00:00:00 -3290.25974783438,2022-10-06 00:00:00,2022-10-07 00:00:00 -3599.61871554336,2022-10-07 00:00:00,2022-10-08 00:00:00 -3310.76282799991,2022-10-08 00:00:00,2022-10-09 00:00:00 -3001.00752807099,2022-10-09 00:00:00,2022-10-10 00:00:00 -3437.04825217304,2022-10-10 00:00:00,2022-10-11 00:00:00 -3269.15476177796,2022-10-11 00:00:00,2022-10-12 00:00:00 -3570.59482383298,2022-10-12 00:00:00,2022-10-13 00:00:00 -3380.87577288478,2022-10-13 00:00:00,2022-10-14 00:00:00 -3426.50259772515,2022-10-14 00:00:00,2022-10-15 00:00:00 -3276.20683425922,2022-10-15 00:00:00,2022-10-16 00:00:00 -3342.22555877267,2022-10-16 00:00:00,2022-10-17 00:00:00 -3463.59290294577,2022-10-17 00:00:00,2022-10-18 00:00:00 -3296.97191132445,2022-10-18 00:00:00,2022-10-19 00:00:00 -3200.05360844051,2022-10-19 00:00:00,2022-10-20 00:00:00 -3296.41669953288,2022-10-20 00:00:00,2022-10-21 00:00:00 -3526.88022663582,2022-10-21 00:00:00,2022-10-22 00:00:00 -3367.23970581691,2022-10-22 00:00:00,2022-10-23 00:00:00 -3413.81842548041,2022-10-23 00:00:00,2022-10-24 00:00:00 -3470.20808674533,2022-10-24 00:00:00,2022-10-25 00:00:00 -3822.50944206245,2022-10-25 00:00:00,2022-10-26 00:00:00 -3220.49786756392,2022-10-26 00:00:00,2022-10-27 00:00:00 -3096.67910637821,2022-10-27 00:00:00,2022-10-28 00:00:00 -3413.51014985965,2022-10-28 00:00:00,2022-10-29 00:00:00 -3826.16067841889,2022-10-29 00:00:00,2022-10-30 00:00:00 -3433.12874579122,2022-10-30 00:00:00,2022-10-31 00:00:00 -3042.03540159051,2022-10-31 00:00:00,2022-11-01 00:00:00 +reading,start time,end time +3529.32622810508,2022-08-18 00:00:00,2022-08-19 00:00:00 +2802.86362275449,2022-08-19 00:00:00,2022-08-20 00:00:00 +3485.92367266153,2022-08-20 00:00:00,2022-08-21 00:00:00 +3445.47567824999,2022-08-21 00:00:00,2022-08-22 00:00:00 +3237.08462321332,2022-08-22 00:00:00,2022-08-23 00:00:00 +3327.25468873395,2022-08-23 00:00:00,2022-08-24 00:00:00 +3325.96502299317,2022-08-24 00:00:00,2022-08-25 00:00:00 +3452.23671328065,2022-08-25 00:00:00,2022-08-26 00:00:00 +3057.62349732744,2022-08-26 00:00:00,2022-08-27 00:00:00 +3389.31166903257,2022-08-27 00:00:00,2022-08-28 00:00:00 +3279.83323568366,2022-08-28 00:00:00,2022-08-29 00:00:00 +3154.97913209101,2022-08-29 00:00:00,2022-08-30 00:00:00 +3382.96924946082,2022-08-30 00:00:00,2022-08-31 00:00:00 +3292.67442198523,2022-08-31 00:00:00,2022-09-01 00:00:00 +3267.58806766986,2022-09-01 00:00:00,2022-09-02 00:00:00 +3608.67559419129,2022-09-02 00:00:00,2022-09-03 00:00:00 +3453.76492072941,2022-09-03 00:00:00,2022-09-04 00:00:00 +3337.53692193113,2022-09-04 00:00:00,2022-09-05 00:00:00 +3192.12457919682,2022-09-05 00:00:00,2022-09-06 00:00:00 +3386.81727529807,2022-09-06 00:00:00,2022-09-07 00:00:00 +3322.97497135126,2022-09-07 00:00:00,2022-09-08 00:00:00 +3206.21593769853,2022-09-08 00:00:00,2022-09-09 00:00:00 +3507.90671715743,2022-09-09 00:00:00,2022-09-10 00:00:00 +3239.0083561803,2022-09-10 00:00:00,2022-09-11 00:00:00 +3800.69859687566,2022-09-11 00:00:00,2022-09-12 00:00:00 +3352.30526094167,2022-09-12 00:00:00,2022-09-13 00:00:00 +3541.72305056262,2022-09-13 00:00:00,2022-09-14 00:00:00 +3225.48314577712,2022-09-14 00:00:00,2022-09-15 00:00:00 +3463.6508224378,2022-09-15 00:00:00,2022-09-16 00:00:00 +3242.50163739077,2022-09-16 00:00:00,2022-09-17 00:00:00 +3475.22505045303,2022-09-17 00:00:00,2022-09-18 00:00:00 +3649.73606096515,2022-09-18 00:00:00,2022-09-19 00:00:00 +3149.56244054955,2022-09-19 00:00:00,2022-09-20 00:00:00 +3801.19093480563,2022-09-20 00:00:00,2022-09-21 00:00:00 +3185.45113112985,2022-09-21 00:00:00,2022-09-22 00:00:00 +3544.01062746427,2022-09-22 00:00:00,2022-09-23 00:00:00 +3208.1841425011,2022-09-23 00:00:00,2022-09-24 00:00:00 +3240.87411285567,2022-09-24 00:00:00,2022-09-25 00:00:00 +3434.1836990663,2022-09-25 00:00:00,2022-09-26 00:00:00 +3263.57516853191,2022-09-26 00:00:00,2022-09-27 00:00:00 +3269.29047945354,2022-09-27 00:00:00,2022-09-28 00:00:00 +3446.31080218755,2022-09-28 00:00:00,2022-09-29 00:00:00 +3612.4926684754,2022-09-29 00:00:00,2022-09-30 00:00:00 +3399.03875929056,2022-09-30 00:00:00,2022-10-01 00:00:00 +3306.23254584579,2022-10-01 00:00:00,2022-10-02 00:00:00 +3347.12051782004,2022-10-02 00:00:00,2022-10-03 00:00:00 +3155.39554334092,2022-10-03 00:00:00,2022-10-04 00:00:00 +3453.44504789371,2022-10-04 00:00:00,2022-10-05 00:00:00 +3401.46512149036,2022-10-05 00:00:00,2022-10-06 00:00:00 +3290.25974783438,2022-10-06 00:00:00,2022-10-07 00:00:00 +3599.61871554336,2022-10-07 00:00:00,2022-10-08 00:00:00 +3310.76282799991,2022-10-08 00:00:00,2022-10-09 00:00:00 +3001.00752807099,2022-10-09 00:00:00,2022-10-10 00:00:00 +3437.04825217304,2022-10-10 00:00:00,2022-10-11 00:00:00 +3269.15476177796,2022-10-11 00:00:00,2022-10-12 00:00:00 +3570.59482383298,2022-10-12 00:00:00,2022-10-13 00:00:00 +3380.87577288478,2022-10-13 00:00:00,2022-10-14 00:00:00 +3426.50259772515,2022-10-14 00:00:00,2022-10-15 00:00:00 +3276.20683425922,2022-10-15 00:00:00,2022-10-16 00:00:00 +3342.22555877267,2022-10-16 00:00:00,2022-10-17 00:00:00 +3463.59290294577,2022-10-17 00:00:00,2022-10-18 00:00:00 +3296.97191132445,2022-10-18 00:00:00,2022-10-19 00:00:00 +3200.05360844051,2022-10-19 00:00:00,2022-10-20 00:00:00 +3296.41669953288,2022-10-20 00:00:00,2022-10-21 00:00:00 +3526.88022663582,2022-10-21 00:00:00,2022-10-22 00:00:00 +3367.23970581691,2022-10-22 00:00:00,2022-10-23 00:00:00 +3413.81842548041,2022-10-23 00:00:00,2022-10-24 00:00:00 +3470.20808674533,2022-10-24 00:00:00,2022-10-25 00:00:00 +3822.50944206245,2022-10-25 00:00:00,2022-10-26 00:00:00 +3220.49786756392,2022-10-26 00:00:00,2022-10-27 00:00:00 +3096.67910637821,2022-10-27 00:00:00,2022-10-28 00:00:00 +3413.51014985965,2022-10-28 00:00:00,2022-10-29 00:00:00 +3826.16067841889,2022-10-29 00:00:00,2022-10-30 00:00:00 +3433.12874579122,2022-10-30 00:00:00,2022-10-31 00:00:00 +3042.03540159051,2022-10-31 00:00:00,2022-11-01 00:00:00 diff --git a/src/server/test/web/readingsData/expected_line_group_ri_15-20_mu_kWh_gu_kgCO2_st_-inf_et_inf.csv b/src/server/test/web/readingsData/expected_line_group_ri_15-20_mu_kWh_gu_kgCO2_st_-inf_et_inf.csv index 06e25ffebc..42c3b0b99f 100644 --- a/src/server/test/web/readingsData/expected_line_group_ri_15-20_mu_kWh_gu_kgCO2_st_-inf_et_inf.csv +++ b/src/server/test/web/readingsData/expected_line_group_ri_15-20_mu_kWh_gu_kgCO2_st_-inf_et_inf.csv @@ -1,76 +1,76 @@ -reading,start time,end time -252.892148928677,2022-08-18 00:00:00,2022-08-19 00:00:00 -223.337293871196,2022-08-19 00:00:00,2022-08-20 00:00:00 -255.680774535246,2022-08-20 00:00:00,2022-08-21 00:00:00 -250.846348838948,2022-08-21 00:00:00,2022-08-22 00:00:00 -242.698017028994,2022-08-22 00:00:00,2022-08-23 00:00:00 -249.367853797597,2022-08-23 00:00:00,2022-08-24 00:00:00 -251.85569690265,2022-08-24 00:00:00,2022-08-25 00:00:00 -247.295309798749,2022-08-25 00:00:00,2022-08-26 00:00:00 -230.662860940612,2022-08-26 00:00:00,2022-08-27 00:00:00 -248.74858156857,2022-08-27 00:00:00,2022-08-28 00:00:00 -245.705851370349,2022-08-28 00:00:00,2022-08-29 00:00:00 -232.233846283603,2022-08-29 00:00:00,2022-08-30 00:00:00 -253.700622881239,2022-08-30 00:00:00,2022-08-31 00:00:00 -243.767850197022,2022-08-31 00:00:00,2022-09-01 00:00:00 -238.183704532081,2022-09-01 00:00:00,2022-09-02 00:00:00 -257.094979610576,2022-09-02 00:00:00,2022-09-03 00:00:00 -257.777319080649,2022-09-03 00:00:00,2022-09-04 00:00:00 -246.512286453807,2022-09-04 00:00:00,2022-09-05 00:00:00 -229.886225395202,2022-09-05 00:00:00,2022-09-06 00:00:00 -250.624023704122,2022-09-06 00:00:00,2022-09-07 00:00:00 -251.627138465283,2022-09-07 00:00:00,2022-09-08 00:00:00 -241.828457022283,2022-09-08 00:00:00,2022-09-09 00:00:00 -249.185273607622,2022-09-09 00:00:00,2022-09-10 00:00:00 -245.574982720773,2022-09-10 00:00:00,2022-09-11 00:00:00 -265.766825732167,2022-09-11 00:00:00,2022-09-12 00:00:00 -246.524273835636,2022-09-12 00:00:00,2022-09-13 00:00:00 -253.532426577597,2022-09-13 00:00:00,2022-09-14 00:00:00 -238.701910075936,2022-09-14 00:00:00,2022-09-15 00:00:00 -251.286709376873,2022-09-15 00:00:00,2022-09-16 00:00:00 -241.148694861167,2022-09-16 00:00:00,2022-09-17 00:00:00 -254.640177033644,2022-09-17 00:00:00,2022-09-18 00:00:00 -256.318865345186,2022-09-18 00:00:00,2022-09-19 00:00:00 -243.760295617627,2022-09-19 00:00:00,2022-09-20 00:00:00 -269.72814149219,2022-09-20 00:00:00,2022-09-21 00:00:00 -239.535250123288,2022-09-21 00:00:00,2022-09-22 00:00:00 -257.968922072573,2022-09-22 00:00:00,2022-09-23 00:00:00 -236.884293822186,2022-09-23 00:00:00,2022-09-24 00:00:00 -236.457969882856,2022-09-24 00:00:00,2022-09-25 00:00:00 -251.908275731723,2022-09-25 00:00:00,2022-09-26 00:00:00 -240.057503051384,2022-09-26 00:00:00,2022-09-27 00:00:00 -238.170393268663,2022-09-27 00:00:00,2022-09-28 00:00:00 -248.098895622592,2022-09-28 00:00:00,2022-09-29 00:00:00 -256.175410700896,2022-09-29 00:00:00,2022-09-30 00:00:00 -248.813852738315,2022-09-30 00:00:00,2022-10-01 00:00:00 -243.496274125415,2022-10-01 00:00:00,2022-10-02 00:00:00 -249.047244409498,2022-10-02 00:00:00,2022-10-03 00:00:00 -239.200631710465,2022-10-03 00:00:00,2022-10-04 00:00:00 -248.790428309162,2022-10-04 00:00:00,2022-10-05 00:00:00 -244.894279966184,2022-10-05 00:00:00,2022-10-06 00:00:00 -250.473477472761,2022-10-06 00:00:00,2022-10-07 00:00:00 -256.267119601032,2022-10-07 00:00:00,2022-10-08 00:00:00 -243.485674905646,2022-10-08 00:00:00,2022-10-09 00:00:00 -229.262270537384,2022-10-09 00:00:00,2022-10-10 00:00:00 -245.49834197354,2022-10-10 00:00:00,2022-10-11 00:00:00 -242.651090400592,2022-10-11 00:00:00,2022-10-12 00:00:00 -256.465170820487,2022-10-12 00:00:00,2022-10-13 00:00:00 -251.210520208321,2022-10-13 00:00:00,2022-10-14 00:00:00 -247.116940873415,2022-10-14 00:00:00,2022-10-15 00:00:00 -238.967408502432,2022-10-15 00:00:00,2022-10-16 00:00:00 -244.104502447371,2022-10-16 00:00:00,2022-10-17 00:00:00 -249.851989275115,2022-10-17 00:00:00,2022-10-18 00:00:00 -243.749304861483,2022-10-18 00:00:00,2022-10-19 00:00:00 -235.366010252579,2022-10-19 00:00:00,2022-10-20 00:00:00 -248.940021970046,2022-10-20 00:00:00,2022-10-21 00:00:00 -253.6622840378,2022-10-21 00:00:00,2022-10-22 00:00:00 -240.301488632524,2022-10-22 00:00:00,2022-10-23 00:00:00 -248.852387944817,2022-10-23 00:00:00,2022-10-24 00:00:00 -261.518753786087,2022-10-24 00:00:00,2022-10-25 00:00:00 -269.97043892657,2022-10-25 00:00:00,2022-10-26 00:00:00 -236.241477685152,2022-10-26 00:00:00,2022-10-27 00:00:00 -238.243667723802,2022-10-27 00:00:00,2022-10-28 00:00:00 -249.593138158714,2022-10-28 00:00:00,2022-10-29 00:00:00 -265.822445194516,2022-10-29 00:00:00,2022-10-30 00:00:00 -246.706333347691,2022-10-30 00:00:00,2022-10-31 00:00:00 -231.028219367406,2022-10-31 00:00:00,2022-11-01 00:00:00 +reading,start time,end time +252.892148928677,2022-08-18 00:00:00,2022-08-19 00:00:00 +223.337293871196,2022-08-19 00:00:00,2022-08-20 00:00:00 +255.680774535246,2022-08-20 00:00:00,2022-08-21 00:00:00 +250.846348838948,2022-08-21 00:00:00,2022-08-22 00:00:00 +242.698017028994,2022-08-22 00:00:00,2022-08-23 00:00:00 +249.367853797597,2022-08-23 00:00:00,2022-08-24 00:00:00 +251.85569690265,2022-08-24 00:00:00,2022-08-25 00:00:00 +247.295309798749,2022-08-25 00:00:00,2022-08-26 00:00:00 +230.662860940612,2022-08-26 00:00:00,2022-08-27 00:00:00 +248.74858156857,2022-08-27 00:00:00,2022-08-28 00:00:00 +245.705851370349,2022-08-28 00:00:00,2022-08-29 00:00:00 +232.233846283603,2022-08-29 00:00:00,2022-08-30 00:00:00 +253.700622881239,2022-08-30 00:00:00,2022-08-31 00:00:00 +243.767850197022,2022-08-31 00:00:00,2022-09-01 00:00:00 +238.183704532081,2022-09-01 00:00:00,2022-09-02 00:00:00 +257.094979610576,2022-09-02 00:00:00,2022-09-03 00:00:00 +257.777319080649,2022-09-03 00:00:00,2022-09-04 00:00:00 +246.512286453807,2022-09-04 00:00:00,2022-09-05 00:00:00 +229.886225395202,2022-09-05 00:00:00,2022-09-06 00:00:00 +250.624023704122,2022-09-06 00:00:00,2022-09-07 00:00:00 +251.627138465283,2022-09-07 00:00:00,2022-09-08 00:00:00 +241.828457022283,2022-09-08 00:00:00,2022-09-09 00:00:00 +249.185273607622,2022-09-09 00:00:00,2022-09-10 00:00:00 +245.574982720773,2022-09-10 00:00:00,2022-09-11 00:00:00 +265.766825732167,2022-09-11 00:00:00,2022-09-12 00:00:00 +246.524273835636,2022-09-12 00:00:00,2022-09-13 00:00:00 +253.532426577597,2022-09-13 00:00:00,2022-09-14 00:00:00 +238.701910075936,2022-09-14 00:00:00,2022-09-15 00:00:00 +251.286709376873,2022-09-15 00:00:00,2022-09-16 00:00:00 +241.148694861167,2022-09-16 00:00:00,2022-09-17 00:00:00 +254.640177033644,2022-09-17 00:00:00,2022-09-18 00:00:00 +256.318865345186,2022-09-18 00:00:00,2022-09-19 00:00:00 +243.760295617627,2022-09-19 00:00:00,2022-09-20 00:00:00 +269.72814149219,2022-09-20 00:00:00,2022-09-21 00:00:00 +239.535250123288,2022-09-21 00:00:00,2022-09-22 00:00:00 +257.968922072573,2022-09-22 00:00:00,2022-09-23 00:00:00 +236.884293822186,2022-09-23 00:00:00,2022-09-24 00:00:00 +236.457969882856,2022-09-24 00:00:00,2022-09-25 00:00:00 +251.908275731723,2022-09-25 00:00:00,2022-09-26 00:00:00 +240.057503051384,2022-09-26 00:00:00,2022-09-27 00:00:00 +238.170393268663,2022-09-27 00:00:00,2022-09-28 00:00:00 +248.098895622592,2022-09-28 00:00:00,2022-09-29 00:00:00 +256.175410700896,2022-09-29 00:00:00,2022-09-30 00:00:00 +248.813852738315,2022-09-30 00:00:00,2022-10-01 00:00:00 +243.496274125415,2022-10-01 00:00:00,2022-10-02 00:00:00 +249.047244409498,2022-10-02 00:00:00,2022-10-03 00:00:00 +239.200631710465,2022-10-03 00:00:00,2022-10-04 00:00:00 +248.790428309162,2022-10-04 00:00:00,2022-10-05 00:00:00 +244.894279966184,2022-10-05 00:00:00,2022-10-06 00:00:00 +250.473477472761,2022-10-06 00:00:00,2022-10-07 00:00:00 +256.267119601032,2022-10-07 00:00:00,2022-10-08 00:00:00 +243.485674905646,2022-10-08 00:00:00,2022-10-09 00:00:00 +229.262270537384,2022-10-09 00:00:00,2022-10-10 00:00:00 +245.49834197354,2022-10-10 00:00:00,2022-10-11 00:00:00 +242.651090400592,2022-10-11 00:00:00,2022-10-12 00:00:00 +256.465170820487,2022-10-12 00:00:00,2022-10-13 00:00:00 +251.210520208321,2022-10-13 00:00:00,2022-10-14 00:00:00 +247.116940873415,2022-10-14 00:00:00,2022-10-15 00:00:00 +238.967408502432,2022-10-15 00:00:00,2022-10-16 00:00:00 +244.104502447371,2022-10-16 00:00:00,2022-10-17 00:00:00 +249.851989275115,2022-10-17 00:00:00,2022-10-18 00:00:00 +243.749304861483,2022-10-18 00:00:00,2022-10-19 00:00:00 +235.366010252579,2022-10-19 00:00:00,2022-10-20 00:00:00 +248.940021970046,2022-10-20 00:00:00,2022-10-21 00:00:00 +253.6622840378,2022-10-21 00:00:00,2022-10-22 00:00:00 +240.301488632524,2022-10-22 00:00:00,2022-10-23 00:00:00 +248.852387944817,2022-10-23 00:00:00,2022-10-24 00:00:00 +261.518753786087,2022-10-24 00:00:00,2022-10-25 00:00:00 +269.97043892657,2022-10-25 00:00:00,2022-10-26 00:00:00 +236.241477685152,2022-10-26 00:00:00,2022-10-27 00:00:00 +238.243667723802,2022-10-27 00:00:00,2022-10-28 00:00:00 +249.593138158714,2022-10-28 00:00:00,2022-10-29 00:00:00 +265.822445194516,2022-10-29 00:00:00,2022-10-30 00:00:00 +246.706333347691,2022-10-30 00:00:00,2022-10-31 00:00:00 +231.028219367406,2022-10-31 00:00:00,2022-11-01 00:00:00