From b82fb9ddda25a6740b792868582dbca530914953 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:22:42 -0500 Subject: [PATCH 01/13] rename startup services --- server/WebApi/Program.cs | 2 +- server/WebApi/{Startup.cs => StartupServices.cs} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename server/WebApi/{Startup.cs => StartupServices.cs} (88%) diff --git a/server/WebApi/Program.cs b/server/WebApi/Program.cs index b326a73..9be396f 100644 --- a/server/WebApi/Program.cs +++ b/server/WebApi/Program.cs @@ -40,7 +40,7 @@ Console.WriteLine($"CORS Origin: {allowedOrigin}"); // Register services -services.AddHostedService(); +services.AddHostedService(); services.AddTransient(); // Add response compression services diff --git a/server/WebApi/Startup.cs b/server/WebApi/StartupServices.cs similarity index 88% rename from server/WebApi/Startup.cs rename to server/WebApi/StartupServices.cs index 44dc8f5..f0d9dd1 100644 --- a/server/WebApi/Startup.cs +++ b/server/WebApi/StartupServices.cs @@ -1,8 +1,8 @@ namespace WebApi.Services; -public class StartupService(ILoggerFactory loggerFactory) : IHostedService +public class StartupServices(ILoggerFactory loggerFactory) : IHostedService { - private readonly ILogger _logger = loggerFactory.CreateLogger(); + private readonly ILogger _logger = loggerFactory.CreateLogger(); /// /// The code in here will run when the application starts, From 721d910ec5a59792e7a4ed8fb086d291da4bd33d Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:22:48 -0500 Subject: [PATCH 02/13] update ng packages --- client/package-lock.json | 1279 ++++++++++++++------------------------ client/package.json | 28 +- 2 files changed, 466 insertions(+), 841 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index cb08067..aa52dde 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -6,17 +6,17 @@ "": { "name": "stock.charts", "dependencies": { - "@angular/animations": "19.0.5", - "@angular/cdk": "19.0.4", - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/forms": "19.0.5", - "@angular/material": "19.0.4", - "@angular/platform-browser": "19.0.5", - "@angular/platform-browser-dynamic": "19.0.5", - "@angular/router": "19.0.5", - "@angular/service-worker": "19.0.5", + "@angular/animations": "19.1.3", + "@angular/cdk": "19.1.1", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/material": "19.1.1", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "18.3.3", "chart.js": "4.4.6", @@ -30,9 +30,9 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "^19.0.6", - "@angular/cli": "19.0.6", - "@angular/compiler-cli": "19.0.5", + "@angular/build": "^19.1.4", + "@angular/cli": "19.1.4", + "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" } }, @@ -51,13 +51,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -67,9 +67,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -95,15 +95,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -114,9 +114,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", + "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -125,40 +125,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.3" } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -167,7 +167,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -175,11 +175,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -197,6 +198,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -206,9 +210,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz", - "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz", + "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -223,26 +227,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -257,9 +261,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -268,14 +272,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -284,7 +288,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -293,9 +297,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -317,14 +321,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.3", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -338,9 +342,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -349,23 +353,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz", - "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz", + "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.0.4", + "@angular/cdk": "19.1.1", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -374,9 +378,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -385,9 +389,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -396,9 +400,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz", - "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.3.tgz", + "integrity": "sha512-rfsHu/+wB8YLPjsHKd/Go0SI8zP2gjMkebUHM9SbvVLXEAkxFubcF2htVKbKu8eTncfEJEXD6+3gRAjh5SLrKw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -407,16 +411,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5" + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3" } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -425,16 +429,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.0.5.tgz", - "integrity": "sha512-qU5lgx1WJ+feCOV/EhkN9m20xFdIslpEQcSZZC+VJnEwcG6VTbofg1dRaHWZ9HAjS1uP7bFoK0HUYu4el0bHGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.1.3.tgz", + "integrity": "sha512-87XPbzqy9sGYkN21y4vqJBT6lMuuQJrkx5ID1pXdDGxUXlfiGprshtbLPNCUcxHXOnLOdnAI2WZ5DDjl4NMNpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -446,8 +450,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" } }, "node_modules/@babel/code-frame": { @@ -769,9 +773,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -786,9 +790,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -803,9 +807,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -820,9 +824,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -837,9 +841,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -854,9 +858,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -871,9 +875,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -888,9 +892,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -905,9 +909,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -922,9 +926,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -939,9 +943,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -956,9 +960,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -973,9 +977,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -990,9 +994,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -1007,9 +1011,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -1024,9 +1028,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -1041,9 +1045,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -1057,10 +1061,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -1075,9 +1096,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -1092,9 +1113,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1109,9 +1130,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1126,9 +1147,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1143,9 +1164,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1160,9 +1181,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1197,14 +1218,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1333,22 +1354,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1652,9 +1673,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1666,9 +1687,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1680,9 +1701,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1694,9 +1715,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1708,9 +1729,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1722,9 +1743,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2737,9 +2758,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2751,9 +2772,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2765,9 +2786,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2779,9 +2800,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2793,9 +2814,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2807,9 +2828,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2821,9 +2842,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2835,9 +2856,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2849,9 +2870,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2863,9 +2884,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2876,10 +2897,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2891,9 +2926,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2905,9 +2940,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2919,9 +2954,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2933,9 +2968,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2947,9 +2982,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2961,9 +2996,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2975,9 +3010,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2989,14 +3024,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -3128,16 +3163,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3273,9 +3308,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3283,10 +3318,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3912,9 +3950,9 @@ "license": "MIT" }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4016,9 +4054,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4029,30 +4067,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -4102,9 +4141,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -4112,16 +4151,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.4.tgz", - "integrity": "sha512-G3iTQw1DizJQ5eEqj1CbFCWhq+pzum7qepkxU7rS1FGZDqjYKcrguo9XDRbV7EgPnn8CgaPigTq+NEjyioeYZQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4136,9 +4175,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, "license": "ISC", "dependencies": { @@ -4389,13 +4428,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4498,9 +4537,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -4788,9 +4827,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4806,12 +4845,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4971,9 +5010,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5314,9 +5353,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -5544,9 +5583,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5893,9 +5932,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5903,9 +5942,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5923,7 +5962,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6047,19 +6086,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6126,9 +6168,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -6142,24 +6184,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -6225,9 +6268,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6881,21 +6924,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6904,19 +6947,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6937,439 +6986,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", diff --git a/client/package.json b/client/package.json index 0f76dce..39bad90 100644 --- a/client/package.json +++ b/client/package.json @@ -13,17 +13,17 @@ }, "private": false, "dependencies": { - "@angular/animations": "19.0.5", - "@angular/cdk": "19.0.4", - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/forms": "19.0.5", - "@angular/material": "19.0.4", - "@angular/platform-browser": "19.0.5", - "@angular/platform-browser-dynamic": "19.0.5", - "@angular/router": "19.0.5", - "@angular/service-worker": "19.0.5", + "@angular/animations": "19.1.3", + "@angular/cdk": "19.1.1", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/material": "19.1.1", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "18.3.3", "chart.js": "4.4.6", @@ -37,9 +37,9 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "^19.0.6", - "@angular/cli": "19.0.6", - "@angular/compiler-cli": "19.0.5", + "@angular/build": "^19.1.4", + "@angular/cli": "19.1.4", + "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" } } \ No newline at end of file From 3ec55cf9f1891da6e149ba2510411c80577bcb56 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:35:30 -0500 Subject: [PATCH 03/13] update ng packages --- client/package-lock.json | 102 ++++++++++++--------------------------- client/package.json | 12 ++--- 2 files changed, 36 insertions(+), 78 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index aa52dde..e1eb07f 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -18,19 +18,19 @@ "@angular/router": "19.1.3", "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", - "@ng-matero/extensions": "18.3.3", - "chart.js": "4.4.6", + "@ng-matero/extensions": "19.1.0", + "chart.js": "4.4.7", "chartjs-adapter-date-fns": "3.0.0", "chartjs-plugin-annotation": "3.1.0", "date-fns": "4.1.0", "ngx-color": "9.0.0", "rxjs": "7.8.1", - "tslib": "2.7.0", - "uuid": "11.0.3", + "tslib": "2.8.1", + "uuid": "11.0.5", "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "^19.1.4", + "@angular/build": "19.1.4", "@angular/cli": "19.1.4", "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" @@ -2146,70 +2146,28 @@ } }, "node_modules/@ng-matero/extensions": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-18.3.3.tgz", - "integrity": "sha512-EBPSqdqCOwQiwZjOuUqlcaWIlQF6oHt93dS9Qci35WjnHiHCxq8M5IMglMTTqXksDqX7UfIhx9kBvhdixVhuKQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-19.1.0.tgz", + "integrity": "sha512-JhaW96XxTSRSs5ROrFqXaDFnjGXopYSEaRs/wth5C5E5N+ICc23XtKWrJeEi9h5SWQIIIfyV0puGjKMETF06nA==", "license": "MIT", "dependencies": { - "@ng-select/ng-select": "^13.7.0", + "@ng-select/ng-select": "^14.1.0", "ngx-color": "^9.0.0", "photoviewer": "^3.10.0", "tslib": "^2.4.0" }, "peerDependencies": { - "@angular/animations": ">=18.2.0", - "@angular/cdk": ">=18.2.0", - "@angular/common": ">=18.2.0", - "@angular/core": ">=18.2.0", - "@angular/material": ">=18.2.0" + "@angular/animations": ">=19.0.0", + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/material": ">=19.0.0" } }, - "node_modules/@ng-matero/extensions/node_modules/@angular/forms": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.13.tgz", - "integrity": "sha512-A67D867fu3DSBhdLWWZl/F5pr7v2+dRM2u3U7ZJ0ewh4a+sv+0yqWdJW+a8xIoiHxS+btGEJL2qAKJiH+MCFfg==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.2.13", - "@angular/core": "18.2.13", - "@angular/platform-browser": "18.2.13", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@ng-matero/extensions/node_modules/@angular/platform-browser": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.13.tgz", - "integrity": "sha512-tu7ZzY6qD3ATdWFzcTcsAKe7M6cJeWbT/4/bF9unyGO3XBPcNYDKoiz10+7ap2PUd0fmPwvuvTvSNJiFEBnB8Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "18.2.13", - "@angular/common": "18.2.13", - "@angular/core": "18.2.13" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@ng-matero/extensions/node_modules/@ng-select/ng-select": { - "version": "13.9.1", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.9.1.tgz", - "integrity": "sha512-+DzQkQp8coGWZREflJM/qx7BXipV6HEVpZCXoa6fJJRHJfmUMsxa5uV6kUVmClUE98Rkffk9CPHt6kZcj8PuqQ==", + "node_modules/@ng-select/ng-select": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.2.0.tgz", + "integrity": "sha512-Dq3PgOb0EBL31TV1Byr6RnQW/Vd5cdaaCEFbII2tIwiIT1r15oMdeSEZqzutuslBqgyggnponYAaBEgQBVorAg==", "license": "MIT", "dependencies": { "tslib": "^2.3.1" @@ -2219,9 +2177,9 @@ "npm": ">= 8" }, "peerDependencies": { - "@angular/common": "^18.0.0", - "@angular/core": "^18.0.0", - "@angular/forms": "^18.0.0" + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -3558,9 +3516,9 @@ "license": "MIT" }, "node_modules/chart.js": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", - "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", + "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -6770,9 +6728,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tuf-js": { @@ -6890,9 +6848,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/client/package.json b/client/package.json index 39bad90..59e914d 100644 --- a/client/package.json +++ b/client/package.json @@ -25,21 +25,21 @@ "@angular/router": "19.1.3", "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", - "@ng-matero/extensions": "18.3.3", - "chart.js": "4.4.6", + "@ng-matero/extensions": "19.1.0", + "chart.js": "4.4.7", "chartjs-adapter-date-fns": "3.0.0", "chartjs-plugin-annotation": "3.1.0", "date-fns": "4.1.0", "ngx-color": "9.0.0", "rxjs": "7.8.1", - "tslib": "2.7.0", - "uuid": "11.0.3", + "tslib": "2.8.1", + "uuid": "11.0.5", "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "^19.1.4", + "@angular/build": "19.1.4", "@angular/cli": "19.1.4", "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" } -} \ No newline at end of file +} From 756b84a63e7307f6a7854c2de1d4ea11565aa79d Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:02:34 -0500 Subject: [PATCH 04/13] update packages --- client/angular.json | 61 +++++++++++++++++---------------- client/package-lock.json | 19 +++++----- client/package.json | 1 + client/src/polyfills.ts | 53 ++-------------------------- server/Directory.Packages.props | 6 ++-- 5 files changed, 48 insertions(+), 92 deletions(-) diff --git a/client/angular.json b/client/angular.json index 1627c7b..87fa47e 100644 --- a/client/angular.json +++ b/client/angular.json @@ -5,59 +5,57 @@ "projects": { "app": { "projectType": "application", + "root": "", + "sourceRoot": "src", + "prefix": "app", "schematics": { "@schematics/angular:component": { - "style": "scss" + "style": "scss", + "skipTests": true, + "standalone": true + }, + "@schematics/angular:directive": { + "skipTests": true, + "standalone": true + }, + "@schematics/angular:pipe": { + "skipTests": true, + "standalone": true + }, + "@schematics/angular:service": { + "skipTests": true } }, - "root": "", - "sourceRoot": "src", - "prefix": "app", "architect": { "build": { "builder": "@angular/build:application", + "defaultConfiguration": "production", "options": { - "aot": true, - "outputPath": { - "base": "dist/app" - }, "browser": "src/main.ts", "index": "src/index.html", - "polyfills": [ - "src/polyfills.ts" - ], + "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", + "outputPath": { + "base": "dist/app" + }, "assets": [ "src/assets", "src/_headers", "src/robots.txt", "src/sitemap.xml" ], - "styles": [ - "src/styles.scss" - ], + "styles": ["src/styles.scss"], "stylePreprocessorOptions": { - "includePaths": [ - "node_modules", - "src", - "src/styles"] + "includePaths": ["node_modules", "src", "src/styles"] }, "outputHashing": "all" }, - "defaultConfiguration": "production", "configurations": { - "development": { - "optimization": false, - "namedChunks": true, - "sourceMap": true - }, "production": { "optimization": true, - "namedChunks": false, "sourceMap": { "scripts": true, "styles": true, - "hidden": false, "vendor": false }, "fileReplacements": [ @@ -66,6 +64,11 @@ "with": "src/environments/environment.prod.ts" } ] + }, + "development": { + "optimization": false, + "sourceMap": true, + "namedChunks": true } } }, @@ -73,11 +76,11 @@ "builder": "@angular/build:dev-server", "defaultConfiguration": "development", "configurations": { - "development": { - "buildTarget": "app:build:development" - }, "production": { "buildTarget": "app:build:production" + }, + "development": { + "buildTarget": "app:build:development" } } }, diff --git a/client/package-lock.json b/client/package-lock.json index e1eb07f..4770235 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -33,6 +33,7 @@ "@angular/build": "19.1.4", "@angular/cli": "19.1.4", "@angular/compiler-cli": "19.1.3", + "@types/node": "20.11.0", "typescript": "5.5.4" } }, @@ -3110,14 +3111,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.4.tgz", - "integrity": "sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==", + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~5.26.4" } }, "node_modules/@vitejs/plugin-basic-ssl": { @@ -6776,12 +6776,11 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/unique-filename": { "version": "4.0.0", diff --git a/client/package.json b/client/package.json index 59e914d..5d714d3 100644 --- a/client/package.json +++ b/client/package.json @@ -40,6 +40,7 @@ "@angular/build": "19.1.4", "@angular/cli": "19.1.4", "@angular/compiler-cli": "19.1.3", + "@types/node": "20.11.0", "typescript": "5.5.4" } } diff --git a/client/src/polyfills.ts b/client/src/polyfills.ts index 813c824..d89e090 100644 --- a/client/src/polyfills.ts +++ b/client/src/polyfills.ts @@ -1,53 +1,6 @@ /** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support + * Angular requires zone.js for its change detection. + * No other polyfills are needed for modern browsers. */ -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ +import 'zone.js'; diff --git a/server/Directory.Packages.props b/server/Directory.Packages.props index 2a276af..4a647aa 100644 --- a/server/Directory.Packages.props +++ b/server/Directory.Packages.props @@ -5,8 +5,8 @@ $(NoWarn);NU1507 - - + + @@ -15,4 +15,4 @@ - + \ No newline at end of file From 4cacdf60ea748d1082842bf30e4a8a3b0d5b5a08 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:13:41 -0500 Subject: [PATCH 05/13] cleanup backend, dx --- .devcontainer/devcontainer.json | 8 ++++---- .../{Controllers/MainController.cs => Endpoints.cs} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename server/WebApi/{Controllers/MainController.cs => Endpoints.cs} (100%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 89c479f..44372e9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,12 +16,12 @@ "ms-azuretools.vscode-azurefunctions", "ms-dotnettools.csharp", "angular.ng-template" - ] + ], + "settings": { + "terminal.integrated.shell.linux": "/usr/bin/bash" + } } }, - "settings": { - "terminal.integrated.shell.linux": "/usr/bin/bash" - }, "postCreateCommand": "cd client && npm install", "remoteEnv": { "ALPACA_KEY": "${localEnv:ALPACA_KEY}", diff --git a/server/WebApi/Controllers/MainController.cs b/server/WebApi/Endpoints.cs similarity index 100% rename from server/WebApi/Controllers/MainController.cs rename to server/WebApi/Endpoints.cs From c306f8bca9b52c3f21ab3073b2d7a2d0bbaeae75 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:35:33 -0500 Subject: [PATCH 06/13] refactor: simplify folders --- server/Directory.Packages.props | 2 +- server/WebApi/{Services => }/Models.cs | 0 server/WebApi/{Services => }/Service.Metadata.cs | 0 server/WebApi/{Services => }/Service.Quotes.cs | 0 server/WebApi/{Services => }/Service.Storage.cs | 0 5 files changed, 1 insertion(+), 1 deletion(-) rename server/WebApi/{Services => }/Models.cs (100%) rename server/WebApi/{Services => }/Service.Metadata.cs (100%) rename server/WebApi/{Services => }/Service.Quotes.cs (100%) rename server/WebApi/{Services => }/Service.Storage.cs (100%) diff --git a/server/Directory.Packages.props b/server/Directory.Packages.props index 4a647aa..5095059 100644 --- a/server/Directory.Packages.props +++ b/server/Directory.Packages.props @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/server/WebApi/Services/Models.cs b/server/WebApi/Models.cs similarity index 100% rename from server/WebApi/Services/Models.cs rename to server/WebApi/Models.cs diff --git a/server/WebApi/Services/Service.Metadata.cs b/server/WebApi/Service.Metadata.cs similarity index 100% rename from server/WebApi/Services/Service.Metadata.cs rename to server/WebApi/Service.Metadata.cs diff --git a/server/WebApi/Services/Service.Quotes.cs b/server/WebApi/Service.Quotes.cs similarity index 100% rename from server/WebApi/Services/Service.Quotes.cs rename to server/WebApi/Service.Quotes.cs diff --git a/server/WebApi/Services/Service.Storage.cs b/server/WebApi/Service.Storage.cs similarity index 100% rename from server/WebApi/Services/Service.Storage.cs rename to server/WebApi/Service.Storage.cs From f383e2f65d98d3f0864620f5223103c7cbd19efb Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:04:51 -0500 Subject: [PATCH 07/13] chore: config and IDE updates --- .devcontainer/devcontainer.json | 7 +- .editorconfig | 50 +- .vscode/extensions.json | 8 +- .vscode/settings.json | 2 +- .vscode/tasks.json | 2 +- server/Functions/Program.cs | 6 + server/Functions/UpdateQuotes.cs | 142 ++- server/WebApi/Endpoints.cs | 1050 +++------------- server/WebApi/Models.cs | 81 -- server/WebApi/Models/ChartColors.cs | 20 + server/WebApi/Models/ChartConfig.cs | 10 + server/WebApi/Models/ChartFill.cs | 9 + server/WebApi/Models/ChartThreshold.cs | 10 + server/WebApi/Models/Emum.cs | 12 + server/WebApi/Models/IndicatorListing.cs | 18 + server/WebApi/Models/IndicatorParamConfig.cs | 12 + server/WebApi/Models/IndicatorResultConfig.cs | 15 + server/WebApi/Program.cs | 46 +- server/WebApi/Service.Metadata.cs | 484 ++++---- server/WebApi/Service.Quotes.cs | 1067 +++++++++-------- server/WebApi/Service.Storage.cs | 115 +- server/WebApi/StartupServices.cs | 12 +- 22 files changed, 1249 insertions(+), 1929 deletions(-) delete mode 100644 server/WebApi/Models.cs create mode 100644 server/WebApi/Models/ChartColors.cs create mode 100644 server/WebApi/Models/ChartConfig.cs create mode 100644 server/WebApi/Models/ChartFill.cs create mode 100644 server/WebApi/Models/ChartThreshold.cs create mode 100644 server/WebApi/Models/Emum.cs create mode 100644 server/WebApi/Models/IndicatorListing.cs create mode 100644 server/WebApi/Models/IndicatorParamConfig.cs create mode 100644 server/WebApi/Models/IndicatorResultConfig.cs diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 44372e9..8279c7d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -13,9 +13,12 @@ "customizations": { "vscode": { "extensions": [ + "angular.ng-template", + "azurite.azurite", "ms-azuretools.vscode-azurefunctions", - "ms-dotnettools.csharp", - "angular.ng-template" + "ms-azuretools.vscode-azurestorage", + "ms-dotnettools.csdevkit", + "ms-vscode-remote.remote-containers" ], "settings": { "terminal.integrated.shell.linux": "/usr/bin/bash" diff --git a/.editorconfig b/.editorconfig index 388b5d3..501f0db 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,23 +1,39 @@ -# top-most EditorConfig file +# EditorConfig: https://EditorConfig.org root = true -# see Client and Server folders for -# language unique editor configurations - -# global baselines +#### Core EditorConfig Options #### [*] -charset = utf-8 -end_of_line = lf +charset = utf-8 # Use UTF-8 character encoding +end_of_line = lf # Use LF line endings (Unix-style) +insert_final_newline = true # Add empty line at end of files +trim_trailing_whitespace = true # Remove whitespace at end of lines +indent_style = space # Use spaces for indentation +indent_size = 2 # Use 2 spaces per indentation level +tab_width = 2 # Set tab width to 2 spaces + +# Markdown files +[*.md] +trim_trailing_whitespace = false # Allow trailing whitespace for line breaks + +# Batch and command files +[*.{cmd,bat}] +end_of_line = crlf # Use CRLF for Windows specific files + +# .NET source files +[*.{cs,vb}] +indent_size = 4 # Use 4 spaces for .NET files +tab_width = 4 # Set tab width to 4 spaces + +dotnet_sort_system_directives_first = true # Place System.* usings before others +dotnet_separate_import_directive_groups = false # Don't add blank lines between using directives -indent_style = space -indent_size = 2 -tab_width = 2 +csharp_style_var_elsewhere = false # Use explicit types when type isn't obvious +csharp_style_var_for_built_in_types = false # Use explicit types for built-in types +csharp_style_var_when_type_is_apparent = false # Use explicit types even when obvious -line_length = 150 -max_line_length = 150 -trim_trailing_whitespace = true -insert_final_newline = true +# Expression-level preferences that differ from defaults +csharp_style_expression_bodied_methods = true:silent # Allow expression-bodied methods +csharp_style_expression_bodied_properties = true:silent # Allow expression-bodied properties -[*.{xml,yml}] -indent_style = space -indent_size = 2 +# Diagnostic overrides +dotnet_diagnostic.IDE0058.severity = none # Disable "use '_' discard" value warnings diff --git a/.vscode/extensions.json b/.vscode/extensions.json index bb76300..d340b7d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,10 @@ { "recommendations": [ + "angular.ng-template", + "azurite.azurite", "ms-azuretools.vscode-azurefunctions", - "ms-dotnettools.csharp" + "ms-azuretools.vscode-azurestorage", + "ms-dotnettools.csdevkit", + "ms-vscode-remote.remote-containers" ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 940c4a5..a6c0ff1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "azureFunctions.projectSubpath": "server\\Functions", - "azureFunctions.deploySubpath": "server\\Functions/bin/Release/net8.0/publish", + "azureFunctions.deploySubpath": "server\\Functions/bin/Release/net9.0/publish", "azureFunctions.projectLanguage": "C#", "azureFunctions.projectRuntime": "~4", "debug.internalConsoleOptions": "neverOpen", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b32202e..f58d5ee 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -71,7 +71,7 @@ "type": "func", "dependsOn": "build (functions)", "options": { - "cwd": "${workspaceFolder}/server\\Functions/bin/Debug/net8.0" + "cwd": "${workspaceFolder}/server\\Functions/bin/Debug/net9.0" }, "command": "host start", "isBackground": true, diff --git a/server/Functions/Program.cs b/server/Functions/Program.cs index a7fda5c..1bd0ff2 100644 --- a/server/Functions/Program.cs +++ b/server/Functions/Program.cs @@ -1,7 +1,13 @@ +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using WebApi.Services; IHost host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() + .ConfigureServices(services => { + services.AddSingleton(); + services.AddHostedService(); + }) .Build(); host.Run(); diff --git a/server/Functions/UpdateQuotes.cs b/server/Functions/UpdateQuotes.cs index 11965a0..929e128 100644 --- a/server/Functions/UpdateQuotes.cs +++ b/server/Functions/UpdateQuotes.cs @@ -10,10 +10,28 @@ namespace Functions; -public class Jobs(ILoggerFactory loggerFactory, IConfiguration configuration) +public class Jobs { - private readonly ILogger _logger = loggerFactory.CreateLogger(); - private readonly IConfiguration _configuration = configuration; + private readonly ILogger _logger; + private readonly IConfiguration _configuration; + private readonly IStorage _storage; + private readonly string? _keyVaultUrl; + private readonly string? _alpacaKey; + private readonly string? _alpacaSecret; + + public Jobs( + ILoggerFactory loggerFactory, + IConfiguration configuration, + IStorage storage) + { + _logger = loggerFactory.CreateLogger(); + _configuration = configuration; + _storage = storage; + + // Load configuration on startup + (_alpacaKey, _alpacaSecret) = GetAlpacaCredentials(); + _keyVaultUrl = _configuration["KEY_VAULT_URL"]; + } /// /// Schedule to get and cache quotes from source feed. @@ -25,72 +43,92 @@ public async Task Run([TimerTrigger("0 */1 08-18 * * 1-5")] TimerInfo myTimer) { // ~ extended market hours, every minute "0 */1 08-18 * * 1-5" // for dev: minutely "0 */1 * * * *" - await StoreQuoteDaily("SPY"); - await StoreQuoteDaily("QQQ"); + List tasks = new() { + StoreQuoteDaily("SPY"), + StoreQuoteDaily("QQQ") + }; + await Task.WhenAll(tasks); _logger.LogInformation( "Quotes updated on {date and time} for {schedule status}.", DateTime.Now, myTimer.ScheduleStatus); } - /// - /// STORE QUOTES: get and store historical quotes to blob storage provider. - /// - /// Security symbol - /// - /// When credentials are missing - /// - private async Task StoreQuoteDaily(string symbol) + private (string? key, string? secret) GetAlpacaCredentials() { - // get and validate keys, see README.md - string? alpacaKey = _configuration["ALPACA_KEY"]; - string? alpacaSecret = _configuration["ALPACA_SECRET"]; + string? key = _configuration["ALPACA_KEY"] + ?? _configuration["UserSecrets:ALPACA_KEY"]; + + string? secret = _configuration["ALPACA_SECRET"] + ?? _configuration["UserSecrets:ALPACA_SECRET"]; + + return (key, secret); + } - if (string.IsNullOrEmpty(alpacaKey) || string.IsNullOrEmpty(alpacaSecret)) + private async Task<(string key, string secret)> GetAlpacaCredentialsFromKeyVault() + { + if (string.IsNullOrEmpty(_keyVaultUrl)) { - // Try to get from User Secrets - alpacaKey = _configuration["UserSecrets:ALPACA_KEY"]; - alpacaSecret = _configuration["UserSecrets:ALPACA_SECRET"]; + throw new InvalidOperationException("Key Vault URL is not configured"); } - if (string.IsNullOrEmpty(alpacaKey) || string.IsNullOrEmpty(alpacaSecret)) + try { - // Try to get from Azure Key Vault - string? keyVaultUrl = _configuration["KEY_VAULT_URL"]; - - if (string.IsNullOrEmpty(keyVaultUrl)) - { - throw new ArgumentNullException( - keyVaultUrl, - $"Key Vault URL missing, use `setx KEY_VAULT_URL \"MY-KEY-VAULT-URL\"` to set."); - } - - SecretClient secretClient = new(new Uri(keyVaultUrl), new DefaultAzureCredential()); - - KeyVaultSecret alpacaKeySecret = await secretClient.GetSecretAsync("ALPACA_KEY"); - KeyVaultSecret alpacaSecretSecret = await secretClient.GetSecretAsync("ALPACA_SECRET"); - - alpacaKey = alpacaKeySecret.Value; - alpacaSecret = alpacaSecretSecret.Value; + SecretClient secretClient = new( + new Uri(_keyVaultUrl), + new DefaultAzureCredential() + ); + + // Get both secrets in parallel + Azure.Response[] tasks = await Task.WhenAll( + secretClient.GetSecretAsync("ALPACA_KEY"), + secretClient.GetSecretAsync("ALPACA_SECRET") + ); + + return (tasks[0].Value.Value, tasks[1].Value.Value); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to retrieve credentials from Key Vault"); + throw new InvalidOperationException("Failed to retrieve credentials from Key Vault", ex); } + } - if (string.IsNullOrEmpty(alpacaKey)) + private async Task<(string key, string secret)> GetValidAlpacaCredentials() + { + // Try environment/configuration first + if (!string.IsNullOrEmpty(_alpacaKey) && !string.IsNullOrEmpty(_alpacaSecret)) { - throw new ArgumentNullException( - alpacaKey, - $"API KEY missing, use `setx ALPACA_KEY \"MY-ALPACA-KEY\"` to set."); + return (_alpacaKey, _alpacaSecret); } - if (string.IsNullOrEmpty(alpacaSecret)) + // Fall back to key vault + try { - throw new ArgumentNullException( - alpacaSecret, - $"API SECRET missing, use `setx ALPACA_SECRET \"MY-ALPACA-SECRET\"` to set."); + return await GetAlpacaCredentialsFromKeyVault(); } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to get valid Alpaca credentials"); + throw new InvalidOperationException( + "Unable to retrieve Alpaca credentials from any source", ex); + } + } + + /// + /// STORE QUOTES: get and store historical quotes to blob storage provider. + /// + /// Security symbol + /// + /// When credentials are missing + /// + private async Task StoreQuoteDaily(string symbol) + { + (string key, string secret) = await GetValidAlpacaCredentials(); // fetch from Alpaca paper trading API IAlpacaDataClient alpacaDataClient = Environments.Paper - .GetAlpacaDataClient(new SecretKey(alpacaKey, alpacaSecret)); + .GetAlpacaDataClient(new SecretKey(key, secret)); DateTime into = DateTime.Now.Subtract(TimeSpan.FromMinutes(16)); DateTime from = into.Subtract(TimeSpan.FromDays(800)); @@ -103,22 +141,22 @@ private async Task StoreQuoteDaily(string symbol) // compose foreach (IBar bar in barSet.Items) { - Quote q = new() { + quotes.Add(new Quote { Date = bar.TimeUtc, Open = bar.Open, High = bar.High, Low = bar.Low, Close = bar.Close, Volume = bar.Volume - }; - quotes.Add(q); + }); } - string json = JsonSerializer.Serialize(quotes.OrderBy(x => x.Date)); + string json = JsonSerializer + .Serialize(quotes.OrderBy(x => x.Date)); // store in Azure Blob Storage string blobName = $"{symbol}-DAILY.json"; - await Storage.PutBlob(blobName, json); + await _storage.PutBlobAsync(blobName, json); _logger.LogInformation("Updated {blobName name}.", blobName); } diff --git a/server/WebApi/Endpoints.cs b/server/WebApi/Endpoints.cs index e2dba5b..dca1e38 100644 --- a/server/WebApi/Endpoints.cs +++ b/server/WebApi/Endpoints.cs @@ -1,19 +1,21 @@ using Microsoft.AspNetCore.Mvc; using WebApi.Services; +using WebApi.Models; namespace WebApi.Controllers; [ApiController] [Route("")] -public class MainController(QuoteService quoteService) : ControllerBase +public class Main(QuoteService quoteService) : ControllerBase { private readonly QuoteService quoteFeed = quoteService; // GLOBALS - internal static readonly int limitLast = 120; + private static readonly int limitLast = 120; [HttpGet] - public string Get() => "API is functioning nominally."; + public string Get() + => "API is functioning nominally."; [HttpGet("quotes")] public async Task GetQuotes() @@ -32,22 +34,12 @@ public IActionResult GetIndicatorCatalog() return Ok(Metadata.IndicatorListing($"{Request.Scheme}://{Request.Host}")); } - - ////////////////////////////////////////// - // INDICATORS (sorted alphabetically) - - [HttpGet("ADL")] - public async Task GetAdl( - int smaPeriods) + private async Task Get(Func, IEnumerable> indicatorFunc) { try { IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAdl(smaPeriods) - .TakeLast(limitLast); - + IEnumerable results = indicatorFunc(quotes).TakeLast(limitLast); return Ok(results); } catch (ArgumentOutOfRangeException rex) @@ -56,190 +48,53 @@ public async Task GetAdl( } } - [HttpGet("ADX")] - public async Task GetAdx( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + ////////////////////////////////////////// + // INDICATORS (sorted alphabetically) - IEnumerable results = - quotes.GetAdx(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("ADL")] + public Task GetAdl(int smaPeriods) + => Get(quotes => quotes.GetAdl(smaPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("ADX")] + public Task GetAdx(int lookbackPeriods) + => Get(quotes => quotes.GetAdx(lookbackPeriods)); [HttpGet("ALMA")] - public async Task GetAlma( - int lookbackPeriods, - double offset, - double sigma) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAlma(lookbackPeriods, offset, sigma) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAlma(int lookbackPeriods, double offset, double sigma) + => Get(quotes => quotes.GetAlma(lookbackPeriods, offset, sigma)); [HttpGet("ALLIGATOR")] - public async Task GetAlligator( - int jawPeriods, - int jawOffset, - int teethPeriods, - int teethOffset, - int lipsPeriods, - int lipsOffset) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAlligator(jawPeriods, jawOffset, teethPeriods, teethOffset, lipsPeriods, lipsOffset) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAlligator(int jawPeriods, int jawOffset, int teethPeriods, int teethOffset, int lipsPeriods, int lipsOffset) + => Get(quotes => quotes.GetAlligator(jawPeriods, jawOffset, teethPeriods, teethOffset, lipsPeriods, lipsOffset)); [HttpGet("AROON")] - public async Task GetAroon( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAroon(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAroon(int lookbackPeriods) + => Get(quotes => quotes.GetAroon(lookbackPeriods)); [HttpGet("ATR")] - public async Task GetAtr( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAtr(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAtr(int lookbackPeriods) + => Get(quotes => quotes.GetAtr(lookbackPeriods)); [HttpGet("ATR-STOP-CLOSE")] - public async Task GetAtrStopClose( - int lookbackPeriods, - double multiplier) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.Close) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAtrStopClose(int lookbackPeriods, double multiplier) + => Get(quotes => quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.Close)); [HttpGet("ATR-STOP-HL")] - public async Task GetAtrStopHL( - int lookbackPeriods, - double multiplier) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.HighLow) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetAtrStopHL(int lookbackPeriods, double multiplier) + => Get(quotes => quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.HighLow)); [HttpGet("BB")] - public async Task GetBollingerBands( - int lookbackPeriods, - double standardDeviations) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetBollingerBands(lookbackPeriods, standardDeviations) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetBollingerBands(int lookbackPeriods, double standardDeviations) + => Get(quotes => quotes.GetBollingerBands(lookbackPeriods, standardDeviations)); [HttpGet("BETA")] - public async Task GetBeta( - int lookbackPeriods, - BetaType type) + public async Task GetBeta(int lookbackPeriods, BetaType type) { try { IEnumerable quotes = await quoteFeed.Get(); IEnumerable market = await quoteFeed.Get("SPY"); - - IEnumerable results = - quotes.GetBeta(market, lookbackPeriods, type) - .TakeLast(limitLast); - + IEnumerable results = quotes.GetBeta(market, lookbackPeriods, type).TakeLast(limitLast); return Ok(results); } catch (ArgumentOutOfRangeException rex) @@ -249,789 +104,154 @@ public async Task GetBeta( } [HttpGet("CHEXIT-LONG")] - public async Task GetChandelierLong( - int lookbackPeriods, - double multiplier) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + public Task GetChandelierLong(int lookbackPeriods, double multiplier) + => Get(quotes => quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Long)); - IEnumerable results = - quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Long) - .TakeLast(limitLast); + [HttpGet("CHEXIT-SHORT")] + public Task GetChandelierShort(int lookbackPeriods, double multiplier) + => Get(quotes => quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Short)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("CHOP")] + public Task GetChop(int lookbackPeriods) + => Get(quotes => quotes.GetChop(lookbackPeriods)); - [HttpGet("CHEXIT-SHORT")] - public async Task GetChandelierShort( - int lookbackPeriods, - double multiplier) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("CMF")] + public Task GetCmf(int lookbackPeriods) + => Get(quotes => quotes.GetCmf(lookbackPeriods)); - IEnumerable results = - quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Short) - .TakeLast(limitLast); + [HttpGet("CMO")] + public Task GetCmo(int lookbackPeriods) + => Get(quotes => quotes.GetCmo(lookbackPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("CRSI")] + public Task GetConnorsRsi(int rsiPeriods, int streakPeriods, int rankPeriods) + => Get(quotes => quotes.GetConnorsRsi(rsiPeriods, streakPeriods, rankPeriods)); - [HttpGet("CHOP")] - public async Task GetChop( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("DOJI")] + public Task GetDoji(double maxPriceChangePercent) + => Get(quotes => quotes.GetDoji(maxPriceChangePercent)); - IEnumerable results = - quotes.GetChop(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("DONCHIAN")] + public Task GetDonchian(int lookbackPeriods) + => Get(quotes => quotes.GetDonchian(lookbackPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("DYN")] + public Task GetDynamic(int lookbackPeriods) + => Get(quotes => quotes.GetDynamic(lookbackPeriods)); - [HttpGet("CMF")] - public async Task GetCmf( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("ELDER-RAY")] + public Task GetElderRay(int lookbackPeriods) + => Get(quotes => quotes.GetElderRay(lookbackPeriods)); - IEnumerable results = - quotes.GetCmf(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("EPMA")] + public Task GetEpma(int lookbackPeriods) + => Get(quotes => quotes.GetEpma(lookbackPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("EMA")] + public Task GetEma(int lookbackPeriods) + => Get(quotes => quotes.GetEma(lookbackPeriods)); - [HttpGet("CMO")] - public async Task GetCmo( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("FCB")] + public Task GetFcb(int windowSpan) + => Get(quotes => quotes.GetFcb(windowSpan)); - IEnumerable results = - quotes.GetCmo(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("FISHER")] + public Task GetFisher(int lookbackPeriods) + => Get(quotes => quotes.GetFisherTransform(lookbackPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("FRACTAL")] + public Task GetFractal(int windowSpan) + => Get(quotes => quotes.GetFractal(windowSpan)); - [HttpGet("CRSI")] - public async Task GetConnorsRsi( - int rsiPeriods, - int streakPeriods, - int rankPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("GATOR")] + public Task GetGator() + => Get(quotes => quotes.GetGator()); - IEnumerable results = - quotes.GetConnorsRsi(rsiPeriods, streakPeriods, rankPeriods) - .TakeLast(limitLast); + [HttpGet("HTL")] + public Task GetHTL() + => Get(quotes => quotes.GetHtTrendline()); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("ICHIMOKU")] + public Task GetIchimoku(int tenkanPeriods, int kijunPeriods, int senkouBPeriods) + => Get(quotes => quotes.GetIchimoku(tenkanPeriods, kijunPeriods, senkouBPeriods)); - [HttpGet("DOJI")] - public async Task GetDoji( - double maxPriceChangePercent) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("KELTNER")] + public Task GetKeltner(int emaPeriods, double multiplier, int atrPeriods) + => Get(quotes => quotes.GetKeltner(emaPeriods, multiplier, atrPeriods)); - IEnumerable results = - quotes.GetDoji(maxPriceChangePercent) - .TakeLast(limitLast); + [HttpGet("MACD")] + public Task GetMacd(int fastPeriods, int slowPeriods, int signalPeriods) + => Get(quotes => quotes.GetMacd(fastPeriods, slowPeriods, signalPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("MARUBOZU")] + public Task GetMarubozu(double minBodyPercent) + => Get(quotes => quotes.GetMarubozu(minBodyPercent)); - [HttpGet("DONCHIAN")] - public async Task GetDonchian( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("MFI")] + public Task GetMfi(int lookbackPeriods) + => Get(quotes => quotes.GetMfi(lookbackPeriods)); - IEnumerable results = - quotes.GetDonchian(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("PSAR")] + public Task GetParabolicSar(double accelerationStep, double maxAccelerationFactor) + => Get(quotes => quotes.GetParabolicSar(accelerationStep, maxAccelerationFactor)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("ROC")] + public Task GetRoc(int lookbackPeriods, int smaPeriods) + => Get(quotes => quotes.GetRoc(lookbackPeriods, smaPeriods)); - [HttpGet("DYN")] - public async Task GetDynamic( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("RSI")] + public Task GetRsi(int lookbackPeriods) + => Get(quotes => quotes.GetRsi(lookbackPeriods)); - IEnumerable results = - quotes.GetDynamic(lookbackPeriods) - .TakeLast(limitLast); + [HttpGet("SLOPE")] + public Task GetSlope(int lookbackPeriods) + => Get(quotes => quotes.GetSlope(lookbackPeriods)); - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("SMA")] + public Task GetSma(int lookbackPeriods) + => Get(quotes => quotes.GetSma(lookbackPeriods)); - [HttpGet("ELDER-RAY")] - public async Task GetElderRay( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); + [HttpGet("SMI")] + public Task GetSmi(int lookbackPeriods, int firstSmoothPeriods, int secondSmoothPeriods, int signalPeriods) + => Get(quotes => quotes.GetSmi(lookbackPeriods, firstSmoothPeriods, secondSmoothPeriods, signalPeriods)); - IEnumerable results = - quotes.GetElderRay(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("EPMA")] - public async Task GetEpma( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetEpma(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("EMA")] - public async Task GetEma( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetEma(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("FCB")] - public async Task GetFcb( - int windowSpan) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetFcb(windowSpan) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("FISHER")] - public async Task GetFisher( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetFisherTransform(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("FRACTAL")] - public async Task GetFractal( - int windowSpan) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetFractal(windowSpan) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("GATOR")] - public async Task GetGator() - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetGator() - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("HTL")] - public async Task GetHTL() - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetHtTrendline() - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("ICHIMOKU")] - public async Task GetIchimoku( - int tenkanPeriods, - int kijunPeriods, - int senkouBPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetIchimoku(tenkanPeriods, kijunPeriods, senkouBPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("KELTNER")] - public async Task GetKeltner( - int emaPeriods, - double multiplier, - int atrPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetKeltner(emaPeriods, multiplier, atrPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("MACD")] - public async Task GetMacd( - int fastPeriods, - int slowPeriods, - int signalPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetMacd(fastPeriods, slowPeriods, signalPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("MARUBOZU")] - public async Task GetMarubozu( - double minBodyPercent) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetMarubozu(minBodyPercent) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("MFI")] - public async Task GetMfi( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetMfi(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("PSAR")] - public async Task GetParabolicSar( - double accelerationStep, - double maxAccelerationFactor) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetParabolicSar(accelerationStep, maxAccelerationFactor) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("ROC")] - public async Task GetRoc( - int lookbackPeriods, - int smaPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetRoc(lookbackPeriods, smaPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("RSI")] - public async Task GetRsi( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetRsi(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("SLOPE")] - public async Task GetSlope( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetSlope(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("SMA")] - public async Task GetSma( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetSma(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("SMI")] - public async Task GetSmi( - int lookbackPeriods, - int firstSmoothPeriods, - int secondSmoothPeriods, - int signalPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetSmi(lookbackPeriods, firstSmoothPeriods, secondSmoothPeriods, signalPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - - [HttpGet("STC")] - public async Task GetStc( - int cyclePeriods, - int fastPeriods, - int slowPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetStc(cyclePeriods, fastPeriods, slowPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + [HttpGet("STC")] + public Task GetStc(int cyclePeriods, int fastPeriods, int slowPeriods) + => Get(quotes => quotes.GetStc(cyclePeriods, fastPeriods, slowPeriods)); [HttpGet("STARC")] - public async Task GetStarc( - int smaPeriods, - double multiplier, - int atrPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetStarcBands(smaPeriods, multiplier, atrPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetStarc(int smaPeriods, double multiplier, int atrPeriods) + => Get(quotes => quotes.GetStarcBands(smaPeriods, multiplier, atrPeriods)); [HttpGet("STDEV")] - public async Task GetStdDev( - int lookbackPeriods, - int smaPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - // we don't ask for smaPeriods with Z-Score, handle - smaPeriods = smaPeriods == 0 ? 1 : smaPeriods; - - IEnumerable results = - quotes.GetStdDev(lookbackPeriods, smaPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetStdDev(int lookbackPeriods, int smaPeriods) + => Get(quotes => quotes.GetStdDev(lookbackPeriods, smaPeriods == 0 ? 1 : smaPeriods)); [HttpGet("STO")] - public async Task GetStoch( - int lookbackPeriods, - int signalPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetStoch(lookbackPeriods, signalPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetStoch(int lookbackPeriods, int signalPeriods) + => Get(quotes => quotes.GetStoch(lookbackPeriods, signalPeriods)); [HttpGet("STORSI")] - public async Task GetStochRsi( - int rsiPeriods, - int stochPeriods, - int signalPeriods, - int smoothPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetStochRsi(rsiPeriods, stochPeriods, signalPeriods, smoothPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetStochRsi(int rsiPeriods, int stochPeriods, int signalPeriods, int smoothPeriods) + => Get(quotes => quotes.GetStochRsi(rsiPeriods, stochPeriods, signalPeriods, smoothPeriods)); [HttpGet("SUPERTREND")] - public async Task GetSuperTrend( - int lookbackPeriods, - double multiplier) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetSuperTrend(lookbackPeriods, multiplier) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetSuperTrend(int lookbackPeriods, double multiplier) + => Get(quotes => quotes.GetSuperTrend(lookbackPeriods, multiplier)); [HttpGet("ULCER")] - public async Task GetUlcer( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetUlcerIndex(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetUlcer(int lookbackPeriods) + => Get(quotes => quotes.GetUlcerIndex(lookbackPeriods)); [HttpGet("VORTEX")] - public async Task GetVortex( - int lookbackPeriods) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetVortex(lookbackPeriods) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetVortex(int lookbackPeriods) + => Get(quotes => quotes.GetVortex(lookbackPeriods)); [HttpGet("ZIGZAG-CLOSE")] - public async Task GetZigZagClose( - decimal percentChange) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetZigZag(EndType.Close, percentChange) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } + public Task GetZigZagClose(decimal percentChange) + => Get(quotes => quotes.GetZigZag(EndType.Close, percentChange)); [HttpGet("ZIGZAG-HIGHLOW")] - public async Task GetZigZagHighLow( - decimal percentChange) - { - try - { - IEnumerable quotes = await quoteFeed.Get(); - - IEnumerable results = - quotes.GetZigZag(EndType.HighLow, percentChange) - .TakeLast(limitLast); - - return Ok(results); - } - catch (ArgumentOutOfRangeException rex) - { - return BadRequest(rex.Message); - } - } - + public Task GetZigZagHighLow(decimal percentChange) + => Get(quotes => quotes.GetZigZag(EndType.HighLow, percentChange)); } diff --git a/server/WebApi/Models.cs b/server/WebApi/Models.cs deleted file mode 100644 index 7909476..0000000 --- a/server/WebApi/Models.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace WebApi.Services; - -[Serializable] -public record class IndicatorListing -{ - public required string Name { get; init; } - public required string Uiid { get; init; } - public required string LegendTemplate { get; init; } - public required string Endpoint { get; init; } - public required string Category { get; init; } - public required string ChartType { get; init; } - public Order Order { get; init; } = Order.Front; - - public ChartConfig? ChartConfig { get; set; } - - public ICollection? Parameters { get; set; } - public required ICollection Results { get; init; } -} - -[Serializable] -public enum Order -{ - // price is 75/76 - // thresholds are 99 - Front = 1, - Behind = 50, - BehindPrice = 80, - Back = 95 -} - -[Serializable] -public record class IndicatorParamConfig -{ - public required string DisplayName { get; init; } - public required string ParamName { get; init; } - public required string DataType { get; init; } - public required double Minimum { get; init; } // greater than - public required double Maximum { get; init; } // less than - public double? DefaultValue { get; init; } -} - -[Serializable] -public record class IndicatorResultConfig -{ - public required string DisplayName { get; init; } - public required string TooltipTemplate { get; init; } - public required string DataName { get; init; } - public required string DataType { get; init; } - public required string LineType { get; init; } - public string? Stack { get; set; } - public float LineWidth { get; set; } = 2; - public required string DefaultColor { get; init; } - public ChartFill? Fill { get; set; } - -} - -[Serializable] -public record class ChartConfig -{ - public double? MinimumYAxis { get; set; } - public double? MaximumYAxis { get; set; } - - public ICollection? Thresholds { get; set; } -} - -[Serializable] -public record class ChartThreshold -{ - public required double Value { get; init; } - public required string Color { get; init; } - public required string Style { get; init; } - public ChartFill? Fill { get; set; } -} - -[Serializable] -public record class ChartFill -{ - public required string Target { get; init; } - public required string ColorAbove { get; init; } - public required string ColorBelow { get; init; } -} diff --git a/server/WebApi/Models/ChartColors.cs b/server/WebApi/Models/ChartColors.cs new file mode 100644 index 0000000..a0b6cc3 --- /dev/null +++ b/server/WebApi/Models/ChartColors.cs @@ -0,0 +1,20 @@ +namespace WebApi.Models; + +public static class ChartColors +{ + // Material Design (M2) color palettes + public static readonly string StandardRed = "#DD2C00"; // deep orange A700 + public static readonly string StandardOrange = "#EF6C00"; // orange 800 + public static readonly string StandardGreen = "#2E7D32"; // green 800 + public static readonly string StandardBlue = "#1E88E5"; // blue 600 + public static readonly string StandardPurple = "#8E24AA"; // purple 600 + public static readonly string StandardGrayTransparent = "#9E9E9E50"; // gray 500 + public static readonly string DarkGray = "#616161CC"; // gray 600 + public static readonly string DarkGrayTransparent = "#61616110"; // gray 600 + + public static readonly string ThresholdRed = "#B71C1C70"; // red 900 + public static readonly string ThresholdRedTransparent = "#B71C1C20"; // red 900 + public static readonly string ThresholdGrayTransparent = "#42424280"; // gray 800 + public static readonly string ThresholdGreen = "#1B5E2070"; // green 900 + public static readonly string ThresholdGreenTransparent = "#1B5E2020"; // green 900 +} diff --git a/server/WebApi/Models/ChartConfig.cs b/server/WebApi/Models/ChartConfig.cs new file mode 100644 index 0000000..0c1991b --- /dev/null +++ b/server/WebApi/Models/ChartConfig.cs @@ -0,0 +1,10 @@ +namespace WebApi.Models; + +[Serializable] +public record ChartConfig +{ + public double? MinimumYAxis { get; set; } + public double? MaximumYAxis { get; set; } + + public ICollection? Thresholds { get; set; } +} diff --git a/server/WebApi/Models/ChartFill.cs b/server/WebApi/Models/ChartFill.cs new file mode 100644 index 0000000..cf7665e --- /dev/null +++ b/server/WebApi/Models/ChartFill.cs @@ -0,0 +1,9 @@ +namespace WebApi.Models; + +[Serializable] +public record ChartFill +{ + public required string Target { get; init; } + public required string ColorAbove { get; init; } + public required string ColorBelow { get; init; } +} diff --git a/server/WebApi/Models/ChartThreshold.cs b/server/WebApi/Models/ChartThreshold.cs new file mode 100644 index 0000000..0623840 --- /dev/null +++ b/server/WebApi/Models/ChartThreshold.cs @@ -0,0 +1,10 @@ +namespace WebApi.Models; + +[Serializable] +public record ChartThreshold +{ + public required double Value { get; init; } + public required string Color { get; init; } + public required string Style { get; init; } + public ChartFill? Fill { get; set; } +} diff --git a/server/WebApi/Models/Emum.cs b/server/WebApi/Models/Emum.cs new file mode 100644 index 0000000..d569d20 --- /dev/null +++ b/server/WebApi/Models/Emum.cs @@ -0,0 +1,12 @@ +namespace WebApi.Models; + +[Serializable] +public enum Order +{ + Front = 1, + Behind = 50, + // price is 75/76 + BehindPrice = 80, + Back = 95 + // thresholds are 99 +} diff --git a/server/WebApi/Models/IndicatorListing.cs b/server/WebApi/Models/IndicatorListing.cs new file mode 100644 index 0000000..9a00481 --- /dev/null +++ b/server/WebApi/Models/IndicatorListing.cs @@ -0,0 +1,18 @@ +namespace WebApi.Models; + +[Serializable] +public record IndicatorListing +{ + public required string Name { get; init; } + public required string Uiid { get; init; } + public required string LegendTemplate { get; init; } + public required string Endpoint { get; init; } + public required string Category { get; init; } + public required string ChartType { get; init; } + public Order Order { get; init; } = Order.Front; + + public ChartConfig? ChartConfig { get; set; } + + public ICollection? Parameters { get; set; } + public required ICollection Results { get; init; } +} diff --git a/server/WebApi/Models/IndicatorParamConfig.cs b/server/WebApi/Models/IndicatorParamConfig.cs new file mode 100644 index 0000000..f07230f --- /dev/null +++ b/server/WebApi/Models/IndicatorParamConfig.cs @@ -0,0 +1,12 @@ +namespace WebApi.Models; + +[Serializable] +public record IndicatorParamConfig +{ + public required string DisplayName { get; init; } + public required string ParamName { get; init; } + public required string DataType { get; init; } + public required double Minimum { get; init; } // greater than + public required double Maximum { get; init; } // less than + public double? DefaultValue { get; init; } +} diff --git a/server/WebApi/Models/IndicatorResultConfig.cs b/server/WebApi/Models/IndicatorResultConfig.cs new file mode 100644 index 0000000..7a1b156 --- /dev/null +++ b/server/WebApi/Models/IndicatorResultConfig.cs @@ -0,0 +1,15 @@ +namespace WebApi.Models; + +[Serializable] +public record IndicatorResultConfig +{ + public required string DisplayName { get; init; } + public required string TooltipTemplate { get; init; } + public required string DataName { get; init; } + public required string DataType { get; init; } + public required string LineType { get; init; } + public string? Stack { get; set; } + public float LineWidth { get; set; } = 2; + public required string DefaultColor { get; init; } + public ChartFill? Fill { get; set; } +} diff --git a/server/WebApi/Program.cs b/server/WebApi/Program.cs index 9be396f..03026c4 100644 --- a/server/WebApi/Program.cs +++ b/server/WebApi/Program.cs @@ -5,9 +5,8 @@ using WebApi.Services; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); - -IServiceCollection services = builder.Services; ConfigurationManager configuration = builder.Configuration; +IServiceCollection services = builder.Services; // Add framework services services.AddControllers(); @@ -15,33 +14,24 @@ // Get CORS origins from appsettings // reminder: production origins defined in cloud host settings » API » CORS // so these are really only for localhost / development -IConfigurationSection corsOrigins = configuration.GetSection("CorsOrigins"); -string? allowedOrigin = corsOrigins["Website"]; - -List origins = []; +string? allowedOrigin = configuration.GetValue("CorsOrigins:Website"); if (!string.IsNullOrEmpty(allowedOrigin)) { - origins.Add(allowedOrigin); -} - -// Setup CORS for website -services.AddCors(options => { - options.AddPolicy("CorsPolicy", - cors => { - cors.AllowAnyHeader(); - cors.AllowAnyMethod(); - cors.AllowCredentials(); - cors.WithOrigins([.. origins]) - .SetIsOriginAllowedToAllowWildcardSubdomains(); + // Setup CORS for website + services.AddCors(options => { + options.AddPolicy("CorsPolicy", + cors => { + cors.AllowAnyHeader(); + cors.AllowAnyMethod(); + cors.AllowCredentials(); + cors.WithOrigins(allowedOrigin) + .SetIsOriginAllowedToAllowWildcardSubdomains(); + }); }); -}); -Console.WriteLine($"CORS Origin: {allowedOrigin}"); - -// Register services -services.AddHostedService(); -services.AddTransient(); + Console.WriteLine($"CORS Origin: {allowedOrigin}"); +} // Add response compression services services.AddResponseCompression(options => { @@ -59,6 +49,14 @@ options.Level = CompressionLevel.Fastest; }); +// Add logging +services.AddLogging(); + +// Add application services +services.AddSingleton(); +services.AddSingleton(); +services.AddHostedService(); + // Build application WebApplication app = builder.Build(); diff --git a/server/WebApi/Service.Metadata.cs b/server/WebApi/Service.Metadata.cs index 616b7bd..7bae713 100644 --- a/server/WebApi/Service.Metadata.cs +++ b/server/WebApi/Service.Metadata.cs @@ -1,48 +1,91 @@ +using WebApi.Models; + namespace WebApi.Services; -public static class Metadata +public static class MetadataHelpers { - // colors from Material Design (M2) color palettes - // ref: https://m2.material.io/design/color/the-color-system.html - - // notably other dark/light theme chart colors (Sept. 2024): - // gridlines: #2E2E2E / #E0E0E0 - // background: #121316 / #FAF9FD - - // indicator colors - // (a) more are available in UI for user selection - // (b) these should be consistently defined in UI colors - // TODO: make these available from API, cached in UI for selection - const string standardRed = "#DD2C00"; // deep orange A700 (red) - const string standardOrange = "#EF6C00"; // orange 800 - const string standardGreen = "#2E7D32"; // green 800 - const string standardBlue = "#1E88E5"; // blue 600 - const string standardPurple = "#8E24AA"; // purple 600 - const string standardGrayTransparent = "#9E9E9E50"; // gray 500 - const string darkGray = "#616161CC"; // gray 600 - const string darkGrayTransparent = "#61616110"; // gray 600 - - // threshold colors (different from indicator colors) - const string thresholdRed = "#B71C1C70"; // red 900 - const string thresholdRedTransparent = "#B71C1C20"; // red 900 - const string thresholdGrayTransparent = "#42424280"; // gray 800 - const string thresholdGreen = "#1B5E2070"; // green 900 - const string thresholdGreenTransparent = "#1B5E2020"; // green 900 + public static ChartConfig GetOscillatorConfig(float min = 0, float max = 100, float upperThreshold = 80, float lowerThreshold = 20) + => new() { + MinimumYAxis = min, + MaximumYAxis = max, + Thresholds = [ + new() { + Value = upperThreshold, + Color = ChartColors.ThresholdRed, + Style = "dash", + Fill = new() { + Target = "+2", + ColorAbove = "transparent", + ColorBelow = ChartColors.ThresholdGreen + } + }, + new() { + Value = lowerThreshold, + Color = ChartColors.ThresholdGreen, + Style = "dash", + Fill = new() { + Target = "+1", + ColorAbove = ChartColors.ThresholdRed, + ColorBelow = "transparent" + } + } + ] + }; + + public static List GetPriceBandResults(string name, string? color = null) + { + color ??= ChartColors.StandardOrange; + return [ + new IndicatorResultConfig { + DisplayName = "Upper Band", + TooltipTemplate = $"{name} Upper Band", + DataName = "upperBand", + DataType = "number", + LineType = "solid", + LineWidth = 1, + DefaultColor = color, + Fill = new() { + Target = "+2", + ColorAbove = ChartColors.DarkGrayTransparent, + ColorBelow = ChartColors.DarkGrayTransparent + } + }, + new() { + DisplayName = "Centerline", + TooltipTemplate = $"{name} Centerline", + DataName = "centerline", + DataType = "number", + LineType = "dash", + LineWidth = 1, + DefaultColor = color + }, + new() { + DisplayName = "Lower Band", + TooltipTemplate = $"{name} Lower Band", + DataName = "lowerBand", + DataType = "number", + LineType = "solid", + LineWidth = 1, + DefaultColor = color + } + ]; + } +} +public static class Metadata +{ public static IEnumerable IndicatorListing(string baseUrl) { - List listing = - [ + List listing = [ // Accumulation Distribution Line (ADL) - new IndicatorListing { + new() { Name = "Accumulation Distribution Line (ADL)", Uiid = "ADL", LegendTemplate = "ADL w/ SMA([P1])", Endpoint = $"{baseUrl}/ADL/", Category = "volume-based", ChartType = "oscillator", - Parameters = - [ + Parameters = [ new() { DisplayName = "SMA Periods", ParamName = "smaPeriods", @@ -54,12 +97,12 @@ public static IEnumerable IndicatorListing(string baseUrl) ], Results = [ new() { - DisplayName = "Accumulation Distribution Line", + DisplayName = "ADL", TooltipTemplate = "ADL", DataName = "adl", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "SMA of ADL", @@ -67,7 +110,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "adlSma", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -85,12 +128,12 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 40, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" }, new() { Value = 20, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" } ] @@ -113,7 +156,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "adx", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "DI+", @@ -121,7 +164,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "pdi", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "DI-", @@ -129,7 +172,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "mdi", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed }, new() { DisplayName = "ADX Rating", @@ -138,7 +181,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 2, - DefaultColor = standardGrayTransparent + DefaultColor = ChartColors.StandardGrayTransparent } ] }, @@ -185,7 +228,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "alma", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -206,17 +249,17 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 70, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "solid" }, new() { Value = 50, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" }, new() { Value = 30, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "solid" } ] @@ -239,7 +282,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "aroonUp", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Aroon Down", @@ -247,7 +290,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "aroonDown", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -268,7 +311,7 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 0, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" } ] @@ -291,7 +334,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "oscillator", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -332,7 +375,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 2, - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Sell Stop", @@ -341,7 +384,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 2, - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -382,7 +425,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 2, - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Sell Stop", @@ -391,7 +434,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 2, - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -422,7 +465,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "atr", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -453,7 +496,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "atrp", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -471,7 +514,7 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 1, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" } ] @@ -494,7 +537,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "beta", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Beta+", @@ -502,7 +545,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "betaUp", DataType = "number", LineType = "dash", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Beta-", @@ -510,7 +553,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "betaDown", DataType = "number", LineType = "dash", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -551,11 +594,11 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 1, - DefaultColor = darkGray, + DefaultColor = ChartColors.DarkGray, Fill = new ChartFill { Target = "+2", - ColorAbove = darkGrayTransparent, - ColorBelow = darkGrayTransparent + ColorAbove = ChartColors.DarkGrayTransparent, + ColorBelow = ChartColors.DarkGrayTransparent } }, new() { @@ -565,7 +608,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dash", LineWidth = 1, - DefaultColor = darkGray + DefaultColor = ChartColors.DarkGray }, new() { DisplayName = "Lower Band", @@ -574,7 +617,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 1, - DefaultColor = darkGray + DefaultColor = ChartColors.DarkGray } ] }, @@ -592,21 +635,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 1, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 0, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -638,7 +681,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "percentB", DataType = "number", LineType = "solid", - DefaultColor = standardBlue, + DefaultColor = ChartColors.StandardBlue, } ] }, @@ -656,7 +699,7 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 0, - Color = thresholdGrayTransparent, + Color = ChartColors.ThresholdGrayTransparent, Style = "dash" } ] @@ -679,7 +722,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "cmf", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -710,7 +753,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "cmo", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -749,7 +792,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "chandelierExit", DataType = "number", LineType = "solid", - DefaultColor = standardOrange + DefaultColor = ChartColors.StandardOrange } ] }, @@ -788,7 +831,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "chandelierExit", DataType = "number", LineType = "dash", - DefaultColor = standardOrange + DefaultColor = ChartColors.StandardOrange } ] }, @@ -809,21 +852,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 61.8, - Color = darkGrayTransparent, + Color = ChartColors.DarkGrayTransparent, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdRed + ColorBelow = ChartColors.ThresholdRed } }, new() { Value = 38.2, - Color = darkGrayTransparent, + Color = ChartColors.DarkGrayTransparent, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdGreen, + ColorAbove = ChartColors.ThresholdGreen, ColorBelow = "transparent" } } @@ -847,7 +890,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "chop", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -868,21 +911,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 90, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 10, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -922,7 +965,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "connorsRsi", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -954,7 +997,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "pointer", LineWidth = 8, - DefaultColor = darkGray + DefaultColor = ChartColors.DarkGray } ] }, @@ -977,7 +1020,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "dcPeriods", DataType = "number", LineType = "bar", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1002,40 +1045,7 @@ public static IEnumerable IndicatorListing(string baseUrl) Maximum = 250 } ], - Results = [ - new() { - DisplayName = "Upper Band", - TooltipTemplate = "DONCHIAN([P1]) Upper Band", - DataName = "upperBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange, - Fill = new ChartFill { - Target = "+2", - ColorAbove = darkGrayTransparent, - ColorBelow = darkGrayTransparent - } - }, - new() { - DisplayName = "Centerline", - TooltipTemplate = "DONCHIAN([P1]) Centerline", - DataName = "centerline", - DataType = "number", - LineType = "dash", - LineWidth = 1, - DefaultColor = standardOrange - }, - new() { - DisplayName = "Lower Band", - TooltipTemplate = "DONCHIAN([P1]) Lower Band", - DataName = "lowerBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange - } - ] + Results = MetadataHelpers.GetPriceBandResults("DONCHIAN", ChartColors.StandardOrange) }, // Dynamic, McGinley @@ -1064,7 +1074,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "dynamic", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1096,7 +1106,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "bar", Stack = "eray", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Bear Power", @@ -1105,7 +1115,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "bar", Stack = "eray", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -1136,7 +1146,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "epma", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1167,7 +1177,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "ema", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1198,7 +1208,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "fisher", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Trigger", @@ -1206,7 +1216,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "trigger", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -1238,7 +1248,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 3, - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed }, new() { DisplayName = "Fractal Bear", @@ -1247,7 +1257,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 3, - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen } ] }, @@ -1279,7 +1289,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "upperBand", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Lower Band", @@ -1287,7 +1297,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "lowerBand", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -1307,7 +1317,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "trendline", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "HT Smoothed Price", @@ -1315,7 +1325,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "smoothPrice", DataType = "number", LineType = "solid", - DefaultColor = standardOrange + DefaultColor = ChartColors.StandardOrange } ] }, @@ -1364,7 +1374,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 2, - DefaultColor = standardBlue, + DefaultColor = ChartColors.StandardBlue, }, new() { DisplayName = "Kijun-sen", @@ -1373,7 +1383,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 2, - DefaultColor = standardPurple, + DefaultColor = ChartColors.StandardPurple, }, new() { DisplayName = "Chikou span", @@ -1382,7 +1392,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 2, - DefaultColor = darkGray, + DefaultColor = ChartColors.DarkGray, }, new() { DisplayName = "Senkou span A", @@ -1391,7 +1401,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 1.5f, - DefaultColor = thresholdGreen, + DefaultColor = ChartColors.ThresholdGreen, }, new() { DisplayName = "Senkou span B", @@ -1400,11 +1410,11 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "solid", LineWidth = 1.5f, - DefaultColor = thresholdRed, + DefaultColor = ChartColors.ThresholdRed, Fill = new ChartFill { Target = "-1", - ColorAbove = thresholdRedTransparent, - ColorBelow = thresholdGreenTransparent + ColorAbove = ChartColors.ThresholdRedTransparent, + ColorBelow = ChartColors.ThresholdGreenTransparent } } ] @@ -1447,40 +1457,7 @@ public static IEnumerable IndicatorListing(string baseUrl) Maximum = 250 } ], - Results = [ - new() { - DisplayName = "Upper Band", - TooltipTemplate = "KELTNER([P1],[P2],[P3]) Upper Band", - DataName = "upperBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange, - Fill = new ChartFill { - Target = "+2", - ColorAbove = darkGrayTransparent, - ColorBelow = darkGrayTransparent - } - }, - new() { - DisplayName = "Centerline", - TooltipTemplate = "KELTNER([P1],[P2],[P3]) Centerline", - DataName = "centerline", - DataType = "number", - LineType = "dash", - LineWidth = 1, - DefaultColor = standardOrange - }, - new() { - DisplayName = "Lower Band", - TooltipTemplate = "KELTNER([P1],[P2],[P3]) Lower Band", - DataName = "lowerBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange - } - ] + Results = MetadataHelpers.GetPriceBandResults("KELTNER", ChartColors.StandardOrange) }, // Marubozu @@ -1510,7 +1487,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "pointer", LineWidth = 8, - DefaultColor = darkGray + DefaultColor = ChartColors.DarkGray } ] }, @@ -1531,21 +1508,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 80, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 20, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -1569,7 +1546,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "mfi", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1587,7 +1564,7 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 0, - Color = darkGrayTransparent, + Color = ChartColors.DarkGrayTransparent, Style = "dash" } ] @@ -1626,7 +1603,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "macd", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Signal", @@ -1634,7 +1611,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "signal", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed }, new() { DisplayName = "Histogram", @@ -1642,7 +1619,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "histogram", DataType = "number", LineType = "bar", - DefaultColor = standardGrayTransparent + DefaultColor = ChartColors.StandardGrayTransparent } ] }, @@ -1683,7 +1660,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dots", LineWidth = 2, - DefaultColor = standardPurple + DefaultColor = ChartColors.StandardPurple } ] }, @@ -1722,7 +1699,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "roc", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "SMA of ROC", @@ -1730,7 +1707,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "rocSma", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -1751,21 +1728,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 70, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 30, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -1789,7 +1766,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "rsi", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1810,21 +1787,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 75, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "solid", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 25, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "solid", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -1864,7 +1841,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "stc", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1895,7 +1872,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "slope", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1926,7 +1903,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "line", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1957,7 +1934,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "sma", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -1996,7 +1973,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "stdDev", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "SMA of Standard Deviation", @@ -2004,7 +1981,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "stdDevSma", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -2035,7 +2012,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "zScore", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -2076,40 +2053,7 @@ public static IEnumerable IndicatorListing(string baseUrl) Maximum = 50 } ], - Results = [ - new() { - DisplayName = "Upper Band", - TooltipTemplate = "STARC([P1],[P2],[P3]) Upper Band", - DataName = "upperBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange, - Fill = new ChartFill { - Target = "+2", - ColorAbove = darkGrayTransparent, - ColorBelow = darkGrayTransparent - } - }, - new() { - DisplayName = "Centerline", - TooltipTemplate = "STARC([P1],[P2],[P3]) Centerline", - DataName = "centerline", - DataType = "number", - LineType = "dash", - LineWidth = 1, - DefaultColor = standardOrange - }, - new() { - DisplayName = "Lower Band", - TooltipTemplate = "STARC([P1],[P2],[P3]) Lower Band", - DataName = "lowerBand", - DataType = "number", - LineType = "solid", - LineWidth = 1, - DefaultColor = standardOrange - } - ] + Results = MetadataHelpers.GetPriceBandResults("STARC", ChartColors.StandardOrange) }, // Stochastic Momentum Index @@ -2125,21 +2069,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 40, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = -40, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -2187,7 +2131,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "smi", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Signal", @@ -2195,7 +2139,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "signal", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -2213,21 +2157,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 80, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 20, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -2259,7 +2203,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "k", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "%D", @@ -2267,7 +2211,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "d", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -2285,21 +2229,21 @@ public static IEnumerable IndicatorListing(string baseUrl) [ new() { Value = 80, - Color = thresholdRed, + Color = ChartColors.ThresholdRed, Style = "dash", Fill = new ChartFill { Target = "+2", ColorAbove = "transparent", - ColorBelow = thresholdGreen + ColorBelow = ChartColors.ThresholdGreen } }, new() { Value = 20, - Color = thresholdGreen, + Color = ChartColors.ThresholdGreen, Style = "dash", Fill = new ChartFill { Target = "+1", - ColorAbove = thresholdRed, + ColorAbove = ChartColors.ThresholdRed, ColorBelow = "transparent" } } @@ -2347,7 +2291,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "stochRsi", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Signal line", @@ -2355,7 +2299,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "signal", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -2395,7 +2339,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "upperBand", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed }, new() { DisplayName = "Lower Band", @@ -2403,7 +2347,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "lowerBand", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "Transition line", @@ -2412,7 +2356,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataType = "number", LineType = "dash", LineWidth = 1, - DefaultColor = darkGrayTransparent + DefaultColor = ChartColors.DarkGrayTransparent } ] }, @@ -2443,7 +2387,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "ui", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue } ] }, @@ -2474,7 +2418,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "pvi", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen }, new() { DisplayName = "VI+", @@ -2482,7 +2426,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "nvi", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed } ] }, @@ -2553,7 +2497,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "jaw", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Teeth", @@ -2561,7 +2505,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "teeth", DataType = "number", LineType = "solid", - DefaultColor = standardRed + DefaultColor = ChartColors.StandardRed }, new() { DisplayName = "Lips", @@ -2569,7 +2513,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "lips", DataType = "number", LineType = "solid", - DefaultColor = standardGreen + DefaultColor = ChartColors.StandardGreen } ] }, @@ -2600,7 +2544,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "zigZag", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Zig Zag Retrace High", @@ -2608,7 +2552,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "retraceHigh", DataType = "number", LineType = "dash", - DefaultColor = thresholdGrayTransparent + DefaultColor = ChartColors.ThresholdGrayTransparent }, new() { DisplayName = "Zig Zag Retrace Low", @@ -2616,7 +2560,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "retraceLow", DataType = "number", LineType = "dash", - DefaultColor = thresholdGrayTransparent + DefaultColor = ChartColors.ThresholdGrayTransparent } ] }, @@ -2647,7 +2591,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "zigZag", DataType = "number", LineType = "solid", - DefaultColor = standardBlue + DefaultColor = ChartColors.StandardBlue }, new() { DisplayName = "Zig Zag Retrace High", @@ -2655,7 +2599,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "retraceHigh", DataType = "number", LineType = "dash", - DefaultColor = thresholdGrayTransparent + DefaultColor = ChartColors.ThresholdGrayTransparent }, new() { DisplayName = "Zig Zag Retrace Low", @@ -2663,7 +2607,7 @@ public static IEnumerable IndicatorListing(string baseUrl) DataName = "retraceLow", DataType = "number", LineType = "dash", - DefaultColor = thresholdGrayTransparent + DefaultColor = ChartColors.ThresholdGrayTransparent } ] } diff --git a/server/WebApi/Service.Quotes.cs b/server/WebApi/Service.Quotes.cs index b357bef..c72eac8 100644 --- a/server/WebApi/Service.Quotes.cs +++ b/server/WebApi/Service.Quotes.cs @@ -2,15 +2,26 @@ namespace WebApi.Services; -public class QuoteService +public interface IQuoteService { - private static readonly IReadOnlyList backupQuotes = GetBackup(); + Task> Get(); + Task> Get(string symbol); +} + +public class QuoteService( + ILogger logger, + IStorage storage) : IQuoteService +{ + private static readonly IReadOnlyList backupQuotes = GetBackup().OrderBy(x => x.Date).ToList(); + private readonly ILogger _logger = logger; + private readonly IStorage _storage = storage; /// /// Get default quotes /// /// List of default quotes - public async Task> Get() => await Get("QQQ"); + public async Task> Get() + => await Get("QQQ"); /// /// Get quotes for a specific symbol. @@ -22,20 +33,36 @@ public async Task> Get(string symbol) try { - BlobClient blob = Storage.GetBlobClient(blobName); + BlobClient blob = _storage.GetBlobClient(blobName); + + if (!await blob.ExistsAsync()) + { + _logger.LogWarning("Blob {BlobName} not found, using backup data", blobName); + return backupQuotes; + } + Response response = await blob.DownloadAsync(); + using Stream? stream = response?.Value.Content; - Stream stream = response.Value.Content; + if (stream == null) + { + _logger.LogError("Download stream was null for {BlobName}", blobName); + return backupQuotes; + } - List? quotes = JsonSerializer - .Deserialize>(stream); + List? quotes = await JsonSerializer.DeserializeAsync>(stream); - return quotes == null || quotes.Count == 0 - ? backupQuotes - : [.. quotes]; // pre-sorted + if (quotes == null || quotes.Count == 0) + { + _logger.LogWarning("No quotes found in {BlobName}", blobName); + return backupQuotes; + } + + return quotes; } - catch + catch (Exception ex) { + _logger.LogError(ex, "Failed to retrieve quotes for {Symbol}", symbol); return backupQuotes; } } @@ -43,516 +70,514 @@ public async Task> Get(string symbol) #region Backup Quotes (for failover) private static List GetBackup() - { - List h = - [ - new Quote { Date = DateTime.Parse("2018-12-31"), Open = 244.92m, High = 245.54m, Low = 242.87m, Close = 245.28m, Volume = 147031456 }, - new Quote { Date = DateTime.Parse("2018-12-28"), Open = 244.94m, High = 246.73m, Low = 241.87m, Close = 243.15m, Volume = 155998912 }, - new Quote { Date = DateTime.Parse("2018-12-27"), Open = 238.06m, High = 243.68m, Low = 234.52m, Close = 243.46m, Volume = 189794032 }, - new Quote { Date = DateTime.Parse("2018-12-26"), Open = 231.59m, High = 241.61m, Low = 229.42m, Close = 241.61m, Volume = 222622048 }, - new Quote { Date = DateTime.Parse("2018-12-24"), Open = 234.60m, High = 236.36m, Low = 229.92m, Close = 229.99m, Volume = 150100704 }, - new Quote { Date = DateTime.Parse("2018-12-21"), Open = 242.16m, High = 245.07m, Low = 235.52m, Close = 236.23m, Volume = 260180208 }, - new Quote { Date = DateTime.Parse("2018-12-20"), Open = 243.79m, High = 245.51m, Low = 238.71m, Close = 241.17m, Volume = 258325808 }, - new Quote { Date = DateTime.Parse("2018-12-19"), Open = 248.97m, High = 253.10m, Low = 243.30m, Close = 245.16m, Volume = 220342928 }, - new Quote { Date = DateTime.Parse("2018-12-18"), Open = 250.95m, High = 251.69m, Low = 247.13m, Close = 248.89m, Volume = 137862544 }, - new Quote { Date = DateTime.Parse("2018-12-17"), Open = 253.10m, High = 254.32m, Low = 247.37m, Close = 249.16m, Volume = 169610592 }, - new Quote { Date = DateTime.Parse("2018-12-14"), Open = 256.58m, High = 257.62m, Low = 253.54m, Close = 254.15m, Volume = 119871688 }, - new Quote { Date = DateTime.Parse("2018-12-13"), Open = 260.05m, High = 260.99m, Low = 257.71m, Close = 258.93m, Volume = 99068200 }, - new Quote { Date = DateTime.Parse("2018-12-12"), Open = 260.98m, High = 262.47m, Low = 258.93m, Close = 259.01m, Volume = 100414888 }, - new Quote { Date = DateTime.Parse("2018-12-11"), Open = 261.16m, High = 261.37m, Low = 256.11m, Close = 257.72m, Volume = 124528112 }, - new Quote { Date = DateTime.Parse("2018-12-10"), Open = 256.98m, High = 258.72m, Low = 252.34m, Close = 257.66m, Volume = 155214672 }, - new Quote { Date = DateTime.Parse("2018-12-07"), Open = 262.92m, High = 264.63m, Low = 256.25m, Close = 257.17m, Volume = 165025936 }, - new Quote { Date = DateTime.Parse("2018-12-06"), Open = 259.46m, High = 263.41m, Low = 256.07m, Close = 263.29m, Volume = 209266640 }, - new Quote { Date = DateTime.Parse("2018-12-04"), Open = 271.61m, High = 272.08m, Low = 263.35m, Close = 263.69m, Volume = 182415248 }, - new Quote { Date = DateTime.Parse("2018-12-03"), Open = 273.47m, High = 273.59m, Low = 270.77m, Close = 272.52m, Volume = 105581352 }, - new Quote { Date = DateTime.Parse("2018-11-30"), Open = 267.16m, High = 269.57m, Low = 266.81m, Close = 268.96m, Volume = 100648032 }, - new Quote { Date = DateTime.Parse("2018-11-29"), Open = 267.06m, High = 268.86m, Low = 265.82m, Close = 267.33m, Volume = 84395640 }, - new Quote { Date = DateTime.Parse("2018-11-28"), Open = 263.05m, High = 267.91m, Low = 261.81m, Close = 267.91m, Volume = 130805744 }, - new Quote { Date = DateTime.Parse("2018-11-27"), Open = 259.87m, High = 261.88m, Low = 259.21m, Close = 261.88m, Volume = 77381344 }, - new Quote { Date = DateTime.Parse("2018-11-26"), Open = 259.33m, High = 261.25m, Low = 258.90m, Close = 261.00m, Volume = 81971728 }, - new Quote { Date = DateTime.Parse("2018-11-23"), Open = 256.79m, High = 258.39m, Low = 256.68m, Close = 256.86m, Volume = 43873168 }, - new Quote { Date = DateTime.Parse("2018-11-21"), Open = 259.40m, High = 260.66m, Low = 258.58m, Close = 258.58m, Volume = 77444168 }, - new Quote { Date = DateTime.Parse("2018-11-20"), Open = 258.92m, High = 260.52m, Low = 256.76m, Close = 257.71m, Volume = 139406240 }, - new Quote { Date = DateTime.Parse("2018-11-19"), Open = 266.42m, High = 266.74m, Low = 261.56m, Close = 262.57m, Volume = 105626432 }, - new Quote { Date = DateTime.Parse("2018-11-16"), Open = 265.19m, High = 268.08m, Low = 264.62m, Close = 267.08m, Volume = 129820216 }, - new Quote { Date = DateTime.Parse("2018-11-15"), Open = 262.25m, High = 266.90m, Low = 260.53m, Close = 266.39m, Volume = 138463488 }, - new Quote { Date = DateTime.Parse("2018-11-14"), Open = 267.50m, High = 267.94m, Low = 261.93m, Close = 263.64m, Volume = 128454960 }, - new Quote { Date = DateTime.Parse("2018-11-13"), Open = 266.46m, High = 268.64m, Low = 264.66m, Close = 265.45m, Volume = 100619768 }, - new Quote { Date = DateTime.Parse("2018-11-12"), Open = 270.46m, High = 270.72m, Low = 265.39m, Close = 265.95m, Volume = 102153984 }, - new Quote { Date = DateTime.Parse("2018-11-09"), Open = 272.25m, High = 272.46m, Low = 269.47m, Close = 271.02m, Volume = 101271544 }, - new Quote { Date = DateTime.Parse("2018-11-08"), Open = 273.31m, High = 274.39m, Low = 272.44m, Close = 273.69m, Volume = 67216992 }, - new Quote { Date = DateTime.Parse("2018-11-07"), Open = 270.82m, High = 274.27m, Low = 270.35m, Close = 274.19m, Volume = 105309120 }, - new Quote { Date = DateTime.Parse("2018-11-06"), Open = 266.68m, High = 268.62m, Low = 266.62m, Close = 268.44m, Volume = 61581152 }, - new Quote { Date = DateTime.Parse("2018-11-05"), Open = 265.82m, High = 267.36m, Low = 264.76m, Close = 266.75m, Volume = 67255520 }, - new Quote { Date = DateTime.Parse("2018-11-02"), Open = 268.08m, High = 268.55m, Low = 263.04m, Close = 265.29m, Volume = 125685896 }, - new Quote { Date = DateTime.Parse("2018-11-01"), Open = 265.01m, High = 267.08m, Low = 263.81m, Close = 266.87m, Volume = 101971008 }, - new Quote { Date = DateTime.Parse("2018-10-31"), Open = 264.08m, High = 266.60m, Low = 263.56m, Close = 264.06m, Volume = 131489024 }, - new Quote { Date = DateTime.Parse("2018-10-30"), Open = 257.27m, High = 261.61m, Low = 256.73m, Close = 261.27m, Volume = 161025888 }, - new Quote { Date = DateTime.Parse("2018-10-29"), Open = 262.27m, High = 263.69m, Low = 253.54m, Close = 257.45m, Volume = 164749392 }, - new Quote { Date = DateTime.Parse("2018-10-26"), Open = 259.46m, High = 264.42m, Low = 255.92m, Close = 258.89m, Volume = 206590848 }, - new Quote { Date = DateTime.Parse("2018-10-25"), Open = 260.89m, High = 265.21m, Low = 259.77m, Close = 263.52m, Volume = 141497248 }, - new Quote { Date = DateTime.Parse("2018-10-24"), Open = 266.69m, High = 267.11m, Low = 258.27m, Close = 258.88m, Volume = 182231472 }, - new Quote { Date = DateTime.Parse("2018-10-23"), Open = 264.37m, High = 268.20m, Low = 262.09m, Close = 266.97m, Volume = 149994752 }, - new Quote { Date = DateTime.Parse("2018-10-22"), Open = 270.27m, High = 270.63m, Low = 267.75m, Close = 268.33m, Volume = 84466760 }, - new Quote { Date = DateTime.Parse("2018-10-19"), Open = 270.40m, High = 272.52m, Low = 268.78m, Close = 269.54m, Volume = 143383136 }, - new Quote { Date = DateTime.Parse("2018-10-18"), Open = 272.62m, High = 273.27m, Low = 268.29m, Close = 269.69m, Volume = 137906032 }, - new Quote { Date = DateTime.Parse("2018-10-17"), Open = 273.63m, High = 274.32m, Low = 270.82m, Close = 273.64m, Volume = 113378952 }, - new Quote { Date = DateTime.Parse("2018-10-16"), Open = 269.88m, High = 274.00m, Low = 269.37m, Close = 273.59m, Volume = 121198672 }, - new Quote { Date = DateTime.Parse("2018-10-15"), Open = 268.86m, High = 270.31m, Low = 267.64m, Close = 267.74m, Volume = 104808584 }, - new Quote { Date = DateTime.Parse("2018-10-12"), Open = 270.05m, High = 270.36m, Low = 265.76m, Close = 269.25m, Volume = 187745152 }, - new Quote { Date = DateTime.Parse("2018-10-11"), Open = 270.35m, High = 272.13m, Low = 263.80m, Close = 265.56m, Volume = 281680000 }, - new Quote { Date = DateTime.Parse("2018-10-10"), Open = 279.87m, High = 279.94m, Low = 271.13m, Close = 271.54m, Volume = 220074688 }, - new Quote { Date = DateTime.Parse("2018-10-09"), Open = 280.41m, High = 281.85m, Low = 279.81m, Close = 280.42m, Volume = 76188928 }, - new Quote { Date = DateTime.Parse("2018-10-08"), Open = 280.08m, High = 281.22m, Low = 278.57m, Close = 280.83m, Volume = 89925664 }, - new Quote { Date = DateTime.Parse("2018-10-05"), Open = 282.66m, High = 283.22m, Low = 279.27m, Close = 280.83m, Volume = 108588344 }, - new Quote { Date = DateTime.Parse("2018-10-04"), Open = 284.11m, High = 284.17m, Low = 280.68m, Close = 282.41m, Volume = 114321768 }, - new Quote { Date = DateTime.Parse("2018-10-03"), Open = 285.63m, High = 286.09m, Low = 284.25m, Close = 284.64m, Volume = 66304540 }, - new Quote { Date = DateTime.Parse("2018-10-02"), Open = 284.48m, High = 285.26m, Low = 284.07m, Close = 284.48m, Volume = 48434264 }, - new Quote { Date = DateTime.Parse("2018-10-01"), Open = 285.02m, High = 285.82m, Low = 283.91m, Close = 284.65m, Volume = 63623792 }, - new Quote { Date = DateTime.Parse("2018-09-28"), Open = 282.95m, High = 284.21m, Low = 282.91m, Close = 283.66m, Volume = 71835632 }, - new Quote { Date = DateTime.Parse("2018-09-27"), Open = 283.36m, High = 284.82m, Low = 283.06m, Close = 283.63m, Volume = 60723896 }, - new Quote { Date = DateTime.Parse("2018-09-26"), Open = 283.85m, High = 285.14m, Low = 282.38m, Close = 282.84m, Volume = 81724024 }, - new Quote { Date = DateTime.Parse("2018-09-25"), Open = 284.45m, High = 284.57m, Low = 283.43m, Close = 283.69m, Volume = 45474200 }, - new Quote { Date = DateTime.Parse("2018-09-24"), Open = 284.27m, High = 284.42m, Low = 283.32m, Close = 283.95m, Volume = 54738760 }, - new Quote { Date = DateTime.Parse("2018-09-21"), Open = 285.97m, High = 286.10m, Low = 284.72m, Close = 284.90m, Volume = 108104552 }, - new Quote { Date = DateTime.Parse("2018-09-20"), Open = 284.25m, High = 285.51m, Low = 282.88m, Close = 285.16m, Volume = 103323632 }, - new Quote { Date = DateTime.Parse("2018-09-19"), Open = 282.63m, High = 283.33m, Low = 282.48m, Close = 282.87m, Volume = 50529584 }, - new Quote { Date = DateTime.Parse("2018-09-18"), Open = 281.28m, High = 283.22m, Low = 281.25m, Close = 282.57m, Volume = 63758804 }, - new Quote { Date = DateTime.Parse("2018-09-17"), Open = 282.48m, High = 282.52m, Low = 280.74m, Close = 281.04m, Volume = 70258840 }, - new Quote { Date = DateTime.Parse("2018-09-14"), Open = 282.71m, High = 282.92m, Low = 281.68m, Close = 282.54m, Volume = 56706020 }, - new Quote { Date = DateTime.Parse("2018-09-13"), Open = 281.99m, High = 282.69m, Low = 281.68m, Close = 282.49m, Volume = 52540928 }, - new Quote { Date = DateTime.Parse("2018-09-12"), Open = 280.77m, High = 281.49m, Low = 279.96m, Close = 280.83m, Volume = 61576576 }, - new Quote { Date = DateTime.Parse("2018-09-11"), Open = 279.13m, High = 281.25m, Low = 278.75m, Close = 280.76m, Volume = 52022324 }, - new Quote { Date = DateTime.Parse("2018-09-10"), Open = 280.46m, High = 280.75m, Low = 279.62m, Close = 279.84m, Volume = 51693300 }, - new Quote { Date = DateTime.Parse("2018-09-07"), Open = 278.75m, High = 280.42m, Low = 278.49m, Close = 279.35m, Volume = 75695528 }, - new Quote { Date = DateTime.Parse("2018-09-06"), Open = 280.86m, High = 281.19m, Low = 278.77m, Close = 279.90m, Volume = 67855744 }, - new Quote { Date = DateTime.Parse("2018-09-05"), Open = 281.11m, High = 281.33m, Low = 279.63m, Close = 280.74m, Volume = 74591480 }, - new Quote { Date = DateTime.Parse("2018-09-04"), Open = 281.53m, High = 281.89m, Low = 280.40m, Close = 281.50m, Volume = 59294748 }, - new Quote { Date = DateTime.Parse("2018-08-31"), Open = 281.53m, High = 282.47m, Low = 280.99m, Close = 281.98m, Volume = 68093544 }, - new Quote { Date = DateTime.Parse("2018-08-30"), Open = 282.60m, High = 283.00m, Low = 281.32m, Close = 281.98m, Volume = 63037208 }, - new Quote { Date = DateTime.Parse("2018-08-29"), Open = 281.84m, High = 283.37m, Low = 281.57m, Close = 283.12m, Volume = 63300776 }, - new Quote { Date = DateTime.Parse("2018-08-28"), Open = 281.98m, High = 282.09m, Low = 281.10m, Close = 281.61m, Volume = 48329404 }, - new Quote { Date = DateTime.Parse("2018-08-27"), Open = 280.58m, High = 281.59m, Low = 280.40m, Close = 281.47m, Volume = 58757348 }, - new Quote { Date = DateTime.Parse("2018-08-24"), Open = 278.23m, High = 279.42m, Low = 278.17m, Close = 279.27m, Volume = 59184624 }, - new Quote { Date = DateTime.Parse("2018-08-23"), Open = 277.77m, High = 278.71m, Low = 277.24m, Close = 277.59m, Volume = 50657548 }, - new Quote { Date = DateTime.Parse("2018-08-22"), Open = 277.68m, High = 278.54m, Low = 277.39m, Close = 277.96m, Volume = 46321688 }, - new Quote { Date = DateTime.Parse("2018-08-21"), Open = 278.04m, High = 279.07m, Low = 277.52m, Close = 278.13m, Volume = 69258080 }, - new Quote { Date = DateTime.Parse("2018-08-20"), Open = 277.38m, High = 277.77m, Low = 276.89m, Close = 277.48m, Volume = 40982744 }, - new Quote { Date = DateTime.Parse("2018-08-17"), Open = 275.69m, High = 277.37m, Low = 275.24m, Close = 276.89m, Volume = 67555760 }, - new Quote { Date = DateTime.Parse("2018-08-16"), Open = 275.27m, High = 276.87m, Low = 275.23m, Close = 275.91m, Volume = 72033608 }, - new Quote { Date = DateTime.Parse("2018-08-15"), Open = 274.28m, High = 274.44m, Low = 272.13m, Close = 273.70m, Volume = 105964064 }, - new Quote { Date = DateTime.Parse("2018-08-14"), Open = 274.81m, High = 276.02m, Low = 274.38m, Close = 275.76m, Volume = 45136396 }, - new Quote { Date = DateTime.Parse("2018-08-13"), Open = 275.34m, High = 276.01m, Low = 273.69m, Close = 274.01m, Volume = 67673568 }, - new Quote { Date = DateTime.Parse("2018-08-10"), Open = 275.32m, High = 275.91m, Low = 274.26m, Close = 275.04m, Volume = 79351592 }, - new Quote { Date = DateTime.Parse("2018-08-09"), Open = 277.34m, High = 277.77m, Low = 276.74m, Close = 276.90m, Volume = 36771464 }, - new Quote { Date = DateTime.Parse("2018-08-08"), Open = 277.21m, High = 277.71m, Low = 276.77m, Close = 277.27m, Volume = 43357916 }, - new Quote { Date = DateTime.Parse("2018-08-07"), Open = 277.21m, High = 277.81m, Low = 277.06m, Close = 277.39m, Volume = 44471960 }, - new Quote { Date = DateTime.Parse("2018-08-06"), Open = 275.51m, High = 276.82m, Low = 275.08m, Close = 276.48m, Volume = 40564136 }, - new Quote { Date = DateTime.Parse("2018-08-03"), Open = 274.43m, High = 275.52m, Low = 274.23m, Close = 275.47m, Volume = 55527740 }, - new Quote { Date = DateTime.Parse("2018-08-02"), Open = 271.38m, High = 274.48m, Low = 271.15m, Close = 274.29m, Volume = 65298924 }, - new Quote { Date = DateTime.Parse("2018-08-01"), Open = 273.49m, High = 274.04m, Low = 272.10m, Close = 272.81m, Volume = 55443260 }, - new Quote { Date = DateTime.Parse("2018-07-31"), Open = 272.76m, High = 273.93m, Low = 272.34m, Close = 273.26m, Volume = 70594928 }, - new Quote { Date = DateTime.Parse("2018-07-30"), Open = 273.44m, High = 273.61m, Low = 271.35m, Close = 271.92m, Volume = 65624404 }, - new Quote { Date = DateTime.Parse("2018-07-27"), Open = 275.57m, High = 275.68m, Low = 272.34m, Close = 273.35m, Volume = 79050080 }, - new Quote { Date = DateTime.Parse("2018-07-26"), Open = 275.08m, High = 275.96m, Low = 274.97m, Close = 275.21m, Volume = 59629476 }, - new Quote { Date = DateTime.Parse("2018-07-25"), Open = 273.26m, High = 276.22m, Low = 273.21m, Close = 275.87m, Volume = 81211824 }, - new Quote { Date = DateTime.Parse("2018-07-24"), Open = 273.71m, High = 274.46m, Low = 272.58m, Close = 273.53m, Volume = 70035320 }, - new Quote { Date = DateTime.Parse("2018-07-23"), Open = 271.44m, High = 272.39m, Low = 271.06m, Close = 272.16m, Volume = 48436568 }, - new Quote { Date = DateTime.Parse("2018-07-20"), Open = 271.75m, High = 272.44m, Low = 271.48m, Close = 271.66m, Volume = 84804656 }, - new Quote { Date = DateTime.Parse("2018-07-19"), Open = 272.27m, High = 272.69m, Low = 271.45m, Close = 271.97m, Volume = 63225212 }, - new Quote { Date = DateTime.Parse("2018-07-18"), Open = 272.51m, High = 273.12m, Low = 272.03m, Close = 273.00m, Volume = 45910016 }, - new Quote { Date = DateTime.Parse("2018-07-17"), Open = 270.48m, High = 272.85m, Low = 270.43m, Close = 272.43m, Volume = 53860032 }, - new Quote { Date = DateTime.Parse("2018-07-16"), Open = 271.62m, High = 271.78m, Low = 270.84m, Close = 271.33m, Volume = 49624096 }, - new Quote { Date = DateTime.Parse("2018-07-13"), Open = 271.16m, High = 271.90m, Low = 270.67m, Close = 271.57m, Volume = 49659024 }, - new Quote { Date = DateTime.Parse("2018-07-12"), Open = 270.30m, High = 271.42m, Low = 269.64m, Close = 271.36m, Volume = 61899772 }, - new Quote { Date = DateTime.Parse("2018-07-11"), Open = 269.20m, High = 270.07m, Low = 268.59m, Close = 268.92m, Volume = 79329656 }, - new Quote { Date = DateTime.Parse("2018-07-10"), Open = 270.43m, High = 271.01m, Low = 270.11m, Close = 270.90m, Volume = 53501064 }, - new Quote { Date = DateTime.Parse("2018-07-09"), Open = 268.62m, High = 269.99m, Low = 268.57m, Close = 269.93m, Volume = 52042820 }, - new Quote { Date = DateTime.Parse("2018-07-06"), Open = 265.31m, High = 267.93m, Low = 264.89m, Close = 267.52m, Volume = 68456816 }, - new Quote { Date = DateTime.Parse("2018-07-05"), Open = 264.36m, High = 265.35m, Low = 263.19m, Close = 265.28m, Volume = 58606568 }, - new Quote { Date = DateTime.Parse("2018-07-03"), Open = 265.05m, High = 265.15m, Low = 262.67m, Close = 263.13m, Volume = 43432576 }, - new Quote { Date = DateTime.Parse("2018-07-02"), Open = 261.78m, High = 264.24m, Low = 261.52m, Close = 264.06m, Volume = 65431128 }, - new Quote { Date = DateTime.Parse("2018-06-29"), Open = 264.32m, High = 265.81m, Low = 263.37m, Close = 263.50m, Volume = 100473760 }, - new Quote { Date = DateTime.Parse("2018-06-28"), Open = 261.57m, High = 263.96m, Low = 260.79m, Close = 263.12m, Volume = 78913504 }, - new Quote { Date = DateTime.Parse("2018-06-27"), Open = 264.45m, High = 266.01m, Low = 261.46m, Close = 261.63m, Volume = 108213904 }, - new Quote { Date = DateTime.Parse("2018-06-26"), Open = 263.85m, High = 264.74m, Low = 263.02m, Close = 263.81m, Volume = 70710976 }, - new Quote { Date = DateTime.Parse("2018-06-25"), Open = 265.60m, High = 265.77m, Low = 261.38m, Close = 263.23m, Volume = 141924096 }, - new Quote { Date = DateTime.Parse("2018-06-22"), Open = 267.76m, High = 267.88m, Low = 266.62m, Close = 266.86m, Volume = 58283384 }, - new Quote { Date = DateTime.Parse("2018-06-21"), Open = 268.05m, High = 268.07m, Low = 265.83m, Close = 266.38m, Volume = 73159376 }, - new Quote { Date = DateTime.Parse("2018-06-20"), Open = 268.35m, High = 268.78m, Low = 267.69m, Close = 268.06m, Volume = 55373416 }, - new Quote { Date = DateTime.Parse("2018-06-19"), Open = 266.14m, High = 267.84m, Low = 265.69m, Close = 267.60m, Volume = 100410976 }, - new Quote { Date = DateTime.Parse("2018-06-18"), Open = 267.59m, High = 268.77m, Low = 267.07m, Close = 268.63m, Volume = 54479888 }, - new Quote { Date = DateTime.Parse("2018-06-15"), Open = 268.67m, High = 269.55m, Low = 267.45m, Close = 269.18m, Volume = 123585600 }, - new Quote { Date = DateTime.Parse("2018-06-14"), Open = 269.80m, High = 270.11m, Low = 268.88m, Close = 269.53m, Volume = 79730104 }, - new Quote { Date = DateTime.Parse("2018-06-13"), Open = 269.97m, High = 270.25m, Low = 268.63m, Close = 268.85m, Volume = 81770464 }, - new Quote { Date = DateTime.Parse("2018-06-12"), Open = 269.82m, High = 270.11m, Low = 269.00m, Close = 269.71m, Volume = 74798688 }, - new Quote { Date = DateTime.Parse("2018-06-11"), Open = 269.25m, High = 270.15m, Low = 269.12m, Close = 269.36m, Volume = 60903392 }, - new Quote { Date = DateTime.Parse("2018-06-08"), Open = 267.71m, High = 269.06m, Low = 267.53m, Close = 269.00m, Volume = 74602920 }, - new Quote { Date = DateTime.Parse("2018-06-07"), Open = 268.77m, High = 269.09m, Low = 267.22m, Close = 268.21m, Volume = 75460928 }, - new Quote { Date = DateTime.Parse("2018-06-06"), Open = 266.68m, High = 268.36m, Low = 266.01m, Close = 268.24m, Volume = 64874192 }, - new Quote { Date = DateTime.Parse("2018-06-05"), Open = 265.97m, High = 266.43m, Low = 265.13m, Close = 266.02m, Volume = 52881036 }, - new Quote { Date = DateTime.Parse("2018-06-04"), Open = 265.47m, High = 266.10m, Low = 265.20m, Close = 265.82m, Volume = 46934832 }, - new Quote { Date = DateTime.Parse("2018-06-01"), Open = 263.42m, High = 264.90m, Low = 263.34m, Close = 264.57m, Volume = 73691520 }, - new Quote { Date = DateTime.Parse("2018-05-31"), Open = 263.16m, High = 263.49m, Low = 261.33m, Close = 261.99m, Volume = 96713160 }, - new Quote { Date = DateTime.Parse("2018-05-30"), Open = 261.57m, High = 264.09m, Low = 261.49m, Close = 263.61m, Volume = 72057608 }, - new Quote { Date = DateTime.Parse("2018-05-29"), Open = 261.39m, High = 262.22m, Low = 258.92m, Close = 260.14m, Volume = 119866288 }, - new Quote { Date = DateTime.Parse("2018-05-25"), Open = 263.16m, High = 263.85m, Low = 262.61m, Close = 263.16m, Volume = 58299660 }, - new Quote { Date = DateTime.Parse("2018-05-24"), Open = 263.90m, High = 264.20m, Low = 261.84m, Close = 263.79m, Volume = 78640328 }, - new Quote { Date = DateTime.Parse("2018-05-23"), Open = 262.22m, High = 264.36m, Low = 262.04m, Close = 264.33m, Volume = 66903156 }, - new Quote { Date = DateTime.Parse("2018-05-22"), Open = 264.91m, High = 265.20m, Low = 263.25m, Close = 263.61m, Volume = 54774884 }, - new Quote { Date = DateTime.Parse("2018-05-21"), Open = 264.00m, High = 264.93m, Low = 262.39m, Close = 264.34m, Volume = 60007156 }, - new Quote { Date = DateTime.Parse("2018-05-18"), Open = 262.65m, High = 263.05m, Low = 261.98m, Close = 262.37m, Volume = 66565792 }, - new Quote { Date = DateTime.Parse("2018-05-17"), Open = 262.96m, High = 264.21m, Low = 262.18m, Close = 263.03m, Volume = 58466824 }, - new Quote { Date = DateTime.Parse("2018-05-16"), Open = 262.19m, High = 263.75m, Low = 262.16m, Close = 263.25m, Volume = 55784492 }, - new Quote { Date = DateTime.Parse("2018-05-15"), Open = 262.62m, High = 262.64m, Low = 261.11m, Close = 262.15m, Volume = 90007968 }, - new Quote { Date = DateTime.Parse("2018-05-14"), Open = 264.31m, High = 265.03m, Low = 263.37m, Close = 263.97m, Volume = 56661420 }, - new Quote { Date = DateTime.Parse("2018-05-11"), Open = 263.17m, High = 264.13m, Low = 262.61m, Close = 263.84m, Volume = 61915812 }, - new Quote { Date = DateTime.Parse("2018-05-10"), Open = 261.41m, High = 263.40m, Low = 261.30m, Close = 263.04m, Volume = 74524544 }, - new Quote { Date = DateTime.Parse("2018-05-09"), Open = 258.84m, High = 260.95m, Low = 258.27m, Close = 260.60m, Volume = 61703432 }, - new Quote { Date = DateTime.Parse("2018-05-08"), Open = 257.70m, High = 258.50m, Low = 256.40m, Close = 258.11m, Volume = 69804000 }, - new Quote { Date = DateTime.Parse("2018-05-07"), Open = 258.08m, High = 259.17m, Low = 257.32m, Close = 258.11m, Volume = 57193284 }, - new Quote { Date = DateTime.Parse("2018-05-04"), Open = 252.89m, High = 257.98m, Low = 252.53m, Close = 257.24m, Volume = 94336840 }, - new Quote { Date = DateTime.Parse("2018-05-03"), Open = 253.60m, High = 254.66m, Low = 250.50m, Close = 253.95m, Volume = 140965808 }, - new Quote { Date = DateTime.Parse("2018-05-02"), Open = 256.02m, High = 256.91m, Low = 254.08m, Close = 254.51m, Volume = 89317992 }, - new Quote { Date = DateTime.Parse("2018-05-01"), Open = 255.16m, High = 256.35m, Low = 253.46m, Close = 256.23m, Volume = 76737024 }, - new Quote { Date = DateTime.Parse("2018-04-30"), Open = 258.44m, High = 259.04m, Low = 255.70m, Close = 255.78m, Volume = 84988424 }, - new Quote { Date = DateTime.Parse("2018-04-27"), Open = 258.18m, High = 258.51m, Low = 256.73m, Close = 257.76m, Volume = 59001736 }, - new Quote { Date = DateTime.Parse("2018-04-26"), Open = 256.05m, High = 258.42m, Low = 255.56m, Close = 257.52m, Volume = 70044640 }, - new Quote { Date = DateTime.Parse("2018-04-25"), Open = 254.23m, High = 255.41m, Low = 252.24m, Close = 254.93m, Volume = 107386584 }, - new Quote { Date = DateTime.Parse("2018-04-24"), Open = 258.89m, High = 259.13m, Low = 252.65m, Close = 254.30m, Volume = 116739904 }, - new Quote { Date = DateTime.Parse("2018-04-23"), Open = 258.44m, High = 259.04m, Low = 256.59m, Close = 257.77m, Volume = 67796416 }, - new Quote { Date = DateTime.Parse("2018-04-20"), Open = 259.93m, High = 260.18m, Low = 256.84m, Close = 257.81m, Volume = 103366016 }, - new Quote { Date = DateTime.Parse("2018-04-19"), Open = 260.75m, High = 260.97m, Low = 258.88m, Close = 260.01m, Volume = 80307456 }, - new Quote { Date = DateTime.Parse("2018-04-18"), Open = 261.75m, High = 262.34m, Low = 260.96m, Close = 261.46m, Volume = 59260488 }, - new Quote { Date = DateTime.Parse("2018-04-17"), Open = 260.44m, High = 261.93m, Low = 259.88m, Close = 261.27m, Volume = 66890592 }, - new Quote { Date = DateTime.Parse("2018-04-16"), Open = 258.18m, High = 259.34m, Low = 257.29m, Close = 258.50m, Volume = 65570252 }, - new Quote { Date = DateTime.Parse("2018-04-13"), Open = 258.58m, High = 258.71m, Low = 255.29m, Close = 256.40m, Volume = 87984192 }, - new Quote { Date = DateTime.Parse("2018-04-12"), Open = 256.50m, High = 258.18m, Low = 256.31m, Close = 257.15m, Volume = 71242736 }, - new Quote { Date = DateTime.Parse("2018-04-11"), Open = 254.77m, High = 256.87m, Low = 254.69m, Close = 255.05m, Volume = 94252208 }, - new Quote { Date = DateTime.Parse("2018-04-10"), Open = 255.54m, High = 257.26m, Low = 254.30m, Close = 256.40m, Volume = 109178536 }, - new Quote { Date = DateTime.Parse("2018-04-09"), Open = 252.74m, High = 256.10m, Low = 251.35m, Close = 252.38m, Volume = 109043264 }, - new Quote { Date = DateTime.Parse("2018-04-06"), Open = 254.72m, High = 256.36m, Low = 249.48m, Close = 251.14m, Volume = 185650928 }, - new Quote { Date = DateTime.Parse("2018-04-05"), Open = 256.78m, High = 257.84m, Low = 255.59m, Close = 256.87m, Volume = 85474776 }, - new Quote { Date = DateTime.Parse("2018-04-04"), Open = 248.27m, High = 255.63m, Low = 248.13m, Close = 254.86m, Volume = 127939576 }, - new Quote { Date = DateTime.Parse("2018-04-03"), Open = 250.32m, High = 252.68m, Low = 248.36m, Close = 252.16m, Volume = 124052768 }, - new Quote { Date = DateTime.Parse("2018-04-02"), Open = 253.88m, High = 254.44m, Low = 246.26m, Close = 248.97m, Volume = 192647056 }, - new Quote { Date = DateTime.Parse("2018-03-29"), Open = 252.50m, High = 256.50m, Low = 251.26m, Close = 254.46m, Volume = 128487112 }, - new Quote { Date = DateTime.Parse("2018-03-28"), Open = 252.14m, High = 253.97m, Low = 250.04m, Close = 251.25m, Volume = 151452896 }, - new Quote { Date = DateTime.Parse("2018-03-27"), Open = 257.38m, High = 257.96m, Low = 250.29m, Close = 252.00m, Volume = 134378272 }, - new Quote { Date = DateTime.Parse("2018-03-26"), Open = 253.48m, High = 256.67m, Low = 250.84m, Close = 256.36m, Volume = 146803168 }, - new Quote { Date = DateTime.Parse("2018-03-23"), Open = 255.45m, High = 256.27m, Low = 249.32m, Close = 249.53m, Volume = 189801520 }, - new Quote { Date = DateTime.Parse("2018-03-22"), Open = 259.06m, High = 259.99m, Low = 254.66m, Close = 254.96m, Volume = 153866192 }, - new Quote { Date = DateTime.Parse("2018-03-21"), Open = 261.96m, High = 264.25m, Low = 261.27m, Close = 261.50m, Volume = 81397104 }, - new Quote { Date = DateTime.Parse("2018-03-20"), Open = 261.99m, High = 262.70m, Low = 261.26m, Close = 262.00m, Volume = 61797672 }, - new Quote { Date = DateTime.Parse("2018-03-19"), Open = 264.32m, High = 265.34m, Low = 259.75m, Close = 261.56m, Volume = 112937344 }, - new Quote { Date = DateTime.Parse("2018-03-16"), Open = 265.44m, High = 266.30m, Low = 265.09m, Close = 265.15m, Volume = 103769888 }, - new Quote { Date = DateTime.Parse("2018-03-15"), Open = 265.71m, High = 266.41m, Low = 264.31m, Close = 264.86m, Volume = 86627344 }, - new Quote { Date = DateTime.Parse("2018-03-14"), Open = 267.57m, High = 267.77m, Low = 264.54m, Close = 265.15m, Volume = 109949368 }, - new Quote { Date = DateTime.Parse("2018-03-13"), Open = 269.52m, High = 270.07m, Low = 265.85m, Close = 266.52m, Volume = 95490048 }, - new Quote { Date = DateTime.Parse("2018-03-12"), Open = 268.90m, High = 269.59m, Low = 267.83m, Close = 268.25m, Volume = 74678496 }, - new Quote { Date = DateTime.Parse("2018-03-09"), Open = 265.53m, High = 268.59m, Low = 265.19m, Close = 268.59m, Volume = 117975584 }, - new Quote { Date = DateTime.Parse("2018-03-08"), Open = 263.46m, High = 264.13m, Low = 262.37m, Close = 263.99m, Volume = 69462520 }, - new Quote { Date = DateTime.Parse("2018-03-07"), Open = 260.45m, High = 263.11m, Low = 260.24m, Close = 262.72m, Volume = 90396808 }, - new Quote { Date = DateTime.Parse("2018-03-06"), Open = 263.22m, High = 263.31m, Low = 261.18m, Close = 262.82m, Volume = 82245904 }, - new Quote { Date = DateTime.Parse("2018-03-05"), Open = 257.86m, High = 262.83m, Low = 257.74m, Close = 262.15m, Volume = 101032888 }, - new Quote { Date = DateTime.Parse("2018-03-02"), Open = 256.00m, High = 259.77m, Low = 255.05m, Close = 259.16m, Volume = 144408144 }, - new Quote { Date = DateTime.Parse("2018-03-01"), Open = 261.40m, High = 263.10m, Low = 256.19m, Close = 257.83m, Volume = 183626128 }, - new Quote { Date = DateTime.Parse("2018-02-28"), Open = 265.51m, High = 266.01m, Low = 261.29m, Close = 261.63m, Volume = 126575120 }, - new Quote { Date = DateTime.Parse("2018-02-27"), Open = 267.86m, High = 268.63m, Low = 264.24m, Close = 264.31m, Volume = 102893264 }, - new Quote { Date = DateTime.Parse("2018-02-26"), Open = 265.76m, High = 267.76m, Low = 265.11m, Close = 267.65m, Volume = 89802808 }, - new Quote { Date = DateTime.Parse("2018-02-23"), Open = 261.77m, High = 264.58m, Low = 261.25m, Close = 264.58m, Volume = 96318072 }, - new Quote { Date = DateTime.Parse("2018-02-22"), Open = 261.10m, High = 262.98m, Low = 259.70m, Close = 260.43m, Volume = 114742312 }, - new Quote { Date = DateTime.Parse("2018-02-21"), Open = 261.87m, High = 264.59m, Low = 259.99m, Close = 260.09m, Volume = 102669592 }, - new Quote { Date = DateTime.Parse("2018-02-20"), Open = 262.00m, High = 263.58m, Low = 260.53m, Close = 261.39m, Volume = 89676400 }, - new Quote { Date = DateTime.Parse("2018-02-16"), Open = 262.28m, High = 265.17m, Low = 262.23m, Close = 263.04m, Volume = 166561968 }, - new Quote { Date = DateTime.Parse("2018-02-15"), Open = 261.56m, High = 262.97m, Low = 258.86m, Close = 262.96m, Volume = 115457688 }, - new Quote { Date = DateTime.Parse("2018-02-14"), Open = 254.56m, High = 260.04m, Low = 254.55m, Close = 259.65m, Volume = 125358160 }, - new Quote { Date = DateTime.Parse("2018-02-13"), Open = 254.24m, High = 256.79m, Low = 253.60m, Close = 256.19m, Volume = 84333360 }, - new Quote { Date = DateTime.Parse("2018-02-12"), Open = 254.10m, High = 257.16m, Low = 252.02m, Close = 255.56m, Volume = 149239040 }, - new Quote { Date = DateTime.Parse("2018-02-09"), Open = 251.18m, High = 253.89m, Low = 243.59m, Close = 251.86m, Volume = 294421856 }, - new Quote { Date = DateTime.Parse("2018-02-08"), Open = 258.13m, High = 258.28m, Low = 248.09m, Close = 248.13m, Volume = 255885040 }, - new Quote { Date = DateTime.Parse("2018-02-07"), Open = 258.60m, High = 262.32m, Low = 257.71m, Close = 257.80m, Volume = 173784240 }, - new Quote { Date = DateTime.Parse("2018-02-06"), Open = 250.35m, High = 259.76m, Low = 249.16m, Close = 259.21m, Volume = 368619296 }, - new Quote { Date = DateTime.Parse("2018-02-05"), Open = 263.37m, High = 265.68m, Low = 253.60m, Close = 254.20m, Volume = 305963968 }, - new Quote { Date = DateTime.Parse("2018-02-02"), Open = 269.75m, High = 269.90m, Low = 265.25m, Close = 265.29m, Volume = 179804944 }, - new Quote { Date = DateTime.Parse("2018-02-01"), Open = 270.71m, High = 272.62m, Low = 270.33m, Close = 271.20m, Volume = 93552120 }, - new Quote { Date = DateTime.Parse("2018-01-31"), Open = 272.30m, High = 272.85m, Low = 270.33m, Close = 271.51m, Volume = 123502168 }, - new Quote { Date = DateTime.Parse("2018-01-30"), Open = 272.18m, High = 274.24m, Low = 270.85m, Close = 271.37m, Volume = 136842368 }, - new Quote { Date = DateTime.Parse("2018-01-29"), Open = 275.39m, High = 275.87m, Low = 274.01m, Close = 274.18m, Volume = 93568600 }, - new Quote { Date = DateTime.Parse("2018-01-26"), Open = 273.77m, High = 276.06m, Low = 273.49m, Close = 276.01m, Volume = 111868160 }, - new Quote { Date = DateTime.Parse("2018-01-25"), Open = 273.68m, High = 273.79m, Low = 271.99m, Close = 272.85m, Volume = 87825816 }, - new Quote { Date = DateTime.Parse("2018-01-24"), Open = 273.55m, High = 274.20m, Low = 271.45m, Close = 272.74m, Volume = 139977680 }, - new Quote { Date = DateTime.Parse("2018-01-23"), Open = 272.31m, High = 273.16m, Low = 271.96m, Close = 272.84m, Volume = 100801672 }, - new Quote { Date = DateTime.Parse("2018-01-22"), Open = 269.84m, High = 272.27m, Low = 269.78m, Close = 272.27m, Volume = 94818768 }, - new Quote { Date = DateTime.Parse("2018-01-19"), Open = 269.48m, High = 270.07m, Low = 268.85m, Close = 270.07m, Volume = 146315344 }, - new Quote { Date = DateTime.Parse("2018-01-18"), Open = 269.17m, High = 269.64m, Low = 268.31m, Close = 268.85m, Volume = 104584464 }, - new Quote { Date = DateTime.Parse("2018-01-17"), Open = 267.78m, High = 269.72m, Low = 266.76m, Close = 269.30m, Volume = 117595008 }, - new Quote { Date = DateTime.Parse("2018-01-16"), Open = 269.05m, High = 269.76m, Low = 266.00m, Close = 266.76m, Volume = 110634704 }, - new Quote { Date = DateTime.Parse("2018-01-12"), Open = 266.23m, High = 267.86m, Low = 265.90m, Close = 267.67m, Volume = 94293048 }, - new Quote { Date = DateTime.Parse("2018-01-11"), Open = 264.62m, High = 265.94m, Low = 264.44m, Close = 265.94m, Volume = 64749016 }, - new Quote { Date = DateTime.Parse("2018-01-10"), Open = 263.59m, High = 264.30m, Low = 262.86m, Close = 264.01m, Volume = 72238032 }, - new Quote { Date = DateTime.Parse("2018-01-09"), Open = 264.28m, High = 265.10m, Low = 263.97m, Close = 264.42m, Volume = 59445976 }, - new Quote { Date = DateTime.Parse("2018-01-08"), Open = 263.23m, High = 263.99m, Low = 262.91m, Close = 263.82m, Volume = 59513708 }, - new Quote { Date = DateTime.Parse("2018-01-05"), Open = 262.46m, High = 263.47m, Low = 261.92m, Close = 263.34m, Volume = 86721784 }, - new Quote { Date = DateTime.Parse("2018-01-04"), Open = 261.20m, High = 262.12m, Low = 260.57m, Close = 261.59m, Volume = 83723648 }, - new Quote { Date = DateTime.Parse("2018-01-03"), Open = 259.04m, High = 260.66m, Low = 259.04m, Close = 260.50m, Volume = 93518840 }, - new Quote { Date = DateTime.Parse("2018-01-02"), Open = 257.96m, High = 258.90m, Low = 257.54m, Close = 258.86m, Volume = 89973440 }, - new Quote { Date = DateTime.Parse("2017-12-29"), Open = 258.63m, High = 258.65m, Low = 256.81m, Close = 257.02m, Volume = 99683152 }, - new Quote { Date = DateTime.Parse("2017-12-28"), Open = 258.01m, High = 258.04m, Low = 257.59m, Close = 257.99m, Volume = 46843448 }, - new Quote { Date = DateTime.Parse("2017-12-27"), Open = 257.52m, High = 257.86m, Low = 257.16m, Close = 257.46m, Volume = 59962032 }, - new Quote { Date = DateTime.Parse("2017-12-26"), Open = 257.20m, High = 257.58m, Low = 257.04m, Close = 257.34m, Volume = 46976656 }, - new Quote { Date = DateTime.Parse("2017-12-22"), Open = 257.73m, High = 257.77m, Low = 257.06m, Close = 257.65m, Volume = 81734768 }, - new Quote { Date = DateTime.Parse("2017-12-21"), Open = 257.87m, High = 258.49m, Low = 257.44m, Close = 257.71m, Volume = 69598728 }, - new Quote { Date = DateTime.Parse("2017-12-20"), Open = 258.38m, High = 258.44m, Low = 256.86m, Close = 257.18m, Volume = 79690000 }, - new Quote { Date = DateTime.Parse("2017-12-19"), Open = 258.58m, High = 258.63m, Low = 257.24m, Close = 257.32m, Volume = 85536976 }, - new Quote { Date = DateTime.Parse("2017-12-18"), Open = 258.21m, High = 258.70m, Low = 258.10m, Close = 258.31m, Volume = 86856320 }, - new Quote { Date = DateTime.Parse("2017-12-15"), Open = 255.66m, High = 257.19m, Low = 255.60m, Close = 256.68m, Volume = 150146832 }, - new Quote { Date = DateTime.Parse("2017-12-14"), Open = 255.93m, High = 256.06m, Low = 254.51m, Close = 254.56m, Volume = 105055176 }, - new Quote { Date = DateTime.Parse("2017-12-13"), Open = 255.90m, High = 256.38m, Low = 255.51m, Close = 255.61m, Volume = 107391488 }, - new Quote { Date = DateTime.Parse("2017-12-12"), Open = 255.43m, High = 256.15m, Low = 255.22m, Close = 255.64m, Volume = 88909792 }, - new Quote { Date = DateTime.Parse("2017-12-11"), Open = 254.49m, High = 255.25m, Low = 254.39m, Close = 255.19m, Volume = 86699232 }, - new Quote { Date = DateTime.Parse("2017-12-08"), Open = 253.92m, High = 254.43m, Low = 253.00m, Close = 254.42m, Volume = 79901608 }, - new Quote { Date = DateTime.Parse("2017-12-07"), Open = 252.10m, High = 253.38m, Low = 251.96m, Close = 253.04m, Volume = 80584848 }, - new Quote { Date = DateTime.Parse("2017-12-06"), Open = 251.89m, High = 252.71m, Low = 251.74m, Close = 252.24m, Volume = 79207304 }, - new Quote { Date = DateTime.Parse("2017-12-05"), Open = 253.38m, High = 254.07m, Low = 252.05m, Close = 252.20m, Volume = 81394656 }, - new Quote { Date = DateTime.Parse("2017-12-04"), Open = 255.19m, High = 255.65m, Low = 253.05m, Close = 253.11m, Volume = 98140184 }, - new Quote { Date = DateTime.Parse("2017-12-01"), Open = 253.70m, High = 254.23m, Low = 249.87m, Close = 253.41m, Volume = 171557392 }, - new Quote { Date = DateTime.Parse("2017-11-30"), Open = 252.74m, High = 254.94m, Low = 252.66m, Close = 253.94m, Volume = 133469840 }, - new Quote { Date = DateTime.Parse("2017-11-29"), Open = 252.03m, High = 252.62m, Low = 251.25m, Close = 251.74m, Volume = 80891176 }, - new Quote { Date = DateTime.Parse("2017-11-28"), Open = 249.87m, High = 251.92m, Low = 249.77m, Close = 251.89m, Volume = 103286312 }, - new Quote { Date = DateTime.Parse("2017-11-27"), Open = 249.53m, High = 249.86m, Low = 249.14m, Close = 249.36m, Volume = 54553804 }, - new Quote { Date = DateTime.Parse("2017-11-24"), Open = 249.45m, High = 249.60m, Low = 249.29m, Close = 249.48m, Volume = 29070892 }, - new Quote { Date = DateTime.Parse("2017-11-22"), Open = 249.14m, High = 249.28m, Low = 248.73m, Close = 248.91m, Volume = 46996584 }, - new Quote { Date = DateTime.Parse("2017-11-21"), Open = 248.35m, High = 249.33m, Low = 247.47m, Close = 249.13m, Volume = 72192504 }, - new Quote { Date = DateTime.Parse("2017-11-20"), Open = 247.36m, High = 247.73m, Low = 247.09m, Close = 247.51m, Volume = 50171324 }, - new Quote { Date = DateTime.Parse("2017-11-17"), Open = 247.43m, High = 247.79m, Low = 247.00m, Close = 247.09m, Volume = 79059392 }, - new Quote { Date = DateTime.Parse("2017-11-16"), Open = 246.76m, High = 248.22m, Low = 246.72m, Close = 247.82m, Volume = 70731712 }, - new Quote { Date = DateTime.Parse("2017-11-15"), Open = 245.90m, High = 246.48m, Low = 244.95m, Close = 245.73m, Volume = 84334432 }, - new Quote { Date = DateTime.Parse("2017-11-14"), Open = 246.66m, High = 247.08m, Low = 245.80m, Close = 246.96m, Volume = 63988136 }, - new Quote { Date = DateTime.Parse("2017-11-13"), Open = 246.56m, High = 247.79m, Low = 246.52m, Close = 247.54m, Volume = 52418324 }, - new Quote { Date = DateTime.Parse("2017-11-10"), Open = 246.96m, High = 247.50m, Low = 246.62m, Close = 247.31m, Volume = 62599644 }, - new Quote { Date = DateTime.Parse("2017-11-09"), Open = 246.96m, High = 247.60m, Low = 245.65m, Close = 247.39m, Volume = 99230672 }, - new Quote { Date = DateTime.Parse("2017-11-08"), Open = 247.67m, High = 248.39m, Low = 247.37m, Close = 248.29m, Volume = 52669760 }, - new Quote { Date = DateTime.Parse("2017-11-07"), Open = 248.15m, High = 248.52m, Low = 247.31m, Close = 247.86m, Volume = 60008920 }, - new Quote { Date = DateTime.Parse("2017-11-06"), Open = 247.51m, High = 248.18m, Low = 247.43m, Close = 248.04m, Volume = 51817160 }, - new Quote { Date = DateTime.Parse("2017-11-03"), Open = 247.00m, High = 247.70m, Low = 246.55m, Close = 247.65m, Volume = 62187496 }, - new Quote { Date = DateTime.Parse("2017-11-02"), Open = 246.66m, High = 246.98m, Low = 245.49m, Close = 246.83m, Volume = 58910404 }, - new Quote { Date = DateTime.Parse("2017-11-01"), Open = 247.26m, High = 247.63m, Low = 246.33m, Close = 246.73m, Volume = 56565660 }, - new Quote { Date = DateTime.Parse("2017-10-31"), Open = 246.44m, High = 246.69m, Low = 246.08m, Close = 246.41m, Volume = 62933720 }, - new Quote { Date = DateTime.Parse("2017-10-30"), Open = 246.33m, High = 246.84m, Low = 245.70m, Close = 246.02m, Volume = 56652224 }, - new Quote { Date = DateTime.Parse("2017-10-27"), Open = 245.76m, High = 247.12m, Low = 244.95m, Close = 246.94m, Volume = 89292576 }, - new Quote { Date = DateTime.Parse("2017-10-26"), Open = 245.30m, High = 245.59m, Low = 244.81m, Close = 244.94m, Volume = 72840760 }, - new Quote { Date = DateTime.Parse("2017-10-25"), Open = 245.48m, High = 245.60m, Low = 243.39m, Close = 244.63m, Volume = 108236672 }, - new Quote { Date = DateTime.Parse("2017-10-24"), Open = 245.88m, High = 246.10m, Low = 245.45m, Close = 245.84m, Volume = 69853928 }, - new Quote { Date = DateTime.Parse("2017-10-23"), Open = 246.72m, High = 246.75m, Low = 245.33m, Close = 245.41m, Volume = 66701640 }, - new Quote { Date = DateTime.Parse("2017-10-20"), Open = 245.98m, High = 246.40m, Low = 245.09m, Close = 246.37m, Volume = 93063952 }, - new Quote { Date = DateTime.Parse("2017-10-19"), Open = 244.18m, High = 245.14m, Low = 243.72m, Close = 245.10m, Volume = 64602432 }, - new Quote { Date = DateTime.Parse("2017-10-18"), Open = 245.21m, High = 245.26m, Low = 244.83m, Close = 245.04m, Volume = 42670820 }, - new Quote { Date = DateTime.Parse("2017-10-17"), Open = 244.57m, High = 244.85m, Low = 244.33m, Close = 244.80m, Volume = 32936836 }, - new Quote { Date = DateTime.Parse("2017-10-16"), Open = 244.55m, High = 244.84m, Low = 244.18m, Close = 244.63m, Volume = 39887916 }, - new Quote { Date = DateTime.Parse("2017-10-13"), Open = 244.48m, High = 244.61m, Low = 244.00m, Close = 244.30m, Volume = 57189416 }, - new Quote { Date = DateTime.Parse("2017-10-12"), Open = 244.02m, High = 244.41m, Low = 243.74m, Close = 244.00m, Volume = 49116908 }, - new Quote { Date = DateTime.Parse("2017-10-11"), Open = 243.88m, High = 244.37m, Low = 243.70m, Close = 244.37m, Volume = 49752644 }, - new Quote { Date = DateTime.Parse("2017-10-10"), Open = 243.96m, High = 244.40m, Low = 243.37m, Close = 243.98m, Volume = 44934412 }, - new Quote { Date = DateTime.Parse("2017-10-09"), Open = 243.99m, High = 244.06m, Low = 243.05m, Close = 243.34m, Volume = 37363944 }, - new Quote { Date = DateTime.Parse("2017-10-06"), Open = 243.53m, High = 244.06m, Low = 243.25m, Close = 243.74m, Volume = 84161696 }, - new Quote { Date = DateTime.Parse("2017-10-05"), Open = 242.95m, High = 244.04m, Low = 242.62m, Close = 244.02m, Volume = 66291980 }, - new Quote { Date = DateTime.Parse("2017-10-04"), Open = 242.13m, High = 242.85m, Low = 242.01m, Close = 242.58m, Volume = 58392872 }, - new Quote { Date = DateTime.Parse("2017-10-03"), Open = 241.91m, High = 242.33m, Low = 241.69m, Close = 242.30m, Volume = 69722704 }, - new Quote { Date = DateTime.Parse("2017-10-02"), Open = 240.98m, High = 241.78m, Low = 240.80m, Close = 241.78m, Volume = 61596044 }, - new Quote { Date = DateTime.Parse("2017-09-29"), Open = 239.88m, High = 240.82m, Low = 239.68m, Close = 240.74m, Volume = 89308704 }, - new Quote { Date = DateTime.Parse("2017-09-28"), Open = 239.30m, High = 239.98m, Low = 239.20m, Close = 239.89m, Volume = 46730936 }, - new Quote { Date = DateTime.Parse("2017-09-27"), Open = 239.44m, High = 240.03m, Low = 238.47m, Close = 239.60m, Volume = 84532616 }, - new Quote { Date = DateTime.Parse("2017-09-26"), Open = 239.00m, High = 239.27m, Low = 238.41m, Close = 238.68m, Volume = 56439616 }, - new Quote { Date = DateTime.Parse("2017-09-25"), Open = 238.74m, High = 239.13m, Low = 237.72m, Close = 238.53m, Volume = 59552032 }, - new Quote { Date = DateTime.Parse("2017-09-22"), Open = 238.65m, High = 239.20m, Low = 238.62m, Close = 239.02m, Volume = 53446664 }, - new Quote { Date = DateTime.Parse("2017-09-21"), Open = 239.44m, High = 239.54m, Low = 238.78m, Close = 238.97m, Volume = 50313136 }, - new Quote { Date = DateTime.Parse("2017-09-20"), Open = 239.62m, High = 239.74m, Low = 238.52m, Close = 239.61m, Volume = 62171164 }, - new Quote { Date = DateTime.Parse("2017-09-19"), Open = 239.56m, High = 239.62m, Low = 239.17m, Close = 239.53m, Volume = 49161788 }, - new Quote { Date = DateTime.Parse("2017-09-18"), Open = 239.18m, High = 239.67m, Low = 238.87m, Close = 239.29m, Volume = 48250824 }, - new Quote { Date = DateTime.Parse("2017-09-15"), Open = 238.30m, High = 238.88m, Low = 238.19m, Close = 238.78m, Volume = 99592680 }, - new Quote { Date = DateTime.Parse("2017-09-14"), Open = 238.18m, High = 238.68m, Low = 237.99m, Close = 238.46m, Volume = 100101416 }, - new Quote { Date = DateTime.Parse("2017-09-13"), Open = 238.11m, High = 238.57m, Low = 237.98m, Close = 238.54m, Volume = 62116640 }, - new Quote { Date = DateTime.Parse("2017-09-12"), Open = 238.02m, High = 238.46m, Low = 237.82m, Close = 238.42m, Volume = 59670932 }, - new Quote { Date = DateTime.Parse("2017-09-11"), Open = 236.51m, High = 237.71m, Low = 236.49m, Close = 237.62m, Volume = 74845424 }, - new Quote { Date = DateTime.Parse("2017-09-08"), Open = 235.07m, High = 235.62m, Low = 234.85m, Close = 235.11m, Volume = 66946052 }, - new Quote { Date = DateTime.Parse("2017-09-07"), Open = 235.75m, High = 235.77m, Low = 234.94m, Close = 235.39m, Volume = 60865172 }, - new Quote { Date = DateTime.Parse("2017-09-06"), Open = 235.36m, High = 235.78m, Low = 234.78m, Close = 235.42m, Volume = 60741564 }, - new Quote { Date = DateTime.Parse("2017-09-05"), Open = 235.76m, High = 236.01m, Low = 233.56m, Close = 234.62m, Volume = 95856440 }, - new Quote { Date = DateTime.Parse("2017-09-01"), Open = 236.39m, High = 236.78m, Low = 236.15m, Close = 236.31m, Volume = 65031164 }, - new Quote { Date = DateTime.Parse("2017-08-31"), Open = 235.25m, High = 236.25m, Low = 234.61m, Close = 235.98m, Volume = 108866560 }, - new Quote { Date = DateTime.Parse("2017-08-30"), Open = 233.44m, High = 234.87m, Low = 233.24m, Close = 234.57m, Volume = 65056144 }, - new Quote { Date = DateTime.Parse("2017-08-29"), Open = 231.76m, High = 233.75m, Low = 231.63m, Close = 233.46m, Volume = 53629680 }, - new Quote { Date = DateTime.Parse("2017-08-28"), Open = 233.77m, High = 233.80m, Low = 232.74m, Close = 233.20m, Volume = 42544052 }, - new Quote { Date = DateTime.Parse("2017-08-25"), Open = 233.51m, High = 234.19m, Low = 233.02m, Close = 233.19m, Volume = 67589040 }, - new Quote { Date = DateTime.Parse("2017-08-24"), Open = 233.61m, High = 233.78m, Low = 232.41m, Close = 232.64m, Volume = 53216420 }, - new Quote { Date = DateTime.Parse("2017-08-23"), Open = 232.97m, High = 233.65m, Low = 232.81m, Close = 233.19m, Volume = 52652352 }, - new Quote { Date = DateTime.Parse("2017-08-22"), Open = 232.24m, High = 234.20m, Low = 232.22m, Close = 234.03m, Volume = 66219544 }, - new Quote { Date = DateTime.Parse("2017-08-21"), Open = 231.36m, High = 231.89m, Low = 230.58m, Close = 231.60m, Volume = 68662792 }, - new Quote { Date = DateTime.Parse("2017-08-18"), Open = 231.60m, High = 232.83m, Low = 230.94m, Close = 231.42m, Volume = 143417408 }, - new Quote { Date = DateTime.Parse("2017-08-17"), Open = 234.79m, High = 235.13m, Low = 231.79m, Close = 231.79m, Volume = 134757072 }, - new Quote { Date = DateTime.Parse("2017-08-16"), Open = 235.62m, High = 236.06m, Low = 234.99m, Close = 235.46m, Volume = 59481648 }, - new Quote { Date = DateTime.Parse("2017-08-15"), Open = 235.49m, High = 235.51m, Low = 234.71m, Close = 235.05m, Volume = 57937020 }, - new Quote { Date = DateTime.Parse("2017-08-14"), Open = 234.17m, High = 235.31m, Low = 234.13m, Close = 235.07m, Volume = 76866480 }, - new Quote { Date = DateTime.Parse("2017-08-11"), Open = 232.67m, High = 233.42m, Low = 232.41m, Close = 232.77m, Volume = 78521472 }, - new Quote { Date = DateTime.Parse("2017-08-10"), Open = 234.84m, High = 234.98m, Low = 232.37m, Close = 232.42m, Volume = 126355448 }, - new Quote { Date = DateTime.Parse("2017-08-09"), Open = 235.01m, High = 235.81m, Low = 234.62m, Close = 235.75m, Volume = 65687312 }, - new Quote { Date = DateTime.Parse("2017-08-08"), Open = 236.00m, High = 237.33m, Low = 235.35m, Close = 235.76m, Volume = 64729500 }, - new Quote { Date = DateTime.Parse("2017-08-07"), Open = 235.98m, High = 236.34m, Low = 235.87m, Close = 236.34m, Volume = 33555464 }, - new Quote { Date = DateTime.Parse("2017-08-04"), Open = 236.01m, High = 236.27m, Low = 235.49m, Close = 235.90m, Volume = 63127488 }, - new Quote { Date = DateTime.Parse("2017-08-03"), Open = 235.81m, High = 235.84m, Low = 235.17m, Close = 235.48m, Volume = 42848608 }, - new Quote { Date = DateTime.Parse("2017-08-02"), Open = 235.96m, High = 236.09m, Low = 234.91m, Close = 235.93m, Volume = 49513776 }, - new Quote { Date = DateTime.Parse("2017-08-01"), Open = 235.95m, High = 235.99m, Low = 235.24m, Close = 235.82m, Volume = 57735292 }, - new Quote { Date = DateTime.Parse("2017-07-31"), Open = 235.87m, High = 235.97m, Low = 235.07m, Close = 235.29m, Volume = 69049712 }, - new Quote { Date = DateTime.Parse("2017-07-28"), Open = 235.18m, High = 235.57m, Low = 234.68m, Close = 235.43m, Volume = 52531244 }, - new Quote { Date = DateTime.Parse("2017-07-27"), Open = 236.43m, High = 236.47m, Low = 234.26m, Close = 235.70m, Volume = 74217968 }, - new Quote { Date = DateTime.Parse("2017-07-26"), Open = 236.23m, High = 236.27m, Low = 235.64m, Close = 235.92m, Volume = 49895744 }, - new Quote { Date = DateTime.Parse("2017-07-25"), Open = 236.16m, High = 236.28m, Low = 235.67m, Close = 235.91m, Volume = 57593908 }, - new Quote { Date = DateTime.Parse("2017-07-24"), Open = 235.31m, High = 235.49m, Low = 234.83m, Close = 235.34m, Volume = 48896096 }, - new Quote { Date = DateTime.Parse("2017-07-21"), Open = 234.98m, High = 235.43m, Low = 234.73m, Close = 235.40m, Volume = 93037592 }, - new Quote { Date = DateTime.Parse("2017-07-20"), Open = 235.78m, High = 235.91m, Low = 235.01m, Close = 235.61m, Volume = 49434036 }, - new Quote { Date = DateTime.Parse("2017-07-19"), Open = 234.58m, High = 235.51m, Low = 234.57m, Close = 235.50m, Volume = 53523280 }, - new Quote { Date = DateTime.Parse("2017-07-18"), Open = 233.66m, High = 234.29m, Low = 233.29m, Close = 234.24m, Volume = 44827112 }, - new Quote { Date = DateTime.Parse("2017-07-17"), Open = 234.05m, High = 234.47m, Low = 233.92m, Close = 234.11m, Volume = 35167316 }, - new Quote { Date = DateTime.Parse("2017-07-14"), Open = 233.06m, High = 234.53m, Low = 232.95m, Close = 234.14m, Volume = 63201796 }, - new Quote { Date = DateTime.Parse("2017-07-13"), Open = 232.67m, High = 233.18m, Low = 232.42m, Close = 233.05m, Volume = 41396728 }, - new Quote { Date = DateTime.Parse("2017-07-12"), Open = 231.99m, High = 232.84m, Low = 231.99m, Close = 232.66m, Volume = 62517696 }, - new Quote { Date = DateTime.Parse("2017-07-11"), Open = 230.90m, High = 231.27m, Low = 229.65m, Close = 230.93m, Volume = 52810484 }, - new Quote { Date = DateTime.Parse("2017-07-10"), Open = 230.70m, High = 231.51m, Low = 230.52m, Close = 231.10m, Volume = 38451396 }, - new Quote { Date = DateTime.Parse("2017-07-07"), Open = 229.99m, High = 231.01m, Low = 229.38m, Close = 230.85m, Volume = 60799664 }, - new Quote { Date = DateTime.Parse("2017-07-06"), Open = 230.64m, High = 230.77m, Low = 229.16m, Close = 229.36m, Volume = 69339864 }, - new Quote { Date = DateTime.Parse("2017-07-05"), Open = 231.35m, High = 231.71m, Low = 230.46m, Close = 231.48m, Volume = 57082112 }, - new Quote { Date = DateTime.Parse("2017-07-03"), Open = 231.59m, High = 232.06m, Low = 230.95m, Close = 230.95m, Volume = 41063396 }, - new Quote { Date = DateTime.Parse("2017-06-30"), Open = 231.01m, High = 231.42m, Low = 230.34m, Close = 230.56m, Volume = 91055080 }, - new Quote { Date = DateTime.Parse("2017-06-29"), Open = 232.33m, High = 232.39m, Low = 228.80m, Close = 230.13m, Volume = 112165824 }, - new Quote { Date = DateTime.Parse("2017-06-28"), Open = 231.22m, High = 232.38m, Low = 230.97m, Close = 232.17m, Volume = 73458688 }, - new Quote { Date = DateTime.Parse("2017-06-27"), Open = 231.74m, High = 232.06m, Low = 230.09m, Close = 230.11m, Volume = 86259016 }, - new Quote { Date = DateTime.Parse("2017-06-26"), Open = 232.56m, High = 233.02m, Low = 231.74m, Close = 231.98m, Volume = 59465848 }, - new Quote { Date = DateTime.Parse("2017-06-23"), Open = 231.61m, High = 232.19m, Low = 231.19m, Close = 231.82m, Volume = 70253848 }, - new Quote { Date = DateTime.Parse("2017-06-22"), Open = 231.66m, High = 232.21m, Low = 231.36m, Close = 231.55m, Volume = 46301224 }, - new Quote { Date = DateTime.Parse("2017-06-21"), Open = 232.10m, High = 232.26m, Low = 231.14m, Close = 231.65m, Volume = 58707680 }, - new Quote { Date = DateTime.Parse("2017-06-20"), Open = 232.89m, High = 232.90m, Low = 231.69m, Close = 231.71m, Volume = 59681776 }, - new Quote { Date = DateTime.Parse("2017-06-19"), Open = 232.26m, High = 233.35m, Low = 232.16m, Close = 233.28m, Volume = 68299992 }, - new Quote { Date = DateTime.Parse("2017-06-16"), Open = 231.48m, High = 231.54m, Low = 230.40m, Close = 231.36m, Volume = 88676880 }, - new Quote { Date = DateTime.Parse("2017-06-15"), Open = 230.27m, High = 231.44m, Low = 229.97m, Close = 231.31m, Volume = 70046440 }, - new Quote { Date = DateTime.Parse("2017-06-14"), Open = 232.34m, High = 232.35m, Low = 230.85m, Close = 231.75m, Volume = 82837904 }, - new Quote { Date = DateTime.Parse("2017-06-13"), Open = 231.51m, High = 232.10m, Low = 231.13m, Close = 232.05m, Volume = 63303744 }, - new Quote { Date = DateTime.Parse("2017-06-12"), Open = 230.70m, High = 230.97m, Low = 229.99m, Close = 230.92m, Volume = 90748160 }, - new Quote { Date = DateTime.Parse("2017-06-09"), Open = 231.61m, High = 232.48m, Low = 229.58m, Close = 230.96m, Volume = 139383184 }, - new Quote { Date = DateTime.Parse("2017-06-08"), Open = 231.31m, High = 231.84m, Low = 230.74m, Close = 231.32m, Volume = 69504536 }, - new Quote { Date = DateTime.Parse("2017-06-07"), Open = 231.14m, High = 231.45m, Low = 230.41m, Close = 231.20m, Volume = 57061952 }, - new Quote { Date = DateTime.Parse("2017-06-06"), Open = 230.90m, High = 231.51m, Low = 230.69m, Close = 230.77m, Volume = 53089976 }, - new Quote { Date = DateTime.Parse("2017-06-05"), Open = 231.50m, High = 231.81m, Low = 231.30m, Close = 231.51m, Volume = 47107480 }, - new Quote { Date = DateTime.Parse("2017-06-02"), Open = 230.97m, High = 231.86m, Low = 230.65m, Close = 231.69m, Volume = 93444032 }, - new Quote { Date = DateTime.Parse("2017-06-01"), Open = 229.60m, High = 230.94m, Low = 229.28m, Close = 230.92m, Volume = 72678144 }, - new Quote { Date = DateTime.Parse("2017-05-31"), Open = 229.47m, High = 229.51m, Low = 228.34m, Close = 229.09m, Volume = 96742576 }, - new Quote { Date = DateTime.Parse("2017-05-30"), Open = 229.00m, High = 229.43m, Low = 228.83m, Close = 229.15m, Volume = 37098796 }, - new Quote { Date = DateTime.Parse("2017-05-26"), Open = 229.19m, High = 229.53m, Low = 229.10m, Close = 229.35m, Volume = 49142620 }, - new Quote { Date = DateTime.Parse("2017-05-25"), Open = 228.87m, High = 229.70m, Low = 228.64m, Close = 229.40m, Volume = 67524256 }, - new Quote { Date = DateTime.Parse("2017-05-24"), Open = 228.03m, High = 228.42m, Low = 227.66m, Close = 228.31m, Volume = 51831288 }, - new Quote { Date = DateTime.Parse("2017-05-23"), Open = 227.68m, High = 227.96m, Low = 227.26m, Close = 227.78m, Volume = 50946640 }, - new Quote { Date = DateTime.Parse("2017-05-22"), Open = 226.68m, High = 227.45m, Low = 226.61m, Close = 227.27m, Volume = 64298244 }, - new Quote { Date = DateTime.Parse("2017-05-19"), Open = 225.20m, High = 226.86m, Low = 225.14m, Close = 226.12m, Volume = 121208928 }, - new Quote { Date = DateTime.Parse("2017-05-18"), Open = 223.68m, High = 225.59m, Low = 223.39m, Close = 224.66m, Volume = 112816072 }, - new Quote { Date = DateTime.Parse("2017-05-17"), Open = 225.93m, High = 226.44m, Low = 223.70m, Close = 223.76m, Volume = 181451968 }, - new Quote { Date = DateTime.Parse("2017-05-16"), Open = 228.34m, High = 228.36m, Low = 227.38m, Close = 227.80m, Volume = 54003024 }, - new Quote { Date = DateTime.Parse("2017-05-15"), Open = 227.23m, High = 228.15m, Low = 227.21m, Close = 228.01m, Volume = 65255528 }, - new Quote { Date = DateTime.Parse("2017-05-12"), Open = 226.87m, High = 227.19m, Low = 226.47m, Close = 226.76m, Volume = 56817892 }, - new Quote { Date = DateTime.Parse("2017-05-11"), Open = 227.11m, High = 227.32m, Low = 225.95m, Close = 227.14m, Volume = 65718612 }, - new Quote { Date = DateTime.Parse("2017-05-10"), Open = 227.15m, High = 227.61m, Low = 226.92m, Close = 227.61m, Volume = 57219496 }, - new Quote { Date = DateTime.Parse("2017-05-09"), Open = 227.69m, High = 227.91m, Low = 226.82m, Close = 227.20m, Volume = 54130976 }, - new Quote { Date = DateTime.Parse("2017-05-08"), Open = 227.49m, High = 227.65m, Low = 226.94m, Close = 227.41m, Volume = 50993060 }, - new Quote { Date = DateTime.Parse("2017-05-05"), Open = 226.96m, High = 227.46m, Low = 226.48m, Close = 227.44m, Volume = 65342296 }, - new Quote { Date = DateTime.Parse("2017-05-04"), Open = 226.62m, High = 226.71m, Low = 225.62m, Close = 226.55m, Volume = 64774736 }, - new Quote { Date = DateTime.Parse("2017-05-03"), Open = 226.11m, High = 226.66m, Low = 225.55m, Close = 226.29m, Volume = 77078864 }, - new Quote { Date = DateTime.Parse("2017-05-02"), Open = 226.63m, High = 226.76m, Low = 226.12m, Close = 226.56m, Volume = 60467504 }, - new Quote { Date = DateTime.Parse("2017-05-01"), Open = 226.48m, High = 226.94m, Low = 226.02m, Close = 226.48m, Volume = 70486576 }, - new Quote { Date = DateTime.Parse("2017-04-28"), Open = 226.68m, High = 226.71m, Low = 225.76m, Close = 225.91m, Volume = 66956400 }, - new Quote { Date = DateTime.Parse("2017-04-27"), Open = 226.56m, High = 226.73m, Low = 225.81m, Close = 226.40m, Volume = 60503960 }, - new Quote { Date = DateTime.Parse("2017-04-26"), Open = 226.31m, High = 227.28m, Low = 226.16m, Close = 226.21m, Volume = 89266768 }, - new Quote { Date = DateTime.Parse("2017-04-25"), Open = 225.75m, High = 226.73m, Low = 225.65m, Close = 226.35m, Volume = 80831256 }, - new Quote { Date = DateTime.Parse("2017-04-24"), Open = 225.05m, High = 225.27m, Low = 222.57m, Close = 225.04m, Volume = 125633672 }, - new Quote { Date = DateTime.Parse("2017-04-21"), Open = 223.22m, High = 223.28m, Low = 222.16m, Close = 222.60m, Volume = 116338368 }, - new Quote { Date = DateTime.Parse("2017-04-20"), Open = 222.18m, High = 223.79m, Low = 221.83m, Close = 223.31m, Volume = 97560568 }, - new Quote { Date = DateTime.Parse("2017-04-19"), Open = 222.53m, High = 222.94m, Low = 221.26m, Close = 221.50m, Volume = 72401856 }, - new Quote { Date = DateTime.Parse("2017-04-18"), Open = 221.77m, High = 222.50m, Low = 221.16m, Close = 221.91m, Volume = 87710560 }, - new Quote { Date = DateTime.Parse("2017-04-17"), Open = 221.19m, High = 222.58m, Low = 220.97m, Close = 222.58m, Volume = 72091488 }, - new Quote { Date = DateTime.Parse("2017-04-13"), Open = 221.69m, High = 222.50m, Low = 220.62m, Close = 220.62m, Volume = 97885392 }, - new Quote { Date = DateTime.Parse("2017-04-12"), Open = 222.74m, High = 222.95m, Low = 221.82m, Close = 222.06m, Volume = 86275816 }, - new Quote { Date = DateTime.Parse("2017-04-11"), Open = 222.89m, High = 223.15m, Low = 221.41m, Close = 223.04m, Volume = 92789720 }, - new Quote { Date = DateTime.Parse("2017-04-10"), Open = 223.33m, High = 224.18m, Low = 222.73m, Close = 223.31m, Volume = 71258848 }, - new Quote { Date = DateTime.Parse("2017-04-07"), Open = 223.13m, High = 223.93m, Low = 222.64m, Close = 223.17m, Volume = 78422128 }, - new Quote { Date = DateTime.Parse("2017-04-06"), Open = 222.93m, High = 223.97m, Low = 222.44m, Close = 223.40m, Volume = 72861232 }, - new Quote { Date = DateTime.Parse("2017-04-05"), Open = 224.18m, High = 225.25m, Low = 222.55m, Close = 222.78m, Volume = 114663488 }, - new Quote { Date = DateTime.Parse("2017-04-04"), Open = 222.98m, High = 223.53m, Low = 222.56m, Close = 223.44m, Volume = 59508952 }, - new Quote { Date = DateTime.Parse("2017-04-03"), Open = 223.74m, High = 223.96m, Low = 221.95m, Close = 223.30m, Volume = 90156280 }, - new Quote { Date = DateTime.Parse("2017-03-31"), Open = 223.84m, High = 224.42m, Low = 223.63m, Close = 223.69m, Volume = 77706304 }, - new Quote { Date = DateTime.Parse("2017-03-30"), Open = 223.43m, High = 224.43m, Low = 223.24m, Close = 224.21m, Volume = 59795288 }, - new Quote { Date = DateTime.Parse("2017-03-29"), Open = 222.97m, High = 223.75m, Low = 222.72m, Close = 223.50m, Volume = 65288636 }, - new Quote { Date = DateTime.Parse("2017-03-28"), Open = 221.34m, High = 223.75m, Low = 221.22m, Close = 223.29m, Volume = 98521432 }, - new Quote { Date = DateTime.Parse("2017-03-27"), Open = 220.07m, High = 221.96m, Low = 219.77m, Close = 221.67m, Volume = 92167056 }, - new Quote { Date = DateTime.Parse("2017-03-24"), Open = 222.40m, High = 223.02m, Low = 221.05m, Close = 221.90m, Volume = 118567344 }, - new Quote { Date = DateTime.Parse("2017-03-23"), Open = 222.04m, High = 223.31m, Low = 221.66m, Close = 222.06m, Volume = 105821032 }, - new Quote { Date = DateTime.Parse("2017-03-22"), Open = 221.82m, High = 222.61m, Low = 221.13m, Close = 222.30m, Volume = 102826864 }, - new Quote { Date = DateTime.Parse("2017-03-21"), Open = 225.33m, High = 225.46m, Low = 221.64m, Close = 221.78m, Volume = 138912016 }, - new Quote { Date = DateTime.Parse("2017-03-20"), Open = 224.91m, High = 225.22m, Low = 224.24m, Close = 224.66m, Volume = 55368008 }, - new Quote { Date = DateTime.Parse("2017-03-17"), Open = 225.59m, High = 225.80m, Low = 224.91m, Close = 224.91m, Volume = 93798120 }, - new Quote { Date = DateTime.Parse("2017-03-16"), Open = 225.90m, High = 225.99m, Low = 224.95m, Close = 225.31m, Volume = 82924856 }, - new Quote { Date = DateTime.Parse("2017-03-15"), Open = 224.44m, High = 226.21m, Low = 224.18m, Close = 225.75m, Volume = 101699816 }, - new Quote { Date = DateTime.Parse("2017-03-14"), Open = 224.08m, High = 224.13m, Low = 223.14m, Close = 223.81m, Volume = 63382108 }, - new Quote { Date = DateTime.Parse("2017-03-13"), Open = 224.49m, High = 224.72m, Low = 224.13m, Close = 224.67m, Volume = 60604724 }, - new Quote { Date = DateTime.Parse("2017-03-10"), Open = 224.82m, High = 224.87m, Low = 223.52m, Close = 224.56m, Volume = 86785840 }, - new Quote { Date = DateTime.Parse("2017-03-09"), Open = 223.62m, High = 224.13m, Low = 222.72m, Close = 223.78m, Volume = 95986360 }, - new Quote { Date = DateTime.Parse("2017-03-08"), Open = 224.23m, High = 224.51m, Low = 223.34m, Close = 223.49m, Volume = 82739456 }, - new Quote { Date = DateTime.Parse("2017-03-07"), Open = 224.25m, High = 224.64m, Low = 223.68m, Close = 223.91m, Volume = 68910464 }, - new Quote { Date = DateTime.Parse("2017-03-06"), Open = 224.38m, High = 224.97m, Low = 223.92m, Close = 224.58m, Volume = 58630368 }, - new Quote { Date = DateTime.Parse("2017-03-03"), Open = 225.01m, High = 225.43m, Low = 224.60m, Close = 225.25m, Volume = 86767480 }, - new Quote { Date = DateTime.Parse("2017-03-02"), Open = 226.33m, High = 226.34m, Low = 225.05m, Close = 225.11m, Volume = 74353376 }, - new Quote { Date = DateTime.Parse("2017-03-01"), Open = 225.22m, High = 227.04m, Low = 225.20m, Close = 226.53m, Volume = 157879712 }, - new Quote { Date = DateTime.Parse("2017-02-28"), Open = 223.60m, High = 223.86m, Low = 222.98m, Close = 223.41m, Volume = 102631472 }, - new Quote { Date = DateTime.Parse("2017-02-27"), Open = 223.57m, High = 224.20m, Low = 223.29m, Close = 224.01m, Volume = 59819992 }, - new Quote { Date = DateTime.Parse("2017-02-24"), Open = 222.45m, High = 223.71m, Low = 222.41m, Close = 223.66m, Volume = 87198608 }, - new Quote { Date = DateTime.Parse("2017-02-23"), Open = 223.79m, High = 223.81m, Low = 222.55m, Close = 223.38m, Volume = 78978816 }, - new Quote { Date = DateTime.Parse("2017-02-22"), Open = 222.98m, High = 223.47m, Low = 222.80m, Close = 223.23m, Volume = 65747160 }, - new Quote { Date = DateTime.Parse("2017-02-21"), Open = 222.51m, High = 223.62m, Low = 222.50m, Close = 223.43m, Volume = 94146880 }, - new Quote { Date = DateTime.Parse("2017-02-17"), Open = 221.03m, High = 222.10m, Low = 221.01m, Close = 222.10m, Volume = 81718352 }, - new Quote { Date = DateTime.Parse("2017-02-16"), Open = 221.98m, High = 222.16m, Low = 220.93m, Close = 221.75m, Volume = 89676304 }, - new Quote { Date = DateTime.Parse("2017-02-15"), Open = 220.55m, High = 222.15m, Low = 220.50m, Close = 221.94m, Volume = 91860344 }, - new Quote { Date = DateTime.Parse("2017-02-14"), Open = 219.71m, High = 220.80m, Low = 219.33m, Close = 220.79m, Volume = 75266840 }, - new Quote { Date = DateTime.Parse("2017-02-13"), Open = 219.26m, High = 220.19m, Low = 219.23m, Close = 219.91m, Volume = 58408632 }, - new Quote { Date = DateTime.Parse("2017-02-10"), Open = 218.24m, High = 218.97m, Low = 217.88m, Close = 218.72m, Volume = 69875952 }, - new Quote { Date = DateTime.Parse("2017-02-09"), Open = 216.88m, High = 218.19m, Low = 216.84m, Close = 217.86m, Volume = 69811760 }, - new Quote { Date = DateTime.Parse("2017-02-08"), Open = 215.98m, High = 216.72m, Low = 215.70m, Close = 216.58m, Volume = 54581376 }, - new Quote { Date = DateTime.Parse("2017-02-07"), Open = 216.71m, High = 216.97m, Low = 216.09m, Close = 216.29m, Volume = 61318484 }, - new Quote { Date = DateTime.Parse("2017-02-06"), Open = 216.23m, High = 216.66m, Low = 215.92m, Close = 216.28m, Volume = 61169192 }, - new Quote { Date = DateTime.Parse("2017-02-03"), Open = 216.18m, High = 216.87m, Low = 215.84m, Close = 216.67m, Volume = 85273832 }, - new Quote { Date = DateTime.Parse("2017-02-02"), Open = 214.65m, High = 215.50m, Low = 214.29m, Close = 215.19m, Volume = 73730552 }, - new Quote { Date = DateTime.Parse("2017-02-01"), Open = 215.65m, High = 215.96m, Low = 214.40m, Close = 215.05m, Volume = 83743792 }, - new Quote { Date = DateTime.Parse("2017-01-31"), Open = 214.44m, High = 215.03m, Low = 213.82m, Close = 214.96m, Volume = 80317680 }, - new Quote { Date = DateTime.Parse("2017-01-30"), Open = 215.57m, High = 215.59m, Low = 213.90m, Close = 214.98m, Volume = 84399624 }, - new Quote { Date = DateTime.Parse("2017-01-27"), Open = 216.75m, High = 216.91m, Low = 216.12m, Close = 216.32m, Volume = 63202528 }, - new Quote { Date = DateTime.Parse("2017-01-26"), Open = 216.73m, High = 217.02m, Low = 216.36m, Close = 216.66m, Volume = 63477304 }, - new Quote { Date = DateTime.Parse("2017-01-25"), Open = 216.07m, High = 216.89m, Low = 215.89m, Close = 216.89m, Volume = 89374928 }, - new Quote { Date = DateTime.Parse("2017-01-24"), Open = 213.89m, High = 215.48m, Low = 213.77m, Close = 215.03m, Volume = 101142584 }, - new Quote { Date = DateTime.Parse("2017-01-23"), Open = 213.85m, High = 214.28m, Low = 212.83m, Close = 213.66m, Volume = 79450624 }, - new Quote { Date = DateTime.Parse("2017-01-20"), Open = 214.18m, High = 214.75m, Low = 213.49m, Close = 214.21m, Volume = 136721344 }, - new Quote { Date = DateTime.Parse("2017-01-19"), Open = 214.31m, High = 214.46m, Low = 212.96m, Close = 213.43m, Volume = 70503512 }, - new Quote { Date = DateTime.Parse("2017-01-18"), Open = 214.02m, High = 214.27m, Low = 213.42m, Close = 214.22m, Volume = 57997156 }, - new Quote { Date = DateTime.Parse("2017-01-17"), Open = 213.81m, High = 214.25m, Low = 213.33m, Close = 213.75m, Volume = 64821664 }, - new Quote { Date = DateTime.Parse("2017-01-13"), Open = 214.21m, High = 214.84m, Low = 214.17m, Close = 214.51m, Volume = 66385084 }, - new Quote { Date = DateTime.Parse("2017-01-12"), Open = 213.99m, High = 214.22m, Low = 212.53m, Close = 214.02m, Volume = 76329760 }, - new Quote { Date = DateTime.Parse("2017-01-11"), Open = 213.86m, High = 214.55m, Low = 213.13m, Close = 214.55m, Volume = 79014928 }, - new Quote { Date = DateTime.Parse("2017-01-10"), Open = 213.97m, High = 214.89m, Low = 213.52m, Close = 213.95m, Volume = 67500792 }, - new Quote { Date = DateTime.Parse("2017-01-09"), Open = 214.38m, High = 214.53m, Low = 213.91m, Close = 213.95m, Volume = 49684316 }, - new Quote { Date = DateTime.Parse("2017-01-06"), Open = 214.02m, High = 215.17m, Low = 213.42m, Close = 214.66m, Volume = 75744152 }, - new Quote { Date = DateTime.Parse("2017-01-05"), Open = 213.77m, High = 214.06m, Low = 213.02m, Close = 213.89m, Volume = 82961968 }, - new Quote { Date = DateTime.Parse("2017-01-04"), Open = 213.16m, High = 214.22m, Low = 213.15m, Close = 214.06m, Volume = 83348752 }, - new Quote { Date = DateTime.Parse("2017-01-03"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 212.80m, Volume = 96708880 }, - new Quote { Date = DateTime.Parse("2017-01-02"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 212.00m, Volume = 76708880 }, - new Quote { Date = DateTime.Parse("2017-01-01"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 211.60m, Volume = 86708880 }, - ]; + => + [ + new() { Date = DateTime.Parse("2018-12-31"), Open = 244.92m, High = 245.54m, Low = 242.87m, Close = 245.28m, Volume = 147031456 }, + new() { Date = DateTime.Parse("2018-12-28"), Open = 244.94m, High = 246.73m, Low = 241.87m, Close = 243.15m, Volume = 155998912 }, + new() { Date = DateTime.Parse("2018-12-27"), Open = 238.06m, High = 243.68m, Low = 234.52m, Close = 243.46m, Volume = 189794032 }, + new() { Date = DateTime.Parse("2018-12-26"), Open = 231.59m, High = 241.61m, Low = 229.42m, Close = 241.61m, Volume = 222622048 }, + new() { Date = DateTime.Parse("2018-12-24"), Open = 234.60m, High = 236.36m, Low = 229.92m, Close = 229.99m, Volume = 150100704 }, + new() { Date = DateTime.Parse("2018-12-21"), Open = 242.16m, High = 245.07m, Low = 235.52m, Close = 236.23m, Volume = 260180208 }, + new() { Date = DateTime.Parse("2018-12-20"), Open = 243.79m, High = 245.51m, Low = 238.71m, Close = 241.17m, Volume = 258325808 }, + new() { Date = DateTime.Parse("2018-12-19"), Open = 248.97m, High = 253.10m, Low = 243.30m, Close = 245.16m, Volume = 220342928 }, + new() { Date = DateTime.Parse("2018-12-18"), Open = 250.95m, High = 251.69m, Low = 247.13m, Close = 248.89m, Volume = 137862544 }, + new() { Date = DateTime.Parse("2018-12-17"), Open = 253.10m, High = 254.32m, Low = 247.37m, Close = 249.16m, Volume = 169610592 }, + new() { Date = DateTime.Parse("2018-12-14"), Open = 256.58m, High = 257.62m, Low = 253.54m, Close = 254.15m, Volume = 119871688 }, + new() { Date = DateTime.Parse("2018-12-13"), Open = 260.05m, High = 260.99m, Low = 257.71m, Close = 258.93m, Volume = 99068200 }, + new() { Date = DateTime.Parse("2018-12-12"), Open = 260.98m, High = 262.47m, Low = 258.93m, Close = 259.01m, Volume = 100414888 }, + new() { Date = DateTime.Parse("2018-12-11"), Open = 261.16m, High = 261.37m, Low = 256.11m, Close = 257.72m, Volume = 124528112 }, + new() { Date = DateTime.Parse("2018-12-10"), Open = 256.98m, High = 258.72m, Low = 252.34m, Close = 257.66m, Volume = 155214672 }, + new() { Date = DateTime.Parse("2018-12-07"), Open = 262.92m, High = 264.63m, Low = 256.25m, Close = 257.17m, Volume = 165025936 }, + new() { Date = DateTime.Parse("2018-12-06"), Open = 259.46m, High = 263.41m, Low = 256.07m, Close = 263.29m, Volume = 209266640 }, + new() { Date = DateTime.Parse("2018-12-04"), Open = 271.61m, High = 272.08m, Low = 263.35m, Close = 263.69m, Volume = 182415248 }, + new() { Date = DateTime.Parse("2018-12-03"), Open = 273.47m, High = 273.59m, Low = 270.77m, Close = 272.52m, Volume = 105581352 }, + new() { Date = DateTime.Parse("2018-11-30"), Open = 267.16m, High = 269.57m, Low = 266.81m, Close = 268.96m, Volume = 100648032 }, + new() { Date = DateTime.Parse("2018-11-29"), Open = 267.06m, High = 268.86m, Low = 265.82m, Close = 267.33m, Volume = 84395640 }, + new() { Date = DateTime.Parse("2018-11-28"), Open = 263.05m, High = 267.91m, Low = 261.81m, Close = 267.91m, Volume = 130805744 }, + new() { Date = DateTime.Parse("2018-11-27"), Open = 259.87m, High = 261.88m, Low = 259.21m, Close = 261.88m, Volume = 77381344 }, + new() { Date = DateTime.Parse("2018-11-26"), Open = 259.33m, High = 261.25m, Low = 258.90m, Close = 261.00m, Volume = 81971728 }, + new() { Date = DateTime.Parse("2018-11-23"), Open = 256.79m, High = 258.39m, Low = 256.68m, Close = 256.86m, Volume = 43873168 }, + new() { Date = DateTime.Parse("2018-11-21"), Open = 259.40m, High = 260.66m, Low = 258.58m, Close = 258.58m, Volume = 77444168 }, + new() { Date = DateTime.Parse("2018-11-20"), Open = 258.92m, High = 260.52m, Low = 256.76m, Close = 257.71m, Volume = 139406240 }, + new() { Date = DateTime.Parse("2018-11-19"), Open = 266.42m, High = 266.74m, Low = 261.56m, Close = 262.57m, Volume = 105626432 }, + new() { Date = DateTime.Parse("2018-11-16"), Open = 265.19m, High = 268.08m, Low = 264.62m, Close = 267.08m, Volume = 129820216 }, + new() { Date = DateTime.Parse("2018-11-15"), Open = 262.25m, High = 266.90m, Low = 260.53m, Close = 266.39m, Volume = 138463488 }, + new() { Date = DateTime.Parse("2018-11-14"), Open = 267.50m, High = 267.94m, Low = 261.93m, Close = 263.64m, Volume = 128454960 }, + new() { Date = DateTime.Parse("2018-11-13"), Open = 266.46m, High = 268.64m, Low = 264.66m, Close = 265.45m, Volume = 100619768 }, + new() { Date = DateTime.Parse("2018-11-12"), Open = 270.46m, High = 270.72m, Low = 265.39m, Close = 265.95m, Volume = 102153984 }, + new() { Date = DateTime.Parse("2018-11-09"), Open = 272.25m, High = 272.46m, Low = 269.47m, Close = 271.02m, Volume = 101271544 }, + new() { Date = DateTime.Parse("2018-11-08"), Open = 273.31m, High = 274.39m, Low = 272.44m, Close = 273.69m, Volume = 67216992 }, + new() { Date = DateTime.Parse("2018-11-07"), Open = 270.82m, High = 274.27m, Low = 270.35m, Close = 274.19m, Volume = 105309120 }, + new() { Date = DateTime.Parse("2018-11-06"), Open = 266.68m, High = 268.62m, Low = 266.62m, Close = 268.44m, Volume = 61581152 }, + new() { Date = DateTime.Parse("2018-11-05"), Open = 265.82m, High = 267.36m, Low = 264.76m, Close = 266.75m, Volume = 67255520 }, + new() { Date = DateTime.Parse("2018-11-02"), Open = 268.08m, High = 268.55m, Low = 263.04m, Close = 265.29m, Volume = 125685896 }, + new() { Date = DateTime.Parse("2018-11-01"), Open = 265.01m, High = 267.08m, Low = 263.81m, Close = 266.87m, Volume = 101971008 }, + new() { Date = DateTime.Parse("2018-10-31"), Open = 264.08m, High = 266.60m, Low = 263.56m, Close = 264.06m, Volume = 131489024 }, + new() { Date = DateTime.Parse("2018-10-30"), Open = 257.27m, High = 261.61m, Low = 256.73m, Close = 261.27m, Volume = 161025888 }, + new() { Date = DateTime.Parse("2018-10-29"), Open = 262.27m, High = 263.69m, Low = 253.54m, Close = 257.45m, Volume = 164749392 }, + new() { Date = DateTime.Parse("2018-10-26"), Open = 259.46m, High = 264.42m, Low = 255.92m, Close = 258.89m, Volume = 206590848 }, + new() { Date = DateTime.Parse("2018-10-25"), Open = 260.89m, High = 265.21m, Low = 259.77m, Close = 263.52m, Volume = 141497248 }, + new() { Date = DateTime.Parse("2018-10-24"), Open = 266.69m, High = 267.11m, Low = 258.27m, Close = 258.88m, Volume = 182231472 }, + new() { Date = DateTime.Parse("2018-10-23"), Open = 264.37m, High = 268.20m, Low = 262.09m, Close = 266.97m, Volume = 149994752 }, + new() { Date = DateTime.Parse("2018-10-22"), Open = 270.27m, High = 270.63m, Low = 267.75m, Close = 268.33m, Volume = 84466760 }, + new() { Date = DateTime.Parse("2018-10-19"), Open = 270.40m, High = 272.52m, Low = 268.78m, Close = 269.54m, Volume = 143383136 }, + new() { Date = DateTime.Parse("2018-10-18"), Open = 272.62m, High = 273.27m, Low = 268.29m, Close = 269.69m, Volume = 137906032 }, + new() { Date = DateTime.Parse("2018-10-17"), Open = 273.63m, High = 274.32m, Low = 270.82m, Close = 273.64m, Volume = 113378952 }, + new() { Date = DateTime.Parse("2018-10-16"), Open = 269.88m, High = 274.00m, Low = 269.37m, Close = 273.59m, Volume = 121198672 }, + new() { Date = DateTime.Parse("2018-10-15"), Open = 268.86m, High = 270.31m, Low = 267.64m, Close = 267.74m, Volume = 104808584 }, + new() { Date = DateTime.Parse("2018-10-12"), Open = 270.05m, High = 270.36m, Low = 265.76m, Close = 269.25m, Volume = 187745152 }, + new() { Date = DateTime.Parse("2018-10-11"), Open = 270.35m, High = 272.13m, Low = 263.80m, Close = 265.56m, Volume = 281680000 }, + new() { Date = DateTime.Parse("2018-10-10"), Open = 279.87m, High = 279.94m, Low = 271.13m, Close = 271.54m, Volume = 220074688 }, + new() { Date = DateTime.Parse("2018-10-09"), Open = 280.41m, High = 281.85m, Low = 279.81m, Close = 280.42m, Volume = 76188928 }, + new() { Date = DateTime.Parse("2018-10-08"), Open = 280.08m, High = 281.22m, Low = 278.57m, Close = 280.83m, Volume = 89925664 }, + new() { Date = DateTime.Parse("2018-10-05"), Open = 282.66m, High = 283.22m, Low = 279.27m, Close = 280.83m, Volume = 108588344 }, + new() { Date = DateTime.Parse("2018-10-04"), Open = 284.11m, High = 284.17m, Low = 280.68m, Close = 282.41m, Volume = 114321768 }, + new() { Date = DateTime.Parse("2018-10-03"), Open = 285.63m, High = 286.09m, Low = 284.25m, Close = 284.64m, Volume = 66304540 }, + new() { Date = DateTime.Parse("2018-10-02"), Open = 284.48m, High = 285.26m, Low = 284.07m, Close = 284.48m, Volume = 48434264 }, + new() { Date = DateTime.Parse("2018-10-01"), Open = 285.02m, High = 285.82m, Low = 283.91m, Close = 284.65m, Volume = 63623792 }, + new() { Date = DateTime.Parse("2018-09-28"), Open = 282.95m, High = 284.21m, Low = 282.91m, Close = 283.66m, Volume = 71835632 }, + new() { Date = DateTime.Parse("2018-09-27"), Open = 283.36m, High = 284.82m, Low = 283.06m, Close = 283.63m, Volume = 60723896 }, + new() { Date = DateTime.Parse("2018-09-26"), Open = 283.85m, High = 285.14m, Low = 282.38m, Close = 282.84m, Volume = 81724024 }, + new() { Date = DateTime.Parse("2018-09-25"), Open = 284.45m, High = 284.57m, Low = 283.43m, Close = 283.69m, Volume = 45474200 }, + new() { Date = DateTime.Parse("2018-09-24"), Open = 284.27m, High = 284.42m, Low = 283.32m, Close = 283.95m, Volume = 54738760 }, + new() { Date = DateTime.Parse("2018-09-21"), Open = 285.97m, High = 286.10m, Low = 284.72m, Close = 284.90m, Volume = 108104552 }, + new() { Date = DateTime.Parse("2018-09-20"), Open = 284.25m, High = 285.51m, Low = 282.88m, Close = 285.16m, Volume = 103323632 }, + new() { Date = DateTime.Parse("2018-09-19"), Open = 282.63m, High = 283.33m, Low = 282.48m, Close = 282.87m, Volume = 50529584 }, + new() { Date = DateTime.Parse("2018-09-18"), Open = 281.28m, High = 283.22m, Low = 281.25m, Close = 282.57m, Volume = 63758804 }, + new() { Date = DateTime.Parse("2018-09-17"), Open = 282.48m, High = 282.52m, Low = 280.74m, Close = 281.04m, Volume = 70258840 }, + new() { Date = DateTime.Parse("2018-09-14"), Open = 282.71m, High = 282.92m, Low = 281.68m, Close = 282.54m, Volume = 56706020 }, + new() { Date = DateTime.Parse("2018-09-13"), Open = 281.99m, High = 282.69m, Low = 281.68m, Close = 282.49m, Volume = 52540928 }, + new() { Date = DateTime.Parse("2018-09-12"), Open = 280.77m, High = 281.49m, Low = 279.96m, Close = 280.83m, Volume = 61576576 }, + new() { Date = DateTime.Parse("2018-09-11"), Open = 279.13m, High = 281.25m, Low = 278.75m, Close = 280.76m, Volume = 52022324 }, + new() { Date = DateTime.Parse("2018-09-10"), Open = 280.46m, High = 280.75m, Low = 279.62m, Close = 279.84m, Volume = 51693300 }, + new() { Date = DateTime.Parse("2018-09-07"), Open = 278.75m, High = 280.42m, Low = 278.49m, Close = 279.35m, Volume = 75695528 }, + new() { Date = DateTime.Parse("2018-09-06"), Open = 280.86m, High = 281.19m, Low = 278.77m, Close = 279.90m, Volume = 67855744 }, + new() { Date = DateTime.Parse("2018-09-05"), Open = 281.11m, High = 281.33m, Low = 279.63m, Close = 280.74m, Volume = 74591480 }, + new() { Date = DateTime.Parse("2018-09-04"), Open = 281.53m, High = 281.89m, Low = 280.40m, Close = 281.50m, Volume = 59294748 }, + new() { Date = DateTime.Parse("2018-08-31"), Open = 281.53m, High = 282.47m, Low = 280.99m, Close = 281.98m, Volume = 68093544 }, + new() { Date = DateTime.Parse("2018-08-30"), Open = 282.60m, High = 283.00m, Low = 281.32m, Close = 281.98m, Volume = 63037208 }, + new() { Date = DateTime.Parse("2018-08-29"), Open = 281.84m, High = 283.37m, Low = 281.57m, Close = 283.12m, Volume = 63300776 }, + new() { Date = DateTime.Parse("2018-08-28"), Open = 281.98m, High = 282.09m, Low = 281.10m, Close = 281.61m, Volume = 48329404 }, + new() { Date = DateTime.Parse("2018-08-27"), Open = 280.58m, High = 281.59m, Low = 280.40m, Close = 281.47m, Volume = 58757348 }, + new() { Date = DateTime.Parse("2018-08-24"), Open = 278.23m, High = 279.42m, Low = 278.17m, Close = 279.27m, Volume = 59184624 }, + new() { Date = DateTime.Parse("2018-08-23"), Open = 277.77m, High = 278.71m, Low = 277.24m, Close = 277.59m, Volume = 50657548 }, + new() { Date = DateTime.Parse("2018-08-22"), Open = 277.68m, High = 278.54m, Low = 277.39m, Close = 277.96m, Volume = 46321688 }, + new() { Date = DateTime.Parse("2018-08-21"), Open = 278.04m, High = 279.07m, Low = 277.52m, Close = 278.13m, Volume = 69258080 }, + new() { Date = DateTime.Parse("2018-08-20"), Open = 277.38m, High = 277.77m, Low = 276.89m, Close = 277.48m, Volume = 40982744 }, + new() { Date = DateTime.Parse("2018-08-17"), Open = 275.69m, High = 277.37m, Low = 275.24m, Close = 276.89m, Volume = 67555760 }, + new() { Date = DateTime.Parse("2018-08-16"), Open = 275.27m, High = 276.87m, Low = 275.23m, Close = 275.91m, Volume = 72033608 }, + new() { Date = DateTime.Parse("2018-08-15"), Open = 274.28m, High = 274.44m, Low = 272.13m, Close = 273.70m, Volume = 105964064 }, + new() { Date = DateTime.Parse("2018-08-14"), Open = 274.81m, High = 276.02m, Low = 274.38m, Close = 275.76m, Volume = 45136396 }, + new() { Date = DateTime.Parse("2018-08-13"), Open = 275.34m, High = 276.01m, Low = 273.69m, Close = 274.01m, Volume = 67673568 }, + new() { Date = DateTime.Parse("2018-08-10"), Open = 275.32m, High = 275.91m, Low = 274.26m, Close = 275.04m, Volume = 79351592 }, + new() { Date = DateTime.Parse("2018-08-09"), Open = 277.34m, High = 277.77m, Low = 276.74m, Close = 276.90m, Volume = 36771464 }, + new() { Date = DateTime.Parse("2018-08-08"), Open = 277.21m, High = 277.71m, Low = 276.77m, Close = 277.27m, Volume = 43357916 }, + new() { Date = DateTime.Parse("2018-08-07"), Open = 277.21m, High = 277.81m, Low = 277.06m, Close = 277.39m, Volume = 44471960 }, + new() { Date = DateTime.Parse("2018-08-06"), Open = 275.51m, High = 276.82m, Low = 275.08m, Close = 276.48m, Volume = 40564136 }, + new() { Date = DateTime.Parse("2018-08-03"), Open = 274.43m, High = 275.52m, Low = 274.23m, Close = 275.47m, Volume = 55527740 }, + new() { Date = DateTime.Parse("2018-08-02"), Open = 271.38m, High = 274.48m, Low = 271.15m, Close = 274.29m, Volume = 65298924 }, + new() { Date = DateTime.Parse("2018-08-01"), Open = 273.49m, High = 274.04m, Low = 272.10m, Close = 272.81m, Volume = 55443260 }, + new() { Date = DateTime.Parse("2018-07-31"), Open = 272.76m, High = 273.93m, Low = 272.34m, Close = 273.26m, Volume = 70594928 }, + new() { Date = DateTime.Parse("2018-07-30"), Open = 273.44m, High = 273.61m, Low = 271.35m, Close = 271.92m, Volume = 65624404 }, + new() { Date = DateTime.Parse("2018-07-27"), Open = 275.57m, High = 275.68m, Low = 272.34m, Close = 273.35m, Volume = 79050080 }, + new() { Date = DateTime.Parse("2018-07-26"), Open = 275.08m, High = 275.96m, Low = 274.97m, Close = 275.21m, Volume = 59629476 }, + new() { Date = DateTime.Parse("2018-07-25"), Open = 273.26m, High = 276.22m, Low = 273.21m, Close = 275.87m, Volume = 81211824 }, + new() { Date = DateTime.Parse("2018-07-24"), Open = 273.71m, High = 274.46m, Low = 272.58m, Close = 273.53m, Volume = 70035320 }, + new() { Date = DateTime.Parse("2018-07-23"), Open = 271.44m, High = 272.39m, Low = 271.06m, Close = 272.16m, Volume = 48436568 }, + new() { Date = DateTime.Parse("2018-07-20"), Open = 271.75m, High = 272.44m, Low = 271.48m, Close = 271.66m, Volume = 84804656 }, + new() { Date = DateTime.Parse("2018-07-19"), Open = 272.27m, High = 272.69m, Low = 271.45m, Close = 271.97m, Volume = 63225212 }, + new() { Date = DateTime.Parse("2018-07-18"), Open = 272.51m, High = 273.12m, Low = 272.03m, Close = 273.00m, Volume = 45910016 }, + new() { Date = DateTime.Parse("2018-07-17"), Open = 270.48m, High = 272.85m, Low = 270.43m, Close = 272.43m, Volume = 53860032 }, + new() { Date = DateTime.Parse("2018-07-16"), Open = 271.62m, High = 271.78m, Low = 270.84m, Close = 271.33m, Volume = 49624096 }, + new() { Date = DateTime.Parse("2018-07-13"), Open = 271.16m, High = 271.90m, Low = 270.67m, Close = 271.57m, Volume = 49659024 }, + new() { Date = DateTime.Parse("2018-07-12"), Open = 270.30m, High = 271.42m, Low = 269.64m, Close = 271.36m, Volume = 61899772 }, + new() { Date = DateTime.Parse("2018-07-11"), Open = 269.20m, High = 270.07m, Low = 268.59m, Close = 268.92m, Volume = 79329656 }, + new() { Date = DateTime.Parse("2018-07-10"), Open = 270.43m, High = 271.01m, Low = 270.11m, Close = 270.90m, Volume = 53501064 }, + new() { Date = DateTime.Parse("2018-07-09"), Open = 268.62m, High = 269.99m, Low = 268.57m, Close = 269.93m, Volume = 52042820 }, + new() { Date = DateTime.Parse("2018-07-06"), Open = 265.31m, High = 267.93m, Low = 264.89m, Close = 267.52m, Volume = 68456816 }, + new() { Date = DateTime.Parse("2018-07-05"), Open = 264.36m, High = 265.35m, Low = 263.19m, Close = 265.28m, Volume = 58606568 }, + new() { Date = DateTime.Parse("2018-07-03"), Open = 265.05m, High = 265.15m, Low = 262.67m, Close = 263.13m, Volume = 43432576 }, + new() { Date = DateTime.Parse("2018-07-02"), Open = 261.78m, High = 264.24m, Low = 261.52m, Close = 264.06m, Volume = 65431128 }, + new() { Date = DateTime.Parse("2018-06-29"), Open = 264.32m, High = 265.81m, Low = 263.37m, Close = 263.50m, Volume = 100473760 }, + new() { Date = DateTime.Parse("2018-06-28"), Open = 261.57m, High = 263.96m, Low = 260.79m, Close = 263.12m, Volume = 78913504 }, + new() { Date = DateTime.Parse("2018-06-27"), Open = 264.45m, High = 266.01m, Low = 261.46m, Close = 261.63m, Volume = 108213904 }, + new() { Date = DateTime.Parse("2018-06-26"), Open = 263.85m, High = 264.74m, Low = 263.02m, Close = 263.81m, Volume = 70710976 }, + new() { Date = DateTime.Parse("2018-06-25"), Open = 265.60m, High = 265.77m, Low = 261.38m, Close = 263.23m, Volume = 141924096 }, + new() { Date = DateTime.Parse("2018-06-22"), Open = 267.76m, High = 267.88m, Low = 266.62m, Close = 266.86m, Volume = 58283384 }, + new() { Date = DateTime.Parse("2018-06-21"), Open = 268.05m, High = 268.07m, Low = 265.83m, Close = 266.38m, Volume = 73159376 }, + new() { Date = DateTime.Parse("2018-06-20"), Open = 268.35m, High = 268.78m, Low = 267.69m, Close = 268.06m, Volume = 55373416 }, + new() { Date = DateTime.Parse("2018-06-19"), Open = 266.14m, High = 267.84m, Low = 265.69m, Close = 267.60m, Volume = 100410976 }, + new() { Date = DateTime.Parse("2018-06-18"), Open = 267.59m, High = 268.77m, Low = 267.07m, Close = 268.63m, Volume = 54479888 }, + new() { Date = DateTime.Parse("2018-06-15"), Open = 268.67m, High = 269.55m, Low = 267.45m, Close = 269.18m, Volume = 123585600 }, + new() { Date = DateTime.Parse("2018-06-14"), Open = 269.80m, High = 270.11m, Low = 268.88m, Close = 269.53m, Volume = 79730104 }, + new() { Date = DateTime.Parse("2018-06-13"), Open = 269.97m, High = 270.25m, Low = 268.63m, Close = 268.85m, Volume = 81770464 }, + new() { Date = DateTime.Parse("2018-06-12"), Open = 269.82m, High = 270.11m, Low = 269.00m, Close = 269.71m, Volume = 74798688 }, + new() { Date = DateTime.Parse("2018-06-11"), Open = 269.25m, High = 270.15m, Low = 269.12m, Close = 269.36m, Volume = 60903392 }, + new() { Date = DateTime.Parse("2018-06-08"), Open = 267.71m, High = 269.06m, Low = 267.53m, Close = 269.00m, Volume = 74602920 }, + new() { Date = DateTime.Parse("2018-06-07"), Open = 268.77m, High = 269.09m, Low = 267.22m, Close = 268.21m, Volume = 75460928 }, + new() { Date = DateTime.Parse("2018-06-06"), Open = 266.68m, High = 268.36m, Low = 266.01m, Close = 268.24m, Volume = 64874192 }, + new() { Date = DateTime.Parse("2018-06-05"), Open = 265.97m, High = 266.43m, Low = 265.13m, Close = 266.02m, Volume = 52881036 }, + new() { Date = DateTime.Parse("2018-06-04"), Open = 265.47m, High = 266.10m, Low = 265.20m, Close = 265.82m, Volume = 46934832 }, + new() { Date = DateTime.Parse("2018-06-01"), Open = 263.42m, High = 264.90m, Low = 263.34m, Close = 264.57m, Volume = 73691520 }, + new() { Date = DateTime.Parse("2018-05-31"), Open = 263.16m, High = 263.49m, Low = 261.33m, Close = 261.99m, Volume = 96713160 }, + new() { Date = DateTime.Parse("2018-05-30"), Open = 261.57m, High = 264.09m, Low = 261.49m, Close = 263.61m, Volume = 72057608 }, + new() { Date = DateTime.Parse("2018-05-29"), Open = 261.39m, High = 262.22m, Low = 258.92m, Close = 260.14m, Volume = 119866288 }, + new() { Date = DateTime.Parse("2018-05-25"), Open = 263.16m, High = 263.85m, Low = 262.61m, Close = 263.16m, Volume = 58299660 }, + new() { Date = DateTime.Parse("2018-05-24"), Open = 263.90m, High = 264.20m, Low = 261.84m, Close = 263.79m, Volume = 78640328 }, + new() { Date = DateTime.Parse("2018-05-23"), Open = 262.22m, High = 264.36m, Low = 262.04m, Close = 264.33m, Volume = 66903156 }, + new() { Date = DateTime.Parse("2018-05-22"), Open = 264.91m, High = 265.20m, Low = 263.25m, Close = 263.61m, Volume = 54774884 }, + new() { Date = DateTime.Parse("2018-05-21"), Open = 264.00m, High = 264.93m, Low = 262.39m, Close = 264.34m, Volume = 60007156 }, + new() { Date = DateTime.Parse("2018-05-18"), Open = 262.65m, High = 263.05m, Low = 261.98m, Close = 262.37m, Volume = 66565792 }, + new() { Date = DateTime.Parse("2018-05-17"), Open = 262.96m, High = 264.21m, Low = 262.18m, Close = 263.03m, Volume = 58466824 }, + new() { Date = DateTime.Parse("2018-05-16"), Open = 262.19m, High = 263.75m, Low = 262.16m, Close = 263.25m, Volume = 55784492 }, + new() { Date = DateTime.Parse("2018-05-15"), Open = 262.62m, High = 262.64m, Low = 261.11m, Close = 262.15m, Volume = 90007968 }, + new() { Date = DateTime.Parse("2018-05-14"), Open = 264.31m, High = 265.03m, Low = 263.37m, Close = 263.97m, Volume = 56661420 }, + new() { Date = DateTime.Parse("2018-05-11"), Open = 263.17m, High = 264.13m, Low = 262.61m, Close = 263.84m, Volume = 61915812 }, + new() { Date = DateTime.Parse("2018-05-10"), Open = 261.41m, High = 263.40m, Low = 261.30m, Close = 263.04m, Volume = 74524544 }, + new() { Date = DateTime.Parse("2018-05-09"), Open = 258.84m, High = 260.95m, Low = 258.27m, Close = 260.60m, Volume = 61703432 }, + new() { Date = DateTime.Parse("2018-05-08"), Open = 257.70m, High = 258.50m, Low = 256.40m, Close = 258.11m, Volume = 69804000 }, + new() { Date = DateTime.Parse("2018-05-07"), Open = 258.08m, High = 259.17m, Low = 257.32m, Close = 258.11m, Volume = 57193284 }, + new() { Date = DateTime.Parse("2018-05-04"), Open = 252.89m, High = 257.98m, Low = 252.53m, Close = 257.24m, Volume = 94336840 }, + new() { Date = DateTime.Parse("2018-05-03"), Open = 253.60m, High = 254.66m, Low = 250.50m, Close = 253.95m, Volume = 140965808 }, + new() { Date = DateTime.Parse("2018-05-02"), Open = 256.02m, High = 256.91m, Low = 254.08m, Close = 254.51m, Volume = 89317992 }, + new() { Date = DateTime.Parse("2018-05-01"), Open = 255.16m, High = 256.35m, Low = 253.46m, Close = 256.23m, Volume = 76737024 }, + new() { Date = DateTime.Parse("2018-04-30"), Open = 258.44m, High = 259.04m, Low = 255.70m, Close = 255.78m, Volume = 84988424 }, + new() { Date = DateTime.Parse("2018-04-27"), Open = 258.18m, High = 258.51m, Low = 256.73m, Close = 257.76m, Volume = 59001736 }, + new() { Date = DateTime.Parse("2018-04-26"), Open = 256.05m, High = 258.42m, Low = 255.56m, Close = 257.52m, Volume = 70044640 }, + new() { Date = DateTime.Parse("2018-04-25"), Open = 254.23m, High = 255.41m, Low = 252.24m, Close = 254.93m, Volume = 107386584 }, + new() { Date = DateTime.Parse("2018-04-24"), Open = 258.89m, High = 259.13m, Low = 252.65m, Close = 254.30m, Volume = 116739904 }, + new() { Date = DateTime.Parse("2018-04-23"), Open = 258.44m, High = 259.04m, Low = 256.59m, Close = 257.77m, Volume = 67796416 }, + new() { Date = DateTime.Parse("2018-04-20"), Open = 259.93m, High = 260.18m, Low = 256.84m, Close = 257.81m, Volume = 103366016 }, + new() { Date = DateTime.Parse("2018-04-19"), Open = 260.75m, High = 260.97m, Low = 258.88m, Close = 260.01m, Volume = 80307456 }, + new() { Date = DateTime.Parse("2018-04-18"), Open = 261.75m, High = 262.34m, Low = 260.96m, Close = 261.46m, Volume = 59260488 }, + new() { Date = DateTime.Parse("2018-04-17"), Open = 260.44m, High = 261.93m, Low = 259.88m, Close = 261.27m, Volume = 66890592 }, + new() { Date = DateTime.Parse("2018-04-16"), Open = 258.18m, High = 259.34m, Low = 257.29m, Close = 258.50m, Volume = 65570252 }, + new() { Date = DateTime.Parse("2018-04-13"), Open = 258.58m, High = 258.71m, Low = 255.29m, Close = 256.40m, Volume = 87984192 }, + new() { Date = DateTime.Parse("2018-04-12"), Open = 256.50m, High = 258.18m, Low = 256.31m, Close = 257.15m, Volume = 71242736 }, + new() { Date = DateTime.Parse("2018-04-11"), Open = 254.77m, High = 256.87m, Low = 254.69m, Close = 255.05m, Volume = 94252208 }, + new() { Date = DateTime.Parse("2018-04-10"), Open = 255.54m, High = 257.26m, Low = 254.30m, Close = 256.40m, Volume = 109178536 }, + new() { Date = DateTime.Parse("2018-04-09"), Open = 252.74m, High = 256.10m, Low = 251.35m, Close = 252.38m, Volume = 109043264 }, + new() { Date = DateTime.Parse("2018-04-06"), Open = 254.72m, High = 256.36m, Low = 249.48m, Close = 251.14m, Volume = 185650928 }, + new() { Date = DateTime.Parse("2018-04-05"), Open = 256.78m, High = 257.84m, Low = 255.59m, Close = 256.87m, Volume = 85474776 }, + new() { Date = DateTime.Parse("2018-04-04"), Open = 248.27m, High = 255.63m, Low = 248.13m, Close = 254.86m, Volume = 127939576 }, + new() { Date = DateTime.Parse("2018-04-03"), Open = 250.32m, High = 252.68m, Low = 248.36m, Close = 252.16m, Volume = 124052768 }, + new() { Date = DateTime.Parse("2018-04-02"), Open = 253.88m, High = 254.44m, Low = 246.26m, Close = 248.97m, Volume = 192647056 }, + new() { Date = DateTime.Parse("2018-03-29"), Open = 252.50m, High = 256.50m, Low = 251.26m, Close = 254.46m, Volume = 128487112 }, + new() { Date = DateTime.Parse("2018-03-28"), Open = 252.14m, High = 253.97m, Low = 250.04m, Close = 251.25m, Volume = 151452896 }, + new() { Date = DateTime.Parse("2018-03-27"), Open = 257.38m, High = 257.96m, Low = 250.29m, Close = 252.00m, Volume = 134378272 }, + new() { Date = DateTime.Parse("2018-03-26"), Open = 253.48m, High = 256.67m, Low = 250.84m, Close = 256.36m, Volume = 146803168 }, + new() { Date = DateTime.Parse("2018-03-23"), Open = 255.45m, High = 256.27m, Low = 249.32m, Close = 249.53m, Volume = 189801520 }, + new() { Date = DateTime.Parse("2018-03-22"), Open = 259.06m, High = 259.99m, Low = 254.66m, Close = 254.96m, Volume = 153866192 }, + new() { Date = DateTime.Parse("2018-03-21"), Open = 261.96m, High = 264.25m, Low = 261.27m, Close = 261.50m, Volume = 81397104 }, + new() { Date = DateTime.Parse("2018-03-20"), Open = 261.99m, High = 262.70m, Low = 261.26m, Close = 262.00m, Volume = 61797672 }, + new() { Date = DateTime.Parse("2018-03-19"), Open = 264.32m, High = 265.34m, Low = 259.75m, Close = 261.56m, Volume = 112937344 }, + new() { Date = DateTime.Parse("2018-03-16"), Open = 265.44m, High = 266.30m, Low = 265.09m, Close = 265.15m, Volume = 103769888 }, + new() { Date = DateTime.Parse("2018-03-15"), Open = 265.71m, High = 266.41m, Low = 264.31m, Close = 264.86m, Volume = 86627344 }, + new() { Date = DateTime.Parse("2018-03-14"), Open = 267.57m, High = 267.77m, Low = 264.54m, Close = 265.15m, Volume = 109949368 }, + new() { Date = DateTime.Parse("2018-03-13"), Open = 269.52m, High = 270.07m, Low = 265.85m, Close = 266.52m, Volume = 95490048 }, + new() { Date = DateTime.Parse("2018-03-12"), Open = 268.90m, High = 269.59m, Low = 267.83m, Close = 268.25m, Volume = 74678496 }, + new() { Date = DateTime.Parse("2018-03-09"), Open = 265.53m, High = 268.59m, Low = 265.19m, Close = 268.59m, Volume = 117975584 }, + new() { Date = DateTime.Parse("2018-03-08"), Open = 263.46m, High = 264.13m, Low = 262.37m, Close = 263.99m, Volume = 69462520 }, + new() { Date = DateTime.Parse("2018-03-07"), Open = 260.45m, High = 263.11m, Low = 260.24m, Close = 262.72m, Volume = 90396808 }, + new() { Date = DateTime.Parse("2018-03-06"), Open = 263.22m, High = 263.31m, Low = 261.18m, Close = 262.82m, Volume = 82245904 }, + new() { Date = DateTime.Parse("2018-03-05"), Open = 257.86m, High = 262.83m, Low = 257.74m, Close = 262.15m, Volume = 101032888 }, + new() { Date = DateTime.Parse("2018-03-02"), Open = 256.00m, High = 259.77m, Low = 255.05m, Close = 259.16m, Volume = 144408144 }, + new() { Date = DateTime.Parse("2018-03-01"), Open = 261.40m, High = 263.10m, Low = 256.19m, Close = 257.83m, Volume = 183626128 }, + new() { Date = DateTime.Parse("2018-02-28"), Open = 265.51m, High = 266.01m, Low = 261.29m, Close = 261.63m, Volume = 126575120 }, + new() { Date = DateTime.Parse("2018-02-27"), Open = 267.86m, High = 268.63m, Low = 264.24m, Close = 264.31m, Volume = 102893264 }, + new() { Date = DateTime.Parse("2018-02-26"), Open = 265.76m, High = 267.76m, Low = 265.11m, Close = 267.65m, Volume = 89802808 }, + new() { Date = DateTime.Parse("2018-02-23"), Open = 261.77m, High = 264.58m, Low = 261.25m, Close = 264.58m, Volume = 96318072 }, + new() { Date = DateTime.Parse("2018-02-22"), Open = 261.10m, High = 262.98m, Low = 259.70m, Close = 260.43m, Volume = 114742312 }, + new() { Date = DateTime.Parse("2018-02-21"), Open = 261.87m, High = 264.59m, Low = 259.99m, Close = 260.09m, Volume = 102669592 }, + new() { Date = DateTime.Parse("2018-02-20"), Open = 262.00m, High = 263.58m, Low = 260.53m, Close = 261.39m, Volume = 89676400 }, + new() { Date = DateTime.Parse("2018-02-16"), Open = 262.28m, High = 265.17m, Low = 262.23m, Close = 263.04m, Volume = 166561968 }, + new() { Date = DateTime.Parse("2018-02-15"), Open = 261.56m, High = 262.97m, Low = 258.86m, Close = 262.96m, Volume = 115457688 }, + new() { Date = DateTime.Parse("2018-02-14"), Open = 254.56m, High = 260.04m, Low = 254.55m, Close = 259.65m, Volume = 125358160 }, + new() { Date = DateTime.Parse("2018-02-13"), Open = 254.24m, High = 256.79m, Low = 253.60m, Close = 256.19m, Volume = 84333360 }, + new() { Date = DateTime.Parse("2018-02-12"), Open = 254.10m, High = 257.16m, Low = 252.02m, Close = 255.56m, Volume = 149239040 }, + new() { Date = DateTime.Parse("2018-02-09"), Open = 251.18m, High = 253.89m, Low = 243.59m, Close = 251.86m, Volume = 294421856 }, + new() { Date = DateTime.Parse("2018-02-08"), Open = 258.13m, High = 258.28m, Low = 248.09m, Close = 248.13m, Volume = 255885040 }, + new() { Date = DateTime.Parse("2018-02-07"), Open = 258.60m, High = 262.32m, Low = 257.71m, Close = 257.80m, Volume = 173784240 }, + new() { Date = DateTime.Parse("2018-02-06"), Open = 250.35m, High = 259.76m, Low = 249.16m, Close = 259.21m, Volume = 368619296 }, + new() { Date = DateTime.Parse("2018-02-05"), Open = 263.37m, High = 265.68m, Low = 253.60m, Close = 254.20m, Volume = 305963968 }, + new() { Date = DateTime.Parse("2018-02-02"), Open = 269.75m, High = 269.90m, Low = 265.25m, Close = 265.29m, Volume = 179804944 }, + new() { Date = DateTime.Parse("2018-02-01"), Open = 270.71m, High = 272.62m, Low = 270.33m, Close = 271.20m, Volume = 93552120 }, + new() { Date = DateTime.Parse("2018-01-31"), Open = 272.30m, High = 272.85m, Low = 270.33m, Close = 271.51m, Volume = 123502168 }, + new() { Date = DateTime.Parse("2018-01-30"), Open = 272.18m, High = 274.24m, Low = 270.85m, Close = 271.37m, Volume = 136842368 }, + new() { Date = DateTime.Parse("2018-01-29"), Open = 275.39m, High = 275.87m, Low = 274.01m, Close = 274.18m, Volume = 93568600 }, + new() { Date = DateTime.Parse("2018-01-26"), Open = 273.77m, High = 276.06m, Low = 273.49m, Close = 276.01m, Volume = 111868160 }, + new() { Date = DateTime.Parse("2018-01-25"), Open = 273.68m, High = 273.79m, Low = 271.99m, Close = 272.85m, Volume = 87825816 }, + new() { Date = DateTime.Parse("2018-01-24"), Open = 273.55m, High = 274.20m, Low = 271.45m, Close = 272.74m, Volume = 139977680 }, + new() { Date = DateTime.Parse("2018-01-23"), Open = 272.31m, High = 273.16m, Low = 271.96m, Close = 272.84m, Volume = 100801672 }, + new() { Date = DateTime.Parse("2018-01-22"), Open = 269.84m, High = 272.27m, Low = 269.78m, Close = 272.27m, Volume = 94818768 }, + new() { Date = DateTime.Parse("2018-01-19"), Open = 269.48m, High = 270.07m, Low = 268.85m, Close = 270.07m, Volume = 146315344 }, + new() { Date = DateTime.Parse("2018-01-18"), Open = 269.17m, High = 269.64m, Low = 268.31m, Close = 268.85m, Volume = 104584464 }, + new() { Date = DateTime.Parse("2018-01-17"), Open = 267.78m, High = 269.72m, Low = 266.76m, Close = 269.30m, Volume = 117595008 }, + new() { Date = DateTime.Parse("2018-01-16"), Open = 269.05m, High = 269.76m, Low = 266.00m, Close = 266.76m, Volume = 110634704 }, + new() { Date = DateTime.Parse("2018-01-12"), Open = 266.23m, High = 267.86m, Low = 265.90m, Close = 267.67m, Volume = 94293048 }, + new() { Date = DateTime.Parse("2018-01-11"), Open = 264.62m, High = 265.94m, Low = 264.44m, Close = 265.94m, Volume = 64749016 }, + new() { Date = DateTime.Parse("2018-01-10"), Open = 263.59m, High = 264.30m, Low = 262.86m, Close = 264.01m, Volume = 72238032 }, + new() { Date = DateTime.Parse("2018-01-09"), Open = 264.28m, High = 265.10m, Low = 263.97m, Close = 264.42m, Volume = 59445976 }, + new() { Date = DateTime.Parse("2018-01-08"), Open = 263.23m, High = 263.99m, Low = 262.91m, Close = 263.82m, Volume = 59513708 }, + new() { Date = DateTime.Parse("2018-01-05"), Open = 262.46m, High = 263.47m, Low = 261.92m, Close = 263.34m, Volume = 86721784 }, + new() { Date = DateTime.Parse("2018-01-04"), Open = 261.20m, High = 262.12m, Low = 260.57m, Close = 261.59m, Volume = 83723648 }, + new() { Date = DateTime.Parse("2018-01-03"), Open = 259.04m, High = 260.66m, Low = 259.04m, Close = 260.50m, Volume = 93518840 }, + new() { Date = DateTime.Parse("2018-01-02"), Open = 257.96m, High = 258.90m, Low = 257.54m, Close = 258.86m, Volume = 89973440 }, + new() { Date = DateTime.Parse("2017-12-29"), Open = 258.63m, High = 258.65m, Low = 256.81m, Close = 257.02m, Volume = 99683152 }, + new() { Date = DateTime.Parse("2017-12-28"), Open = 258.01m, High = 258.04m, Low = 257.59m, Close = 257.99m, Volume = 46843448 }, + new() { Date = DateTime.Parse("2017-12-27"), Open = 257.52m, High = 257.86m, Low = 257.16m, Close = 257.46m, Volume = 59962032 }, + new() { Date = DateTime.Parse("2017-12-26"), Open = 257.20m, High = 257.58m, Low = 257.04m, Close = 257.34m, Volume = 46976656 }, + new() { Date = DateTime.Parse("2017-12-22"), Open = 257.73m, High = 257.77m, Low = 257.06m, Close = 257.65m, Volume = 81734768 }, + new() { Date = DateTime.Parse("2017-12-21"), Open = 257.87m, High = 258.49m, Low = 257.44m, Close = 257.71m, Volume = 69598728 }, + new() { Date = DateTime.Parse("2017-12-20"), Open = 258.38m, High = 258.44m, Low = 256.86m, Close = 257.18m, Volume = 79690000 }, + new() { Date = DateTime.Parse("2017-12-19"), Open = 258.58m, High = 258.63m, Low = 257.24m, Close = 257.32m, Volume = 85536976 }, + new() { Date = DateTime.Parse("2017-12-18"), Open = 258.21m, High = 258.70m, Low = 258.10m, Close = 258.31m, Volume = 86856320 }, + new() { Date = DateTime.Parse("2017-12-15"), Open = 255.66m, High = 257.19m, Low = 255.60m, Close = 256.68m, Volume = 150146832 }, + new() { Date = DateTime.Parse("2017-12-14"), Open = 255.93m, High = 256.06m, Low = 254.51m, Close = 254.56m, Volume = 105055176 }, + new() { Date = DateTime.Parse("2017-12-13"), Open = 255.90m, High = 256.38m, Low = 255.51m, Close = 255.61m, Volume = 107391488 }, + new() { Date = DateTime.Parse("2017-12-12"), Open = 255.43m, High = 256.15m, Low = 255.22m, Close = 255.64m, Volume = 88909792 }, + new() { Date = DateTime.Parse("2017-12-11"), Open = 254.49m, High = 255.25m, Low = 254.39m, Close = 255.19m, Volume = 86699232 }, + new() { Date = DateTime.Parse("2017-12-08"), Open = 253.92m, High = 254.43m, Low = 253.00m, Close = 254.42m, Volume = 79901608 }, + new() { Date = DateTime.Parse("2017-12-07"), Open = 252.10m, High = 253.38m, Low = 251.96m, Close = 253.04m, Volume = 80584848 }, + new() { Date = DateTime.Parse("2017-12-06"), Open = 251.89m, High = 252.71m, Low = 251.74m, Close = 252.24m, Volume = 79207304 }, + new() { Date = DateTime.Parse("2017-12-05"), Open = 253.38m, High = 254.07m, Low = 252.05m, Close = 252.20m, Volume = 81394656 }, + new() { Date = DateTime.Parse("2017-12-04"), Open = 255.19m, High = 255.65m, Low = 253.05m, Close = 253.11m, Volume = 98140184 }, + new() { Date = DateTime.Parse("2017-12-01"), Open = 253.70m, High = 254.23m, Low = 249.87m, Close = 253.41m, Volume = 171557392 }, + new() { Date = DateTime.Parse("2017-11-30"), Open = 252.74m, High = 254.94m, Low = 252.66m, Close = 253.94m, Volume = 133469840 }, + new() { Date = DateTime.Parse("2017-11-29"), Open = 252.03m, High = 252.62m, Low = 251.25m, Close = 251.74m, Volume = 80891176 }, + new() { Date = DateTime.Parse("2017-11-28"), Open = 249.87m, High = 251.92m, Low = 249.77m, Close = 251.89m, Volume = 103286312 }, + new() { Date = DateTime.Parse("2017-11-27"), Open = 249.53m, High = 249.86m, Low = 249.14m, Close = 249.36m, Volume = 54553804 }, + new() { Date = DateTime.Parse("2017-11-24"), Open = 249.45m, High = 249.60m, Low = 249.29m, Close = 249.48m, Volume = 29070892 }, + new() { Date = DateTime.Parse("2017-11-22"), Open = 249.14m, High = 249.28m, Low = 248.73m, Close = 248.91m, Volume = 46996584 }, + new() { Date = DateTime.Parse("2017-11-21"), Open = 248.35m, High = 249.33m, Low = 247.47m, Close = 249.13m, Volume = 72192504 }, + new() { Date = DateTime.Parse("2017-11-20"), Open = 247.36m, High = 247.73m, Low = 247.09m, Close = 247.51m, Volume = 50171324 }, + new() { Date = DateTime.Parse("2017-11-17"), Open = 247.43m, High = 247.79m, Low = 247.00m, Close = 247.09m, Volume = 79059392 }, + new() { Date = DateTime.Parse("2017-11-16"), Open = 246.76m, High = 248.22m, Low = 246.72m, Close = 247.82m, Volume = 70731712 }, + new() { Date = DateTime.Parse("2017-11-15"), Open = 245.90m, High = 246.48m, Low = 244.95m, Close = 245.73m, Volume = 84334432 }, + new() { Date = DateTime.Parse("2017-11-14"), Open = 246.66m, High = 247.08m, Low = 245.80m, Close = 246.96m, Volume = 63988136 }, + new() { Date = DateTime.Parse("2017-11-13"), Open = 246.56m, High = 247.79m, Low = 246.52m, Close = 247.54m, Volume = 52418324 }, + new() { Date = DateTime.Parse("2017-11-10"), Open = 246.96m, High = 247.50m, Low = 246.62m, Close = 247.31m, Volume = 62599644 }, + new() { Date = DateTime.Parse("2017-11-09"), Open = 246.96m, High = 247.60m, Low = 245.65m, Close = 247.39m, Volume = 99230672 }, + new() { Date = DateTime.Parse("2017-11-08"), Open = 247.67m, High = 248.39m, Low = 247.37m, Close = 248.29m, Volume = 52669760 }, + new() { Date = DateTime.Parse("2017-11-07"), Open = 248.15m, High = 248.52m, Low = 247.31m, Close = 247.86m, Volume = 60008920 }, + new() { Date = DateTime.Parse("2017-11-06"), Open = 247.51m, High = 248.18m, Low = 247.43m, Close = 248.04m, Volume = 51817160 }, + new() { Date = DateTime.Parse("2017-11-03"), Open = 247.00m, High = 247.70m, Low = 246.55m, Close = 247.65m, Volume = 62187496 }, + new() { Date = DateTime.Parse("2017-11-02"), Open = 246.66m, High = 246.98m, Low = 245.49m, Close = 246.83m, Volume = 58910404 }, + new() { Date = DateTime.Parse("2017-11-01"), Open = 247.26m, High = 247.63m, Low = 246.33m, Close = 246.73m, Volume = 56565660 }, + new() { Date = DateTime.Parse("2017-10-31"), Open = 246.44m, High = 246.69m, Low = 246.08m, Close = 246.41m, Volume = 62933720 }, + new() { Date = DateTime.Parse("2017-10-30"), Open = 246.33m, High = 246.84m, Low = 245.70m, Close = 246.02m, Volume = 56652224 }, + new() { Date = DateTime.Parse("2017-10-27"), Open = 245.76m, High = 247.12m, Low = 244.95m, Close = 246.94m, Volume = 89292576 }, + new() { Date = DateTime.Parse("2017-10-26"), Open = 245.30m, High = 245.59m, Low = 244.81m, Close = 244.94m, Volume = 72840760 }, + new() { Date = DateTime.Parse("2017-10-25"), Open = 245.48m, High = 245.60m, Low = 243.39m, Close = 244.63m, Volume = 108236672 }, + new() { Date = DateTime.Parse("2017-10-24"), Open = 245.88m, High = 246.10m, Low = 245.45m, Close = 245.84m, Volume = 69853928 }, + new() { Date = DateTime.Parse("2017-10-23"), Open = 246.72m, High = 246.75m, Low = 245.33m, Close = 245.41m, Volume = 66701640 }, + new() { Date = DateTime.Parse("2017-10-20"), Open = 245.98m, High = 246.40m, Low = 245.09m, Close = 246.37m, Volume = 93063952 }, + new() { Date = DateTime.Parse("2017-10-19"), Open = 244.18m, High = 245.14m, Low = 243.72m, Close = 245.10m, Volume = 64602432 }, + new() { Date = DateTime.Parse("2017-10-18"), Open = 245.21m, High = 245.26m, Low = 244.83m, Close = 245.04m, Volume = 42670820 }, + new() { Date = DateTime.Parse("2017-10-17"), Open = 244.57m, High = 244.85m, Low = 244.33m, Close = 244.80m, Volume = 32936836 }, + new() { Date = DateTime.Parse("2017-10-16"), Open = 244.55m, High = 244.84m, Low = 244.18m, Close = 244.63m, Volume = 39887916 }, + new() { Date = DateTime.Parse("2017-10-13"), Open = 244.48m, High = 244.61m, Low = 244.00m, Close = 244.30m, Volume = 57189416 }, + new() { Date = DateTime.Parse("2017-10-12"), Open = 244.02m, High = 244.41m, Low = 243.74m, Close = 244.00m, Volume = 49116908 }, + new() { Date = DateTime.Parse("2017-10-11"), Open = 243.88m, High = 244.37m, Low = 243.70m, Close = 244.37m, Volume = 49752644 }, + new() { Date = DateTime.Parse("2017-10-10"), Open = 243.96m, High = 244.40m, Low = 243.37m, Close = 243.98m, Volume = 44934412 }, + new() { Date = DateTime.Parse("2017-10-09"), Open = 243.99m, High = 244.06m, Low = 243.05m, Close = 243.34m, Volume = 37363944 }, + new() { Date = DateTime.Parse("2017-10-06"), Open = 243.53m, High = 244.06m, Low = 243.25m, Close = 243.74m, Volume = 84161696 }, + new() { Date = DateTime.Parse("2017-10-05"), Open = 242.95m, High = 244.04m, Low = 242.62m, Close = 244.02m, Volume = 66291980 }, + new() { Date = DateTime.Parse("2017-10-04"), Open = 242.13m, High = 242.85m, Low = 242.01m, Close = 242.58m, Volume = 58392872 }, + new() { Date = DateTime.Parse("2017-10-03"), Open = 241.91m, High = 242.33m, Low = 241.69m, Close = 242.30m, Volume = 69722704 }, + new() { Date = DateTime.Parse("2017-10-02"), Open = 240.98m, High = 241.78m, Low = 240.80m, Close = 241.78m, Volume = 61596044 }, + new() { Date = DateTime.Parse("2017-09-29"), Open = 239.88m, High = 240.82m, Low = 239.68m, Close = 240.74m, Volume = 89308704 }, + new() { Date = DateTime.Parse("2017-09-28"), Open = 239.30m, High = 239.98m, Low = 239.20m, Close = 239.89m, Volume = 46730936 }, + new() { Date = DateTime.Parse("2017-09-27"), Open = 239.44m, High = 240.03m, Low = 238.47m, Close = 239.60m, Volume = 84532616 }, + new() { Date = DateTime.Parse("2017-09-26"), Open = 239.00m, High = 239.27m, Low = 238.41m, Close = 238.68m, Volume = 56439616 }, + new() { Date = DateTime.Parse("2017-09-25"), Open = 238.74m, High = 239.13m, Low = 237.72m, Close = 238.53m, Volume = 59552032 }, + new() { Date = DateTime.Parse("2017-09-22"), Open = 238.65m, High = 239.20m, Low = 238.62m, Close = 239.02m, Volume = 53446664 }, + new() { Date = DateTime.Parse("2017-09-21"), Open = 239.44m, High = 239.54m, Low = 238.78m, Close = 238.97m, Volume = 50313136 }, + new() { Date = DateTime.Parse("2017-09-20"), Open = 239.62m, High = 239.74m, Low = 238.52m, Close = 239.61m, Volume = 62171164 }, + new() { Date = DateTime.Parse("2017-09-19"), Open = 239.56m, High = 239.62m, Low = 239.17m, Close = 239.53m, Volume = 49161788 }, + new() { Date = DateTime.Parse("2017-09-18"), Open = 239.18m, High = 239.67m, Low = 238.87m, Close = 239.29m, Volume = 48250824 }, + new() { Date = DateTime.Parse("2017-09-15"), Open = 238.30m, High = 238.88m, Low = 238.19m, Close = 238.78m, Volume = 99592680 }, + new() { Date = DateTime.Parse("2017-09-14"), Open = 238.18m, High = 238.68m, Low = 237.99m, Close = 238.46m, Volume = 100101416 }, + new() { Date = DateTime.Parse("2017-09-13"), Open = 238.11m, High = 238.57m, Low = 237.98m, Close = 238.54m, Volume = 62116640 }, + new() { Date = DateTime.Parse("2017-09-12"), Open = 238.02m, High = 238.46m, Low = 237.82m, Close = 238.42m, Volume = 59670932 }, + new() { Date = DateTime.Parse("2017-09-11"), Open = 236.51m, High = 237.71m, Low = 236.49m, Close = 237.62m, Volume = 74845424 }, + new() { Date = DateTime.Parse("2017-09-08"), Open = 235.07m, High = 235.62m, Low = 234.85m, Close = 235.11m, Volume = 66946052 }, + new() { Date = DateTime.Parse("2017-09-07"), Open = 235.75m, High = 235.77m, Low = 234.94m, Close = 235.39m, Volume = 60865172 }, + new() { Date = DateTime.Parse("2017-09-06"), Open = 235.36m, High = 235.78m, Low = 234.78m, Close = 235.42m, Volume = 60741564 }, + new() { Date = DateTime.Parse("2017-09-05"), Open = 235.76m, High = 236.01m, Low = 233.56m, Close = 234.62m, Volume = 95856440 }, + new() { Date = DateTime.Parse("2017-09-01"), Open = 236.39m, High = 236.78m, Low = 236.15m, Close = 236.31m, Volume = 65031164 }, + new() { Date = DateTime.Parse("2017-08-31"), Open = 235.25m, High = 236.25m, Low = 234.61m, Close = 235.98m, Volume = 108866560 }, + new() { Date = DateTime.Parse("2017-08-30"), Open = 233.44m, High = 234.87m, Low = 233.24m, Close = 234.57m, Volume = 65056144 }, + new() { Date = DateTime.Parse("2017-08-29"), Open = 231.76m, High = 233.75m, Low = 231.63m, Close = 233.46m, Volume = 53629680 }, + new() { Date = DateTime.Parse("2017-08-28"), Open = 233.77m, High = 233.80m, Low = 232.74m, Close = 233.20m, Volume = 42544052 }, + new() { Date = DateTime.Parse("2017-08-25"), Open = 233.51m, High = 234.19m, Low = 233.02m, Close = 233.19m, Volume = 67589040 }, + new() { Date = DateTime.Parse("2017-08-24"), Open = 233.61m, High = 233.78m, Low = 232.41m, Close = 232.64m, Volume = 53216420 }, + new() { Date = DateTime.Parse("2017-08-23"), Open = 232.97m, High = 233.65m, Low = 232.81m, Close = 233.19m, Volume = 52652352 }, + new() { Date = DateTime.Parse("2017-08-22"), Open = 232.24m, High = 234.20m, Low = 232.22m, Close = 234.03m, Volume = 66219544 }, + new() { Date = DateTime.Parse("2017-08-21"), Open = 231.36m, High = 231.89m, Low = 230.58m, Close = 231.60m, Volume = 68662792 }, + new() { Date = DateTime.Parse("2017-08-18"), Open = 231.60m, High = 232.83m, Low = 230.94m, Close = 231.42m, Volume = 143417408 }, + new() { Date = DateTime.Parse("2017-08-17"), Open = 234.79m, High = 235.13m, Low = 231.79m, Close = 231.79m, Volume = 134757072 }, + new() { Date = DateTime.Parse("2017-08-16"), Open = 235.62m, High = 236.06m, Low = 234.99m, Close = 235.46m, Volume = 59481648 }, + new() { Date = DateTime.Parse("2017-08-15"), Open = 235.49m, High = 235.51m, Low = 234.71m, Close = 235.05m, Volume = 57937020 }, + new() { Date = DateTime.Parse("2017-08-14"), Open = 234.17m, High = 235.31m, Low = 234.13m, Close = 235.07m, Volume = 76866480 }, + new() { Date = DateTime.Parse("2017-08-11"), Open = 232.67m, High = 233.42m, Low = 232.41m, Close = 232.77m, Volume = 78521472 }, + new() { Date = DateTime.Parse("2017-08-10"), Open = 234.84m, High = 234.98m, Low = 232.37m, Close = 232.42m, Volume = 126355448 }, + new() { Date = DateTime.Parse("2017-08-09"), Open = 235.01m, High = 235.81m, Low = 234.62m, Close = 235.75m, Volume = 65687312 }, + new() { Date = DateTime.Parse("2017-08-08"), Open = 236.00m, High = 237.33m, Low = 235.35m, Close = 235.76m, Volume = 64729500 }, + new() { Date = DateTime.Parse("2017-08-07"), Open = 235.98m, High = 236.34m, Low = 235.87m, Close = 236.34m, Volume = 33555464 }, + new() { Date = DateTime.Parse("2017-08-04"), Open = 236.01m, High = 236.27m, Low = 235.49m, Close = 235.90m, Volume = 63127488 }, + new() { Date = DateTime.Parse("2017-08-03"), Open = 235.81m, High = 235.84m, Low = 235.17m, Close = 235.48m, Volume = 42848608 }, + new() { Date = DateTime.Parse("2017-08-02"), Open = 235.96m, High = 236.09m, Low = 234.91m, Close = 235.93m, Volume = 49513776 }, + new() { Date = DateTime.Parse("2017-08-01"), Open = 235.95m, High = 235.99m, Low = 235.24m, Close = 235.82m, Volume = 57735292 }, + new() { Date = DateTime.Parse("2017-07-31"), Open = 235.87m, High = 235.97m, Low = 235.07m, Close = 235.29m, Volume = 69049712 }, + new() { Date = DateTime.Parse("2017-07-28"), Open = 235.18m, High = 235.57m, Low = 234.68m, Close = 235.43m, Volume = 52531244 }, + new() { Date = DateTime.Parse("2017-07-27"), Open = 236.43m, High = 236.47m, Low = 234.26m, Close = 235.70m, Volume = 74217968 }, + new() { Date = DateTime.Parse("2017-07-26"), Open = 236.23m, High = 236.27m, Low = 235.64m, Close = 235.92m, Volume = 49895744 }, + new() { Date = DateTime.Parse("2017-07-25"), Open = 236.16m, High = 236.28m, Low = 235.67m, Close = 235.91m, Volume = 57593908 }, + new() { Date = DateTime.Parse("2017-07-24"), Open = 235.31m, High = 235.49m, Low = 234.83m, Close = 235.34m, Volume = 48896096 }, + new() { Date = DateTime.Parse("2017-07-21"), Open = 234.98m, High = 235.43m, Low = 234.73m, Close = 235.40m, Volume = 93037592 }, + new() { Date = DateTime.Parse("2017-07-20"), Open = 235.78m, High = 235.91m, Low = 235.01m, Close = 235.61m, Volume = 49434036 }, + new() { Date = DateTime.Parse("2017-07-19"), Open = 234.58m, High = 235.51m, Low = 234.57m, Close = 235.50m, Volume = 53523280 }, + new() { Date = DateTime.Parse("2017-07-18"), Open = 233.66m, High = 234.29m, Low = 233.29m, Close = 234.24m, Volume = 44827112 }, + new() { Date = DateTime.Parse("2017-07-17"), Open = 234.05m, High = 234.47m, Low = 233.92m, Close = 234.11m, Volume = 35167316 }, + new() { Date = DateTime.Parse("2017-07-14"), Open = 233.06m, High = 234.53m, Low = 232.95m, Close = 234.14m, Volume = 63201796 }, + new() { Date = DateTime.Parse("2017-07-13"), Open = 232.67m, High = 233.18m, Low = 232.42m, Close = 233.05m, Volume = 41396728 }, + new() { Date = DateTime.Parse("2017-07-12"), Open = 231.99m, High = 232.84m, Low = 231.99m, Close = 232.66m, Volume = 62517696 }, + new() { Date = DateTime.Parse("2017-07-11"), Open = 230.90m, High = 231.27m, Low = 229.65m, Close = 230.93m, Volume = 52810484 }, + new() { Date = DateTime.Parse("2017-07-10"), Open = 230.70m, High = 231.51m, Low = 230.52m, Close = 231.10m, Volume = 38451396 }, + new() { Date = DateTime.Parse("2017-07-07"), Open = 229.99m, High = 231.01m, Low = 229.38m, Close = 230.85m, Volume = 60799664 }, + new() { Date = DateTime.Parse("2017-07-06"), Open = 230.64m, High = 230.77m, Low = 229.16m, Close = 229.36m, Volume = 69339864 }, + new() { Date = DateTime.Parse("2017-07-05"), Open = 231.35m, High = 231.71m, Low = 230.46m, Close = 231.48m, Volume = 57082112 }, + new() { Date = DateTime.Parse("2017-07-03"), Open = 231.59m, High = 232.06m, Low = 230.95m, Close = 230.95m, Volume = 41063396 }, + new() { Date = DateTime.Parse("2017-06-30"), Open = 231.01m, High = 231.42m, Low = 230.34m, Close = 230.56m, Volume = 91055080 }, + new() { Date = DateTime.Parse("2017-06-29"), Open = 232.33m, High = 232.39m, Low = 228.80m, Close = 230.13m, Volume = 112165824 }, + new() { Date = DateTime.Parse("2017-06-28"), Open = 231.22m, High = 232.38m, Low = 230.97m, Close = 232.17m, Volume = 73458688 }, + new() { Date = DateTime.Parse("2017-06-27"), Open = 231.74m, High = 232.06m, Low = 230.09m, Close = 230.11m, Volume = 86259016 }, + new() { Date = DateTime.Parse("2017-06-26"), Open = 232.56m, High = 233.02m, Low = 231.74m, Close = 231.98m, Volume = 59465848 }, + new() { Date = DateTime.Parse("2017-06-23"), Open = 231.61m, High = 232.19m, Low = 231.19m, Close = 231.82m, Volume = 70253848 }, + new() { Date = DateTime.Parse("2017-06-22"), Open = 231.66m, High = 232.21m, Low = 231.36m, Close = 231.55m, Volume = 46301224 }, + new() { Date = DateTime.Parse("2017-06-21"), Open = 232.10m, High = 232.26m, Low = 231.14m, Close = 231.65m, Volume = 58707680 }, + new() { Date = DateTime.Parse("2017-06-20"), Open = 232.89m, High = 232.90m, Low = 231.69m, Close = 231.71m, Volume = 59681776 }, + new() { Date = DateTime.Parse("2017-06-19"), Open = 232.26m, High = 233.35m, Low = 232.16m, Close = 233.28m, Volume = 68299992 }, + new() { Date = DateTime.Parse("2017-06-16"), Open = 231.48m, High = 231.54m, Low = 230.40m, Close = 231.36m, Volume = 88676880 }, + new() { Date = DateTime.Parse("2017-06-15"), Open = 230.27m, High = 231.44m, Low = 229.97m, Close = 231.31m, Volume = 70046440 }, + new() { Date = DateTime.Parse("2017-06-14"), Open = 232.34m, High = 232.35m, Low = 230.85m, Close = 231.75m, Volume = 82837904 }, + new() { Date = DateTime.Parse("2017-06-13"), Open = 231.51m, High = 232.10m, Low = 231.13m, Close = 232.05m, Volume = 63303744 }, + new() { Date = DateTime.Parse("2017-06-12"), Open = 230.70m, High = 230.97m, Low = 229.99m, Close = 230.92m, Volume = 90748160 }, + new() { Date = DateTime.Parse("2017-06-09"), Open = 231.61m, High = 232.48m, Low = 229.58m, Close = 230.96m, Volume = 139383184 }, + new() { Date = DateTime.Parse("2017-06-08"), Open = 231.31m, High = 231.84m, Low = 230.74m, Close = 231.32m, Volume = 69504536 }, + new() { Date = DateTime.Parse("2017-06-07"), Open = 231.14m, High = 231.45m, Low = 230.41m, Close = 231.20m, Volume = 57061952 }, + new() { Date = DateTime.Parse("2017-06-06"), Open = 230.90m, High = 231.51m, Low = 230.69m, Close = 230.77m, Volume = 53089976 }, + new() { Date = DateTime.Parse("2017-06-05"), Open = 231.50m, High = 231.81m, Low = 231.30m, Close = 231.51m, Volume = 47107480 }, + new() { Date = DateTime.Parse("2017-06-02"), Open = 230.97m, High = 231.86m, Low = 230.65m, Close = 231.69m, Volume = 93444032 }, + new() { Date = DateTime.Parse("2017-06-01"), Open = 229.60m, High = 230.94m, Low = 229.28m, Close = 230.92m, Volume = 72678144 }, + new() { Date = DateTime.Parse("2017-05-31"), Open = 229.47m, High = 229.51m, Low = 228.34m, Close = 229.09m, Volume = 96742576 }, + new() { Date = DateTime.Parse("2017-05-30"), Open = 229.00m, High = 229.43m, Low = 228.83m, Close = 229.15m, Volume = 37098796 }, + new() { Date = DateTime.Parse("2017-05-26"), Open = 229.19m, High = 229.53m, Low = 229.10m, Close = 229.35m, Volume = 49142620 }, + new() { Date = DateTime.Parse("2017-05-25"), Open = 228.87m, High = 229.70m, Low = 228.64m, Close = 229.40m, Volume = 67524256 }, + new() { Date = DateTime.Parse("2017-05-24"), Open = 228.03m, High = 228.42m, Low = 227.66m, Close = 228.31m, Volume = 51831288 }, + new() { Date = DateTime.Parse("2017-05-23"), Open = 227.68m, High = 227.96m, Low = 227.26m, Close = 227.78m, Volume = 50946640 }, + new() { Date = DateTime.Parse("2017-05-22"), Open = 226.68m, High = 227.45m, Low = 226.61m, Close = 227.27m, Volume = 64298244 }, + new() { Date = DateTime.Parse("2017-05-19"), Open = 225.20m, High = 226.86m, Low = 225.14m, Close = 226.12m, Volume = 121208928 }, + new() { Date = DateTime.Parse("2017-05-18"), Open = 223.68m, High = 225.59m, Low = 223.39m, Close = 224.66m, Volume = 112816072 }, + new() { Date = DateTime.Parse("2017-05-17"), Open = 225.93m, High = 226.44m, Low = 223.70m, Close = 223.76m, Volume = 181451968 }, + new() { Date = DateTime.Parse("2017-05-16"), Open = 228.34m, High = 228.36m, Low = 227.38m, Close = 227.80m, Volume = 54003024 }, + new() { Date = DateTime.Parse("2017-05-15"), Open = 227.23m, High = 228.15m, Low = 227.21m, Close = 228.01m, Volume = 65255528 }, + new() { Date = DateTime.Parse("2017-05-12"), Open = 226.87m, High = 227.19m, Low = 226.47m, Close = 226.76m, Volume = 56817892 }, + new() { Date = DateTime.Parse("2017-05-11"), Open = 227.11m, High = 227.32m, Low = 225.95m, Close = 227.14m, Volume = 65718612 }, + new() { Date = DateTime.Parse("2017-05-10"), Open = 227.15m, High = 227.61m, Low = 226.92m, Close = 227.61m, Volume = 57219496 }, + new() { Date = DateTime.Parse("2017-05-09"), Open = 227.69m, High = 227.91m, Low = 226.82m, Close = 227.20m, Volume = 54130976 }, + new() { Date = DateTime.Parse("2017-05-08"), Open = 227.49m, High = 227.65m, Low = 226.94m, Close = 227.41m, Volume = 50993060 }, + new() { Date = DateTime.Parse("2017-05-05"), Open = 226.96m, High = 227.46m, Low = 226.48m, Close = 227.44m, Volume = 65342296 }, + new() { Date = DateTime.Parse("2017-05-04"), Open = 226.62m, High = 226.71m, Low = 225.62m, Close = 226.55m, Volume = 64774736 }, + new() { Date = DateTime.Parse("2017-05-03"), Open = 226.11m, High = 226.66m, Low = 225.55m, Close = 226.29m, Volume = 77078864 }, + new() { Date = DateTime.Parse("2017-05-02"), Open = 226.63m, High = 226.76m, Low = 226.12m, Close = 226.56m, Volume = 60467504 }, + new() { Date = DateTime.Parse("2017-05-01"), Open = 226.48m, High = 226.94m, Low = 226.02m, Close = 226.48m, Volume = 70486576 }, + new() { Date = DateTime.Parse("2017-04-28"), Open = 226.68m, High = 226.71m, Low = 225.76m, Close = 225.91m, Volume = 66956400 }, + new() { Date = DateTime.Parse("2017-04-27"), Open = 226.56m, High = 226.73m, Low = 225.81m, Close = 226.40m, Volume = 60503960 }, + new() { Date = DateTime.Parse("2017-04-26"), Open = 226.31m, High = 227.28m, Low = 226.16m, Close = 226.21m, Volume = 89266768 }, + new() { Date = DateTime.Parse("2017-04-25"), Open = 225.75m, High = 226.73m, Low = 225.65m, Close = 226.35m, Volume = 80831256 }, + new() { Date = DateTime.Parse("2017-04-24"), Open = 225.05m, High = 225.27m, Low = 222.57m, Close = 225.04m, Volume = 125633672 }, + new() { Date = DateTime.Parse("2017-04-21"), Open = 223.22m, High = 223.28m, Low = 222.16m, Close = 222.60m, Volume = 116338368 }, + new() { Date = DateTime.Parse("2017-04-20"), Open = 222.18m, High = 223.79m, Low = 221.83m, Close = 223.31m, Volume = 97560568 }, + new() { Date = DateTime.Parse("2017-04-19"), Open = 222.53m, High = 222.94m, Low = 221.26m, Close = 221.50m, Volume = 72401856 }, + new() { Date = DateTime.Parse("2017-04-18"), Open = 221.77m, High = 222.50m, Low = 221.16m, Close = 221.91m, Volume = 87710560 }, + new() { Date = DateTime.Parse("2017-04-17"), Open = 221.19m, High = 222.58m, Low = 220.97m, Close = 222.58m, Volume = 72091488 }, + new() { Date = DateTime.Parse("2017-04-13"), Open = 221.69m, High = 222.50m, Low = 220.62m, Close = 220.62m, Volume = 97885392 }, + new() { Date = DateTime.Parse("2017-04-12"), Open = 222.74m, High = 222.95m, Low = 221.82m, Close = 222.06m, Volume = 86275816 }, + new() { Date = DateTime.Parse("2017-04-11"), Open = 222.89m, High = 223.15m, Low = 221.41m, Close = 223.04m, Volume = 92789720 }, + new() { Date = DateTime.Parse("2017-04-10"), Open = 223.33m, High = 224.18m, Low = 222.73m, Close = 223.31m, Volume = 71258848 }, + new() { Date = DateTime.Parse("2017-04-07"), Open = 223.13m, High = 223.93m, Low = 222.64m, Close = 223.17m, Volume = 78422128 }, + new() { Date = DateTime.Parse("2017-04-06"), Open = 222.93m, High = 223.97m, Low = 222.44m, Close = 223.40m, Volume = 72861232 }, + new() { Date = DateTime.Parse("2017-04-05"), Open = 224.18m, High = 225.25m, Low = 222.55m, Close = 222.78m, Volume = 114663488 }, + new() { Date = DateTime.Parse("2017-04-04"), Open = 222.98m, High = 223.53m, Low = 222.56m, Close = 223.44m, Volume = 59508952 }, + new() { Date = DateTime.Parse("2017-04-03"), Open = 223.74m, High = 223.96m, Low = 221.95m, Close = 223.30m, Volume = 90156280 }, + new() { Date = DateTime.Parse("2017-03-31"), Open = 223.84m, High = 224.42m, Low = 223.63m, Close = 223.69m, Volume = 77706304 }, + new() { Date = DateTime.Parse("2017-03-30"), Open = 223.43m, High = 224.43m, Low = 223.24m, Close = 224.21m, Volume = 59795288 }, + new() { Date = DateTime.Parse("2017-03-29"), Open = 222.97m, High = 223.75m, Low = 222.72m, Close = 223.50m, Volume = 65288636 }, + new() { Date = DateTime.Parse("2017-03-28"), Open = 221.34m, High = 223.75m, Low = 221.22m, Close = 223.29m, Volume = 98521432 }, + new() { Date = DateTime.Parse("2017-03-27"), Open = 220.07m, High = 221.96m, Low = 219.77m, Close = 221.67m, Volume = 92167056 }, + new() { Date = DateTime.Parse("2017-03-24"), Open = 222.40m, High = 223.02m, Low = 221.05m, Close = 221.90m, Volume = 118567344 }, + new() { Date = DateTime.Parse("2017-03-23"), Open = 222.04m, High = 223.31m, Low = 221.66m, Close = 222.06m, Volume = 105821032 }, + new() { Date = DateTime.Parse("2017-03-22"), Open = 221.82m, High = 222.61m, Low = 221.13m, Close = 222.30m, Volume = 102826864 }, + new() { Date = DateTime.Parse("2017-03-21"), Open = 225.33m, High = 225.46m, Low = 221.64m, Close = 221.78m, Volume = 138912016 }, + new() { Date = DateTime.Parse("2017-03-20"), Open = 224.91m, High = 225.22m, Low = 224.24m, Close = 224.66m, Volume = 55368008 }, + new() { Date = DateTime.Parse("2017-03-17"), Open = 225.59m, High = 225.80m, Low = 224.91m, Close = 224.91m, Volume = 93798120 }, + new() { Date = DateTime.Parse("2017-03-16"), Open = 225.90m, High = 225.99m, Low = 224.95m, Close = 225.31m, Volume = 82924856 }, + new() { Date = DateTime.Parse("2017-03-15"), Open = 224.44m, High = 226.21m, Low = 224.18m, Close = 225.75m, Volume = 101699816 }, + new() { Date = DateTime.Parse("2017-03-14"), Open = 224.08m, High = 224.13m, Low = 223.14m, Close = 223.81m, Volume = 63382108 }, + new() { Date = DateTime.Parse("2017-03-13"), Open = 224.49m, High = 224.72m, Low = 224.13m, Close = 224.67m, Volume = 60604724 }, + new() { Date = DateTime.Parse("2017-03-10"), Open = 224.82m, High = 224.87m, Low = 223.52m, Close = 224.56m, Volume = 86785840 }, + new() { Date = DateTime.Parse("2017-03-09"), Open = 223.62m, High = 224.13m, Low = 222.72m, Close = 223.78m, Volume = 95986360 }, + new() { Date = DateTime.Parse("2017-03-08"), Open = 224.23m, High = 224.51m, Low = 223.34m, Close = 223.49m, Volume = 82739456 }, + new() { Date = DateTime.Parse("2017-03-07"), Open = 224.25m, High = 224.64m, Low = 223.68m, Close = 223.91m, Volume = 68910464 }, + new() { Date = DateTime.Parse("2017-03-06"), Open = 224.38m, High = 224.97m, Low = 223.92m, Close = 224.58m, Volume = 58630368 }, + new() { Date = DateTime.Parse("2017-03-03"), Open = 225.01m, High = 225.43m, Low = 224.60m, Close = 225.25m, Volume = 86767480 }, + new() { Date = DateTime.Parse("2017-03-02"), Open = 226.33m, High = 226.34m, Low = 225.05m, Close = 225.11m, Volume = 74353376 }, + new() { Date = DateTime.Parse("2017-03-01"), Open = 225.22m, High = 227.04m, Low = 225.20m, Close = 226.53m, Volume = 157879712 }, + new() { Date = DateTime.Parse("2017-02-28"), Open = 223.60m, High = 223.86m, Low = 222.98m, Close = 223.41m, Volume = 102631472 }, + new() { Date = DateTime.Parse("2017-02-27"), Open = 223.57m, High = 224.20m, Low = 223.29m, Close = 224.01m, Volume = 59819992 }, + new() { Date = DateTime.Parse("2017-02-24"), Open = 222.45m, High = 223.71m, Low = 222.41m, Close = 223.66m, Volume = 87198608 }, + new() { Date = DateTime.Parse("2017-02-23"), Open = 223.79m, High = 223.81m, Low = 222.55m, Close = 223.38m, Volume = 78978816 }, + new() { Date = DateTime.Parse("2017-02-22"), Open = 222.98m, High = 223.47m, Low = 222.80m, Close = 223.23m, Volume = 65747160 }, + new() { Date = DateTime.Parse("2017-02-21"), Open = 222.51m, High = 223.62m, Low = 222.50m, Close = 223.43m, Volume = 94146880 }, + new() { Date = DateTime.Parse("2017-02-17"), Open = 221.03m, High = 222.10m, Low = 221.01m, Close = 222.10m, Volume = 81718352 }, + new() { Date = DateTime.Parse("2017-02-16"), Open = 221.98m, High = 222.16m, Low = 220.93m, Close = 221.75m, Volume = 89676304 }, + new() { Date = DateTime.Parse("2017-02-15"), Open = 220.55m, High = 222.15m, Low = 220.50m, Close = 221.94m, Volume = 91860344 }, + new() { Date = DateTime.Parse("2017-02-14"), Open = 219.71m, High = 220.80m, Low = 219.33m, Close = 220.79m, Volume = 75266840 }, + new() { Date = DateTime.Parse("2017-02-13"), Open = 219.26m, High = 220.19m, Low = 219.23m, Close = 219.91m, Volume = 58408632 }, + new() { Date = DateTime.Parse("2017-02-10"), Open = 218.24m, High = 218.97m, Low = 217.88m, Close = 218.72m, Volume = 69875952 }, + new() { Date = DateTime.Parse("2017-02-09"), Open = 216.88m, High = 218.19m, Low = 216.84m, Close = 217.86m, Volume = 69811760 }, + new() { Date = DateTime.Parse("2017-02-08"), Open = 215.98m, High = 216.72m, Low = 215.70m, Close = 216.58m, Volume = 54581376 }, + new() { Date = DateTime.Parse("2017-02-07"), Open = 216.71m, High = 216.97m, Low = 216.09m, Close = 216.29m, Volume = 61318484 }, + new() { Date = DateTime.Parse("2017-02-06"), Open = 216.23m, High = 216.66m, Low = 215.92m, Close = 216.28m, Volume = 61169192 }, + new() { Date = DateTime.Parse("2017-02-03"), Open = 216.18m, High = 216.87m, Low = 215.84m, Close = 216.67m, Volume = 85273832 }, + new() { Date = DateTime.Parse("2017-02-02"), Open = 214.65m, High = 215.50m, Low = 214.29m, Close = 215.19m, Volume = 73730552 }, + new() { Date = DateTime.Parse("2017-02-01"), Open = 215.65m, High = 215.96m, Low = 214.40m, Close = 215.05m, Volume = 83743792 }, + new() { Date = DateTime.Parse("2017-01-31"), Open = 214.44m, High = 215.03m, Low = 213.82m, Close = 214.96m, Volume = 80317680 }, + new() { Date = DateTime.Parse("2017-01-30"), Open = 215.57m, High = 215.59m, Low = 213.90m, Close = 214.98m, Volume = 84399624 }, + new() { Date = DateTime.Parse("2017-01-27"), Open = 216.75m, High = 216.91m, Low = 216.12m, Close = 216.32m, Volume = 63202528 }, + new() { Date = DateTime.Parse("2017-01-26"), Open = 216.73m, High = 217.02m, Low = 216.36m, Close = 216.66m, Volume = 63477304 }, + new() { Date = DateTime.Parse("2017-01-25"), Open = 216.07m, High = 216.89m, Low = 215.89m, Close = 216.89m, Volume = 89374928 }, + new() { Date = DateTime.Parse("2017-01-24"), Open = 213.89m, High = 215.48m, Low = 213.77m, Close = 215.03m, Volume = 101142584 }, + new() { Date = DateTime.Parse("2017-01-23"), Open = 213.85m, High = 214.28m, Low = 212.83m, Close = 213.66m, Volume = 79450624 }, + new() { Date = DateTime.Parse("2017-01-20"), Open = 214.18m, High = 214.75m, Low = 213.49m, Close = 214.21m, Volume = 136721344 }, + new() { Date = DateTime.Parse("2017-01-19"), Open = 214.31m, High = 214.46m, Low = 212.96m, Close = 213.43m, Volume = 70503512 }, + new() { Date = DateTime.Parse("2017-01-18"), Open = 214.02m, High = 214.27m, Low = 213.42m, Close = 214.22m, Volume = 57997156 }, + new() { Date = DateTime.Parse("2017-01-17"), Open = 213.81m, High = 214.25m, Low = 213.33m, Close = 213.75m, Volume = 64821664 }, + new() { Date = DateTime.Parse("2017-01-13"), Open = 214.21m, High = 214.84m, Low = 214.17m, Close = 214.51m, Volume = 66385084 }, + new() { Date = DateTime.Parse("2017-01-12"), Open = 213.99m, High = 214.22m, Low = 212.53m, Close = 214.02m, Volume = 76329760 }, + new() { Date = DateTime.Parse("2017-01-11"), Open = 213.86m, High = 214.55m, Low = 213.13m, Close = 214.55m, Volume = 79014928 }, + new() { Date = DateTime.Parse("2017-01-10"), Open = 213.97m, High = 214.89m, Low = 213.52m, Close = 213.95m, Volume = 67500792 }, + new() { Date = DateTime.Parse("2017-01-09"), Open = 214.38m, High = 214.53m, Low = 213.91m, Close = 213.95m, Volume = 49684316 }, + new() { Date = DateTime.Parse("2017-01-06"), Open = 214.02m, High = 215.17m, Low = 213.42m, Close = 214.66m, Volume = 75744152 }, + new() { Date = DateTime.Parse("2017-01-05"), Open = 213.77m, High = 214.06m, Low = 213.02m, Close = 213.89m, Volume = 82961968 }, + new() { Date = DateTime.Parse("2017-01-04"), Open = 213.16m, High = 214.22m, Low = 213.15m, Close = 214.06m, Volume = 83348752 }, + new() { Date = DateTime.Parse("2017-01-03"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 212.80m, Volume = 96708880 }, + new() { Date = DateTime.Parse("2017-01-02"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 212.00m, Volume = 76708880 }, + new() { Date = DateTime.Parse("2017-01-01"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 211.60m, Volume = 86708880 }, + ]; - return [.. h.OrderBy(x => x.Date)]; - } #endregion } + diff --git a/server/WebApi/Service.Storage.cs b/server/WebApi/Service.Storage.cs index 5bfd67c..348e13e 100644 --- a/server/WebApi/Service.Storage.cs +++ b/server/WebApi/Service.Storage.cs @@ -1,60 +1,95 @@ namespace WebApi.Services; -public static class Storage +public interface IStorage { - private static readonly string containerName = "chart-demo"; - private static readonly string azureWebJobStorage - = Environment.GetEnvironmentVariable("AzureWebJobsStorage") - ?? "UseDevelopmentStorage=true"; // failover to Azurite dev storage + Task InitializeAsync(CancellationToken cancellationToken = default); + Task PutBlobAsync(string blobName, string content); + BlobClient GetBlobClient(string blobName); +} - /// - /// Initialize Azure services (setup blob storage for quotes) - /// - /// - public static async Task Initialize( - ILogger logger, - CancellationToken cancellationToken) - { - logger.LogInformation("API initializing ..."); +public class Storage : IStorage +{ + private readonly string _containerName; + private readonly BlobContainerClient _blobClient; + private readonly ILogger _logger; - // main blob container - BlobContainerClient blobContainer = new(azureWebJobStorage, containerName); + public Storage( + IConfiguration configuration, + ILogger logger) + { + _logger = logger; - Response response = await blobContainer - .CreateIfNotExistsAsync(cancellationToken: cancellationToken); + _containerName + = configuration.GetValue("Storage:ContainerName") + ?? "chart-demo"; - string message = response != null - ? $"New `{containerName}` blob container created." - : $"Existing `{containerName}` blob container found."; + string connectionString + = configuration.GetValue("Storage:ConnectionString") + ?? Environment.GetEnvironmentVariable("AzureWebJobsStorage") + ?? "UseDevelopmentStorage=true"; - logger.LogInformation("Blob container status: {message}", message); + _blobClient = new BlobContainerClient(connectionString, _containerName); } /// - /// Upload/save blob item (JSON quotes) + /// Initializes the blob storage container /// - /// Unique name of blob item - /// JSON payload to store - public static async Task PutBlob(string blobName, string csv) + /// Cancellation token + /// Task representing the async operation + public async Task InitializeAsync(CancellationToken cancellationToken = default) { - BlobClient blob = GetBlobClient(blobName); - BlobHttpHeaders httpHeader = new() { - ContentType = "application/json" - }; - - using MemoryStream ms = new(Encoding.UTF8.GetBytes(csv)); - ms.Position = 0; - await blob.UploadAsync(ms, httpHeader); + try + { + _logger.LogInformation("Initializing blob storage for container {ContainerName}...", _containerName); + + Response response = await _blobClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken); + string message = response?.Value != null + ? "Created new blob container" + : "Using existing blob container"; + + _logger.LogInformation("{Message} {ContainerName}", message, _containerName); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to initialize blob storage for {ContainerName}", _containerName); + throw; + } } /// - /// Get Azure Blob client + /// Uploads content to a blob with the specified name /// - /// Unique name of blob item - /// - internal static BlobClient GetBlobClient(string blobName) + /// Name of the blob + /// Content to upload + /// Task representing the async operation + public async Task PutBlobAsync(string blobName, string content) { - BlobContainerClient blobContainer = new(azureWebJobStorage, containerName); - return blobContainer.GetBlobClient(blobName); + try + { + BlobClient blob = GetBlobClient(blobName); + if (await blob.ExistsAsync()) + { + _logger.LogWarning("Overwriting existing blob {BlobName}", blobName); + } + + BlobHttpHeaders httpHeader = new() { ContentType = "application/json" }; + using MemoryStream ms = new(Encoding.UTF8.GetBytes(content)); + await blob.UploadAsync(ms, httpHeader); + + _logger.LogInformation("Successfully uploaded blob {BlobName}", blobName); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to upload blob {BlobName}", blobName); + throw; + } } + + /// + /// Gets a BlobClient for the specified blob name + /// + /// Name of the blob + /// BlobClient instance + public BlobClient GetBlobClient(string blobName) + => _blobClient.GetBlobClient(blobName); } diff --git a/server/WebApi/StartupServices.cs b/server/WebApi/StartupServices.cs index f0d9dd1..d42b1bc 100644 --- a/server/WebApi/StartupServices.cs +++ b/server/WebApi/StartupServices.cs @@ -1,8 +1,11 @@ namespace WebApi.Services; -public class StartupServices(ILoggerFactory loggerFactory) : IHostedService +public class StartupServices( + ILogger logger, + IStorage storage) : IHostedService { - private readonly ILogger _logger = loggerFactory.CreateLogger(); + private readonly ILogger _logger = logger; + private readonly IStorage _storage = storage; /// /// The code in here will run when the application starts, @@ -10,7 +13,10 @@ public class StartupServices(ILoggerFactory loggerFactory) : IHostedService /// /// /// The code in here will run when the application stops. From fc7bcfb06a0ea8052c0bbe7e93279d95c4b3c145 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:12:42 -0500 Subject: [PATCH 08/13] refactor: services --- server/WebApi/Endpoints.cs | 4 +- server/WebApi/Program.cs | 7 ++ .../WebApi/{ => Services}/Service.Metadata.cs | 0 .../Service.Quotes.Failover.cs} | 72 +------------------ server/WebApi/Services/Service.Quotes.cs | 71 ++++++++++++++++++ .../WebApi/{ => Services}/Service.Storage.cs | 45 ++---------- .../WebApi/{ => Services}/StartupServices.cs | 0 7 files changed, 86 insertions(+), 113 deletions(-) rename server/WebApi/{ => Services}/Service.Metadata.cs (100%) rename server/WebApi/{Service.Quotes.cs => Services/Service.Quotes.Failover.cs} (97%) create mode 100644 server/WebApi/Services/Service.Quotes.cs rename server/WebApi/{ => Services}/Service.Storage.cs (53%) rename server/WebApi/{ => Services}/StartupServices.cs (100%) diff --git a/server/WebApi/Endpoints.cs b/server/WebApi/Endpoints.cs index dca1e38..dd86fdb 100644 --- a/server/WebApi/Endpoints.cs +++ b/server/WebApi/Endpoints.cs @@ -6,9 +6,9 @@ namespace WebApi.Controllers; [ApiController] [Route("")] -public class Main(QuoteService quoteService) : ControllerBase +public class Main(IQuoteService quoteService) : ControllerBase { - private readonly QuoteService quoteFeed = quoteService; + private readonly IQuoteService quoteFeed = quoteService; // GLOBALS private static readonly int limitLast = 120; diff --git a/server/WebApi/Program.cs b/server/WebApi/Program.cs index 03026c4..160500c 100644 --- a/server/WebApi/Program.cs +++ b/server/WebApi/Program.cs @@ -3,6 +3,7 @@ using System.IO.Compression; using Microsoft.AspNetCore.ResponseCompression; using WebApi.Services; +using Microsoft.Extensions.Azure; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); ConfigurationManager configuration = builder.Configuration; @@ -52,6 +53,12 @@ // Add logging services.AddLogging(); +// Add Azure dependencies +services.AddAzureClients(builder => { + builder.AddBlobServiceClient(configuration.GetValue("Storage:ConnectionString") + ?? "UseDevelopmentStorage=true"); +}); + // Add application services services.AddSingleton(); services.AddSingleton(); diff --git a/server/WebApi/Service.Metadata.cs b/server/WebApi/Services/Service.Metadata.cs similarity index 100% rename from server/WebApi/Service.Metadata.cs rename to server/WebApi/Services/Service.Metadata.cs diff --git a/server/WebApi/Service.Quotes.cs b/server/WebApi/Services/Service.Quotes.Failover.cs similarity index 97% rename from server/WebApi/Service.Quotes.cs rename to server/WebApi/Services/Service.Quotes.Failover.cs index c72eac8..314aea7 100644 --- a/server/WebApi/Service.Quotes.cs +++ b/server/WebApi/Services/Service.Quotes.Failover.cs @@ -1,76 +1,10 @@ -using System.Text.Json; - namespace WebApi.Services; -public interface IQuoteService -{ - Task> Get(); - Task> Get(string symbol); -} - -public class QuoteService( - ILogger logger, - IStorage storage) : IQuoteService +public partial class QuoteService { private static readonly IReadOnlyList backupQuotes = GetBackup().OrderBy(x => x.Date).ToList(); - private readonly ILogger _logger = logger; - private readonly IStorage _storage = storage; - - /// - /// Get default quotes - /// - /// List of default quotes - public async Task> Get() - => await Get("QQQ"); - - /// - /// Get quotes for a specific symbol. - /// - /// "SPY" or "QQQ" only, for now - public async Task> Get(string symbol) - { - string blobName = $"{symbol}-DAILY.json"; - - try - { - BlobClient blob = _storage.GetBlobClient(blobName); - - if (!await blob.ExistsAsync()) - { - _logger.LogWarning("Blob {BlobName} not found, using backup data", blobName); - return backupQuotes; - } - Response response = await blob.DownloadAsync(); - using Stream? stream = response?.Value.Content; - - if (stream == null) - { - _logger.LogError("Download stream was null for {BlobName}", blobName); - return backupQuotes; - } - - List? quotes = await JsonSerializer.DeserializeAsync>(stream); - - if (quotes == null || quotes.Count == 0) - { - _logger.LogWarning("No quotes found in {BlobName}", blobName); - return backupQuotes; - } - - return quotes; - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to retrieve quotes for {Symbol}", symbol); - return backupQuotes; - } - } - - #region Backup Quotes (for failover) - - private static List GetBackup() - => + private static List GetBackup() => [ new() { Date = DateTime.Parse("2018-12-31"), Open = 244.92m, High = 245.54m, Low = 242.87m, Close = 245.28m, Volume = 147031456 }, new() { Date = DateTime.Parse("2018-12-28"), Open = 244.94m, High = 246.73m, Low = 241.87m, Close = 243.15m, Volume = 155998912 }, @@ -577,7 +511,5 @@ private static List GetBackup() new() { Date = DateTime.Parse("2017-01-02"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 212.00m, Volume = 76708880 }, new() { Date = DateTime.Parse("2017-01-01"), Open = 212.61m, High = 213.35m, Low = 211.52m, Close = 211.60m, Volume = 86708880 }, ]; - - #endregion } diff --git a/server/WebApi/Services/Service.Quotes.cs b/server/WebApi/Services/Service.Quotes.cs new file mode 100644 index 0000000..6e0c167 --- /dev/null +++ b/server/WebApi/Services/Service.Quotes.cs @@ -0,0 +1,71 @@ +using System.Text.Json; +using Azure.Storage.Blobs; +using Azure.Storage.Blobs.Models; +using Azure; + +namespace WebApi.Services; + +public interface IQuoteService +{ + Task> Get(); + Task> Get(string symbol); +} + +public partial class QuoteService( + ILogger logger, + IStorage storage) : IQuoteService +{ + private readonly ILogger _logger = logger; + private readonly IStorage _storage = storage; + + /// + /// Get default quotes + /// + /// List of default quotes + public async Task> Get() + => await Get("QQQ"); + + /// + /// Get quotes for a specific symbol. + /// + /// "SPY" or "QQQ" only, for now + public async Task> Get(string symbol) + { + string blobName = $"{symbol}-DAILY.json"; + + try + { + BlobClient blob = _storage.GetBlobClient(blobName); + + if (!await blob.ExistsAsync()) + { + _logger.LogWarning("Blob {BlobName} not found, using backup data", blobName); + return backupQuotes; + } + + Response response = await blob.DownloadAsync(); + using Stream? stream = response?.Value.Content; + + if (stream == null) + { + _logger.LogError("Download stream was null for {BlobName}", blobName); + return backupQuotes; + } + + List? quotes = await JsonSerializer.DeserializeAsync>(stream); + + if (quotes == null || quotes.Count == 0) + { + _logger.LogWarning("No quotes found in {BlobName}", blobName); + return backupQuotes; + } + + return quotes.OrderBy(x => x.Date); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to retrieve quotes for {Symbol}", symbol); + return backupQuotes; + } + } +} diff --git a/server/WebApi/Service.Storage.cs b/server/WebApi/Services/Service.Storage.cs similarity index 53% rename from server/WebApi/Service.Storage.cs rename to server/WebApi/Services/Service.Storage.cs index 348e13e..b563469 100644 --- a/server/WebApi/Service.Storage.cs +++ b/server/WebApi/Services/Service.Storage.cs @@ -11,14 +11,9 @@ public class Storage : IStorage { private readonly string _containerName; private readonly BlobContainerClient _blobClient; - private readonly ILogger _logger; - public Storage( - IConfiguration configuration, - ILogger logger) + public Storage(IConfiguration configuration) { - _logger = logger; - _containerName = configuration.GetValue("Storage:ContainerName") ?? "chart-demo"; @@ -38,22 +33,7 @@ string connectionString /// Task representing the async operation public async Task InitializeAsync(CancellationToken cancellationToken = default) { - try - { - _logger.LogInformation("Initializing blob storage for container {ContainerName}...", _containerName); - - Response response = await _blobClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken); - string message = response?.Value != null - ? "Created new blob container" - : "Using existing blob container"; - - _logger.LogInformation("{Message} {ContainerName}", message, _containerName); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to initialize blob storage for {ContainerName}", _containerName); - throw; - } + await _blobClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken); } /// @@ -64,25 +44,8 @@ public async Task InitializeAsync(CancellationToken cancellationToken = default) /// Task representing the async operation public async Task PutBlobAsync(string blobName, string content) { - try - { - BlobClient blob = GetBlobClient(blobName); - if (await blob.ExistsAsync()) - { - _logger.LogWarning("Overwriting existing blob {BlobName}", blobName); - } - - BlobHttpHeaders httpHeader = new() { ContentType = "application/json" }; - using MemoryStream ms = new(Encoding.UTF8.GetBytes(content)); - await blob.UploadAsync(ms, httpHeader); - - _logger.LogInformation("Successfully uploaded blob {BlobName}", blobName); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to upload blob {BlobName}", blobName); - throw; - } + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(content)); + await _blobClient.GetBlobClient(blobName).UploadAsync(stream, overwrite: true); } /// diff --git a/server/WebApi/StartupServices.cs b/server/WebApi/Services/StartupServices.cs similarity index 100% rename from server/WebApi/StartupServices.cs rename to server/WebApi/Services/StartupServices.cs From 95083c2bf654fb7d2e6d97e6cad9e12568db0d50 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:15:38 -0500 Subject: [PATCH 09/13] revert: some angular setups --- client/angular.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/client/angular.json b/client/angular.json index 87fa47e..9bd1b2b 100644 --- a/client/angular.json +++ b/client/angular.json @@ -11,18 +11,6 @@ "schematics": { "@schematics/angular:component": { "style": "scss", - "skipTests": true, - "standalone": true - }, - "@schematics/angular:directive": { - "skipTests": true, - "standalone": true - }, - "@schematics/angular:pipe": { - "skipTests": true, - "standalone": true - }, - "@schematics/angular:service": { "skipTests": true } }, From 92f993bc44ca5038596f203e29b2c2f315a606dc Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 02:23:45 -0500 Subject: [PATCH 10/13] rollback and update packages --- client/angular.json | 49 +- client/package-lock.json | 1324 ++++++++++++++++++++++++-------------- client/package.json | 35 +- 3 files changed, 896 insertions(+), 512 deletions(-) diff --git a/client/angular.json b/client/angular.json index 9bd1b2b..1627c7b 100644 --- a/client/angular.json +++ b/client/angular.json @@ -5,45 +5,59 @@ "projects": { "app": { "projectType": "application", - "root": "", - "sourceRoot": "src", - "prefix": "app", "schematics": { "@schematics/angular:component": { - "style": "scss", - "skipTests": true + "style": "scss" } }, + "root": "", + "sourceRoot": "src", + "prefix": "app", "architect": { "build": { "builder": "@angular/build:application", - "defaultConfiguration": "production", "options": { - "browser": "src/main.ts", - "index": "src/index.html", - "polyfills": ["zone.js"], - "tsConfig": "tsconfig.app.json", + "aot": true, "outputPath": { "base": "dist/app" }, + "browser": "src/main.ts", + "index": "src/index.html", + "polyfills": [ + "src/polyfills.ts" + ], + "tsConfig": "tsconfig.app.json", "assets": [ "src/assets", "src/_headers", "src/robots.txt", "src/sitemap.xml" ], - "styles": ["src/styles.scss"], + "styles": [ + "src/styles.scss" + ], "stylePreprocessorOptions": { - "includePaths": ["node_modules", "src", "src/styles"] + "includePaths": [ + "node_modules", + "src", + "src/styles"] }, "outputHashing": "all" }, + "defaultConfiguration": "production", "configurations": { + "development": { + "optimization": false, + "namedChunks": true, + "sourceMap": true + }, "production": { "optimization": true, + "namedChunks": false, "sourceMap": { "scripts": true, "styles": true, + "hidden": false, "vendor": false }, "fileReplacements": [ @@ -52,11 +66,6 @@ "with": "src/environments/environment.prod.ts" } ] - }, - "development": { - "optimization": false, - "sourceMap": true, - "namedChunks": true } } }, @@ -64,11 +73,11 @@ "builder": "@angular/build:dev-server", "defaultConfiguration": "development", "configurations": { - "production": { - "buildTarget": "app:build:production" - }, "development": { "buildTarget": "app:build:development" + }, + "production": { + "buildTarget": "app:build:production" } } }, diff --git a/client/package-lock.json b/client/package-lock.json index 4770235..211bd65 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -6,34 +6,33 @@ "": { "name": "stock.charts", "dependencies": { - "@angular/animations": "19.1.3", - "@angular/cdk": "19.1.1", - "@angular/common": "19.1.3", - "@angular/compiler": "19.1.3", - "@angular/core": "19.1.3", - "@angular/forms": "19.1.3", - "@angular/material": "19.1.1", - "@angular/platform-browser": "19.1.3", - "@angular/platform-browser-dynamic": "19.1.3", - "@angular/router": "19.1.3", - "@angular/service-worker": "19.1.3", + "@angular/animations": "19.0.5", + "@angular/cdk": "19.0.4", + "@angular/common": "19.0.5", + "@angular/compiler": "19.0.5", + "@angular/core": "19.0.5", + "@angular/forms": "19.0.5", + "@angular/material": "19.0.4", + "@angular/platform-browser": "19.0.5", + "@angular/platform-browser-dynamic": "19.0.5", + "@angular/router": "19.0.5", + "@angular/service-worker": "19.0.5", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "19.1.0", - "chart.js": "4.4.7", + "chart.js": "4.4.6", "chartjs-adapter-date-fns": "3.0.0", "chartjs-plugin-annotation": "3.1.0", "date-fns": "4.1.0", "ngx-color": "9.0.0", "rxjs": "7.8.1", - "tslib": "2.8.1", - "uuid": "11.0.5", + "tslib": "2.7.0", + "uuid": "11.0.3", "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "19.1.4", - "@angular/cli": "19.1.4", - "@angular/compiler-cli": "19.1.3", - "@types/node": "20.11.0", + "@angular/build": "19.0.6", + "@angular/cli": "19.0.6", + "@angular/compiler-cli": "19.0.5", "typescript": "5.5.4" } }, @@ -52,13 +51,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1900.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", + "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.0.6", "rxjs": "7.8.1" }, "engines": { @@ -68,9 +67,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", + "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", "dev": true, "license": "MIT", "dependencies": { @@ -96,15 +95,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", + "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.0.6", "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", + "magic-string": "0.30.12", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -115,9 +114,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", - "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", + "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -126,40 +125,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.0.5" } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", + "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1900.6", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.1", - "@vitejs/plugin-basic-ssl": "1.2.0", - "beasties": "0.2.0", + "@inquirer/confirm": "5.0.2", + "@vitejs/plugin-basic-ssl": "1.1.0", + "beasties": "0.1.0", "browserslist": "^4.23.0", - "esbuild": "0.24.2", - "fast-glob": "3.3.3", - "https-proxy-agent": "7.0.6", + "esbuild": "0.24.0", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.5", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.17", + "magic-string": "0.30.12", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.8.0", - "rollup": "4.30.1", - "sass": "1.83.1", + "piscina": "4.7.0", + "rollup": "4.26.0", + "sass": "1.80.7", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "5.4.11", "watchpack": "2.4.2" }, "engines": { @@ -168,7 +167,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.2.2" + "lmdb": "3.1.5" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -176,12 +175,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.0.6", "less": "^4.2.0", - "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.7" }, "peerDependenciesMeta": { "@angular/localize": { @@ -199,9 +197,6 @@ "less": { "optional": true }, - "ng-packagr": { - "optional": true - }, "postcss": { "optional": true }, @@ -211,9 +206,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz", - "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==", + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz", + "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -228,26 +223,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", + "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", - "@inquirer/prompts": "7.2.1", + "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/core": "19.0.6", + "@angular-devkit/schematics": "19.0.6", + "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.0.6", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.1", + "npm-package-arg": "12.0.0", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.10", + "resolve": "1.22.8", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -262,9 +257,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", + "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -273,14 +268,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", + "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -289,7 +284,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.0.5" }, "peerDependenciesMeta": { "@angular/core": { @@ -298,9 +293,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", + "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", "dev": true, "license": "MIT", "dependencies": { @@ -322,14 +317,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", - "typescript": ">=5.5 <5.8" + "@angular/compiler": "19.0.5", + "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", + "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -343,9 +338,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", + "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -354,23 +349,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.0.5", + "@angular/core": "19.0.5", + "@angular/platform-browser": "19.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz", - "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==", + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz", + "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.1.1", + "@angular/cdk": "19.0.4", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -379,9 +374,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", + "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -390,9 +385,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.0.5", + "@angular/common": "19.0.5", + "@angular/core": "19.0.5" }, "peerDependenciesMeta": { "@angular/animations": { @@ -401,9 +396,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.3.tgz", - "integrity": "sha512-rfsHu/+wB8YLPjsHKd/Go0SI8zP2gjMkebUHM9SbvVLXEAkxFubcF2htVKbKu8eTncfEJEXD6+3gRAjh5SLrKw==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz", + "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -412,16 +407,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/compiler": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3" + "@angular/common": "19.0.5", + "@angular/compiler": "19.0.5", + "@angular/core": "19.0.5", + "@angular/platform-browser": "19.0.5" } }, "node_modules/@angular/router": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", - "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", + "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -430,16 +425,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.0.5", + "@angular/core": "19.0.5", + "@angular/platform-browser": "19.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.1.3.tgz", - "integrity": "sha512-87XPbzqy9sGYkN21y4vqJBT6lMuuQJrkx5ID1pXdDGxUXlfiGprshtbLPNCUcxHXOnLOdnAI2WZ5DDjl4NMNpw==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.0.5.tgz", + "integrity": "sha512-qU5lgx1WJ+feCOV/EhkN9m20xFdIslpEQcSZZC+VJnEwcG6VTbofg1dRaHWZ9HAjS1uP7bFoK0HUYu4el0bHGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -451,8 +446,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/common": "19.0.5", + "@angular/core": "19.0.5" } }, "node_modules/@babel/code-frame": { @@ -774,9 +769,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -791,9 +786,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -808,9 +803,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -825,9 +820,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -842,9 +837,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -859,9 +854,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -876,9 +871,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -893,9 +888,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -910,9 +905,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -927,9 +922,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -944,9 +939,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -961,9 +956,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -978,9 +973,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -995,9 +990,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -1012,9 +1007,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -1029,9 +1024,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -1046,9 +1041,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -1062,27 +1057,10 @@ "node": ">=18" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -1097,9 +1075,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", "cpu": [ "arm64" ], @@ -1114,9 +1092,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -1131,9 +1109,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -1148,9 +1126,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -1165,9 +1143,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -1182,9 +1160,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -1219,14 +1197,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", - "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", + "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" }, "engines": { "node": ">=18" @@ -1355,22 +1333,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", - "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", + "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.4", - "@inquirer/confirm": "^5.1.1", - "@inquirer/editor": "^4.2.1", - "@inquirer/expand": "^4.0.4", - "@inquirer/input": "^4.1.1", - "@inquirer/number": "^3.0.4", - "@inquirer/password": "^4.0.4", - "@inquirer/rawlist": "^4.0.4", - "@inquirer/search": "^3.0.4", - "@inquirer/select": "^4.0.4" + "@inquirer/checkbox": "^4.0.2", + "@inquirer/confirm": "^5.0.2", + "@inquirer/editor": "^4.1.0", + "@inquirer/expand": "^4.0.2", + "@inquirer/input": "^4.0.2", + "@inquirer/number": "^3.0.2", + "@inquirer/password": "^4.0.2", + "@inquirer/rawlist": "^4.0.2", + "@inquirer/search": "^3.0.2", + "@inquirer/select": "^4.0.2" }, "engines": { "node": ">=18" @@ -1674,9 +1652,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", - "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", + "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", "cpu": [ "arm64" ], @@ -1688,9 +1666,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", - "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", + "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", "cpu": [ "x64" ], @@ -1702,9 +1680,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", - "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", + "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", "cpu": [ "arm" ], @@ -1716,9 +1694,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", - "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", + "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", "cpu": [ "arm64" ], @@ -1730,9 +1708,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", - "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", + "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", "cpu": [ "x64" ], @@ -1744,9 +1722,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", - "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", + "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", "cpu": [ "x64" ], @@ -2165,7 +2143,7 @@ "@angular/material": ">=19.0.0" } }, - "node_modules/@ng-select/ng-select": { + "node_modules/@ng-matero/extensions/node_modules/@ng-select/ng-select": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.2.0.tgz", "integrity": "sha512-Dq3PgOb0EBL31TV1Byr6RnQW/Vd5cdaaCEFbII2tIwiIT1r15oMdeSEZqzutuslBqgyggnponYAaBEgQBVorAg==", @@ -2717,9 +2695,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", - "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", + "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", "cpu": [ "arm" ], @@ -2731,9 +2709,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", - "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", + "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", "cpu": [ "arm64" ], @@ -2745,9 +2723,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", - "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", + "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", "cpu": [ "arm64" ], @@ -2759,9 +2737,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", - "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", + "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", "cpu": [ "x64" ], @@ -2773,9 +2751,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", - "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", + "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", "cpu": [ "arm64" ], @@ -2787,9 +2765,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", - "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", + "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", "cpu": [ "x64" ], @@ -2801,9 +2779,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", - "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", + "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", "cpu": [ "arm" ], @@ -2815,9 +2793,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", - "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", + "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", "cpu": [ "arm" ], @@ -2829,9 +2807,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", - "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", + "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", "cpu": [ "arm64" ], @@ -2843,9 +2821,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", - "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", + "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", "cpu": [ "arm64" ], @@ -2856,24 +2834,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", - "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", - "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", + "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", "cpu": [ "ppc64" ], @@ -2885,9 +2849,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", - "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", + "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", "cpu": [ "riscv64" ], @@ -2899,9 +2863,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", - "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", + "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", "cpu": [ "s390x" ], @@ -2913,9 +2877,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", - "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", + "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", "cpu": [ "x64" ], @@ -2927,9 +2891,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", - "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", + "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", "cpu": [ "x64" ], @@ -2941,9 +2905,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", - "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", + "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", "cpu": [ "arm64" ], @@ -2955,9 +2919,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", - "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", + "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", "cpu": [ "ia32" ], @@ -2969,9 +2933,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", - "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", + "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", "cpu": [ "x64" ], @@ -2983,14 +2947,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", + "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.0.6", + "@angular-devkit/schematics": "19.0.6", "jsonc-parser": "3.3.1" }, "engines": { @@ -3111,26 +3075,27 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "22.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.4.tgz", + "integrity": "sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.8" } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.21.3" + "node": ">=14.6.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3266,9 +3231,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", - "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", + "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3276,13 +3241,10 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.1.0", + "htmlparser2": "^9.0.0", "picocolors": "^1.1.1", - "postcss": "^8.4.49", + "postcss": "^8.4.47", "postcss-media-query-parser": "^0.2.3" - }, - "engines": { - "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3516,9 +3478,9 @@ "license": "MIT" }, "node_modules/chart.js": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", - "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", + "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -3908,9 +3870,9 @@ "license": "MIT" }, "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", + "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4012,9 +3974,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4025,31 +3987,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -4099,9 +4060,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -4109,16 +4070,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.4.tgz", + "integrity": "sha512-G3iTQw1DizJQ5eEqj1CbFCWhq+pzum7qepkxU7rS1FGZDqjYKcrguo9XDRbV7EgPnn8CgaPigTq+NEjyioeYZQ==", "dev": true, "funding": [ { @@ -4133,9 +4094,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -4386,13 +4347,13 @@ } }, "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==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { @@ -4495,9 +4456,9 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4785,9 +4746,9 @@ } }, "node_modules/lmdb": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", - "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", + "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4803,12 +4764,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.2.2", - "@lmdb/lmdb-darwin-x64": "3.2.2", - "@lmdb/lmdb-linux-arm": "3.2.2", - "@lmdb/lmdb-linux-arm64": "3.2.2", - "@lmdb/lmdb-linux-x64": "3.2.2", - "@lmdb/lmdb-win32-x64": "3.2.2" + "@lmdb/lmdb-darwin-arm64": "3.1.5", + "@lmdb/lmdb-darwin-x64": "3.1.5", + "@lmdb/lmdb-linux-arm": "3.1.5", + "@lmdb/lmdb-linux-arm64": "3.1.5", + "@lmdb/lmdb-linux-x64": "3.1.5", + "@lmdb/lmdb-win32-x64": "3.1.5" } }, "node_modules/log-symbols": { @@ -4968,9 +4929,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dev": true, "license": "MIT", "dependencies": { @@ -5311,9 +5272,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -5541,9 +5502,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", - "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", + "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, "license": "ISC", "dependencies": { @@ -5890,9 +5851,9 @@ } }, "node_modules/piscina": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", - "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", + "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5900,9 +5861,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -5920,7 +5881,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6044,22 +6005,19 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6126,9 +6084,9 @@ } }, "node_modules/rollup": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", + "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", "dev": true, "license": "MIT", "dependencies": { @@ -6142,25 +6100,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", + "@rollup/rollup-android-arm-eabi": "4.26.0", + "@rollup/rollup-android-arm64": "4.26.0", + "@rollup/rollup-darwin-arm64": "4.26.0", + "@rollup/rollup-darwin-x64": "4.26.0", + "@rollup/rollup-freebsd-arm64": "4.26.0", + "@rollup/rollup-freebsd-x64": "4.26.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", + "@rollup/rollup-linux-arm-musleabihf": "4.26.0", + "@rollup/rollup-linux-arm64-gnu": "4.26.0", + "@rollup/rollup-linux-arm64-musl": "4.26.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", + "@rollup/rollup-linux-riscv64-gnu": "4.26.0", + "@rollup/rollup-linux-s390x-gnu": "4.26.0", + "@rollup/rollup-linux-x64-gnu": "4.26.0", + "@rollup/rollup-linux-x64-musl": "4.26.0", + "@rollup/rollup-win32-arm64-msvc": "4.26.0", + "@rollup/rollup-win32-ia32-msvc": "4.26.0", + "@rollup/rollup-win32-x64-msvc": "4.26.0", "fsevents": "~2.3.2" } }, @@ -6226,9 +6183,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", - "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", + "version": "1.80.7", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", + "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6728,9 +6685,9 @@ } }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, "node_modules/tuf-js": { @@ -6776,11 +6733,12 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/unique-filename": { "version": "4.0.0", @@ -6847,9 +6805,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6881,21 +6839,21 @@ } }, "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6904,25 +6862,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -6943,15 +6895,439 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", diff --git a/client/package.json b/client/package.json index 5d714d3..931ed1e 100644 --- a/client/package.json +++ b/client/package.json @@ -13,34 +13,33 @@ }, "private": false, "dependencies": { - "@angular/animations": "19.1.3", - "@angular/cdk": "19.1.1", - "@angular/common": "19.1.3", - "@angular/compiler": "19.1.3", - "@angular/core": "19.1.3", - "@angular/forms": "19.1.3", - "@angular/material": "19.1.1", - "@angular/platform-browser": "19.1.3", - "@angular/platform-browser-dynamic": "19.1.3", - "@angular/router": "19.1.3", - "@angular/service-worker": "19.1.3", + "@angular/animations": "19.0.5", + "@angular/cdk": "19.0.4", + "@angular/common": "19.0.5", + "@angular/compiler": "19.0.5", + "@angular/core": "19.0.5", + "@angular/forms": "19.0.5", + "@angular/material": "19.0.4", + "@angular/platform-browser": "19.0.5", + "@angular/platform-browser-dynamic": "19.0.5", + "@angular/router": "19.0.5", + "@angular/service-worker": "19.0.5", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "19.1.0", - "chart.js": "4.4.7", + "chart.js": "4.4.6", "chartjs-adapter-date-fns": "3.0.0", "chartjs-plugin-annotation": "3.1.0", "date-fns": "4.1.0", "ngx-color": "9.0.0", "rxjs": "7.8.1", - "tslib": "2.8.1", - "uuid": "11.0.5", + "tslib": "2.7.0", + "uuid": "11.0.3", "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "19.1.4", - "@angular/cli": "19.1.4", - "@angular/compiler-cli": "19.1.3", - "@types/node": "20.11.0", + "@angular/build": "19.0.6", + "@angular/cli": "19.0.6", + "@angular/compiler-cli": "19.0.5", "typescript": "5.5.4" } } From 8f9253cfda0cfd38c543e68477b746cdfda065c6 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 02:39:44 -0500 Subject: [PATCH 11/13] upgrage ng, disable new "hmr" --- client/angular.json | 3 + client/package-lock.json | 1391 ++++++++++++++------------------------ client/package.json | 28 +- 3 files changed, 525 insertions(+), 897 deletions(-) diff --git a/client/angular.json b/client/angular.json index 1627c7b..bc88ed2 100644 --- a/client/angular.json +++ b/client/angular.json @@ -72,6 +72,9 @@ "serve": { "builder": "@angular/build:dev-server", "defaultConfiguration": "development", + "options": { + "hmr": false + }, "configurations": { "development": { "buildTarget": "app:build:development" diff --git a/client/package-lock.json b/client/package-lock.json index 211bd65..079c7b0 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -6,17 +6,17 @@ "": { "name": "stock.charts", "dependencies": { - "@angular/animations": "19.0.5", - "@angular/cdk": "19.0.4", - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/forms": "19.0.5", - "@angular/material": "19.0.4", - "@angular/platform-browser": "19.0.5", - "@angular/platform-browser-dynamic": "19.0.5", - "@angular/router": "19.0.5", - "@angular/service-worker": "19.0.5", + "@angular/animations": "19.1.3", + "@angular/cdk": "19.1.1", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/material": "19.1.1", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "19.1.0", "chart.js": "4.4.6", @@ -30,9 +30,9 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "19.0.6", - "@angular/cli": "19.0.6", - "@angular/compiler-cli": "19.0.5", + "@angular/build": "19.1.4", + "@angular/cli": "19.1.4", + "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" } }, @@ -51,13 +51,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -67,9 +67,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -95,15 +95,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -114,9 +114,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", + "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -125,40 +125,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.3" } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -167,7 +167,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -175,11 +175,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -197,6 +198,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -206,9 +210,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz", - "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz", + "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -223,26 +227,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -257,9 +261,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -268,14 +272,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -284,7 +288,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -293,9 +297,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -317,14 +321,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.3", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -338,9 +342,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -349,23 +353,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz", - "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz", + "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.0.4", + "@angular/cdk": "19.1.1", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -374,9 +378,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -385,9 +389,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -396,9 +400,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz", - "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.3.tgz", + "integrity": "sha512-rfsHu/+wB8YLPjsHKd/Go0SI8zP2gjMkebUHM9SbvVLXEAkxFubcF2htVKbKu8eTncfEJEXD6+3gRAjh5SLrKw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -407,16 +411,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5" + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3" } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -425,16 +429,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.0.5.tgz", - "integrity": "sha512-qU5lgx1WJ+feCOV/EhkN9m20xFdIslpEQcSZZC+VJnEwcG6VTbofg1dRaHWZ9HAjS1uP7bFoK0HUYu4el0bHGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.1.3.tgz", + "integrity": "sha512-87XPbzqy9sGYkN21y4vqJBT6lMuuQJrkx5ID1pXdDGxUXlfiGprshtbLPNCUcxHXOnLOdnAI2WZ5DDjl4NMNpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -446,8 +450,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" } }, "node_modules/@babel/code-frame": { @@ -769,9 +773,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -786,9 +790,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -803,9 +807,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -820,9 +824,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -837,9 +841,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -854,9 +858,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -871,9 +875,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -888,9 +892,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -905,9 +909,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -922,9 +926,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -939,9 +943,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -956,9 +960,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -973,9 +977,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -990,9 +994,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -1007,9 +1011,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -1024,9 +1028,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -1041,9 +1045,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -1057,10 +1061,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -1075,9 +1096,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -1092,9 +1113,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1109,9 +1130,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1126,9 +1147,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1143,9 +1164,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1160,9 +1181,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1197,14 +1218,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1333,22 +1354,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1652,9 +1673,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1666,9 +1687,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1680,9 +1701,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1694,9 +1715,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1708,9 +1729,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1722,9 +1743,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2143,7 +2164,7 @@ "@angular/material": ">=19.0.0" } }, - "node_modules/@ng-matero/extensions/node_modules/@ng-select/ng-select": { + "node_modules/@ng-select/ng-select": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.2.0.tgz", "integrity": "sha512-Dq3PgOb0EBL31TV1Byr6RnQW/Vd5cdaaCEFbII2tIwiIT1r15oMdeSEZqzutuslBqgyggnponYAaBEgQBVorAg==", @@ -2352,9 +2373,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2373,25 +2394,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -2410,9 +2431,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -2431,9 +2452,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -2452,9 +2473,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -2473,9 +2494,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -2494,9 +2515,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -2515,9 +2536,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -2536,9 +2557,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2557,9 +2578,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2578,9 +2599,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2599,9 +2620,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2620,9 +2641,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2641,9 +2662,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2695,9 +2716,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2709,9 +2730,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2723,9 +2744,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2737,9 +2758,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2751,9 +2772,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2765,9 +2786,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2779,9 +2800,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2793,9 +2814,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2807,9 +2828,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2821,9 +2842,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2834,10 +2855,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2849,9 +2884,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2863,9 +2898,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2877,9 +2912,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2891,9 +2926,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2905,9 +2940,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2919,9 +2954,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2933,9 +2968,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2947,14 +2982,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -3086,16 +3121,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3231,9 +3266,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3241,10 +3276,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3870,9 +3908,9 @@ "license": "MIT" }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3974,9 +4012,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3987,30 +4025,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -4060,9 +4099,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -4070,16 +4109,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.4.tgz", - "integrity": "sha512-G3iTQw1DizJQ5eEqj1CbFCWhq+pzum7qepkxU7rS1FGZDqjYKcrguo9XDRbV7EgPnn8CgaPigTq+NEjyioeYZQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4094,9 +4133,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, "license": "ISC", "dependencies": { @@ -4347,13 +4386,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4456,9 +4495,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -4746,9 +4785,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4764,12 +4803,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4929,9 +4968,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5272,9 +5311,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -5502,9 +5541,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5851,9 +5890,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5861,9 +5900,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5881,7 +5920,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6005,19 +6044,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6084,9 +6126,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -6100,24 +6142,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -6183,9 +6226,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6839,21 +6882,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6862,19 +6905,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6895,439 +6944,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", diff --git a/client/package.json b/client/package.json index 931ed1e..e0d2b81 100644 --- a/client/package.json +++ b/client/package.json @@ -13,17 +13,17 @@ }, "private": false, "dependencies": { - "@angular/animations": "19.0.5", - "@angular/cdk": "19.0.4", - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/forms": "19.0.5", - "@angular/material": "19.0.4", - "@angular/platform-browser": "19.0.5", - "@angular/platform-browser-dynamic": "19.0.5", - "@angular/router": "19.0.5", - "@angular/service-worker": "19.0.5", + "@angular/animations": "19.1.3", + "@angular/cdk": "19.1.1", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/material": "19.1.1", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "@angular/service-worker": "19.1.3", "@ctrl/tinycolor": "4.1.0", "@ng-matero/extensions": "19.1.0", "chart.js": "4.4.6", @@ -37,9 +37,9 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular/build": "19.0.6", - "@angular/cli": "19.0.6", - "@angular/compiler-cli": "19.0.5", + "@angular/build": "19.1.4", + "@angular/cli": "19.1.4", + "@angular/compiler-cli": "19.1.3", "typescript": "5.5.4" } } From 235e2d08a4797a58d12ffe70966fefd6973e2db0 Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 02:57:56 -0500 Subject: [PATCH 12/13] switch to HDR, need to see if it works --- client/angular.json | 2 +- client/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/angular.json b/client/angular.json index bc88ed2..4b8485e 100644 --- a/client/angular.json +++ b/client/angular.json @@ -73,7 +73,7 @@ "builder": "@angular/build:dev-server", "defaultConfiguration": "development", "options": { - "hmr": false + "hmr": true }, "configurations": { "development": { diff --git a/client/package.json b/client/package.json index e0d2b81..aeb573e 100644 --- a/client/package.json +++ b/client/package.json @@ -6,7 +6,7 @@ }, "scripts": { "ng": "ng", - "start": "ng serve --open --live-reload", + "start": "ng serve --open --hmr", "build": "ng build --configuration=development", "build.prod": "ng build --configuration=production", "watch": "ng build --configuration=development --watch" From ce55dcfa85a4f160a0dedac95e71af7c81c1c2ea Mon Sep 17 00:00:00 2001 From: Dave Skender <8432125+DaveSkender@users.noreply.github.com> Date: Sun, 26 Jan 2025 03:11:06 -0500 Subject: [PATCH 13/13] code cleanup --- client/angular.json | 2 +- client/package.json | 2 +- server/WebApi/Endpoints.cs | 2 +- server/WebApi/Program.cs | 2 +- server/WebApi/Services/Service.Quotes.cs | 2 +- server/WebApi/Services/StartupServices.cs | 3 ++- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/client/angular.json b/client/angular.json index 4b8485e..bc88ed2 100644 --- a/client/angular.json +++ b/client/angular.json @@ -73,7 +73,7 @@ "builder": "@angular/build:dev-server", "defaultConfiguration": "development", "options": { - "hmr": true + "hmr": false }, "configurations": { "development": { diff --git a/client/package.json b/client/package.json index aeb573e..a64f052 100644 --- a/client/package.json +++ b/client/package.json @@ -6,7 +6,7 @@ }, "scripts": { "ng": "ng", - "start": "ng serve --open --hmr", + "start": "ng serve --open", "build": "ng build --configuration=development", "build.prod": "ng build --configuration=production", "watch": "ng build --configuration=development --watch" diff --git a/server/WebApi/Endpoints.cs b/server/WebApi/Endpoints.cs index dd86fdb..e9e62d0 100644 --- a/server/WebApi/Endpoints.cs +++ b/server/WebApi/Endpoints.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; -using WebApi.Services; using WebApi.Models; +using WebApi.Services; namespace WebApi.Controllers; diff --git a/server/WebApi/Program.cs b/server/WebApi/Program.cs index 160500c..667dbfc 100644 --- a/server/WebApi/Program.cs +++ b/server/WebApi/Program.cs @@ -2,8 +2,8 @@ using System.IO.Compression; using Microsoft.AspNetCore.ResponseCompression; -using WebApi.Services; using Microsoft.Extensions.Azure; +using WebApi.Services; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); ConfigurationManager configuration = builder.Configuration; diff --git a/server/WebApi/Services/Service.Quotes.cs b/server/WebApi/Services/Service.Quotes.cs index 6e0c167..498df6e 100644 --- a/server/WebApi/Services/Service.Quotes.cs +++ b/server/WebApi/Services/Service.Quotes.cs @@ -1,7 +1,7 @@ using System.Text.Json; +using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; -using Azure; namespace WebApi.Services; diff --git a/server/WebApi/Services/StartupServices.cs b/server/WebApi/Services/StartupServices.cs index d42b1bc..d48d8fe 100644 --- a/server/WebApi/Services/StartupServices.cs +++ b/server/WebApi/Services/StartupServices.cs @@ -14,8 +14,9 @@ public class StartupServices( ///