From 2998b7692538adf9c947ca1705017d1d7d3a47c6 Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 3 Apr 2025 17:28:36 -0400 Subject: [PATCH] Add eNavigator --- .gitignore | 1574 +++++++++++++++++ eNavigator/MarketDataLib/MarketDataLib.csproj | 12 + .../MarketDataModel/BollingerBand.cs | 161 ++ .../MarketDataModel/Constants.cs | 15 + .../MarketDataLib/MarketDataModel/GainLoss.cs | 37 + .../MarketDataModel/GainLoss/DMAValue.cs | 35 + .../MarketDataModel/GainLoss/DMAValues.cs | 21 + .../GainLoss/GainLossCompoundModel.cs | 19 + .../GainLossCompoundModelCollection.cs | 90 + .../MarketDataModel/GainLoss/GainLossItem.cs | 114 ++ .../GainLoss/TotalGainLossCollection.cs | 16 + .../GainLoss/TotalGainLossItem.cs | 49 + .../MarketDataModel/Headlines.cs | 41 + .../MarketDataModel/MobileDataModels.cs | 51 + .../MarketDataModel/ModelTrade.cs | 96 + .../MarketDataModel/ParityElement.cs | 23 + .../MarketDataModel/Portfolio.cs | 107 ++ .../MarketDataModel/PortfolioTrade.cs | 91 + .../MarketDataModel/PortfolioTrades.cs | 179 ++ .../PositionWithDescription.cs | 23 + .../MarketDataModel/PremarketElement.cs | 19 + .../MarketDataModel/PriceIndex.cs | 28 + .../MarketDataLib/MarketDataModel/Prices.cs | 448 +++++ .../MarketDataModel/StopLimit.cs | 14 + .../MarketDataModel/TimeSeriesElement.cs | 144 ++ .../MarketDataLib/Numerics/BetaGenerator.cs | 139 ++ eNavigator/MarketDataLib/Numerics/Bin.cs | 66 + .../MarketDataLib/Numerics/BlackScholes.cs | 73 + eNavigator/MarketDataLib/Numerics/KStest.cs | 52 + .../MarketDataLib/Numerics/LeastSquares.cs | 134 ++ eNavigator/MarketDataLib/Numerics/Numerics.cs | 1498 ++++++++++++++++ eNavigator/MarketDataLib/Numerics/Spline.cs | 114 ++ .../MarketDataLib/Service/Authorization.cs | 15 + .../MarketDataLib/Service/ServiceResult.cs | 33 + .../MarketDataLib/Utility/CSVLineHelper.cs | 57 + .../MarketDataLib/Utility/DateGenerator.cs | 344 ++++ eNavigator/MarketDataLib/Utility/DateRange.cs | 28 + eNavigator/MarketDataLib/Utility/MDTrace.cs | 159 ++ eNavigator/MarketDataLib/Utility/NVP.cs | 99 ++ eNavigator/MarketDataLib/Utility/Profiler.cs | 36 + .../MarketDataLib/Utility/SemaphoreLocker.cs | 34 + .../MarketDataLib/Utility/UpdateManager.cs | 93 + eNavigator/MarketDataLib/Utility/Utility.cs | 575 ++++++ eNavigator/eNavigator.sln | 30 + eNavigator/eNavigatorUI/.vscode/launch.json | 18 + eNavigator/eNavigatorUI/.vscode/settings.json | 16 + eNavigator/eNavigatorUI/.vscode/tasks.json | 53 + eNavigator/eNavigatorUI/App.razor | 12 + .../NavigatorAuthenticationStateProvider.cs | 33 + .../Components/Shared/BusyIndicator.razor | 17 + .../Components/Shared/BusyIndicator.razor.cs | 14 + .../Interfaces/IMarketDataServiceClient.cs | 31 + .../Interfaces/IStateContainer.cs | 15 + .../eNavigatorUI/Layout/MainLayout.razor | 53 + .../eNavigatorUI/Layout/MainLayout.razor.css | 77 + eNavigator/eNavigatorUI/Layout/NavMenu.razor | 54 + .../eNavigatorUI/Layout/NavMenu.razor.css | 83 + eNavigator/eNavigatorUI/Models/Selectable.cs | 34 + .../eNavigatorUI/Models/SelectableSymbol.cs | 6 + .../eNavigatorUI/Models/StateContainer.cs | 100 ++ eNavigator/eNavigatorUI/Models/StateItem.cs | 9 + .../eNavigatorUI/Models/StateStrings.cs | 9 + .../eNavigatorUI/Pages/BollingerBands.razor | 56 + .../Pages/BollingerBands.razor.cs | 285 +++ eNavigator/eNavigatorUI/Pages/Counter.razor | 12 + .../eNavigatorUI/Pages/Counter.razor.cs | 34 + eNavigator/eNavigatorUI/Pages/Headlines.razor | 64 + .../eNavigatorUI/Pages/Headlines.razor.cs | 128 ++ eNavigator/eNavigatorUI/Pages/Home.razor | 13 + eNavigator/eNavigatorUI/Pages/Login.razor | 31 + eNavigator/eNavigatorUI/Pages/Login.razor.cs | 131 ++ eNavigator/eNavigatorUI/Pages/Weather.razor | 66 + .../eNavigatorUI/Pages/Weather.razor.cs | 39 + eNavigator/eNavigatorUI/Program.cs | 53 + .../Properties/launchSettings.json | 23 + eNavigator/eNavigatorUI/Routes/PageRoute.cs | 17 + .../Service/MarketDataServiceClient.cs | 506 ++++++ eNavigator/eNavigatorUI/_Imports.razor | 11 + eNavigator/eNavigatorUI/eNavigator.csproj | 22 + eNavigator/eNavigatorUI/settings.json | 3 + .../eNavigatorUI/wwwroot/appsettings.json | 7 + eNavigator/eNavigatorUI/wwwroot/css/app.css | 103 ++ .../wwwroot/css/bootstrap/bootstrap.min.css | 7 + .../css/bootstrap/bootstrap.min.css.map | 1 + eNavigator/eNavigatorUI/wwwroot/favicon.png | Bin 0 -> 1148 bytes eNavigator/eNavigatorUI/wwwroot/icon-192.png | Bin 0 -> 2626 bytes eNavigator/eNavigatorUI/wwwroot/index.html | 35 + .../wwwroot/sample-data/weather.json | 27 + eNavigator/run.sh | 4 + 89 files changed, 9298 insertions(+) create mode 100644 eNavigator/MarketDataLib/MarketDataLib.csproj create mode 100755 eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/Constants.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/Headlines.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/Prices.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs create mode 100755 eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs create mode 100755 eNavigator/MarketDataLib/Numerics/BetaGenerator.cs create mode 100755 eNavigator/MarketDataLib/Numerics/Bin.cs create mode 100755 eNavigator/MarketDataLib/Numerics/BlackScholes.cs create mode 100755 eNavigator/MarketDataLib/Numerics/KStest.cs create mode 100755 eNavigator/MarketDataLib/Numerics/LeastSquares.cs create mode 100755 eNavigator/MarketDataLib/Numerics/Numerics.cs create mode 100755 eNavigator/MarketDataLib/Numerics/Spline.cs create mode 100755 eNavigator/MarketDataLib/Service/Authorization.cs create mode 100755 eNavigator/MarketDataLib/Service/ServiceResult.cs create mode 100755 eNavigator/MarketDataLib/Utility/CSVLineHelper.cs create mode 100755 eNavigator/MarketDataLib/Utility/DateGenerator.cs create mode 100755 eNavigator/MarketDataLib/Utility/DateRange.cs create mode 100755 eNavigator/MarketDataLib/Utility/MDTrace.cs create mode 100755 eNavigator/MarketDataLib/Utility/NVP.cs create mode 100755 eNavigator/MarketDataLib/Utility/Profiler.cs create mode 100644 eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs create mode 100755 eNavigator/MarketDataLib/Utility/UpdateManager.cs create mode 100755 eNavigator/MarketDataLib/Utility/Utility.cs create mode 100644 eNavigator/eNavigator.sln create mode 100755 eNavigator/eNavigatorUI/.vscode/launch.json create mode 100755 eNavigator/eNavigatorUI/.vscode/settings.json create mode 100755 eNavigator/eNavigatorUI/.vscode/tasks.json create mode 100755 eNavigator/eNavigatorUI/App.razor create mode 100644 eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs create mode 100644 eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor create mode 100644 eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs create mode 100644 eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs create mode 100644 eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs create mode 100755 eNavigator/eNavigatorUI/Layout/MainLayout.razor create mode 100755 eNavigator/eNavigatorUI/Layout/MainLayout.razor.css create mode 100755 eNavigator/eNavigatorUI/Layout/NavMenu.razor create mode 100755 eNavigator/eNavigatorUI/Layout/NavMenu.razor.css create mode 100644 eNavigator/eNavigatorUI/Models/Selectable.cs create mode 100644 eNavigator/eNavigatorUI/Models/SelectableSymbol.cs create mode 100644 eNavigator/eNavigatorUI/Models/StateContainer.cs create mode 100644 eNavigator/eNavigatorUI/Models/StateItem.cs create mode 100644 eNavigator/eNavigatorUI/Models/StateStrings.cs create mode 100644 eNavigator/eNavigatorUI/Pages/BollingerBands.razor create mode 100644 eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs create mode 100755 eNavigator/eNavigatorUI/Pages/Counter.razor create mode 100755 eNavigator/eNavigatorUI/Pages/Counter.razor.cs create mode 100644 eNavigator/eNavigatorUI/Pages/Headlines.razor create mode 100644 eNavigator/eNavigatorUI/Pages/Headlines.razor.cs create mode 100755 eNavigator/eNavigatorUI/Pages/Home.razor create mode 100644 eNavigator/eNavigatorUI/Pages/Login.razor create mode 100644 eNavigator/eNavigatorUI/Pages/Login.razor.cs create mode 100755 eNavigator/eNavigatorUI/Pages/Weather.razor create mode 100644 eNavigator/eNavigatorUI/Pages/Weather.razor.cs create mode 100755 eNavigator/eNavigatorUI/Program.cs create mode 100755 eNavigator/eNavigatorUI/Properties/launchSettings.json create mode 100644 eNavigator/eNavigatorUI/Routes/PageRoute.cs create mode 100755 eNavigator/eNavigatorUI/Service/MarketDataServiceClient.cs create mode 100755 eNavigator/eNavigatorUI/_Imports.razor create mode 100755 eNavigator/eNavigatorUI/eNavigator.csproj create mode 100755 eNavigator/eNavigatorUI/settings.json create mode 100644 eNavigator/eNavigatorUI/wwwroot/appsettings.json create mode 100755 eNavigator/eNavigatorUI/wwwroot/css/app.css create mode 100755 eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css create mode 100755 eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100755 eNavigator/eNavigatorUI/wwwroot/favicon.png create mode 100755 eNavigator/eNavigatorUI/wwwroot/icon-192.png create mode 100755 eNavigator/eNavigatorUI/wwwroot/index.html create mode 100755 eNavigator/eNavigatorUI/wwwroot/sample-data/weather.json create mode 100755 eNavigator/run.sh diff --git a/.gitignore b/.gitignore index 46e8321..668135f 100644 --- a/.gitignore +++ b/.gitignore @@ -213,3 +213,1577 @@ Translate/Translate/obj/Debug/net8.0/Translate.GlobalUsings.g.cs Translate/Translate/obj/Debug/net8.0/translate.pdb Translate/Translate/obj/Debug/net8.0/ref/translate.dll Translate/Translate/obj/Debug/net8.0/refint/translate.dll +eNavigator/eNavigatorUI/.vscode/chrome-debug/BrowserMetrics-spare.pma +eNavigator/eNavigatorUI/.vscode/chrome-debug/First Run +eNavigator/eNavigatorUI/.vscode/chrome-debug/first_party_sets.db +eNavigator/eNavigatorUI/.vscode/chrome-debug/first_party_sets.db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Last Version +eNavigator/eNavigatorUI/.vscode/chrome-debug/Local State +eNavigator/eNavigatorUI/.vscode/chrome-debug/Variations +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ER +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ES +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ET +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ID +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ME +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ML +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/OM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/QA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ST +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/US +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/WF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/WS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/XK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/YE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/YT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/crl-set +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/crl-set +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/Preload Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.2hquzb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.CRAZN7 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.dH6Xi6 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.DnmcsX +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.iKVmv5 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Affiliation Database +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Affiliation Database-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsSiteData +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsSiteData-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsState +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cookies +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cookies-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DIPS +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DIPS-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Favicons +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Favicons-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/heavy_ad_intervention_opt_out.db +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/heavy_ad_intervention_opt_out.db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/History +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/History-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/InterestGroups +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/InterestGroups-wal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data For Account +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data For Account-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Action Predictor +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Action Predictor-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Persistent State +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Preferences +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PreferredApps +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PrivateAggregation +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PrivateAggregation-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/README +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Reporting and NEL +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Reporting and NEL-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Safe Browsing Cookies +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Safe Browsing Cookies-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/SCT Auditing Pending Reports +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Secure Preferences +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/SharedStorage +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shortcuts +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shortcuts-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Top Sites +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Top Sites-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/TransportSecurity +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Trust Tokens +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Trust Tokens-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/trusted_vault.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Visited Links +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Web Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Web Data-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0a0fb489a230a4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0bd4674e62b97884_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0bf16d9c867a2daa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0c1dd70f3180f989_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00d2a42d63db7841_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0d3635ea8555db62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0e8af0eb6f212e1d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00e9750514cd514a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0f1b96d8acbc54c4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0f38d426e2d8462a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1a100a0072ee54ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1addba6edada2e9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1affbc558c7f2811_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1bbb0e5c3c783297_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1c336f8588e58c70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d01eb226fffa768_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d3bee652933ffa0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d09bb23b3998cdc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d8761faed13d5c5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1e066f6b4fc9b474_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1ee562894820ac70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2a5e9023eb19227f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2af6b44897b1a680_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2af39d42981e0889_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/02b5e14dfc80cf42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2b9367e229eaa1ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2bb12769f78684a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2bddb3d029abf83d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2d658284fe26dae9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2d4032085695322d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dc7d67e12f4affb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dc15a63709d8e3a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2df7e008cb85230b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dffc0699ef373d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e2b6739a69fd0a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e09e6fb29846430_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e20f2a0f46140c7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ec449d6d7e569ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ed5ae3816ed6830_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ef51f0ede11e643_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f484c2d4233b168_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f899538adf5bae8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f4250155b66717c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03acbe3b78dddb4d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3bb1428a173912f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03c3dab0cacce38c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3cc08e6c7c8520f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3d436dd166dd189b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3eb935c8f2d07d16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3ef117c4e731b406_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3fd23a31de1aa9b5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3fe561e424006b63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/04bc77d2f3934972_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4beac0c972a77ba7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4c8aa10094e098c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4c50e0720f781411_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4ce4425bc7c0c5a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4cfb2d3a1264a518_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d5e10c2441b2a20_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d50c2293fcfc828_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d7995dac92c6696_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4da27f4bbeb649a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4dfd3ba21ecdb215_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4e9203b96c32c931_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4f231dd5771baea5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a54e00228beed4b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a88a75e50aec531_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a722e3d0f87a8aa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5aa75711b462f907_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5af23f7d32acbc2f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5bf1bb6e19dd4f3f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5c5eb60328c65486_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5ed3b0f91e23449c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5efc079d6ff3e2a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5f91897a69fe3a73_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6ae3b1c6a6e4e158_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6b3e0c8c2284ff25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6b446973891d17b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6bdb29d5c2b71a39_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/06bf675b5128bf23_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6c987a3ac29d9e1e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6cc9a0e5bcbed2e1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6cf540e09b40095b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6d0a0443c225095d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6dce5da19946369b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6e1680c48fae9086_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6ec3033511f52862_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7a2880339b2d2689_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/07ab9474baabf5af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7ae20c37631f4b57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7b53ff4a370ed1a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7c2beebd3bc4ed55_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7c066f807447d38d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7cbb2b8333717edb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7d9598262d18b86f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7dc22048c587150b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e5ab28d2054ba33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e99da0bfd064cd8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e4317fff948564e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7efaccfbb47d7a84_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7f9f3a928e117c65_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7faa73f9dee2f773_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8a089b0af3a6ba24_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8badac44d82d96ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8bc98d6f98dd6ca1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8ceb2a5c52e05a3b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8db00ecacc585b54_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8e2d94d4376c93ab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8e814c2a00399dec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8f820c27350b37de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8f02668c0c5ae8c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8ff3a91513adc560_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9bc098b8cccbcf93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9c0a8312e401831c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9c70e53847c38d16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9cbd42fd196c079d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9d4ca6f24f6a0f3c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9ddf347c8160d9da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9eced8c7b8b67437_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9fb99d746074aa10_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/11d8899db7e42557_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/11e9ac77ce805720_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/13f3738206617928_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/13ffa2b4ceebe804_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15b72bec5b5b4ca5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15c1db5237306e29_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/16a6f531cef9584f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/17a5c92c848e1e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/19fa243120ba7058_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20b021a80c30301a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20b83461296be7db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20e4b0fcb00f9dd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20f8c756dbfc7ce3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/021fc8a372b4db2e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/22b9a88adc7de473_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/23a5c0461a6e697a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/023aab326f7ca4ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/023c853b6a819924_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/24f460e19ab756fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25a9c4dc7adf34c7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25df1fa95ffaec7e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29c348f4be877e66_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/31af91d3e3335af4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/33c0b158094ea216_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/36ffef5ba52f0cb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/37ad0a189f23c740_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/39d896bfd26b9242_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/41a9f5f3c1503744_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/41c087987c2382ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/42c5c02c50069a49_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/43c75a00dba82a08_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/46fbdb35f62ae3a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47b3abc14004ead1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47c1683b4da6381d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47ecac95eca8686c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/49b4e95447a1e8ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/49e27805fd5d5941_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/50dd0d91369b90fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/51aa3eb270eb264c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/51eb3e9c3a9ebeff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/53e359996b959f60_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/56e4725e80b8f809_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/56f89ed697204517_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/58af09d3896594ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60dd1e31f5698aa5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60fc9d222b00874f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/61d0fb8e2ec50b47_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/62cee9ee341be97d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/62ff9c3e1132741f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/65d7871f91a646c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/66a79f7fcd002328_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/68a08ba6c212bdf6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/70bdca58424e4838_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/72f0d4e3c90e50a2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/74aabb1e4f6d540c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/74b94df4a62112a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75c2f3ebdb77ae4e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75ebd2670dd5b9dc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75ed5f995d70c7ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/78ba7c04a98b8ec0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/78d1c78e79663697_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/79a131ddd0638b20_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/080eda7bc761e158_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82a55857e68f890a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82e2aca7dcc80fd1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82e28df9ed603e63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/083ee2a9e435e482_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85aedd2200d384ed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85f7315d7b299a44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/86c051813c43f768_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/86eecd222b4ae151_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/89d83331222e53c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/90e5d43799e65f8f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/92c85924306ca92f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93b444b67830bd59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93c6f5db73b1857d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93d81321f8c35eab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/94ff6ae2ead9a37d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/96a82e6fd3c3dbae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/97d472ad17a09e71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/101ed8de0d699c9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/102d898b131eef1b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/134d7991b1f16ce2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/137d9a06e3b2b9f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/164bf0dd89475a9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/179cb74b9cf62054_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/201cd9bd1a34ddd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00209b0914edb6fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/232d45e9a83d6252_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/252f3c92c14244f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/257b9ada9582cd59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/382d6b33d8ee4450_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/393d52e9d34a281c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/411e4d3859637210_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/420c0bb2a22aa4d4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/421dffa84b8e6e7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/437bde8abc8b01c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/452f530d6d340dbb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0481c23fa4f55727_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/482e5b5da4673333_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/493a1229f626ad87_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/503dc8060bbde6df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/518ed87a330043c9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/558c25b144f5e339_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/650a6fb5c8c13cb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/654f0cf247e0871f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/669f9cc804c906dc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/682d11580072eeed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/764b59ee0918edaf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00767e3bf3613963_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/810e73f0f05908a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/816e219f84814a28_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/820afbbc5d94ea79_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/848bbd428ba4bf8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/860d3c63b3374a95_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/876df51692b3de7f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/928f63ad843ebc19_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/949c213ef980ae58_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/951cd4f906b91619_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/970d39d313391937_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/980d1b2cde38e5f8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/983a571b8702b667_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1982a060167c78a0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2167e76970110ac9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2947c593d7b976bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3167a8c7ee975511_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3405d1653639c199_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03417ca4c715cfcb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4234cb350db9cfdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4846d5bc32d48390_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4888efb6e8801d3b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6225de45b25c77eb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6663a150c467348e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6736a8afd768543c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7064b74fce6ec57d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7320cc6282f4beeb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7378ef7ae4d7ffa0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7532cdc84777c4a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7603e59d3afe67af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7908a02466229e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8212aed81c3ee4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8702a043a57d3522_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8857ceba65652826_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8891f3f4912e358b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9041f4451810fd96_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9129f3e48085fc2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9137c22af8e92409_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9216aa7f23fa0c04_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9754e94edd482054_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9965b828282a6e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/12606f898579d450_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/18983b4bb0e11ea8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25587c4bce26bf42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29206fb343975224_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29497e1fed536235_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/32194dd0bb16af33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/40854d3e15f43a59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/50532f5b450f3840_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/53899c486fe75590_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/69114b121af6cfd6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/73988f892865cdc0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/77234dc44c4a62f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/79440f4f3943b680_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/81368a571fd353f8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/81748a974032f176_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85979d6f320b08e9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/87762aa742a57bd6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/90617b7fc2ac4c68_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/119222e8e2ec426b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/138489f334bad118_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0148081ee028a2f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0168148b2ae8b26c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/175304b605cce8cc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/224882c1153876e3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/276840cf55b6d378_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/332636a61a1a4cd0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/459639f1537adb8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/481486e38149712c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/570720e66f22e4db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/581392a987ce522e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/672150b88a31c4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/744854f8054fc435_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/761307ffe29616fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/809867e8e6b4ca72_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/904394eeae9b203a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/948325a909d83769_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/952364b4766efcdf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3640545b2742a5fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5198966a522758f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5439955c1fba6b45_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5554085be01bab26_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6060781ff50be050_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15145040f7f12f31_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/17179511b76bf644_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60797177f6fa2495_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/83403720cd6f862b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/235294880a1bd386_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/308775642fc48353_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/401913909aa42260_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/445892548de12d07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/448820310ea803d1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/820275419acb8a6d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/859430074fc3c947_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3141746876f4a523_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7818172825e606c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8022019877b53019_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/14383641564a06dd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4271504103873c3c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a5b57fbc8e034bcf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a6c33adacbe8506b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8c01c294639af80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8d6e59c7d2afcfb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8f69ebfb46f29e4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a9c3bc6a9e0d86a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a53d0820f038f6a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a57a843ad21df102_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a63e5f0bb42b8bb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a67c70d3fd6780bc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a590e8bfc56ca086_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a611b95e503f5fd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a10931a1a69c1edf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a534891105b3e625_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a7904172400cb5d5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a139100911159bd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa0c99b3b0b17dbf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa5f31029fd0dcb2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa507364dac3e224_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab2d1d8c2fa6548d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab3fa0201edf7a80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab4f4f01bb58f9bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab7a6c9de1731108_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab7368be61d71212_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/abad948868888ad4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac0cbebe054d26be_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac2aad74b2791c36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac8c197cf9141314_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acc5c2bbf5ad5da8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acd080f9d15b5078_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acff44dae6755a8c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ad3a92df062b1a2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/adbee61c62df1b44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ae3cb5f2e7d2f405_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ae21ed4a4b5e55fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aed6dfa2cf63614f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aef641c9b3c683ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/af05b8ddef67dff5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/af9769fa010d464b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b5cca6ee37b08b8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b5d03d4e138b1fbf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9b9254eaa6d7961_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b11ee7825ab38c7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b30b81163b170dca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b50c76f2cfde9d36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b60badfdd1c74835_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9147cf17966e9f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9342fc013e98a93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b107574ffa8a9512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ba0e3914f44a083d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ba2feb89db36e17c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bae56f121e46934c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bb37ee141498f83c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bb415d779b1d0784_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bbf9db8a58aa84b0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc0fb7d6a90f2f8e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc0fc72965d4e2ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc8cd33893bbb79c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd9f3b1857b618fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd41d17b37743781_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd810a6e3d078362_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bdce0e6109b47f55_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bddf87b029f5bac5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/be0b4d7af5896f70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/be13dc2f1a395bed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bee17c8085c3f576_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bf72232f95ae888c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c2efab0a274b112d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c3a0319bc618e776_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c5ce415b92beac63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c6ee2a65fc7b08f7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c7cc51d6f5281896_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c8fa1c7e70a04c80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9ad41221a962d57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c72f48a3aea0551e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c127d597560a2baf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c292e072c86ce10b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c758c811e133be98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c839f790ed7bd09f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c6137faad6f2f478_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9361f5a6e021d98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9630e837d3e965a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c30528c930b74eed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9359153cc747231_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cb26d0c5232dc512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cc0fb5bfd3eaa3fb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ccc66c5395126290_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ccefea220dc5b0a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cd8cac6ff7873804_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cd93d8a86ed99b98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cde91af872531f96_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdee31d1ef510c43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdf7b9063975414a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdf676bab8dd7abd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdfa73996de710fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ce5057e18179d2ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cedc98f6bbd4cd77_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cfa6a8e613ab1b36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cfd1a074b71743df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d1e3a896a963b310_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d3a1f43e8758f54c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d04c232764c297d9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d4f4b96721eb9e16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d4fd5aa7c6a55337_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d8fa51dd4b1e6b0d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d26ae16005a21333_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d44faa11ecc2dbab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d86a7063405c6ac0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d92d4770f43105ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d457f780f97a253e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d667b265bb34de0c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d885b4d5f0d3f251_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d1073ec659e263a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d3869f1d98aa3f16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d5959e3a3f2cbfaf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d7576d5f00dd1465_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d37930c46a7f2677_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d67591def52a244a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d97662a9eb22805f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d928922fadd71458_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d60834870a7b351d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/da1db25c0e3935ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/da104e24aca267da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dae926831eb3636a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/db38854c81c6ecbd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dd0202e65e16d83a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ddbc6181f275b641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/deeac2621301a255_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/df2471fed7015ffa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dfce60148e4bd0db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dfe3930400651aac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e2c5efd87d0a9f69_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e3e15e177b3aa467_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5c68e360ac3d91d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5dfe271eb937c8d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e6ba18841ee0a5d2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e7dd57e45d7f7eef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e8f1dba8c3306437_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e50cd2315f54da51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e73f20cd41f932c4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e74ccb92362268ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e85ac8952d7783d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e245e16d9f0f1d6c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5388b7d95ecdf12_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e52645bafca7137f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ea5208cac1e3a534_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eb6bb261458329df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eb41a78379534cdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ec4c7c205aa9bc71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ec9a10e4821714e4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eca8c1f18c539b98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eca890e3d2f7e101_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ed69dc39f602eb16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ed5152d08612b2ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/edeaa3a9da304e5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ee6ec258d942c52d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ee971ee482cc2469_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/efaa6782067314e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f0f7206b3d0542a6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f2c5bb49e2af5579_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f4dba657e1857320_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f5e3f9054cc9c3c6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f5f2d62674e7a936_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f6b1f0f85fbc35fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f7be5fd113dc69f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f15a91be97b954a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f88a7365c4137206_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f94e05c34585dfa2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f380bf29a4b8954f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f612e69a0c8128d8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f4892ee3837a550f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f680230f72e4a86c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f713894f2e69c4a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f1607311ba1fc7b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f6088892425c5d64_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f123997397309b8d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fa989c2ae1a1f7b6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fb30a97ffc5aa136_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fc4c3b79d13b657c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fc8ed6a10b259a5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fce3abe9b2ebdf4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fdc29bb14a090dd8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fdc69935efd3bf0b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fe05da4c82a8b22e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fe28cb3a9f3f0d35_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/feb289bffaff2d07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ff54a890ae093e64_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ffbaffad25ab43e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0a6c40fb87866435_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/00b019bfa7ae0aca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0cf009985fcc4a31_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0e7a81002fefa053_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0eae13b097ef39ab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1a848d5ba1d9da73_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1ac060d4d43687f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1ae721bf27996952_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1b6753ef78015a7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1d04bef2abfa72c6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1da273e328e26897_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1e2c59325da00830_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2a30697c9aa9b7d8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2ae0b3e2a7b386b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2b1a8882c9eee352_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2b1ffa2862c1ce9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2d034a82d03f3337_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2f7a42ddcac67e88_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2fb7acae2f037641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2fd767a8ae73b55d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3c878b9c6b2711ba_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3cd88d1a85541c35_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3d9b9a333a31dff6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3f0a8c245e2a507f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/03f122cad8335b14_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3fd7d957874e232a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5bc3a646e6bcc707_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e0a2cb89d6bdbb2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e1b061a6ddc79cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e5bfd612034cd68_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5f85a38150a6929f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6bc2c651c0d6f31a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6c083ed099de1edc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6c138a7cc5550d6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6d0b78a7984afdac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6d81ce5a2d8c39f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7b4311b2387bfb57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7bf6821e52fee8c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7f5f1d50bb614e5f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8a97abef9c409a22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8a34617c17c4b579_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8aff6df68f0dc96c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8c81dd785243063f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8c73333a4dfe61d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8cd4eae1c08033a9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8d68870333143e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8e080e94ff96b703_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8ffe2a5d972b104c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/09a7b9084a99801e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9b94093e6cbbbbcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9be0cb6716587df8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9c1af8385f6aadcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9e8e4d8b8189cbdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/12e2c4b18dbb728d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/12f835541d1dab48_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/013d518ee7cc0f82_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/13f162154fad7955_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/16af11a7a348424b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/19fc1df34a20b146_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21b9cb134a6868d9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21c21c5d6a3777cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21da5745358f908a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/24bc1b34cae9933b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/25bb9134685b9002_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/25d24c50d6908129_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/29d5a8880ca97c1c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/30b05ce35f4bdde4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/32e84752da5337b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/34b57dffbf78b854_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/39e113aab00b8b7b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/44d5079ad5841b25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/47a4811439b25efc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/49c5284b87bca143_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/52d4fec1241d1282_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/58c1c0b242b5e0c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/62bb6b5b8c0b581d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/69a2ac0955e7ba62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/069dc562a85e7ed8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/70a4e14b79e4e6db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/73b3bde7fda36205_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/78d67e085e223791_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/83b4cd320063f228_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/86b0b750eb02bbcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/89b595bc24ea0441_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/89db893576032902_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/92e1d1d087833f0b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/93ba11a3dd17446c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/95fb9af30631c702_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/138e76a2a3ff46b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/158b72197c7cef46_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/172b237bc017862d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/481a039d98aa0e8c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/545f9bf761103f1c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/577d78f09bce4035_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/653a86096b47192c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/672b8245ed7b50ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/762df6759f04cf22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0835c6c01209a860_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/844ab8cb8e603034_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2810afaaf190228f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2940f1b866286526_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/4147f026c6db26ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5216d040d17acde9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6793a0a065f88506_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6966b0e2eb85f5f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7019b151dc0ae6de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8712c7933ba9e94d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/19152b7f8e8efcb9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/20850c409e895015_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/22510e6f41637f30_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/28428cc358c9a654_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/33421b9681ef958c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/76791e3058f0e8ea_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/90513cc6a23414c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/99422e7e0aeaae38_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/154000feacda5f15_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0508217b08f99cf3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0587842c7942e87a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/617885bb170208d2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2127222b73f24cdb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6168649e6abb0ac4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/83884321280c179f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a1c9b1d6263f92ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a1e8104971366de7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a2af1a89ad11c65b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a24e7986ec3623cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a92fc2d2b9d9f0a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a851b595bd85f42b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a69226eb7e1fcb4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/aa33a951e0e2fb80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b0ef456cf74c90e6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b9fea8e9b56f6f59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b13e1e19feff933d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b62fd1180d39c14c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b77cc7fdb69c2940_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b97c948285070cc1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b190a9e98a3382ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b492dd9f8c950142_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ba678a2fbd8c358c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ba872977e7eafed0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bb73c6570251aa2d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bcbd34f004ee44e8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bdbb32c140428cdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bdcad5d2ccc5e29a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c2b4e8597e4738ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c2fc02437f318960_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c4abc04011f93372_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c7cf3d7e1fd24514_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c9f0ddcbab423344_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c041c29b492faf43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c916ae6dbdf101a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c1171d10046ce47e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c1217f17274291f3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c494825d97b4425f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cb62217fd6d67a53_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cc3ad7087279ec82_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ccd66b3f4ba78e13_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cf89c1b1aabc0399_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cfb0462fc698bd2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d6ee63056e09487e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d7ad3808076f82b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d44b902c1fdedf0f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d248e09813c348fb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d9249ef35eeb907b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d96890d33e3a1aeb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d941724cafd2b8da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d05522793999cdd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/db80d672a14a2d79_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc4c5a1acfc9933b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc100c144b67a5e2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc8468664a0ce1de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dce3001693bfcf17_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/def8392308044387_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/df9da550ea6d3003_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e2ff477fbcffa50d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e3ee5f6523268f92_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e6f3131849f40447_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e8cc62188ae19862_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e37e0bf86bc3effd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e42ff61463b1cb5d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e43f8d2f78e0c1f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e703d7f949c59f94_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e31381c9078227af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e5411017fc547b9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ece31a5f0788ad08_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ede8b2e2df482b40_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ee08c28427b16c56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ef69ae87f07a0e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/eff2a3dcbe82a847_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f6c9287d878fb9af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f9ff70d6603acee9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f013d4ba17d15fe5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f29fc4182015cd04_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f50d9e69434308c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f0572c9ab2f19dd1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f735b670a4f7a234_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f2508f9f774dff5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f19837c40ebfe846_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fa5e20b09bcfadde_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fc466e6d9d6351a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fd66fe581b302149_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fed0cd31909da4d4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/wasm/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/wasm/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1a +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1b +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1c +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1d +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1e +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/19 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/c +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/d +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000005.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000007.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000009.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000012.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000014.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000015.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/index.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0b4d39f7c888ce6d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0be2ed6d42a9bc71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0c101b2c7692e517_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1a0a3f4995bb2254_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1c58bd0ce3c2af44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1c767435e2b74058_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1de2d63e560cff4e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1deb0446904a14ec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2a3fd85baff92641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2aa94ba10ce985b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2d51d21683d3fde3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2dd865860acf1df6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2fb3acb31a6157db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/02ff7cae1f02ea90_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3a3c1e7deafaa3f0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3ae49ef07252d0e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3bc17776b7895e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3cc69b60590705df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3e7a9f2e98beca43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3fd5acd9febb1950_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4becd8fef8cdd9a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4d91ebf20aa6dc0e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4e3fd70f6550d2bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4f99ee371139dd67_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5ba1b2dd3979e8bb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5c24768b720cca22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5cf4bb4ec500fc07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5d9b1ad5657d9e30_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5d2717b456787461_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5de4214638b5ff9f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5ebe3b55686a70ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5f8249bcd3c827b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6b7ce08a3c9b7b02_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6bfc300a65ac3801_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/06e9d20a3677562f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6ee218e86a97ba4f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a1f7aa11e0c4911_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a2d990b7e561e5d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a78c84e93dad7f4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/07af79ed3b8c71b4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7d0f086d22cfa8cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7f2bc84c488a4bca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7f008bbe6b6ba551_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7fb67b4c9e30015a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8a7ca7cce107b5af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8b9d0aa2e871fef9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8b182da30663dbc5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8bc91157a69279f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8c113148776ca08a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9a054be393d9e993_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9f5205a7f43d8eec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/11f06e6887c225a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/14fba6121164f44b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/16b53456ddc6a407_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/20d9288178ecce81_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/22f456b328716eb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/23abcef69d11dcd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/024ee9dc8ad4b28f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/28fc6da58d469960_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/29b4fd6b2e84980d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/30bacaa729ddf977_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/30bd121aaed082b1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/32a556399ad31da9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/038e0e73b9419fb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/55eaaf868a203587_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/62af9519f2bfccec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/62f75c6b929a3394_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/70ea646235216476_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/071fd5518b458788_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/80fc0b9486e2e2d3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/82e684081ff46275_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/91c526f662b5d097_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/94d10c26dbf94abd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/181b13709b51420e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/264be3d81568c0a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/277efa448ed6e836_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/294b479dd89c282d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/368ff8d500f354db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/388f7f7e301a6f33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/453b326c9b483f72_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/503e55b5bfab95f7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/512c17a10870b718_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/537a0c8ca8fd2443_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/688e48d7ca0897b8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/705f7018b47a29cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/725f7497cd40b2fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/822bca40375f23fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/824aa4a7e03a50c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/863f86ae0627beaa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/899e555350d20456_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2105dfc980ad01ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2200faf93675cedc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2594e0654b9f1c9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5354af84e21f1d51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6592c3dc31836c8f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7494b6ec8f790902_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7568dcb9954ab512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9533cefd5b4a4429_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9647d418c3605ddf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/24028cc485b4fbda_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/35765d1c2d3ebf50_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/45980bdf89d08647_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/56265e5315bdcc87_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/73147f1662329c92_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/90264d330cab75d1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/91499ff8bef69901_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/99089d7968ba6414_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6465164d74f23ed6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7651369e11f1ba66_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/96168239cc7d2c90_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/41226524674f27cb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6009529258122241_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a4d061cb66b90a27_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a9e0fced5020478a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a54f933e8c613d51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a57c5e14ba469d25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a79b73092c936306_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a138afc515e3bdd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a369eaf00da1bff9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a733e074169ad2cb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a867a39acf1e0343_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a901c78bd3cf7452_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a9524c52054c2256_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a589173f36eac2b9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ab63ef0e85babf15_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ad1a8603189ec68a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/af05b011f8a8484d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/af38e3e7c42594b8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b2d2ed0043bca05d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b6aa7eda6e6aca4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b6c9cc537f24ac62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b7b8abeed0f4309b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b13f2bdd129d4593_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b81da747bbed99c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b1052bab4fd60612_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b02675d98516e1c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b2944bbdd1bf16e9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b500347a1d1a8e4b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/baa0a691db5ffdfa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bba78a1679c4dac3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bd3e0c130699c6bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/be461a3891907918_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bf033e3e0c890938_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c2d4052f4766a029_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c9c2d57715ca7870_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c14fe20a087cd28b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c29c988b8c1cea93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c52ee76d94b0d050_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c442e5a9886bda6a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c9941d683a51bd18_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c18552b0dea7a484_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c81262da6da3cfea_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c166259646762d91_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ca6b9c1a3b2abd40_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/cc1bd9bce7706839_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/cd0d94947736d958_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d3be535795e422c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d89f088d3f826fad_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d91a3f244bb1dce4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d99d76b9b209f8a9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d0145cf6ddf78a7f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d507f22da6734180_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d2807a6000673a76_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d27467bc8d4c5103_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dc7d745af4c8f586_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dc9f4abe71a09653_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dd2099898fcf2bb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/de14b5d1d6e407cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dee688216ed694a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/df889a0bee6afa9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e0e75eaf75966c14_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e1fe2789a2617592_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e54ac6d9bcf2a8b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e8148a749af52df5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e8150f448b975161_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e762262ba54125ba_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/eafc88d9f3f14543_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/eb767bec8f3de370_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/edae1db52fdc125a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ef976bc05b8a2845_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f0d4bba25458ef42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f3ac3f3ad2f1827c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f3ae20fda594d6c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f4bcc398ba7c1f7b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f8c627ca53d41d37_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f49c875bb6fcc5f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f067a9499c0ae505_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f70cba5d315da8ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f95dd273c1d239fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f84717a666713fc2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fa24731edec0762c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fc495a1e1463e3a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fcf71213bf914edc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fd2124ea46425448_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fe45b2d2398e2c7d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Session_13386251160424781 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Session_13386252129146048 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Tabs_13386251840469301 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Tabs_13386251991261332 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/db +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/cache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/cache/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/WebStorage/QuotaManager +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/WebStorage/QuotaManager-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Dictionaries/en-US-10-1.bdic +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/download_file_types.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/sets.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/preloaded_data.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/cr_en-us_500000_index.bin +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/optimization-hints.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/crs.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/ct_config.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/kp_pinslist.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/crs.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/ct_config.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/kp_pinslist.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/privacy-sandbox-attestations.dat +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/ssl_error_assistant.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/safety_tips.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/safety_tips.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Indexed Rules/36/9.55.0/Ruleset Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/Filtering Rules +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/LICENSE.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/metadata.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/metadata.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/keys.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/english_wikipedia.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/female_names.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/male_names.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/passwords.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/ranked_dicts +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/surnames.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/us_tv_and_film.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/eeigpngbgcognadeebkilcpcaedhellh_1.8814cb6cab024b119ab991ad7acd74f4df7bc68bbf86c0903c8be9852a5baa55 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/efniojlnjndmcbiieegkicadnoecjjef_1.d66493bde74e078e8c2805eb80b3e6c086436545a859af43deb91d54788319b9 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/gcmjkmgdlgnkkcocmoeiminaijmmjnii_1.6af08fc2b0dd497e30e40290efcb817b9b1f7dc7f734ab1a9dd000ae01f36050 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/ggkkehgbnfjpeggfpleeakpidbkibbmn_1.d1946dacbc7fa6bebbf52d4f09160b462f69342198cd34de08f94b27c32a0c73 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/giekcmmlnklenlaomppkphknjmnnpneh_1.3eb16d6c28b502ac4cfee8f4a148df05f4d93229fa36a71db8b08d06329ff18a +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/gonpemdgkjcecdgbnaabipppbmgfggbe_1.7c7087f1e01a939b41851a790125c2fed32542cba2ff03cd364e3292810704b2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/hfnkpimlhhgieaddgfemjhofmfblmnib_1.1950bceba96ac03150a63ab2cef89c42b25a408d9c9182c54bb1875c9ef738e8 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jamhcnnkihinmdlkakkaopbjbbcngflc_1.c52c62a7c50daf7d3f73ec16977cd4b0ea401710807d5dbe3850941dd1b73a70 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jflhchccmppkfebkiaminageehmchikm_1.9f64d174f399031b59ba557c2fc3d355f329ade8a1114cab159b928ca1b0a237 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jflookgnkcckhobaglndicnbbgbonegd_1.63868a769fa0a0d9b29403d397874e07c21258dc176528df388e09e42ce1461d +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/khaoiebndkojlmppeemjhbpbandiljpe_1.05399c5840405f4af2454470ceccaa3d097f07e271705cf37c1e5559ce793eeb +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/kiabhabjdbkjdpjbpigfodbdjmbglcoo_1.1987650928271ad440c2b8a50f309139de82c742fb6f1f3ea055b35718ac46e7 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/laoigpblnllgcgjnjnllmfolckpjlhki_1.29661be65c8fb50d3d4df2fe040a1cc6dd525f50a95850aae6a191301c3de744 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/llkgjffcdpffmhiakmfcdcblohccpfmo_1.2638e3c2d1fa1d417bfdc31dd21bc938f106d3b436a6488b41b014ca9e2b7541 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/lmelglejhemejginpboagddgdfbepgmp_1.735e672dfc473cd68910fe5beb9b40609ef66162b030f06af3aa37876febd90d +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/mfhmdacoffpmifoibamicehhklffanao_1.5d909a5170a955937f7e351112e7cf8cfad773e1fdc4f7880c370aee193bd9cd +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/niikhdgajlphfehepabhhblakbdgeefj_1.780ed8a4eda82d8fef820781c32c60705576b4feb90d1fc4306966ecc4ebaf73 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/obedbbhbpmojnkanicioggnmelmoomoc_1.a77dc10f747e4dd1922e396acb7a68ae40ad1a5e50da0b1d3c2c70933e40b8c6 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/oimompecagnajdejgnnjijobebaeigek_1.c28ebc536851070d5ecefe023e5308aacfee71d18e5b0fc27d152964d1312836 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/ojhpjlocmbogdgmfpkhlaaeamibhnphh_1.545666a4efd056351597bb386aea1368105ededc976ed5650d8682daab9f37ff +eNavigator/eNavigatorUI/.vscode/chrome-debug/extensions_crx_cache/aleakchihdccplidncghkekgioiakgal_1.2007b59ca6741d4e9552b51f25a19010041a7e775020cd0add78607d75f8deec +eNavigator/eNavigatorUI/.vscode/chrome-debug/extensions_crx_cache/cjpalhdlnbpafiamejdnhcphjbkeiagm_1.94025c6277ef9e9568c92f2d4364c6b2d98503a3c2bbfe324b265971949d9679 +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-af.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-as.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-be.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-bg.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-bn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cs.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cy.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-da.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-1901.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-1996.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-ch-1901.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-el.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-en-gb.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-en-us.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-es.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-et.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-eu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-fr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ga.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-gl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-gu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hy.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-it.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ka.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-kn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-la.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-lt.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-lv.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ml.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mn-cyrl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mul-ethi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nb.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-or.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-pa.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-pt.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ru.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sq.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sv.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ta.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-te.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-tk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-uk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-und-ethi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/segmentation_platform/ukm_db +eNavigator/eNavigatorUI/.vscode/chrome-debug/segmentation_platform/ukm_db-journal diff --git a/eNavigator/MarketDataLib/MarketDataLib.csproj b/eNavigator/MarketDataLib/MarketDataLib.csproj new file mode 100644 index 0000000..1111f48 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataLib.csproj @@ -0,0 +1,12 @@ + + + net8.0 + enable + enable + CS0108;CS8602;CS8601;CS8620;CS8618;CS8603;CS8767;CS8625;CS8604;CS8600;CS8604 + + + + + + diff --git a/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs b/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs new file mode 100755 index 0000000..55deb27 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using MarketData.Utils; +using MarketData.Numerical; + +namespace MarketData.MarketDataModel +{ + public class BollingerBandElementsByDate : Dictionary + { + public BollingerBandElementsByDate() + { + } + } + public class BollingerBands : BollingerBandElements + { + public BollingerBands() + { + } + public BollingerBands(List bollingerBandElements) + { + foreach(BollingerBandElement bollingerBandElement in bollingerBandElements)Add(bollingerBandElement); + } + public static String GetHeader(int movingAverageDays) + { + StringBuilder sb = new StringBuilder(); + sb.Append("Date,Symbol,Open,High,Low,Close,Volume,SMA(").Append(movingAverageDays).Append("),StDev(").Append(movingAverageDays).Append("),K,L,K-1,L+1"); + return sb.ToString(); + } + public BollingerBandElementsByDate GetBollingerBandElementsByDate() + { + BollingerBandElementsByDate bollingerBandElementsByDate = new BollingerBandElementsByDate(); + for (int index = 0; index < Count; index++) + { + BollingerBandElement bollingerBandElement = this[index]; + if (!bollingerBandElementsByDate.ContainsKey(bollingerBandElement.Date)) bollingerBandElementsByDate.Add(bollingerBandElement.Date, bollingerBandElement); + } + return bollingerBandElementsByDate; + } + } + public class BollingerBandElements : List + { + public BollingerBandElements() + { + } + public BollingerBandElements(List bollingerBandElements) + { + foreach(BollingerBandElement bollingerBandElement in bollingerBandElements)Add(bollingerBandElement); + } + public LeastSquaresResult LeastSquaresFitClose() + { + double[] closingPrices=(from BollingerBandElement bollingerBandElement in this select bollingerBandElement.Close).ToList().ToArray(); + LeastSquaresResult leastSquaresResult=Numerics.LeastSquares(closingPrices); + return leastSquaresResult; + } + } + public class BollingerBandElement + { + private DateTime date; + private String symbol; + private double open; + private double high; + private double low; + private double close; + private long volume; + private double smaN; + private double stdevN; + private double k; + private double l; + private double kl1; + private double lp1; + + public BollingerBandElement() + { + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public double Open + { + get { return open; } + set { open = value; } + } + public double High + { + get { return high; } + set { high = value; } + } + public double Low + { + get { return low; } + set { low = value; } + } + public double Close + { + get { return close; } + set { close = value; } + } + public double SMAN + { + get { return smaN; } + set { smaN = value; } + } + public double StDevN + { + get { return stdevN; } + set { stdevN = value; } + } + public long Volume + { + get { return volume; } + set { volume = value; } + } + public double K + { + get { return k; } + set { k = value; } + } + public double L + { + get { return l; } + set { l = value; } + } + public double KL1 + { + get { return kl1; } + set { kl1 = value; } + } + public double LP1 + { + get { return lp1; } + set { lp1 = value; } + } + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(Date)).Append(","); + sb.Append(Symbol).Append(","); + sb.Append(Open).Append(","); + sb.Append(High).Append(","); + sb.Append(Low).Append(","); + sb.Append(Close).Append(","); + sb.Append(Volume).Append(","); + sb.Append(SMAN).Append(","); + sb.Append(StDevN).Append(","); + sb.Append(K).Append(","); + sb.Append(L).Append(","); + sb.Append(KL1).Append(","); + sb.Append(LP1); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Constants.cs b/eNavigator/MarketDataLib/MarketDataModel/Constants.cs new file mode 100755 index 0000000..d97ef18 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Constants.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.MarketDataModel +{ + public class Constants + { + public const String CONST_ALL ="{All}"; + public const String CONST_DASHES = "---"; + public const String NA = "N.A."; + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs new file mode 100755 index 0000000..794cf5f --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MarketData.MarketDataModel +{ + public class GainLossSummaryItemCollection : List + { + public GainLossSummaryItemCollection() + { + } + public GainLossSummaryItemCollection(List gainLossSummaryItemCollection) + { + foreach(GainLossSummaryItem gainLossSummaryItem in gainLossSummaryItemCollection)Add(gainLossSummaryItem); + } + public GainLossSummaryItemCollection SortByChange() + { + GainLossSummaryItemCollection gainLossSummaryCollection=new GainLossSummaryItemCollection((from GainLossSummaryItem gainLossSummaryItem in this orderby gainLossSummaryItem.Date descending,gainLossSummaryItem.Change descending, gainLossSummaryItem.Symbol descending select gainLossSummaryItem).ToList()); + return gainLossSummaryCollection; + } + } + public class GainLossSummaryItem + { + public GainLossSummaryItem() + { + } + public DateTime Date{get;set;} + public String Symbol{get;set;} + public String CompanyName{get;set;} + public double CurrentGainLoss{get;set;} + public double PreviousGainLoss{get;set;} + public double Change{get;set;} + public double ChangePercent{get;set;} + public bool HasStopLimit{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs new file mode 100755 index 0000000..278379e --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs @@ -0,0 +1,35 @@ +using System; + +namespace MarketData.MarketDataModel.GainLoss +{ + public class DMAValue + { + private DateTime date; + private double value; + private double maValue; + + public DMAValue() + { + } + public DMAValue(DateTime date, double value) + { + this.date = date; + this.value = value; + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public double Value + { + get { return value; } + set { this.value = value; } + } + public double MAValue + { + get { return maValue; } + set { this.maValue = value; } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs new file mode 100755 index 0000000..d78bbe0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ + public class DMAValues : List + { + public DMAValues() + { + } + public float[] GetValues(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] valuesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + valuesArray[arrayIndex] = (float)this[index].Value; + } + return valuesArray; + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs new file mode 100755 index 0000000..1e0cfa4 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs @@ -0,0 +1,19 @@ +using System; + +namespace MarketData.MarketDataModel.GainLoss +{ +// ************************************************************************************************************************************************************** +// *********************************************** G A I N / L O S S C O M P O U N D M O D E L **************************************** +// ************************************************************************************************************************************************************** +// This GainLossModel will be used to model the GainLossView in terms of surfacing the Active Gain/Loss, Active Exposure, Active Gain/Loss%, Total Gain/Loss, Total Gain/Loss % data + public class GainLossCompoundModel + { + public DateTime Date{get;set;} + public double ActiveExposure{get;set;} + public double ActiveGainLoss{get;set;} + public double ActiveGainLossPercent{get;set;} + public double TotalGainLoss{get;set;} + public double TotalGainLossPercent{get;set;} + public double TotalDividendsPaid{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs new file mode 100755 index 0000000..922ad99 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ +// The GainLossCompoundModelCollection contains both the active gain loss and the total gain loss time series data + public class GainLossCompoundModelCollection : List + { + public GainLossCompoundModelCollection() + { + } + public GainLossCompoundModelCollection(List items) + { + foreach(GainLossCompoundModel item in items)Add(item); + } + public GainLossCompoundModelCollection(GainLossCollection activeGainLossCollection,TotalGainLossCollection totalGainLossCollection) + { + if(null==activeGainLossCollection||null==totalGainLossCollection)return; + Dictionary activeGainLossCollectionByDate=new Dictionary(); + Dictionary totalGainLossCollectionByDate=new Dictionary(); + foreach(GainLossItem gainLossItem in activeGainLossCollection)if(!activeGainLossCollectionByDate.ContainsKey(gainLossItem.Date))activeGainLossCollectionByDate.Add(gainLossItem.Date,gainLossItem); + foreach(TotalGainLossItem gainLossItem in totalGainLossCollection)if(!totalGainLossCollectionByDate.ContainsKey(gainLossItem.Date))totalGainLossCollectionByDate.Add(gainLossItem.Date,gainLossItem); + List dates=new List(activeGainLossCollectionByDate.Keys); + dates.Sort(); + foreach(DateTime date in dates) + { + GainLossItem activeGainLossItem=activeGainLossCollectionByDate[date]; + if(!totalGainLossCollectionByDate.ContainsKey(date))continue; + TotalGainLossItem totalGainLossItem=totalGainLossCollectionByDate[date]; + GainLossCompoundModel gainLossModel=new GainLossCompoundModel(); + gainLossModel.Date=activeGainLossItem.Date; + gainLossModel.ActiveExposure=activeGainLossItem.Exposure; + gainLossModel.ActiveGainLoss=activeGainLossItem.GainLoss; + gainLossModel.ActiveGainLossPercent=activeGainLossItem.GainLossPercent; + gainLossModel.TotalGainLoss=totalGainLossItem.TotalGainLoss; + gainLossModel.TotalGainLossPercent=totalGainLossItem.TotalGainLossPercent; + gainLossModel.TotalDividendsPaid=totalGainLossItem.TotalDividendsPaid; + Add(gainLossModel); + } + } + public DMAValues DMAValuesActiveGainLoss + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.ActiveGainLoss)); + } + return dmaValues; + } + } + public DMAValues DMAValuesTotalGainLoss + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.TotalGainLoss)); + } + return dmaValues; + } + } + public DMAValues DMAValuesActiveGainLossPercent + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.ActiveGainLossPercent)); + } + return dmaValues; + } + } + public DMAValues DMAValuesTotalGainLossPercent + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.TotalGainLossPercent)); + } + return dmaValues; + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs new file mode 100755 index 0000000..2bfa7a0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using MarketData.Utils; + +namespace MarketData.MarketDataModel.GainLoss +{ +// ********************************************************************************************************************************************************************* +// ************************************************************************ G A I N L O S S ************************************************************************** +// ********************************************************************************************************************************************************************* +// This gain loss provides a picture of the Active Gain/Loss. The gain loss on open positions + public class GainLossItem : IComparable + { + private DateTime date; + private double gainLoss; + private double gainLossPercent; + private double exposure; + private double dividends; + private bool valueIsPercent; + public GainLossItem() + { + } + public GainLossItem(DateTime date, double gainLoss,double exposure,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.exposure = exposure; + this.valueIsPercent = valueIsPercent; + } + public GainLossItem(DateTime date, double gainLoss,double gainLossPercent,double exposure,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.gainLossPercent=gainLossPercent; + this.exposure = exposure; + this.valueIsPercent = valueIsPercent; + } + public GainLossItem(DateTime date, double gainLoss,double gainLossPercent,double exposure,double dividends,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.gainLossPercent=gainLossPercent; + this.exposure = exposure; + this.dividends=dividends; + this.valueIsPercent = valueIsPercent; + } + public DateTime Date + { + get { return date; } + } + public double Exposure + { + get + { + return exposure; + } + } + public double GainLoss + { + get { return gainLoss; } + } + public double Dividends + { + get{return dividends;} + } + public double GainLossPercent + { + get { return gainLossPercent; } + } + public bool ValueIsPercent + { + get + { + return valueIsPercent; + } + set + { + valueIsPercent = value; + } + } + public String FormattedGainLoss + { + get + { + if (valueIsPercent) return Utility.FormatNumber(gainLoss); + return Utility.FormatCurrency(gainLoss); + } + } + public int CompareTo(Object obj) + { + if (!obj.GetType().IsInstanceOfType(this)) throw new Exception("Expected GainLoss"); + GainLossItem that = (GainLossItem)obj; + return date.CompareTo(that.Date); + } + } + public class GainLossCollection : List + { + public GainLossCollection(ICollection gainLoss) + : base(gainLoss) + { + } + public DMAValues DMAValues + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossItem gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.GainLoss)); + } + return dmaValues; + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs new file mode 100755 index 0000000..27910ab --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ +// **************************************************************************************************************************************************** +// ********************************************************************** T O T A L G A I N L O S S ************************************************* +// **************************************************************************************************************************************************** +// This Gain/Loss provides a picture of the total Gain/Loss. This is Gain/Loss generated by all trades + public class TotalGainLossCollection : List + { + public TotalGainLossCollection(ICollection gainLoss) + : base(gainLoss) + { + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs new file mode 100755 index 0000000..dd10f9b --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs @@ -0,0 +1,49 @@ +using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.IO; +//using MarketData.Utils; +//using System.Collections.ObjectModel; +//using MarketData.Generator.GainLoss; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel.GainLoss +{ +// **************************************************************************************************************************************************** +// ********************************************************************** T O T A L G A I N L O S S ************************************************* +// **************************************************************************************************************************************************** +// This Gain/Loss provides a picture of the total Gain/Loss. This is Gain/Loss generated by all trades + public class TotalGainLossItem : IComparable + { + public TotalGainLossItem(DateTime date,double totalGainLoss,double totalGainLossPercent,double totalExposure,double totalMarketValue) + { + Date=date; + TotalGainLoss=totalGainLoss; + TotalExposure=totalExposure; + TotalMarketValue=totalMarketValue; + TotalGainLossPercent=totalGainLossPercent; + } + public TotalGainLossItem(DateTime date,double totalGainLoss,double totalGainLossPercent,double totalExposure,double totalMarketValue,double totalDividendsPaid) + { + Date=date; + TotalGainLoss=totalGainLoss; + TotalExposure=totalExposure; + TotalMarketValue=totalMarketValue; + TotalGainLossPercent=totalGainLossPercent; + TotalDividendsPaid=totalDividendsPaid; + } + public DateTime Date{get;private set;} + public double TotalGainLoss{get;private set;} + public double TotalGainLossPercent{get;private set;} + public double TotalExposure{get;private set;} + public double TotalMarketValue{get;private set;} + public double TotalDividendsPaid{get;private set;} + public int CompareTo(Object obj) + { + if (!obj.GetType().IsInstanceOfType(this)) throw new Exception("Expected GainLoss"); + TotalGainLossItem that = (TotalGainLossItem)obj; + return Date.CompareTo(that.Date); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs b/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs new file mode 100755 index 0000000..18ea819 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.MarketDataModel +{ + public class Headlines : List + { + } + public class Headline + { + public Headline() + { + } + public Headline(Headline headline) + { + Date=headline.Date; + Symbol=headline.Symbol; + CompanyName=headline.CompanyName; + Entry=headline.Entry; + Modified=headline.Modified; + Source=headline.Source; + } + public Headline(String symbol,DateTime date,String entry) + { + Symbol=symbol; + Date=date; + Entry=entry; + Modified=DateTime.Now; + } + public DateTime Date{get;set;} + public String Symbol{get;set;} + public String CompanyName{get;set;} + public String Entry{get;set;} + public DateTime Modified{get;set;} + public String Source{get;set;} + } +} + diff --git a/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs b/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs new file mode 100755 index 0000000..093aeab --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using MarketData.Generator; + +namespace MarketData.MarketDataModel +{ +// These are models that were designed to be consumed by the mobile platform + public class PortfolioTradesWithParityPrice + { + public PortfolioTradesWithParityPrice(PortfolioTrades portfolioTrades, Price parityPrice) + { + Trades = portfolioTrades; + ParityPrice = parityPrice; + } + public Price ParityPrice { get; set; } + public PortfolioTrades Trades { get; set; } + } +// ************************************************************************************ + public class GainLossSummaryItemDetail: GainLossSummaryItem + { + public GainLossSummaryItemDetail() + { + } + public GainLossSummaryItemDetail(GainLossSummaryItem gainLossSummaryItem) + { + this.Date=gainLossSummaryItem.Date; + this.Symbol=gainLossSummaryItem.Symbol; + this.CompanyName=gainLossSummaryItem.CompanyName; + this.CurrentGainLoss=gainLossSummaryItem.CurrentGainLoss; + this.PreviousGainLoss=gainLossSummaryItem.PreviousGainLoss; + this.Change=gainLossSummaryItem.Change; + this.ChangePercent=gainLossSummaryItem.ChangePercent; + this.HasStopLimit = gainLossSummaryItem.HasStopLimit; + } + public int Lots{get;set;} + public double Shares{get;set;} + public double Exposure{get;set;} + public double DividendYield{get;set;} // decimal + public double AnnualDividend{get;set;} // amount + public ParityElement ParityElement{get;set;} + public String ParityElementDescription{get{return null==ParityElement?"":ParityElement.ToString();}} + public double AllTimeGainLossPercent{get;set;} + public double PercentDistanceFromAllTimeGainLossPercent{get;set;} + public Price LatestPrice{get;set;} + public double PriceChange{get;set;} + public bool HasStopLimit{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs b/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs new file mode 100755 index 0000000..01637bd --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs @@ -0,0 +1,96 @@ +using System; +using System.Text; +using MarketData.Utils; +using MarketData.MarketDataModel; + +namespace MarketData.MarketDataModel +{ + public class ModelTrade + { + public enum TradeType { Buy, Sell }; + private DateTime tradeDate; + private String symbol; + private int shares; + private double price; + private TradeType tradeType; + private int daysHeld; + private double gainLoss; + private double exposure; + private double returnOnPosition; + private String comment; + + public ModelTrade() + { + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime TradeDate + { + get { return tradeDate; } + set { tradeDate = value; } + } + public int Shares + { + get { return shares; } + set { shares = value; } + } + public double Price + { + get { return price; } + set { price = value; } + } + public int DaysHeld + { + get { return daysHeld; } + set { daysHeld = value; } + } + public double GainLoss + { + get { return gainLoss; } + set { gainLoss = value; } + } + public double Return + { + get { return returnOnPosition; } + set { returnOnPosition = value; } + } + public double Exposure + { + get { return exposure; } + set { exposure = value; } + } + public String Comment + { + get { return comment; } + set { comment = value; } + } + public ModelTrade.TradeType Type + { + get { return tradeType; } + set { tradeType = value; } + } + public static String Header + { + get + { + return "Date,Buy/Sell,Symbol,Shares,Price,Gain/Loss,Days Held,Comment"; + } + } + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(TradeDate)).Append(","); + sb.Append(tradeType.Equals(ModelTrade.TradeType.Sell) ? "Sell" : "Buy").Append(","); + sb.Append(Symbol).Append(","); + sb.Append(Shares).Append(","); + sb.Append("\"" + String.Format("{0:C}", price) + "\"").Append(","); + sb.Append("\"" + String.Format("{0:C}", gainLoss) + "\"").Append(","); + sb.Append(daysHeld).Append(","); + sb.Append("\"").Append(null!=comment?comment:"").Append("\""); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs b/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs new file mode 100755 index 0000000..6c6dd15 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class ParityElement + { + public String Symbol { get; set; } + public DateTime PricingDate { get; set; } + public double ParityOffsetPrice { get; set; } + public double ParityOffsetPercent { get; set; } // This is not a percent it needs to be multiplied by 100 to be a percentage + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Even @").Append(Utility.FormatCurrency(ParityOffsetPrice)).Append(" (").Append(ParityOffsetPercent > 0 ? "+" : "").Append(Utility.FormatPercent(ParityOffsetPercent)).Append(")"); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs b/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs new file mode 100755 index 0000000..6286df0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel +{ + public class Portfolio + { + private List trades = new List(); + private bool openPosition = false; + private double availableCash; + private double initialCash; + + public Portfolio(double initialCash) + { + this.initialCash = this.availableCash = initialCash; + } + public List Trades + { + get { return trades; } + set { trades = value; } + } + public double AvailableCash + { + get { return availableCash; } + set { availableCash = value; } + } + public double GetPortfolioReturn(Price priceOpenPosition) + { + return (GetPortfolioValue(priceOpenPosition)-initialCash)/initialCash; + } + // pass in latest price so we can price any open position + public double GetPortfolioValue(Price priceOpenPosition) + { + double cashValue = AvailableCash; + if (0 != trades.Count) + { + ModelTrade lastTrade = trades[trades.Count - 1]; + if (lastTrade.Type.Equals(ModelTrade.TradeType.Buy)) cashValue += (lastTrade.Shares * priceOpenPosition.Close); + } + return cashValue; + } + public void Add(ModelTrade trade) + { + trades.Add(trade); + } + public ModelTrade GetLastTrade() + { + return trades[trades.Count - 1]; + } + public bool HasOpenPosition + { + get { return openPosition; } + set { openPosition = value; } + } + public int GetTradeCount() + { + return trades.Count; + } + public double GetAverageGainLoss() + { + double totalGainLoss = 0; + for (int index = 0; index < trades.Count; index++) + { + totalGainLoss += trades[index].GainLoss; + } + return totalGainLoss / trades.Count; + } + public int GetAverageHoldingDays() + { + int totalHoldingDays = 0; + int numberOfSellTrades = 0; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + if (trade.Type == ModelTrade.TradeType.Sell) + { + totalHoldingDays += trades[index].DaysHeld; + numberOfSellTrades++; + } + } + return (numberOfSellTrades>0?totalHoldingDays / numberOfSellTrades:0); + } + public int GetMinHoldingDays() + { + int minHoldingDays = Int16.MaxValue; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + int holdingDays = trade.DaysHeld; + if (trade.Type == ModelTrade.TradeType.Sell && holdingDays < minHoldingDays) minHoldingDays = holdingDays; + } + return minHoldingDays; + } + public int GetMaxHoldingDays() + { + int maxHoldingDays =0; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + int holdingDays = trade.DaysHeld; + if (trade.Type==ModelTrade.TradeType.Sell && holdingDays > maxHoldingDays) maxHoldingDays = holdingDays; + } + return maxHoldingDays; + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs new file mode 100755 index 0000000..a281463 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class PortfolioTrade + { + private int tradeId=-1; + private String symbol; + private DateTime tradeDate; + private double shares; + private double price; + private double commission; + private String buySell; + private String account; + private String status; + private double sellPrice=double.NaN; + private DateTime sellDate=Utility.Epoch; + + public int TradeId + { + get {return tradeId ;} + set { tradeId = value; ;} + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime TradeDate + { + get { return tradeDate; } + set { tradeDate = value; } + } + public double Shares + { + get { return shares; } + set { shares = value; } + } + public double Exposure() + { + return Price*Shares; + } + public String BuySell + { + get { return buySell; } + set { buySell = value; } + } + public String Status + { + get { return status; } + set { status = value; } + } + public bool IsOpen + { + get { return status.ToUpper().Equals("OPEN"); } + } + public bool IsClosed + { + get { return !IsOpen; } + } + public String Account + { + get { return account; } + set{account=value;} + } + public DateTime SellDate + { + get { return sellDate; } + set { sellDate = value; } + } + public double SellPrice + { + get { return sellPrice;} + set { sellPrice = value;} + } + public double Price + { + get { return price; } + set { price = value; } + } + public double Commission + { + get { return commission; } + set { commission = value; } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs new file mode 100755 index 0000000..d72eda3 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class Position + { + public String Symbol { get; set; } + public double Shares{get;set;} + public double Exposure { get; set; } + public double MarketValue { get; set; } + } + public class PortfolioTrades : List + { + public PortfolioTrades() + { + } + public PortfolioTrades(List trades) + { + if(null==trades)return; + for (int index = 0; index < trades.Count; index++) Add(trades[index]); + } + public List Symbols + { + get + { + Dictionary uniqueSymbols = new Dictionary(); + List symbols = new List(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (!uniqueSymbols.ContainsKey(portfolioTrade.Symbol)) uniqueSymbols.Add(portfolioTrade.Symbol, portfolioTrade.Symbol); + } + symbols = new List(uniqueSymbols.Values); + symbols.Sort(); + return symbols; + } + } + public List GetPositions(DateTime asOf) + { + List positions = new List(); + List symbols = Symbols; + foreach (String symbol in symbols) positions.Add(GetPosition(symbol, asOf)); + return positions; + } + public Position GetPosition(String symbol,DateTime asof) + { + List portfolioTrades = new List(); + for (int index = 0; index < Count; index++) + { + PortfolioTrade portfolioTrade = this[index]; + if (!portfolioTrade.Symbol.Equals(symbol)) continue; + if (portfolioTrade.IsOpen && portfolioTrade.TradeDate<=asof) { portfolioTrades.Add(portfolioTrade); continue; } + if (portfolioTrade.IsClosed && portfolioTrade.SellDate > asof) { portfolioTrades.Add(portfolioTrade); continue; } + } + if (0 == portfolioTrades.Count) return null; + Position position = new Position(); + position.Symbol = symbol; + position.Shares = portfolioTrades.Sum(x => x.Shares); + position.Exposure = portfolioTrades.Sum(x=>x.Shares*x.Price); + return position; + } + public double Exposure(){return this.Sum(x=>x.Exposure());} + public List Accounts + { + get + { + Dictionary uniqueAccounts = new Dictionary(); + List accounts = new List(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (!uniqueAccounts.ContainsKey(portfolioTrade.Account)) uniqueAccounts.Add(portfolioTrade.Account, portfolioTrade.Account); + } + accounts = new List(uniqueAccounts.Values); + accounts.Sort(); + return accounts; + } + } + public DateTime GetMinTradeDate() + { + DateTime minDate = Utility.Epoch; + minDate = (from portfolioTrade in this select portfolioTrade.TradeDate).Min(); + return minDate; + } + public DateTime GetMinTradeDate(String symbol) + { + DateTime minDate=Utility.Epoch; + symbol=symbol.ToUpper(); + minDate = (from portfolioTrade in this where portfolioTrade.Symbol.Equals(symbol) select portfolioTrade.TradeDate).Min(); + return minDate; + } + +// We just want the trades (open or closed) on or before the specified date. This will be used to run a cumulative gain/loss and return + public PortfolioTrades GetTradesOnOrBefore(DateTime date) + { + PortfolioTrades tradesOnOrBefore = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (date >= portfolioTrade.TradeDate) tradesOnOrBefore.Add(portfolioTrade); + } + return tradesOnOrBefore; + } +// This will remove trades that are status='CLOSED' and SELL_DATE=closingDate +// The user of this fucntion would be making the inference that a trade that closed on closingDate should not be seen as part of the holdings. +// For example. The assumption would be that trades that closed on closingDate would not be a part of the portfolio on closingDate + public PortfolioTrades RemoveClosedTradesWhereClosedOn(DateTime closingDate) + { + PortfolioTrades portfolioTrades; + List removeTrades = (from PortfolioTrade portfolioTrade in this where portfolioTrade.Status.Equals("CLOSED") && portfolioTrade.SellDate.Date.Equals(closingDate.Date) select portfolioTrade).ToList(); + if (null != removeTrades && 0 != removeTrades.Count) portfolioTrades = new PortfolioTrades(this.Except(removeTrades).ToList()); + else portfolioTrades = this; + return portfolioTrades; + } + public PortfolioTrades GetOpenTradesOn(DateTime date) + { + PortfolioTrades openTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (Utility.Epoch.Equals(portfolioTrade.SellDate)) // No sell date so trade is open + { + if (date >= portfolioTrade.TradeDate) openTrades.Add(portfolioTrade); + } + else // sell date is not epoch so see if date is in between tradedate and selldate + { + if (date >= portfolioTrade.TradeDate && date < portfolioTrade.SellDate) openTrades.Add(portfolioTrade); // assume that if the sell date is equal to date then the position is closed + } + } + return openTrades; + } + public bool HasOpenPositions(String symbol) + { + int openTrades=(from PortfolioTrade portfolioTrade in this where portfolioTrade.Symbol.Equals(symbol) && portfolioTrade.IsOpen select portfolioTrade).Count(); + return openTrades>0?true:false; + } + public bool HasOpenPositionsOn(String symbol,DateTime dateTime) + { + PortfolioTrades portfolioTrades=GetOpenTradesOn(dateTime); + int numTrades=(from PortfolioTrade portfolioTrade in portfolioTrades where portfolioTrade.Symbol.Equals(symbol) select portfolioTrade).Count(); + return numTrades>0?true:false; + } +// This method relies on the fact that BreakoutTrades method in PortfolioDA.GetTradesSymbol() creates pairs of BUY and SELL legs with paired legs sharing the same TradeId. +// The open trades will show up with count==1 when we group them by TradeId + public PortfolioTrades GetOpenTrades() + { + if(0==Count)return new PortfolioTrades(); + PortfolioTrades openTrades=new PortfolioTrades((from PortfolioTrade trade in this select trade).GroupBy(x=>x.TradeId).Where(grouping=>grouping.Count()==1).Select(grouping=>grouping.FirstOrDefault()).ToList()); + return openTrades; + } + public PortfolioTrades FilterAccount(String account) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (portfolioTrade.Account.Equals(account)) portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + public PortfolioTrades FilterAccount(List accounts) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if(accounts.Any(x=>x.Equals(portfolioTrade.Account)))portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + public PortfolioTrades FilterSymbol(String symbol) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (portfolioTrade.Symbol.Equals(symbol)) portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs b/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs new file mode 100755 index 0000000..c4d0c8b --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs @@ -0,0 +1,23 @@ +using System; + +namespace MarketData.MarketDataModel +{ + public class PositionWithDescription : MarketDataModel.Position + { + public PositionWithDescription() + { + } + public PositionWithDescription(MarketDataModel.Position position, String companyName, String description) + { + if (null == position || null == description) return; + this.Symbol = position.Symbol; + this.Shares = position.Shares; + this.MarketValue = position.MarketValue; + this.Exposure = position.Exposure; + this.Description = description; + this.CompanyName = companyName; + } + public String Description { get; set; } + public String CompanyName { get; set; } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs b/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs new file mode 100755 index 0000000..bc1317f --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class PremarketElement + { + public String Market { get; set; } + public double ChangePercent { get; set; } + public double ChangeValue { get; set; } + public DateTime Timestamp { get; set; } + } + public class PremarketElements:List + { + public PremarketElements() + { + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs b/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs new file mode 100755 index 0000000..9198534 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class PriceIndex + { + public String Code{get;set;} + public String Name{get;set;} + public double Value{get;set;} + public DateTime AsOf{get;set;} + public String Source{get;set;} + } + + public class PriceIndices : List + { + public PriceIndices() + { + } + public PriceIndices(List priceIndices) + { + foreach(PriceIndex priceIndex in priceIndices) + { + Add(priceIndex); + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Prices.cs b/eNavigator/MarketDataLib/MarketDataModel/Prices.cs new file mode 100755 index 0000000..3daab73 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Prices.cs @@ -0,0 +1,448 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using MarketData.Utils; +using MarketData.Numerical; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel +{ + public class PricesByDate : Dictionary + { + private DateTime maxDate=Utility.Epoch; + private DateTime minDate=Utility.Epoch; + public PricesByDate() + { + } + public new void Add(DateTime key,Price price) + { + base.Add(key,price); + if(key>maxDate)maxDate=key; + else if(Utility.IsEpoch(minDate))minDate=key; + else if(key + { + public int Compare(Price p1, Price p2) + { + if (p1.Date < p2.Date) return -1; + else if (p1.Date > p2.Date) return 1; + return 0; + } + } +// Throughout the application it is assumed that these collections, when populated, be be in descending date order. + public class Prices : List + { + public Prices() + { + } + public Prices(Price[] prices) + { + foreach (Price price in prices) Add(price); + } + public Prices(List prices) + { + foreach(Price price in prices)Add(price); + } + public Prices(String strCSV,String symbol) + { + String[] csvLines = strCSV.Split('\n'); + Clear(); + for (int index = 1; index < csvLines.Length; index++) + { + if (csvLines[index].Length < 1) continue; + String[] lineItems = csvLines[index].Split(','); + Price price = new Price(); + String[] dateParts = lineItems[0].Split('-'); + try { price.Date = new DateTime(int.Parse(dateParts[0]), int.Parse(dateParts[1]), int.Parse(dateParts[2])); } + catch (Exception /*exception*/) + { + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("'{0}' does not contain a date", lineItems[0])); + continue; + } + price.Symbol = symbol; + price.Open = Double.Parse(lineItems[1]); + price.High = Double.Parse(lineItems[2]); + price.Low = Double.Parse(lineItems[3]); + price.Close = Double.Parse(lineItems[4]); + price.Volume = Int64.Parse(lineItems[5]); + if(lineItems.Length>6)price.AdjClose=Double.Parse(lineItems[6]); + Add(price); + } + } +// This Beta differs wildly with Yahoo Finance. Yahoo finance uses 36 buckets of monthly returns which was simulated when building this Investopedia-based routine. +// I have yet to discover the cause of the difference but I leave this routine in place as a matter of further study and to make comparisons. +// I tested the bucket methodology against just using a stream of returns and they produce the same result so this routine simply uses a stream of returns. +// At any rate, the beta produced by this method does not match to Yahoo finance. + //public double Beta(Prices bmkPrices) + //{ + // double beta=double.NaN; + // if(Count!=bmkPrices.Count)return beta; + // float[] cumReturnsPricesArray=GetReturns(); + // float[] cumReturnsPricesBenchmark=bmkPrices.GetReturns(); + // beta=Numerics.Beta(ref cumReturnsPricesArray,ref cumReturnsPricesBenchmark); + // return beta*10; + //} +// Assumes that the prices are stored lowest date first + public double MaxDrawdown() + { + return Numerics.MaxDrawdown(GetPrices()); + } + public double MaxUpside() + { + return Numerics.MaxUpside(GetPrices()); + } + public PricesByDate GetPricesByDate() + { + PricesByDate pricesByDate = new PricesByDate(); + for (int index = 0; index < Count; index++) pricesByDate.Add(this[index].Date, this[index]); + return pricesByDate; + } + public Prices Top(int count) + { + Prices prices = new Prices(); + for (int index = 0; index < count && index=0 && prices.Count Count) return null; + float[] pricesArray=new float[count]; + for (int index = startIndex,arrayIndex=0; index < startIndex + count; index++,arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].Close; + } + return pricesArray; + } + public float[] GetPricesHigh(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] pricesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].High; + } + return pricesArray; + } + public float[] GetPricesLow(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] pricesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].Low; + } + return pricesArray; + } + public float[] GetReturns() + { + if(Count==0||1==Count)return null; + float[] returns = new float[Count - 1]; + for (int index = 0; index < Count - 1; index++) + { + Price currentPrice = this[index]; + Price prevPrice = this[index + 1]; + if (0.00 == prevPrice.Close) returns[index] = 0.00F; + else returns[index] = (float)((currentPrice.Close - prevPrice.Close) / Math.Abs(prevPrice.Close)); + } + return returns; + } + public double GetReturn1D() + { + if(Count<2)return double.NaN; + Prices pricesForReturn1D=new Prices(this.Take(2).ToList()); + return pricesForReturn1D.GetCumulativeReturn(); + } + public float[] GetReturns(int dayCount) + { + if(Count-dayCount<=0)return new float[0]; + float[] returns = new float[Count - dayCount]; + for (int index = 0; index < Count - dayCount; index++) + { + Price currentPrice = this[index]; + Price prevPrice = this[index + dayCount]; + if (0.00 == prevPrice.Close) returns[index] = 0.00F; + else returns[index] = (float)((currentPrice.Close - prevPrice.Close) / Math.Abs(prevPrice.Close)); + } + return returns; + } + public double GetCumulativeReturn() + { + float[] returns=GetReturns(); + if(null==returns)return double.NaN; + double itemReturn=0.00; + for(int index=0;index symbolPricesByDate = new Dictionary(); + // List historicalDates = new List(); + // while (historicalDates.Count < (months + 1)) + // { + // historicalDates.Add(startDate); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // } + // DateTime requestStartDate = dateGenerator.DaysAddActual(asof, 5); // advance 5 days to provide an error margin for holidays + // Prices symbolPrices = PricingDA.GetPrices(symbol, requestStartDate, historicalDates[historicalDates.Count - 1]); + // foreach (Price price in symbolPrices) symbolPricesByDate.Add(price.Date, price); + // startDate = dateGenerator.GetCurrMonthStart(asof); + // while (prices.Count < (months + 1)) + // { + // Price price = GetPrice(symbol, startDate, symbolPricesByDate); + // if (null == price) return null; + // prices.Add(price); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // if (startDate < minPricingDate) break; + // } + // return prices; + //} + private static Price GetPrice(String symbol,DateTime requestedDate, Dictionary symbolPricesByDate) + { + int maxAdvanceDays = 5; + Price symbolPrice = null; + for (int advanceDays = 0; advanceDays < maxAdvanceDays; advanceDays++) + { + if (!symbolPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + symbolPrice = symbolPricesByDate[requestedDate]; + } + return symbolPrice; + } +// ********************************** + + + + + + + } + public class Price + { + private String symbol; + private DateTime date; + private double open; + private double high; + private double low; + private double close; + private long volume; + private double adjClose; + public Price() + { + } + public Price Clone() + { + Price clonePrice=new Price(); + clonePrice.Symbol=Symbol; + clonePrice.Date=Date; + clonePrice.Open=Open; + clonePrice.High=High; + clonePrice.Low=Low; + clonePrice.Close=Close; + clonePrice.Volume=Volume; + clonePrice.AdjClose=AdjClose; + return clonePrice; + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public double Open + { + get { return open; } + set { open = value; } + } + public double High + { + get { return high; } + set { high = value; } + } + public double Low + { + get { return low; } + set { low = value; } + } + public double Close + { + get { return close; } + set { close = value; } + } + public long Volume + { + get { return volume; } + set { volume = value; } + } + public double AdjClose + { + get { return adjClose; } + set { adjClose = value; } + } + public bool IsValid + { + get + { + if(null==symbol)return false; + if(Utility.IsEpoch(date))return false; + if(double.IsNaN(open))return false; + if(double.IsNaN(high))return false; + if(double.IsNaN(low))return false; + if(double.IsNaN(close))return false; + if(double.IsNaN(adjClose))return false; + return true; + } + } + public static String Header + { + get { return "Date,Symbol,Open,High,Low,Close,Volume,Adj Close"; } // ,M12,M26,MACD,Signal,Histogram + } + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(symbol).Append(","); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(Date)).Append(","); + sb.Append(String.Format("{0:0.00}", Open)).Append(","); + sb.Append(String.Format("{0:0.00}", High)).Append(","); + sb.Append(String.Format("{0:0.00}", Low)).Append(","); + sb.Append(String.Format("{0:0.00}", Close)).Append(","); + sb.Append(Volume).Append(","); + sb.Append(String.Format("{0:0.00}", AdjClose)); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs b/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs new file mode 100755 index 0000000..613d1c3 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class StopLimit + { + public String Symbol{get;set;} + public double StopPrice{get;set;} + public double Shares{get;set;} + public String StopType{get;set;} + public int Active{get;set;} + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs b/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs new file mode 100755 index 0000000..81ba955 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs @@ -0,0 +1,144 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using MarketData.Numerical; + +namespace MarketData.MarketDataModel +{ + public class TimeSeriesCollection : List + { + public TimeSeriesCollection() + { + } + public TimeSeriesCollection(List elements) + { + if (null == elements) return; + foreach (TimeSeriesElement element in elements) Add(element); + } +// Returns the intersection of both sets on the common dates + public static AlignDatesResult AlignDates(TimeSeriesCollection tsA,TimeSeriesCollection tsB) + { + List tsADates=(from ts in tsA select ts.AsOf).ToList(); + List tsBDates=(from ts in tsB select ts.AsOf).ToList(); + + List tsIntersect=tsADates.Intersect(tsBDates).Distinct().ToList(); + tsA=new TimeSeriesCollection((from ts in tsA where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); + tsB=new TimeSeriesCollection((from ts in tsB where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); + return new AlignDatesResult(tsA,tsB); + } + + public float[] ToFloat() + { + float[] values = new float[Count]; + for (int index = 0; index < Count; index++) values[index] = (float)this[index].Value; + return values; + } + public bool ContainsNegativeValues() + { + int count= (from TimeSeriesElement element in this where element.Value < 0 select element).Count(); + return count > 0 ? true : false; + } + public TimeSeriesCollection RemoveNegativeValues() + { + return new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value >= 0 select element).ToList()); + } +// Removes the outliers from the collection. If the resulting collection contains zero elements then returns the original collection. + //public TimeSeriesCollection RemoveOutliers(int standardDeviations=4) + //{ + // double[] values = (from TimeSeriesElement element in this select element.Value).ToArray(); + // double valuesStd=Numerics.Volatility(ref values)*standardDeviations; + // TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value <=valuesStd select element).ToList()); + // if(0==timeSeriesCollection.Count)return this; + // else return timeSeriesCollection; + //} + } + public class TimeSeriesElement + { + public enum ElementType { INVALID, OTHER,BVPS, EPS, OperatingCashflow,FreeCashflow,Revenue,QuarterlyRevenue,Inventory,QuarterlyInventory,ROIC,OperatingIncome,WorkingCapital,ROA,NetIncomeAvailableToCommonShareholders,TaxRate,InterestExpense,COGS}; + private String symbol; + private DateTime asof; + private ElementType elementType; + private double value; + private String otherType; + + public TimeSeriesElement() + { + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime AsOf + { + get { return asof; } + set { asof = value; } + } + public double Value + { + get { return value; } + set { this.value = value; } + } + public String OtherType + { + get{return otherType;} + set{otherType=value;} + } + public TimeSeriesElement.ElementType Type + { + get { return elementType; } + set { elementType = value; } + } + public static String StringForType(TimeSeriesElement.ElementType type) + { + switch (type) + { + case ElementType.INVALID : + return "???"; + case ElementType.BVPS: + return "bvps"; + case ElementType.EPS: + return "eps"; + case ElementType.OperatingCashflow : + return "operating_cashflow"; + case ElementType.FreeCashflow: + return "free_cashflow"; + case ElementType.Revenue: + return "revenue"; + case ElementType.QuarterlyRevenue: + return "quarterly_revenue"; + case ElementType.OperatingIncome: + return "operating_income"; + case ElementType.ROIC: + return "roic"; + case ElementType.WorkingCapital: + return "working_capital"; + case ElementType.ROA: + return "roa"; + case ElementType.TaxRate : + return "tax_rate"; + case ElementType.InterestExpense: + return "interest_expense"; + case ElementType.NetIncomeAvailableToCommonShareholders: + return "net_income_available_to_common_shareholders"; + case ElementType.COGS: + return "cogs"; + default: + return "???"; + } + } + } + public class AlignDatesResult + { + public AlignDatesResult() + { + } + public AlignDatesResult(TimeSeriesCollection collectionA,TimeSeriesCollection collectionB) + { + CollectionA=collectionA; + CollectionB=collectionB; + } + public TimeSeriesCollection CollectionA{get;set;} + public TimeSeriesCollection CollectionB{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs b/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs new file mode 100755 index 0000000..61a45f7 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using MarketData.DataAccess; +using MarketData.MarketDataModel; +using MarketData.Utils; + +// This Beta calculator is modelled after Yahoo Finance Beta calculator. It calculates Beta using 36 monthly prices start at beginning of previous month and going back 36 months +// While the calculator does not match exactly to Yahoo Finance I will use this as an alternative in the event that Yahoo Finance Beta is no longer available. +namespace MarketData.Numerical +{ + public class BetaPrices : List + { + public BetaPrices() + { + } +// assuming that the list is in descending date order + public double[] ReturnsBenchmark() + { + double[] returns=new double[Count-1]; + for(int index=Count-2;index>=0;index--) + { + if(this[index+1].PriceBenchmark.Close==0.00)returns[index]=0.00; + else returns[index]=(this[index].PriceBenchmark.Close-this[index+1].PriceBenchmark.Close)/this[index+1].PriceBenchmark.Close; + } + return returns; + } + public double[] ReturnsSymbol() + { + double[] returns=new double[Count-1]; + for(int index=Count-2;index>=0;index--) + { + if(this[index+1].PriceSymbol.Close==0.00)returns[index]=0.00; + else returns[index]=(this[index].PriceSymbol.Close-this[index+1].PriceSymbol.Close)/this[index+1].PriceSymbol.Close; + } + return returns; + } + } + public class BetaPrice + { + public BetaPrice(String symbol,String benchmark,Price symbolPrice,Price benchmarkPrice,DateTime pricingDate) + { + Symbol=symbol; + Benchmark=benchmark; + PricingDate=pricingDate; + PriceSymbol=symbolPrice; + PriceBenchmark=benchmarkPrice; + } + public DateTime PricingDate{get;set;} + public String Symbol{get;set;} + public String Benchmark{get;set;} + public Price PriceSymbol{get;set;} + public Price PriceBenchmark{get;set;} + } + + public class BetaGenerator + { + private BetaGenerator() + { + } + //public static double Beta(String symbol,int months = 36) + //{ + // return Beta(symbol, PricingDA.GetLatestDate(symbol), months); + //} + //public static double Beta(String symbol,DateTime asof,int months=36) + //{ + // try + // { + // String benchmark = "SPY"; + // DateGenerator dateGenerator = new DateGenerator(); + + // BetaPrices betaPrices = new BetaPrices(); + // DateTime startDate = dateGenerator.GetPrevMonthStart(asof); + // DateTime minPricingDate = PricingDA.GetEarliestDate(symbol); + // Dictionary symbolPricesByDate = new Dictionary(); + // Dictionary benchmarkPricesByDate = new Dictionary(); + // List historicalDates = new List(); + // while (historicalDates.Count < (months + 1)) + // { + // historicalDates.Add(startDate); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // } + // Prices symbolPrices = PricingDA.GetPrices(symbol, asof, historicalDates[historicalDates.Count - 1]); + // Prices benchmarkPrices = PricingDA.GetPrices(benchmark, asof, historicalDates[historicalDates.Count - 1]); + // foreach (Price price in symbolPrices) symbolPricesByDate.Add(price.Date, price); + // foreach (Price price in benchmarkPrices) benchmarkPricesByDate.Add(price.Date, price); + // startDate = dateGenerator.GetPrevMonthStart(asof); + // while (betaPrices.Count < (months + 1)) + // { + // BetaPrice betaPrice = GetPrice(symbol, benchmark, startDate, symbolPricesByDate, benchmarkPricesByDate); + // if (null == betaPrice) + // { + // return double.NaN; + // } + // betaPrices.Add(betaPrice); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // if (startDate < minPricingDate) break; + // } + // double[] returnsSymbol = betaPrices.ReturnsSymbol(); + // double[] returnsBenchmark = betaPrices.ReturnsBenchmark(); + // double beta = Numerics.Beta(ref returnsSymbol, ref returnsBenchmark); + // return beta; + // } + // catch (Exception exception) + // { + // MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception:{0}",exception.ToString())); + // return double.NaN; + // } + //} + private static BetaPrice GetPrice(String symbol, String benchmark, DateTime requestedDate, Dictionary symbolPricesByDate, Dictionary benchmarkPricesByDate) + { + try + { + int maxAdvanceDays = 10; + Price symbolPrice = null; + Price benchmarkPrice = null; + for (int advanceDays = 0; advanceDays < maxAdvanceDays; advanceDays++) + { + if (!symbolPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + symbolPrice = symbolPricesByDate[requestedDate]; + if (!benchmarkPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + benchmarkPrice = benchmarkPricesByDate[requestedDate]; + } + if (null == symbolPrice || null == benchmarkPrice) return null; + symbolPrice.Date = requestedDate.Date; + benchmarkPrice.Date = requestedDate.Date; + return new BetaPrice(symbol, benchmark, symbolPrice, benchmarkPrice, requestedDate); + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Exception:{0}", exception.ToString())); + return null; + } + } + } +} + diff --git a/eNavigator/MarketDataLib/Numerics/Bin.cs b/eNavigator/MarketDataLib/Numerics/Bin.cs new file mode 100755 index 0000000..0729b8a --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Bin.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.Numerical +{ + public interface IBinValueExtractor + { + double BinValue(); + } + public class BinCollection : List> + { + } + public class BinItems : List + { + public BinItems() + { + } + public BinItems(List list) + { + foreach(T item in list)Add(item); + } + } + public class BinHelper where T : IBinValueExtractor + { + public static BinCollection CreateBins(BinItems items,int bins) + { + BinCollection binCollection=new BinCollection(); + if(null==items||0==items.Count) + { + for(int index=0;index()); + return binCollection; + } + items.Sort(); + T minItem=items[0]; + T maxItem=items[items.Count-1]; + double midPoint=(maxItem.BinValue()-minItem.BinValue())/(double)bins; + List borderValues=new List(); + for(int index=0;index()); + for(int index=0;index binItems=binCollection[binCollection.Count-1]; + lowerBound=borderValues[index]; + if(index==borderValues.Count-1)upperBound=maxItem.BinValue(); + else upperBound=borderValues[index+1]; + for(int itemIndex=0;itemIndex=lowerBound&&item.BinValue()()); + } + return binCollection; + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/BlackScholes.cs b/eNavigator/MarketDataLib/Numerics/BlackScholes.cs new file mode 100755 index 0000000..79bff96 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/BlackScholes.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using MarketData.MarketDataModel; + +namespace MarketData.Numerical +{ + /// + /// Black Sholes Option Pricing Model for simplest scenario + /// + public class BlackScholesOptionPricingModel + { + private BlackScholesOptionPricingModel() + { + } + /// + /// Get Option price by applying BlackScholesOptionPricingModel + /// + /// Enum to indicate whether Call or Put + /// Price of underlying + /// Strike price + /// Time to expiration in years + /// Risk free interest rate + /// Volatility + /// + //public static double GetPrice(OptionTypeEnum optionType, double S, double X, double T, double r, double v) + //{ + // double d1 = 0.0; + // double d2 = 0.0; + // double optionValue = 0.0; + + // d1 = (Math.Log(S / X) + (r + v * v / 2.0) * T) / (v * Math.Sqrt(T)); + // d2 = d1 - v * Math.Sqrt(T); + // if (optionType == OptionTypeEnum.CallOption) + // { + // optionValue = S * CumulativeNormalDistributionFun(d1) - X * Math.Exp(-r * T) * CumulativeNormalDistributionFun(d2); + // } + // else if (optionType == OptionTypeEnum.PutOption) + // { + // optionValue = X * Math.Exp(-r * T) * CumulativeNormalDistributionFun(-d2) - S * CumulativeNormalDistributionFun(-d1); + // } + // return optionValue; + //} + /// + /// Cumulative normal distribution function + /// + /// + /// + private static double CumulativeNormalDistributionFun(double d) + { + double L = 0.0; + double K = 0.0; + double dCND = 0.0; + const double a1 = 0.31938153; + const double a2 = -0.356563782; + const double a3 = 1.781477937; + const double a4 = -1.821255978; + const double a5 = 1.330274429; + L = Math.Abs(d); + K = 1.0 / (1.0 + 0.2316419 * L); + + dCND = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI)) * Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) + a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0)); + + if (d < 0) + { + return 1.0 - dCND; + } + else + { + return dCND; + } + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/KStest.cs b/eNavigator/MarketDataLib/Numerics/KStest.cs new file mode 100755 index 0000000..8376084 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/KStest.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +//using System.Data.SqlClient; +using System.Text; +using System.IO; + +// Filename: KSTest.cs +// Author:Yan Kvitko +// Date:01/2005 + +namespace MarketData.Numerical +{ + [Serializable] + public class KSTest + { + private int h; + private double pValue; + private double ksStat; + private double criticalValue; + + public KSTest() + { + } + public KSTest(int h, double pValue, double ksStat, double criticalValue) + { + this.h=h; + this.pValue=pValue; + this.ksStat=ksStat; + this.criticalValue=criticalValue; + } + public int H + { + get{return h;} + set{h=value;} + } + public double PValue + { + get{return pValue;} + set{pValue=value;} + } + public double KSStat + { + get{return ksStat;} + set{ksStat=value;} + } + public double CriticalValue + { + get{return criticalValue;} + set{criticalValue=value;} + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/LeastSquares.cs b/eNavigator/MarketDataLib/Numerics/LeastSquares.cs new file mode 100755 index 0000000..8772ded --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/LeastSquares.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MarketData.Utils; + +namespace MarketData.Numerical +{ + public class LeastSquaresResult + { + public double[] LeastSquares { get; set; } + public double YIntercept { get; set; } + public double XIntercept { get; set; } + public double Slope { get; set; } + public void Extend(int itemCount, double slope) // extend the result set by itemCount by applying the slope to subsequent values + { + if (null == LeastSquares || 0 == LeastSquares.Length) return; + double[] extendedItems = new double[itemCount + LeastSquares.Length]; + Array.Copy(LeastSquares, 0, extendedItems, itemCount, LeastSquares.Length); + for (int index = itemCount - 1; index >= 0; index--) + { + extendedItems[index] = extendedItems[index + 1] + slope; + } + LeastSquares = extendedItems; + } + } + public class LeastSquaresResultWithR2 : LeastSquaresResult + { + public double RSquared { get; set; } + } +// ********************************************************************************************************************************************** + public class LeastSquaresHelper + { + private LeastSquaresHelper() + { + } +// This version reverses the slope because the input data is in reverse order +// The input data should be in the following manner observations[count-1]=earliest data point, observations[0]=most recent data point +// This version should be retained as-is because it is being referenced in models etc., + public static LeastSquaresResult CalculateLeastSquares(double[] observations) + { + try + { + LeastSquaresResult leastSquaresResult = new LeastSquaresResult(); + double[] xSeries = new double[observations.Length]; + double[] xMinusXMean = new double[observations.Length]; + double[] yMinusYMean = new double[observations.Length]; + double[] meanProduct = new double[observations.Length]; + double[] xMinusXMeanSquared = new double[observations.Length]; + double[] leastSquares = new double[observations.Length]; + double xMean = double.NaN; + double yMean = double.NaN; + double slope = double.NaN; + double yIntercept = double.NaN; + for (int index = 0; index < xSeries.Length; index++) xSeries[index] = index + 1; + xMean = Numerics.Mean(ref xSeries); + yMean = Numerics.Mean(ref observations); + for (int index = 0; index < observations.Length; index++) + { + xMinusXMean[index] = xSeries[index] - xMean; + yMinusYMean[index] = observations[index] - yMean; + meanProduct[index] = xMinusXMean[index] * yMinusYMean[index]; + xMinusXMeanSquared[index] = xMinusXMean[index] * xMinusXMean[index]; + } + slope = Numerics.Sum(ref meanProduct) / Numerics.Sum(ref xMinusXMeanSquared); + yIntercept = Numerics.YIntercept(xMean, yMean, slope); + for (int index = 0; index < leastSquares.Length; index++) leastSquares[index] = slope * xSeries[index] + yIntercept; + leastSquaresResult.LeastSquares = leastSquares; + leastSquaresResult.YIntercept = yIntercept; + leastSquaresResult.XIntercept = xMean; + leastSquaresResult.Slope = slope * -1.00; + return leastSquaresResult; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, exception.ToString()); + return null; + } + } +// This version uses the true slope whereas the version above reverses the slope due to the arrangement of the input data +// The input data should be in the following manner observations[0]=earliest data point, observations[count-1]=most recent data point + public static LeastSquaresResultWithR2 CalculateLeastSquaresWithR2(double[] observations) + { + try + { + LeastSquaresResultWithR2 leastSquaresResultWithR2 = new LeastSquaresResultWithR2(); + double[] xSeries = new double[observations.Length]; + double[] xMinusXMean = new double[observations.Length]; + double[] yMinusYMean = new double[observations.Length]; + double[] meanProduct = new double[observations.Length]; + double[] xMinusXMeanSquared = new double[observations.Length]; + double[] leastSquares = new double[observations.Length]; + double xMean = double.NaN; + double yMean = double.NaN; + double slope = double.NaN; + double yIntercept = double.NaN; + for (int index = 0; index < xSeries.Length; index++) xSeries[index] = index + 1; + xMean = Numerics.Mean(ref xSeries); + yMean = Numerics.Mean(ref observations); + for (int index = 0; index < observations.Length; index++) + { + xMinusXMean[index] = xSeries[index] - xMean; + yMinusYMean[index] = observations[index] - yMean; + meanProduct[index] = xMinusXMean[index] * yMinusYMean[index]; + xMinusXMeanSquared[index] = xMinusXMean[index] * xMinusXMean[index]; + } + slope = Numerics.Sum(ref meanProduct) / Numerics.Sum(ref xMinusXMeanSquared); + yIntercept = Numerics.YIntercept(xMean, yMean, slope); + for (int index = 0; index < leastSquares.Length; index++) leastSquares[index] = slope * xSeries[index] + yIntercept; + leastSquaresResultWithR2.LeastSquares = leastSquares; + leastSquaresResultWithR2.YIntercept = yIntercept; + leastSquaresResultWithR2.XIntercept = xMean; + leastSquaresResultWithR2.Slope = slope; + // calculate the R2 + double[] estimated = new double[observations.Length]; + double[] estimatedLessMeanSquared = new double[observations.Length]; + double sumOfEstimatedLessMeanSquared = 0.00; + double sumofsquares = 0.00; + foreach (double observation in observations) sumofsquares += Math.Pow(observation - yMean, 2); + for (int index = 0; index < observations.Length; index++) estimated[index] = yIntercept + (slope * (index + 1)); + for (int index = 0; index < observations.Length; index++) estimatedLessMeanSquared[index] = Math.Pow(estimated[index] - yMean, 2); + foreach (double value in estimatedLessMeanSquared) sumOfEstimatedLessMeanSquared += value; + leastSquaresResultWithR2.RSquared = sumOfEstimatedLessMeanSquared / sumofsquares; + return leastSquaresResultWithR2; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, exception.ToString()); + return null; + } + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/Numerics.cs b/eNavigator/MarketDataLib/Numerics/Numerics.cs new file mode 100755 index 0000000..5c8c786 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Numerics.cs @@ -0,0 +1,1498 @@ +using System; +using System.Threading; +using System.Collections; +using System.Linq; +using System.Collections.Generic; +using MarketData.MarketDataModel; +using MarketData.Utils; + +// Filename: Numerics.cs +// Author:Sean Kessler / Werner Stanzl +// Date:07/2003 + +namespace MarketData.Numerical +{ + public class Numerics + { + public static double[] ToDouble(float[] floatArray) + { + double[] doubleArray=new double[floatArray.Length]; + for(int index=0;index-2*stddev select value).ToArray(); + double[] newObservations=(from double value in observations where value (deviations*-1)*stddev select value).ToArray(); + return newObservations; + } + public static LeastSquaresResult LeastSquares(double[] observations) + { + return LeastSquaresHelper.CalculateLeastSquares(observations); + } + public static LeastSquaresResultWithR2 LeastSquaresWithR2(double[] observations) + { + return LeastSquaresHelper.CalculateLeastSquaresWithR2(observations); + } + public static double RSquared(double[] observations) + { + try + { + double[] estimated = new double[observations.Length]; + double[] estimatedLessMeanSquared = new double[observations.Length]; + double sumOfEstimatedLessMeanSquared = 0.00; + double rSquared = 0.00; + LeastSquaresResult leastSquaresResult = null; + double mean = Numerics.Mean(ref observations); + double sumofsquares = 0.00; + foreach (double observation in observations) sumofsquares += Math.Pow(observation - mean, 2); + leastSquaresResult = LeastSquares(observations); + double slope = leastSquaresResult.Slope * -1.00; // LeastSquares generator reverses the slope. Because prices fed to it are in reverse order + double yIntercept = leastSquaresResult.YIntercept; + for (int index = 0; index < observations.Length; index++) estimated[index] = yIntercept + (slope * (index + 1)); + for (int index = 0; index < observations.Length; index++) estimatedLessMeanSquared[index] = Math.Pow(estimated[index] - mean, 2); + foreach (double value in estimatedLessMeanSquared) sumOfEstimatedLessMeanSquared += value; + rSquared = sumOfEstimatedLessMeanSquared / sumofsquares; + return rSquared; + } + catch (Exception) + { + return double.NaN; + } + } +/// LeastSquares - Calculates least squares fit. +/// y-Values +/// LeastSquares + //public static LeastSquaresResult LeastSquares(double[] observations) + //{ + // LeastSquaresResult leastSquaresResult=new LeastSquaresResult(); + // double[] xSeries=new double[observations.Length]; + // double[] xMinusXMean=new double[observations.Length]; + // double[] yMinusYMean=new double[observations.Length]; + // double[] meanProduct=new double[observations.Length]; + // double[] xMinusXMeanSquared=new double[observations.Length]; + // double[] leastSquares=new double[observations.Length]; + // double xMean=double.NaN; + // double yMean=double.NaN; + // double slope=double.NaN; + // double yIntercept=double.NaN; + // for(int index=0;indexYIntercept - Calculates slope of values. +/// YIntercept + public static double YIntercept(double xMean,double yMean,double slope) + { + return yMean-(slope*xMean); + } + public static double Slope(ref double[] x,ref double[] y) + { + double sumxy=0.00; + double sumx=0.00; + double sumy=0.00; + double sumx2=0.00; + + if(x.Length!=y.Length)return double.NaN; + for(int index=0;indexSlope - Calculates slope of values. +/// y-values x-values are assumed to be sequential +/// Slope + public static float Slope(float[] y) + { + float sum1 = 0.00F; + float sum2 = 0.00F; + float[] x=new float[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + float averageY = Mean(ref y); + float averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + float currX = x[index]; + sum1+=(currX-averageX)*(y[index]-averageY); + sum2 += (float)Math.Pow(currX-averageX,2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } +/// Slope - Calculates slope of values. +/// y-values x-values are assumed to be sequential +/// Slope + public static double Slope(ref double[] y) + { + double sum1 = 0.00F; + double sum2 = 0.00F; + double[] x=new double[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + double averageY = Mean(ref y); + double averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + double currX = x[index]; + sum1+=(currX-averageX)*(y[index]-averageY); + sum2 += (float)Math.Pow(currX-averageX,2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } + /// Slope - Calculates slope of values. + /// y-values x-values are assumed to be sequential + /// Slope + public static double Slope(double[] y) + { + double sum1 = 0.00F; + double sum2 = 0.00F; + double[] x = new double[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + double averageY = Mean(ref y); + double averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + double currX = x[index]; + sum1 += (currX - averageX) * (y[index] - averageY); + sum2 += (float)Math.Pow(currX - averageX, 2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } +/// Median - Calculates median of values. +/// values +/// Median + public static double Median(ref double[] values) + { + int length=values.Length; + if (length == 0)throw new Exception("Numerics::cannot calculate median of an empty array"); + if (length == 1 )return values[0]; + double [] sorted = new double[length]; + Array.Copy(values, 0, sorted, 0, length); + Array.Sort(sorted); + if( (length%2) == 0 ) return (sorted[length/2]+sorted[length/2-1])/2; + return sorted[(length-1)/2]; + } +/// Floor - Calculates floor of values. +/// values +/// floor + public static void Floor(ref double[] values) + { + for (int i=0; i< values.Length; i++) + { + values[i] = Math.Floor(values[i]); + } + } +/// Percentile - Calculates percentile of values. +/// values +/// Percentile + public static float Percentile(int perc,ref float[] values) + { + if(values.Length<5)return float.NaN; + int index; + Array.Sort(values); + index=(int)Math.Floor(perc*(values.Length)/100.00F)-1; + if(index<0)index=0; + else if(index>=values.Length)index=values.Length-1; + return values[index]; + } +/// Min - Calculates minimum of values. +/// values +/// minimum + public static float Min(ref float[] values) + { + if(0==values.Length)return 0; + float min=values[0]; + for(int index=1;indexMin - Calculates minimum of values. +/// values +/// minimum + public static double Min(ref double[] values) + { + if(0==values.Length)return 0; + double min=values[0]; + for(int index=1;indexMax - Calculates maximum of values. +/// values +/// maximum + public static float Max(ref float[] values) + { + if(0==values.Length)return 0; + float max=values[0]; + for(int index=1;indexmax)max=values[index]; + } + return max; + } +/// Max - Calculates maximum of values. +/// values +/// maximum + public static double Max(ref double[] values) + { + double max=values[0]; + for(int index=1;indexmax)max=values[index]; + } + return max; + } +/// Mean - Calculates mean of values. +/// values +/// Mean + public static float Mean(ref float[] values) + { + if (null == values) return float.NaN; + int length=values.Length; + float mean=0; + if(0==length)return float.NaN; + for(int index=0;indexMean - Calculates mean of values. +/// values +/// Mean + public static double Mean(ref double[] values) + { + if (null == values) return float.NaN; + int length=values.Length; + double mean=0; + if(0==values.Length)return double.NaN; + for(int index=0;indexMeanAbs - Calculates mean of abs(values). +/// values +/// Mean + public static float MeanAbs(ref float[] values) + { + int length=values.Length; + float mean=0; + if(0==length)return mean; + for(int index=0;indexGeometricMean - Calculates mean of values. +/// values +/// Mean + public static float GeometricMean(ref float[] values) + { + float geometricMean=1.00F; + int length=values.Length; + if(0==length)return geometricMean; + for(int index=0;indexSum - Calculates Sum. +/// float array x. +/// float Sum + public static float Sum(ref float[] x) + { + float sum=0; + int length=x.Length; + if(0==length)return sum; + for(int index=0;indexSum - Calculates Sum. + /// double array x. + /// double Sum + public static double Sum(ref double[] x) + { + double sum=0; + int length=x.Length; + if(0==length)return sum; + for(int index=0;indexAnnualizedVolatility - Calculates annualized volatility of values. can be any number of period +/// values +/// volatility + public static float AnnualizedVolatility(ref float[] values) + { + return (float)(Math.Sqrt(252.00)*StdDev(ref values)); // 252 is average number of trading days in a year + } +/// AnnualizedVolatility - Calculates annualized volatility of values. can be any number of periods +/// values +/// volatility + public static double AnnualizedVolatility(ref double[] values) + { + return Math.Sqrt(252)*StdDev(ref values); // 252 is average number of trading days in a year + } +/// Volatility - Calculates volatility of values. +/// values +/// volatility + public static float Volatility(ref float[] values) + { + return StdDev(ref values); + } +/// Volatility - Calculates volatility of values. +/// values +/// volatility + public static double Volatility(ref double[] values) + { + return StdDev(ref values); + } +/// Standardize - Standardizes the input. +/// values +/// volatility + public static float[] Standardize(ref float[] values) + { + float[] returnData=new float[values.Length]; + float valuesMean=Mean(ref values); + float valuesStd=Volatility(ref values); + + if(0==valuesStd)return values; + for(int index=0;indexDownStd - Returns downside standard deviation of values. +/// values +/// downside standard deviation + public static float DownStd(ref float[] values) + { + float average; + float downStd=0; + if(1>=values.Length)return downStd; + average=Mean(ref values); + foreach(float value in values) + { + if(valueBattingAverage - Returns batting average of values. +/// values +/// batting average + public static float BattingAverage(ref float[] values) + { + float battingAverage=0; + if(0==values.Length)return float.NaN; + foreach(float value in values) + { + if(value>0)battingAverage++; + } + return battingAverage/values.Length; + } +/// AverageReturnWithSpline -This is a collection of prices ordered highest date first. +/// values +/// AverageReturnWithSpline + public static double AverageReturnWithSpline(TimeSeriesCollection timeSeriesCollection) + { + List sourceElements = new List(); + List destElements = null; + List values = new List(); + + if (null == timeSeriesCollection || 0 == timeSeriesCollection.Count) return double.NaN; + for (int index = timeSeriesCollection.Count-1; index >=0; index--) + { + TimeSeriesElement timeSeriesElement=timeSeriesCollection[index]; + sourceElements.Add(new Element(Utility.DateToLong(timeSeriesElement.AsOf), timeSeriesElement.Value)); + } + DateTime startDate = timeSeriesCollection[timeSeriesCollection.Count - 1].AsOf; + DateTime endDate = timeSeriesCollection[0].AsOf; + DateTime valueDate = startDate; + + while (valueDate <= endDate) + { + destElements = new List(); + destElements.Add(new Element(Utility.DateToLong(valueDate), 0)); + CatmullRom.PerformSpline((Element[])sourceElements.ToArray(), (Element[])destElements.ToArray()); + double value = destElements[0].Row; + values.Add((float)value); + valueDate = new DateTime(valueDate.Year+1,valueDate.Month,valueDate.Day); + } + List inverseValues = new List(); + for (int index = values.Count - 1; index >= 0; index--) + { + inverseValues.Add(values[index]); + } + float[] fvalues = inverseValues.ToArray(); + double averageReturn = Numerics.AverageReturn(ref fvalues); + return averageReturn; + } + /// AverageReturnWithSpline -This is a collection of prices ordered highest date first. + /// values + /// AverageReturnWithSpline + //public static double AverageReturnWithSpline(TimeSeriesCollection timeSeriesCollection,ReturnItems returnItems) + //{ + // List sourceElements = new List(); + // List destElements = null; + + // returnItems.Clear(); + // if (null == timeSeriesCollection || 0 == timeSeriesCollection.Count) return double.NaN; + // for (int index = timeSeriesCollection.Count - 1; index >= 0; index--) + // { + // TimeSeriesElement timeSeriesElement = timeSeriesCollection[index]; + // sourceElements.Add(new Element(Utility.DateToLong(timeSeriesElement.AsOf), timeSeriesElement.Value)); + // } + // DateTime startDate = timeSeriesCollection[timeSeriesCollection.Count - 1].AsOf; + // DateTime endDate = timeSeriesCollection[0].AsOf; + // DateTime valueDate = startDate; + + // while (valueDate <= endDate) + // { + // destElements = new List(); + // destElements.Add(new Element(Utility.DateToLong(valueDate), 0)); + // CatmullRom.PerformSpline((Element[])sourceElements.ToArray(), (Element[])destElements.ToArray()); + // double value = destElements[0].Row; + // returnItems.Add(new ReturnItem(valueDate,value)); + // valueDate = new DateTime(valueDate.Year + 1, valueDate.Month, valueDate.Day); + // } + // returnItems.CalculateReturns(); + // float[] values = null; + // values = returnItems.ToFloat(); + // double averageReturn = Numerics.Mean(ref values); + // return averageReturn; + //} + /// AverageReturn -Assumes this is a collection of prices ordered highest date first. + /// timeSeriesCollection,if exclusionThreshold is provided then return values>than threshold will be thrown away + /// AverageReturn + public static double AverageReturn(TimeSeriesCollection timeSeriesCollection) + { + if(null==timeSeriesCollection || 0==timeSeriesCollection.Count)return double.NaN; + float[] values = timeSeriesCollection.ToFloat(); + return AverageReturn(ref values); + } + /// AverageReturn -Assumes this is a collection of prices ordered highest date first. + /// values,if exclusionThreshold is provided then return values>than threshold will be thrown away + /// AverageReturn + public static double AverageReturn(ref float[] values) + { + try + { + if (0 == values.Length) return double.NaN; + List returns = new List(); + for (int index = 0; index < values.Length - 1; index++) + { + float current = values[index]; + float prev = values[index + 1]; + if (0 == prev) returns.Add(0.00); + else + { + double currentReturn=double.NaN; + if (prev == 0.00) currentReturn = 0; + else currentReturn = (float)((current - prev) / Math.Abs(prev)); + returns.Add(currentReturn); + } + } + double[] returnsArray = returns.ToArray(); + return Mean(ref returnsArray); + } + catch (Exception) + { + return double.NaN; + } + } + /// AverageReturnTop -Assumes this is a collection of prices ordered highest date first. + /// values + /// AverageReturnTop - Calculates return of top n elements, count must be greater than 1 + public static double AverageReturnTop(ref float[] values,int top) + { + try + { + if (0 == values.Length || 1==values.Length || values.LengthPeriodicReturn -Assumes this is a collection of daily prices ordered highest date first. +/// values +/// PeriodicReturn - Calculates return of elements + public static double AnnualReturn(ref float[] values) + { + double periodicReturn = double.NaN; + double p0 = values[values.Length - 1]; + double p1 = values[0]; + double returnValue=(p1-p0)/Math.Abs(p0); + double n = values.Length / 365; + periodicReturn = Math.Pow(1 + returnValue, 1 / n) - 1; + return periodicReturn; + } +// most recent price is at lowest index + //public static float[] GetReturns(float[] prices) + //{ + // if(null==prices||1==prices.Length)return null; + // float[] returns = new float[prices.Length - 1]; + // for (int index = 0; index < prices.Length - 1; index++) + // { + // float currentPrice = prices[index]; + // float prevPrice = prices[index + 1]; + // if (0.00 == prevPrice) returns[index] = 0.00F; + // else returns[index] = (float)((currentPrice - prevPrice) / Math.Abs(prevPrice)); + // } + // return returns; + //} +/// PowerHit - Returns power hitting of vector x. +/// values +/// power hit + public static float PowerHitting(ref float[] values) + { + float win=0; + long winCount=0; + float lose=0; + long loseCount=0; + + if(0==values.Length)return float.NaN; + foreach(float value in values) + { + if(value>0) + { + win+=value; + winCount++; + } + else if(value<0) + { + lose+=(-value); + loseCount++; + } + } + return (loseCount*win/(winCount*lose)); + } +/// Product - Returns sum of products. +/// values +/// product + public static float Product(ref float[] values) + { + float product=1; + if(0==values.Length)return 0; + foreach(float value in values) + { + product*=value; + } + return product; + } +/// CumProduct - Returns cumulative product of values. +/// values +/// cumulative product + public static float[] CumProduct(ref float[] values) + { + if(0==values.Length)return new float[0]; + float[] cumProduct=new float[values.Length]; + cumProduct[0]=values[0]; + for(int index=1;indexStdDev - Calculates standard deviation of values. +/// values +/// standard deviation + public static float StdDev(ref float[] values) + { + long length = 0;// values.Length; + float value; + float sum=0; + float sqr=0; + + if(null==values || 1>=(length=values.Length))return float.NaN; + for(int index=0;indexStdDev - Calculates standard deviation of values. +/// values +/// standard deviation + public static double StdDev(ref double[] values) + { + long length = 0; ; + double value; + double sum=0; + double sqr=0; + + if(null==values || 1>=(length=values.Length))return float.NaN; + for(int index=0;indexStDevWithDecay - Calculates StDev with a Decay. +/// float array x. +/// float StDev + //public static float StdDevWithDecay(ref float[] x) + //{ + // if(1>=x.Length)return 0; + // return ApplyDecay(ref x); + //} +/// Covariance - Calculates covariance of x and y. +/// vector x +/// vector y. +/// covariance +///In probability theory and statistics, covariance is a measure of the joint variability of two random variables. +///[1] If the greater values of one variable mainly correspond with the greater values of the other variable, +///and the same holds for the lesser values, (i.e., the variables tend to show similar behavior), +///the covariance is positive.[2] In the opposite case, when the greater values of one variable mainly +///correspond to the lesser values of the other, (i.e., the variables tend to show opposite behavior), +///the covariance is negative. The sign of the covariance therefore shows the tendency in the linear +///relationship between the variables. The magnitude of the covariance is not easy to interpret because +///it is not normalized and hence depends on the magnitudes of the variables. The normalized version of the +///covariance, the correlation coefficient, however, shows by its magnitude the strength of the linear relation. + public static float Covariance(ref float[] x,ref float[] y) + { + float meanx; + float meany; + int length; + float product; + + if(0==x.Length && 0==y.Length)return 0; + if((length=x.Length)!=y.Length)return 0; + product=0; + meanx=Mean(ref x); + meany=Mean(ref y); + for(int index=0;indexCovariance - Calculates covariance of x and y. +/// vector x +/// vector y. +/// covariance + public static double Covariance(ref double[] x,ref double[] y) + { + double meanx; + double meany; + int length; + double product; + + if(0==x.Length && 0==y.Length)return 0; + if((length=x.Length)!=y.Length)return 0; + product=0; + meanx=Mean(ref x); + meany=Mean(ref y); + for(int index=0;indexVariance - Calculates variance of x (population). +/// vector x +/// variance + public static float Variance(ref float[] xarray) + { + return Covariance(ref xarray, ref xarray); + } +/// Variance - Calculates variance of x (population). +/// vector x +/// variance + public static double Variance(ref double[] xarray) + { + return Covariance(ref xarray, ref xarray); + } +/// Skewness - Calculates skewness of x (population). +/// vector x +/// skewness + public static float Skewness(ref float[] x) + { + float meanx; + float sd_x; + int length; + float product; + + if(0==x.Length)return float.NaN; + product=0; + meanx=Mean(ref x); + sd_x=StdDev(ref x); + if(float.NaN==sd_x)return float.NaN; + length=x.Length; + for(int index=0;indexKurtosis - Calculates kurtosis of x. +/// vector x +/// kurtosis + public static float Kurtosis(ref float[] x) + { + float meanx; + float sd_x; + int length; + float product; + + if(0==x.Length)return float.NaN; + product=0; + meanx=Mean(ref x); + sd_x=StdDev(ref x); + if(float.NaN==sd_x) return float.NaN; + length=x.Length; + for(int index=0;indexRemoveDuplicates +/// Removes duplicates from x and y and stores the rest of the values in result. +/// This is a helper function for KStest. +/// vector x +/// vector y +/// ArrayList result +/// x without duplicates + private static float[] RemoveDuplicates(float[] x,float[] y,ArrayList result) + { + ArrayList list= new ArrayList(); + int newLength=0; + for(int i=0; i Do not reject the null hypothesis at 0.05 significance level. + H = 1 => Reject the null hypothesis at 0.05 significance level. + (2) pValue: the asymptotic P-value P. + (3) KSstat: the K-S test statistic, T = max|S(x) - CDF|, where S(x) is the + empirical c.d.f. estimated from the sample vector X and CDF is the + standard normal. + (4) criticalValue: the critical value of the test, on which the decision + to reject the null hypothesis is based. + + NaN's are removed and a blank is returned if the length of the input array is 0. + + The implementation of this function is based on the Matlab function kstest.m +*/ + public static KSTest KSTest(ref float[]x) + { + float alpha=0.05f; + KSTest blank=new KSTest(0,Double.NaN,Double.NaN,Double.NaN); + + ArrayList xNoNaNs=new ArrayList(); + for(int i=0; icriticalValue?1:0; + double lambda=Math.Max((Math.Sqrt(n)+0.12+0.11/Math.Sqrt(n))*KSstatistic,0); + int[] j=new int[101]; + double sumP=0; + for(int i=0; i1)pValue=1; + + KSTest ret=new KSTest(H,pValue,KSstatistic,criticalValue); + return ret; + } + +/* ERFC Complementary error function for each element of x. + * The function is defined as: + * erfc(x) = 2/sqrt(pi) * integral from x to inf of exp(-t^2) dt. + * = 1 - erf(x). + * + * This is a helper function to KStest and is based on the Matlab function erfc.m + * / + */ + private static double[] ERFCore(double[] x, int jint) + { + double[] result = new double[x.Length]; + for(int i=0; i0) + { + double[] a=new double[] {3.16112374387056560e00, 1.13864154151050156e02, 3.77485237685302021e02, 3.20937758913846947e03,1.85777706184603153e-1}; + double[] b=new double[] {2.36012909523441209e01, 2.44024637934444173e02, 1.28261652607737228e03, 2.84423683343917062e03}; + + double[] y=new double[k.Length]; + double[] z=new double[k.Length]; + double[] xnum=new double[k.Length]; + double[] xden=new double[k.Length]; + for(int i=0; ixbreak && Math.Abs(x[i])<=4.0) + { + kList1.Add(i); + newLength1++; + } + + int[] k1=new int[newLength1]; + kList1.CopyTo(k1); + + + if(k1.Length>0) + { + double[] c=new double[] {5.64188496988670089e-1, 8.88314979438837594e00, 6.61191906371416295e01, 2.98635138197400131e02, 8.81952221241769090e02, 1.71204761263407058e03, 2.05107837782607147e03, 1.23033935479799725e03, 2.15311535474403846e-8}; + double[] d=new double[] {1.57449261107098347e01, 1.17693950891312499e02, 5.37181101862009858e02, 1.62138957456669019e03, 3.29079923573345963e03, 4.36261909014324716e03, 3.43936767414372164e03, 1.23033935480374942e03}; + + double[] y=new double[k1.Length]; + double[] z=new double[k1.Length]; + double[] xnum=new double[k1.Length]; + double[] xden=new double[k1.Length]; + double[] del=new double[k1.Length]; + for(int i=0; i0?Math.Floor(y[i]*16)/16:Math.Ceiling(y[i]*16)/16; + del[i]=(y[i]-z[i])*(y[i]+z[i]); + result[k1[i]]=Math.Exp(z[i]*z[i]*-1)*Math.Exp(del[i]*-1)*result[k1[i]]; + } + } + + ArrayList kList2 = new ArrayList(); + int newLength2=0; + for(int i=0; i4.0) + { + kList2.Add(i); + newLength2++; + } + + int[] k2=new int[newLength2]; + kList2.CopyTo(k2); + + if(k2.Length>0) + { + double[] p=new double[] {3.05326634961232344e-1, 3.60344899949804439e-1, 1.25781726111229246e-1, 1.60837851487422766e-2, 6.58749161529837803e-4, 1.63153871373020978e-2}; + double[] q=new double[] {2.56852019228982242e00, 1.87295284992346047e00, 5.27905102951428412e-1, 6.05183413124413191e-2, 2.33520497626869185e-3}; + + double[] y=new double[k2.Length]; + double[] z=new double[k2.Length]; + double[] xnum=new double[k2.Length]; + double[] xden=new double[k2.Length]; + double[] del=new double[k2.Length]; + for(int i=0; i0?Math.Floor(y[i]*16)/16:Math.Ceiling(y[i]*16)/16; + del[i]=(y[i]-z[i])*(y[i]+z[i]); + result[k2[i]]=Math.Exp(z[i]*z[i]*-1)*Math.Exp(del[i]*-1)*result[k2[i]]; + } + + + ArrayList kList3 = new ArrayList(); + int newLength3=0; + for(int i=0; iCorrelation - Calculates correlation coefficient from input vectors. +/// vector x +/// vector y. +/// correlation coefficient +/// Interpretation of results: +/// -1 : A perfect downhill (negative) linear relationship +/// -0.70 : A strong downhill (negative) linear relationship +/// –0.50. A moderate downhill (negative) relationship +/// –0.30. A weak downhill (negative) linear relationship +/// 0. No linear relationship +/// +0.30. A weak uphill (positive) linear relationship +/// +0.50. A moderate uphill (positive) relationship +/// +0.70. A strong uphill (positive) linear relationship +/// Exactly +1. A perfect uphill (positive) linear relationship +///In probability theory and statistics, covariance is a measure of the joint variability of two random variables. +///[1] If the greater values of one variable mainly correspond with the greater values of the other variable, +///and the same holds for the lesser values, (i.e., the variables tend to show similar behavior), +///the covariance is positive.[2] In the opposite case, when the greater values of one variable mainly +///correspond to the lesser values of the other, (i.e., the variables tend to show opposite behavior), +///the covariance is negative. The sign of the covariance therefore shows the tendency in the linear +///relationship between the variables. The magnitude of the covariance is not easy to interpret because +///it is not normalized and hence depends on the magnitudes of the variables. The normalized version of the +///covariance, the correlation coefficient, however, shows by its magnitude the strength of the linear relation. + public static float Correlation(ref float[] x, ref float[] y) + { + float sd_x = StdDev(ref x); + float sd_y = StdDev(ref y); + return Covariance(ref x, ref y)*x.Length/((sd_x * sd_y)*(x.Length-1)); + } +/// Correlation - Calculates correlation matrix from input matrix. +/// source matrix +/// number of columns in source. +/// number of columns in source. +/// tranposed array + public static float[,] Correlation(ref float[,] matrix,int rows,int cols) + { + float[,] result=new float[cols,cols]; + float[] x=new float[rows]; + float[] y=new float[rows]; + int col=0; + int row; + + for(int srcIndex=0;srcIndexCreateCorrelationMatrix - Creates correlation matrix from input matrix. +/// the input matrix. +/// indicates whether to transpose the input matrix. +/// float[,] correlation matrix + public static float[,] CreateCorrelationMatrix(ref float[,] values,bool transpose) + { + int columns=values.GetLength(1); + int rows=values.GetLength(0); + if(!transpose)return Correlation(ref values,rows,columns); + float[,] transposeMatrix=Transpose(ref values,ref rows,ref columns); + return Correlation(ref transposeMatrix,rows,columns); + } +/// Transpose - Convert horizontal range of cells to vertical. +/// number of rows in source +/// number of columns in source. +/// the source matrix. +/// tranposed array + public static float[] Transpose(ref int srcRows,ref int srcCols,ref float[] source) + { + float[] result=new float[srcRows*srcCols]; + long dstRow=0; + long dstCol=0; + + for(int srcRow=0;srcRowTranspose - Convert horizontal range of cells to vertical. +/// number of rows in source +/// number of columns in source. +/// the source matrix. +/// tranposed array + public static float[,] Transpose(ref float[,] source,ref int srcRows,ref int srcCols) + { + float[,] result=new float[srcCols,srcRows]; + long dstRow=0; + long dstCol=0; + + for(int srcRow=0;srcRowTransposeXAY - Transpose(x)*A*y. +/// row vector +/// matrix. +/// column vector. +/// number of elements in each dimension. +/// tranposed array + public static float TransposeXAY(ref float[] x,ref float[,] a,ref float[] y,int elements) + { + float[] acol=new float[elements]; + float[] intermediate=new float[elements]; + + for(int col=0;colMMult - Performs matrix multiplication of vectors. +/// the row vector +/// the column vector +/// Product + public static float MMult(ref float[] rowVector,ref float[] colVector) + { + float product=0; + int length; + + if((length=rowVector.Length)!=colVector.Length)return product; + for(int index=0;indexGetXY - Get vertical columns from matrix[,] into x and y. +/// column from matrix to copy to x array +/// column from matrix to copy to y array +/// source matrix +/// destination array x +/// destination array y +/// None + private static void GetXY(int xColumn,int yColumn,ref float[,] matrix,ref float[] x,ref float[] y,int rows) + { + for(int row=0;rowGetX - Get vertical column from matrix[,] into x. +/// column from matrix to copy +/// the source matrix. +/// the destination vector. +/// number of rows in matrix. +/// None + private static void GetX(int xColumn,ref float[,] matrix,ref float[] x,int rows) + { + for(int row=0;rowBeta - Calculates Beta. +/// ticker returns. +/// sector returns. +/// Beta value +/// A beta of 1.00 indicates that the security's price will move with the market +/// A beta of less than 1.00 indicates that the security will be less volatile than the market +/// A beta of more than 1.00 indicates that the security will be more volatile than the market +/// The revised code (i.e.) Beta=Covariance(x,y)/Variance(x) was taken from Investopedia + public static double Beta(ref double[] assetReturns, ref double[] benchmarkReturns) + { + return Covariance(ref assetReturns, ref benchmarkReturns) / Variance(ref benchmarkReturns); + } +/// ApplyDecay - Apply exponential weighting. +/// the samples to weight. +/// The weighted standard deviation + //private static float ApplyDecay(ref float[] samples) + //{ + // int numSamples=samples.Length; + // Decay decay=new Decay(numSamples); + // float average=0; + // float weightedVariance=0; + // float weightedError=0; + // float stddev=0; + // float error=0; + + // for(int item=0;itemRSquared - Calculate R2 statistic. +/// observations. +/// residual sum of squares. +/// includes mean. +/// The R2 statistic + //public static double RSquared(ref double[] y,double rss,bool includeMean) + //{ + // double mean=0; + // double tss=0; + // double intermediate=0; + + // if(includeMean) + // { + // mean=Numerics.Mean(ref y); + // for(int index=0;indexTStatistic - Calculate TStatistic. +/// The average for the samples. +/// Standard deviation of the samples. +/// The number of samples. +/// TStatistic + public static float TStatistic(float average,float stddev,int samples) + { + if(0==samples||0==stddev)return float.NaN; + return (float)((average/stddev)*Math.Sqrt(samples)); + } +/// TStatistic - Calculate TStatistic. +/// Least squares estimates. +/// Standard errors. +/// TStatistic + public static double[] TStatistic(ref double[] leastSquaresEstimates,ref double[] standardErrors) + { + double[] tStats; + int length; + if((length=leastSquaresEstimates.Length)!=standardErrors.Length)return new double[0]; + tStats=new double[length]; + for(int index=0;index maxPrice) maxPrice = prices[i]; + else if (prices[i] < maxPrice) maxDd = Math.Min(maxDd, prices[i] / maxPrice - 1); + } + return maxDd; + } +// a float version + public static float MaxDrawdown(float[] prices) + { + if (prices.Length <= 1) return 0; + float maxPrice = prices[0]; + float maxDd = 0; + for (int i = 1; i < prices.Length; i++) + { + if (prices[i] > maxPrice) maxPrice = prices[i]; + else if (prices[i] < maxPrice) maxDd = Math.Min(maxDd, prices[i] / maxPrice - 1); + } + return maxDd; + } +// float MaxUpside + public static float MaxUpside(float[] prices) + { + if (prices.Length <= 1) return 0; + float minPrice = prices[0]; + float maxUpside = 0; + for (int i = 1; i < prices.Length; i++) + { + if (prices[i] < minPrice) minPrice = prices[i]; + else if (prices[i] > minPrice) maxUpside = Math.Max(maxUpside, prices[i] / minPrice - 1); + } + return maxUpside; + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/Spline.cs b/eNavigator/MarketDataLib/Numerics/Spline.cs new file mode 100755 index 0000000..4fa2c8c --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Spline.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections; + +namespace MarketData.Numerical +{ +// The column is the key, the row is the value. +// For Time series elements put the date in the column and the value in the row + public class Element + { + private double row; + private double column; + + public Element() + { + } + public Element(double column, double row) + { + this.column = column; + this.row = row; + } + public double Row + { + get { return row; } + set { row = value; } + } + public double Column + { + get { return column; } + set { column = value; } + } + } + public class CatmullRom + { + private CatmullRom() + { + } + public static bool PerformSpline(Element[] sourcePairs, Element[] destPairs) + { + double a0, a1, a2, a3; + double dx, dx1, dx2; + double dy, dy1, dy2; + double endPointOne; + double endPointTwo; + double resamplingPos; + double xPoint; + int clampOne, clampTwo; + int direction; + int destSize = destPairs.Length; + int sourceSize = sourcePairs.Length; + int inputIndex, index; + + a0 = a1 = a2 = a3 = endPointOne = 0; + if (sourceSize < 2 || destSize < 1) return false; + if (((Element)sourcePairs[0]).Column < ((Element)sourcePairs[1]).Column) + { + if (((Element)destPairs[0]).Column < ((Element)sourcePairs[0]).Column || + ((Element)destPairs[destSize - 1]).Column > ((Element)sourcePairs[sourceSize - 1]).Column) + direction = 0; + else direction = 1; + } + else + { + if (((Element)destPairs[0]).Column > ((Element)sourcePairs[0]).Column || + ((Element)destPairs[destSize - 1]).Column < ((Element)sourcePairs[sourceSize - 1]).Column) + direction = 0; + else direction = -1; + } + if (0 == direction) return false; + if (1 == direction) endPointTwo = ((Element)destPairs[0]).Column - 1; + else endPointTwo = ((Element)destPairs[0]).Column + 1; + for (index = 0; index < destSize; index++) + { + resamplingPos = ((Element)destPairs[index]).Column; + if ((1 == direction && resamplingPos > endPointTwo) || + (-1 == direction && resamplingPos < endPointTwo)) + { + for (inputIndex = 0; inputIndex < sourceSize && resamplingPos > ((Element)sourcePairs[inputIndex]).Column; inputIndex++) ; + if (resamplingPos < ((Element)sourcePairs[inputIndex]).Column) inputIndex--; + if (inputIndex < 0) inputIndex = 0; + else if (inputIndex == sourceSize-1) inputIndex--; + endPointOne = ((Element)sourcePairs[inputIndex]).Column; + endPointTwo = ((Element)sourcePairs[inputIndex + 1]).Column; + clampOne = Math.Max(inputIndex - 1, 0); + clampTwo = Math.Min(inputIndex + 2, sourceSize - 1); + double clampOneValue = ((Element)sourcePairs[clampOne]).Column; + double clampTwoValue = ((Element)sourcePairs[clampTwo]).Column; + dx = 1.0 / ((endPointTwo - endPointOne)==0?1:(endPointTwo-endPointOne)); + dx1 = 1.0 / ((endPointTwo - clampOneValue) == 0 ? 1 : (endPointTwo - clampOneValue)); + dx2 = 1.0 / (clampTwoValue-endPointOne == 0 ? 1 : (clampTwoValue - endPointOne)); + dy = (((Element)sourcePairs[inputIndex + 1]).Row - ((Element)sourcePairs[inputIndex]).Row) * dx; + dy1 = (((Element)sourcePairs[inputIndex + 1]).Row - ((Element)sourcePairs[clampOne]).Row) * dx1; + dy2 = (((Element)sourcePairs[clampTwo]).Row - ((Element)sourcePairs[inputIndex]).Row) * dx2; + a0 = ((Element)sourcePairs[inputIndex]).Row; + a1 = dy1; + a2 = dx * (3 * dy - 2 * dy1 - dy2); + a3 = dx * dx * (-2 * dy + dy1 + dy2); + } + xPoint = resamplingPos - endPointOne; + ((Element)destPairs[index]).Row = ((a3 * xPoint + a2) * xPoint + a1) * xPoint + a0; + } + return true; + } + public static Element[] CreateSplineSourceElements(double[] columns, double[] rows) + { + Element[] elements = new Element[columns.Length]; + if (columns.Length != rows.Length) return null; + for (int index = 0; index < columns.Length; index++) + { + elements[index] = new Element(columns[index], rows[index]); + } + return elements; + } + } +} // namespace diff --git a/eNavigator/MarketDataLib/Service/Authorization.cs b/eNavigator/MarketDataLib/Service/Authorization.cs new file mode 100755 index 0000000..6061780 --- /dev/null +++ b/eNavigator/MarketDataLib/Service/Authorization.cs @@ -0,0 +1,15 @@ +using System; +using System.Text; + +namespace MarketData.Service +{ + public class Authorizations + { + public static String Xor(String input, int magic=5) + { + StringBuilder sb = new StringBuilder(); + foreach (char ch in input) sb.Append((char)(ch ^ (char)magic)); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/Service/ServiceResult.cs b/eNavigator/MarketDataLib/Service/ServiceResult.cs new file mode 100755 index 0000000..098452b --- /dev/null +++ b/eNavigator/MarketDataLib/Service/ServiceResult.cs @@ -0,0 +1,33 @@ +using MarketData.MarketDataModel; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Net.Http; +using System.Text; + +namespace MarketData.Service +{ + public class ServiceResult + { + public ServiceResult(bool success) + { + Success=success; + } + public ServiceResult(bool success,String message) + { + Success=success; + Message=message; + } + public ServiceResult(Object contextSpecificResult) + { + Success=true; + ContextSpecificResult=contextSpecificResult; + } + public bool Success{get;set;} + public Object ContextSpecificResult{get;set;} + public String Message{get; set; } + public long ElapsedTimeMS{ get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs b/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs new file mode 100755 index 0000000..12d2176 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs @@ -0,0 +1,57 @@ +using System; +using System.Text; +using System.Collections.Generic; + +namespace MarketData.Utils +{ + public class CSVLineHelper + { + public CSVLineHelper() + { + } + public static String[] ParseLine(String strLine) + { + try + { + List items = new List(); + int length = strLine.Length; + for (int index = 0; index < length; index++) + { + char ch = strLine[index]; + if (ch == '"') items.Add(GetQuotedItem(strLine, ref index, length)); + else items.Add(GetItem(strLine, ref index, length)); + } + return items.ToArray(); + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString()); + return null; + } + } + private static String GetQuotedItem(String strLine,ref int index,int length) + { + StringBuilder sb = new StringBuilder(); + char ch = '\0'; + while (indexDateGenerator - Generate Historical Dates + [Serializable] + public class DateGenerator + { + private Hashtable holidays=null; + public DateGenerator() + { + } + public DateTime GetPrevMonthStart(DateTime dateTime) + { + DateTime startDate = new DateTime(dateTime.Year, dateTime.Month, 1); + startDate = startDate.AddMonths(-1); + startDate = GetNextBusinessDay(startDate); + return startDate; + } + public DateTime GetCurrMonthStart(DateTime dateTime) + { + DateTime startDate = new DateTime(dateTime.Year, dateTime.Month, 1); + startDate = GetNextBusinessDay(startDate); + return startDate; + } + public DateGenerator(Hashtable holidays) + { + this.holidays=holidays; + } + public static int GetPrevMonth(int month) + { + if(1==month)return 12; + return month-1; + } +/// FindPrevBusinessDay - Finds previous business day +/// DateTime + public DateTime FindPrevBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + asOf=asOf.Subtract(oneDay); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Subtract(oneDay); + return asOf; + } + /// FindNextBusinessDays - Finds following business day + /// DateTime + public DateTime FindForwardBusinessDay(DateTime asOf,int daysForward) + { + for (int index = 0; index < daysForward; index++) + { + asOf = FindNextBusinessDay(asOf); + } + return asOf; + } +/// FindNextBusinessDay - Finds following business day +/// DateTime + public DateTime FindNextBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + asOf=asOf.Add(oneDay); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Add(oneDay); + return asOf; + } +/// GetPrevBusinessDay - Gets previous business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetPrevBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Subtract(oneDay); + return asOf; + } +/// GetNextBusinessDay - Gets next business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetNextBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Add(oneDay); + return asOf; + } +/// GetNextDay - Gets next business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetNextDay(DateTime asOf) + { + return asOf.Add(Utility.OneDay); + } +/// GetPrevFriday - Gets date of prior friday +/// Get the date of the previous friday - if previous Friday is holiday will seek previous business day +/// None + public DateTime GetPrevFriday(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + List historicalDates=null; + int daysToFetch=7; + + if(DayOfWeek.Friday==asOf.DayOfWeek) + { + asOf=asOf.Subtract(oneDay); + daysToFetch--; + } + historicalDates=GenerateHistoricalDates(asOf,daysToFetch); + for(int index=0;index endDate) + { + TimeSpan timeSpan = startDate.Date - endDate.Date; + return (int)timeSpan.TotalDays; + } + else + { + TimeSpan timeSpan = endDate.Date - startDate.Date; + return (int)timeSpan.TotalDays; + } + } + public static List GenerateHistoricalYear(int startYear,int years) + { + List yearsList = new List(); + for (int index = 0; index < years; index++) + { + yearsList.Add(startYear); + startYear--; + } + return yearsList; + } + public List GenerateHistoricalDates(DateTime startDate, int dayCount) + { + List histDates=new List(); + DateTime histDate; + TimeSpan singleDay; + + startDate = startDate.Date; + histDate=startDate; + if(dayCount<0)singleDay=new TimeSpan(-1,0,0,0); + else singleDay=new TimeSpan(1,0,0,0); + dayCount=dayCount<0?-dayCount:dayCount; + while(histDates.Count GenerateHistoricalDates(DateTime startDate,DateTime endDate) + { + if (Utility.Epoch.Equals(startDate)||Utility.Epoch.Equals(endDate)) return null; + startDate = startDate.Date; + endDate = endDate.Date; + List histDates = new List(); + DateTime histDate; + TimeSpan singleDay; + + bool reverse = false; + if (endDate > startDate) + { + reverse = true; + DateTime swap = endDate; + endDate = startDate; + startDate = swap; + } + histDate=startDate; + singleDay=new TimeSpan(1,0,0,0); + while(histDate>=endDate) + { + if(IsMarketOpen(ref histDate))histDates.Add(histDate); + histDate=histDate.Subtract(singleDay); + } + if (reverse) histDates.Reverse(); + return histDates; + } +// The function will figure out which date is the most recent and which one is the historical date. +// Generally, make startDate the most recent and endDate the historical date. + public List GenerateHistoricalDatesActual(DateTime startDate, DateTime endDate) + { + if (Utility.Epoch.Equals(startDate) || Utility.Epoch.Equals(endDate)) return null; + startDate = startDate.Date; + endDate = endDate.Date; + List histDates = new List(); + DateTime histDate; + TimeSpan singleDay; + + bool reverse = false; + if (endDate > startDate) + { + reverse = true; + DateTime swap = endDate; + endDate = startDate; + startDate = swap; + } + histDate = startDate; + singleDay = new TimeSpan(1, 0, 0, 0); + while (histDate >= endDate) + { + histDates.Add(histDate); + histDate = histDate.Subtract(singleDay); + } + if (reverse) histDates.Reverse(); + return histDates; + } + private bool IsMarketOpen(ref DateTime dateTime) + { + if(IsWeekend(dateTime)||IsHoliday(dateTime))return false; + return true; + } + public bool IsWeekend(DateTime dateTime) + { + if(DayOfWeek.Sunday==dateTime.DayOfWeek || DayOfWeek.Saturday==dateTime.DayOfWeek)return true; + return false; + } + public bool IsHoliday(DateTime dateTime) + { + if(null==holidays)return false; + return holidays.Contains(dateTime.Date); + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/DateRange.cs b/eNavigator/MarketDataLib/Utility/DateRange.cs new file mode 100755 index 0000000..382f200 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/DateRange.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.Text; + +namespace MarketData.Utils +{ + public class DateRange : List + { + public DateRange(DateTime startDate,DateTime endDate) + { + startDate = startDate.Date; + endDate=endDate.Date; + DateGenerator dateGenerator=new DateGenerator(); + List dates= dateGenerator.GenerateHistoricalDates(startDate, endDate); + foreach (DateTime date in dates) Add(date); + Sort(); // ensure that no matter how we set this up, the oldest date winds up being at the lowest index of the list + } + public DateTime StartDate + { + get { return this[0]; } + } + public DateTime EndDate + { + get { return this[Count-1]; } + } + } +} diff --git a/eNavigator/MarketDataLib/Utility/MDTrace.cs b/eNavigator/MarketDataLib/Utility/MDTrace.cs new file mode 100755 index 0000000..23b0d0c --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/MDTrace.cs @@ -0,0 +1,159 @@ +using System; +using System.Diagnostics; +using System.Threading; +using System.Text; +using System.Reflection; +using System.Net; +//using System.Runtime.Remoting.Messaging; + +// Filename: MarketDataTrace.cs +// Author:Sean Kessler +// Date:11/2005 + +namespace MarketData.Utils +{ + public enum LogLevel : uint + { + NONE=0x0000, + INFO=0x0002, + DEBUG=0x0004, + VERBOSE=0x0008 + }; +/// MarketDataTrace - Utility for . + public class MDTrace + { + private static LogLevel logLevel=LogLevel.DEBUG; + +/// MarketDataTrace - Private constructor prevents instantiation. +/// none + private MDTrace() + { + } + +/// LogLevel - Get/Set Log level. +/// The log level. +/// LogLevel + public static LogLevel LogLevel + { + get{return logLevel;} + set{logLevel=value;} + } +/// WriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void Write(LogLevel logLevel,string message) + { + if(MDTrace.logLevelWriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(string message) + { + WriteLine(LogLevel.DEBUG,GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+" "+GetMethodInfo()+message); + Console.WriteLine(message); + } +/// WriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(LogLevel logLevel,Exception exception) + { + if(MDTrace.logLevelWriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(LogLevel logLevel,string message) + { + if(MDTrace.logLevelIndent - set trace log indentation. +/// void +// [Conditional("TRACE")] + public static void Indent() + { + Trace.Indent(); + } +/// Unindent - set trace log indentation back. +/// void +// [Conditional("TRACE")] + public static void Unindent() + { + Trace.Unindent(); + } +/// Flush - Flush trace log buffers to disk. +/// void +// [Conditional("TRACE")] + public static void Flush() + { + Trace.Flush(); + } +/// GetLogLevel - Return current log level. +/// LogLevel + public static LogLevel GetLogLevel(String strLogLevel) + { + if(strLogLevel.Equals("debug"))return LogLevel.DEBUG; + else if(strLogLevel.Equals("verbose"))return LogLevel.VERBOSE; + else if(strLogLevel.Equals("info"))return LogLevel.INFO; + else return LogLevel.NONE; + } + +/// GetLogLevel - Return current log level. +/// LogLevel + private static string GetLogLevelRep() + { + if (MDTrace.logLevel == LogLevel.DEBUG) return "[TRACE.DEBUG]"; + else if (MDTrace.logLevel == LogLevel.VERBOSE) return "[TRACE.VERBOSE]"; + else if (MDTrace.logLevel == LogLevel.INFO) return "[TRACE.INFO]"; + else return "[TRACE.NONE]"; + } +/// GetThreadRep - Return threading information. +/// LogLevel + private static string GetThreadRep() + { + return "[Thread="+Thread.CurrentThread.GetHashCode()+"]"; + } +/// GetMethodInfo - Returns information about the calling method 2 frames up. +/// String + private static String GetMethodInfo() + { + StringBuilder sb=new StringBuilder(); + StackFrame frame=new StackFrame(2,true); + MethodBase methodBase=frame.GetMethod(); + ParameterInfo[] parameters=methodBase.GetParameters(); + sb.Append("[").Append(methodBase.DeclaringType.FullName).Append("::").Append(methodBase.Name).Append("("); + for(int index=0;indexGetCallerIP - Returns the calling methods IP address. +/// String + private static String GetCallerIP() + { + String hostName = Dns.GetHostName(); + String hostAddress = Dns.GetHostAddresses(hostName).ToString(); + if(null!=hostName)hostName=hostName.Split('.')[0]; + if(null==hostName && null==hostAddress)return "[LOCAL]"; + return "["+hostAddress+"->"+hostName+"]"; + } + } +} diff --git a/eNavigator/MarketDataLib/Utility/NVP.cs b/eNavigator/MarketDataLib/Utility/NVP.cs new file mode 100755 index 0000000..e5a8408 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/NVP.cs @@ -0,0 +1,99 @@ +using System; +using System.Runtime.InteropServices; +using System.Collections; +using System.Text; +using System.Collections.Generic; + +namespace MarketData.Utils +{ + public class NVPDictionary : Dictionary + { + public NVPDictionary() + { + } + } + public class NVPCollections : List + { + public NVPCollections() + { + } + public NVPCollections(List nvpCollections) + { + foreach(String nvpCollectionString in nvpCollections)Add(new NVPCollection(nvpCollectionString)); + } + public List ToList() + { + List nvpCollections=new List(); + foreach(NVPCollection nvpCollection in this)nvpCollections.Add(nvpCollection.ToString()); + return nvpCollections; + } + } + public class NVPCollection : List + { + public NVPCollection() + { + } + public NVPCollection(String nvpCollectionString) + { + if(null==nvpCollectionString)return; + String[] nvpItems=nvpCollectionString.Split('|'); + if(null==nvpItems)return; + for(int index=0;index() + { + T result=default(T); + try {result = (T)Convert.ChangeType(Value, typeof(T));} + catch {result = default(T);} + return result; + } + public String Name{get;set;} + public String Value{get;set;} + public override String ToString() + { + StringBuilder sb=new StringBuilder(); + sb.Append(Name).Append("=").Append(Value); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/Profiler.cs b/eNavigator/MarketDataLib/Utility/Profiler.cs new file mode 100755 index 0000000..04a94b7 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/Profiler.cs @@ -0,0 +1,36 @@ +using System.Diagnostics; + +// Filename: Profiler.cs +// Author:Sean Kessler + +namespace MarketData.Utils +{ + /// Profiler - Profiler utility class + public class Profiler + { + private Stopwatch watch = default; + + public Profiler() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public void Reset() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public void Start() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public long Stop() + { + return End(); + } + public long End() + { + watch.Stop(); + return watch.ElapsedMilliseconds; + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs b/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs new file mode 100644 index 0000000..2b1c7d1 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs @@ -0,0 +1,34 @@ +namespace MarketData.Utils +{ + public class SemaphoreLocker + { + private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); + + public async Task LockAsync(Func worker) + { + await _semaphore.WaitAsync(); + try + { + await worker(); + } + finally + { + _semaphore.Release(); + } + } + + // overloading variant for non-void methods with return type (generic T) + public async Task LockAsync(Func> worker) + { + await _semaphore.WaitAsync(); + try + { + return await worker(); + } + finally + { + _semaphore.Release(); + } + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/UpdateManager.cs b/eNavigator/MarketDataLib/Utility/UpdateManager.cs new file mode 100755 index 0000000..7827f57 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/UpdateManager.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace MarketData.Utils +{ + public class UpdateManager + { + private StreamWriter streamWriter=null; + private FileStream fileStream=null; + private Dictionary entries=new Dictionary(); + + public UpdateManager() + { + } + public bool Prepare(String strPathFileName) + { + try + { + String currentWorkingDirectory=Directory.GetCurrentDirectory(); + if(!File.Exists(strPathFileName)||IsExpired(strPathFileName)) + { + if(File.Exists(strPathFileName))File.Delete(strPathFileName); + fileStream=new FileStream(strPathFileName,FileMode.Create); + streamWriter=new StreamWriter(fileStream); + Console.WriteLine(String.Format("Creating session file:{0}",strPathFileName)); + } + else + { + FileStream fileStream=new FileStream(strPathFileName,FileMode.Open); + StreamReader streamReader=new StreamReader(fileStream); + String strLine=null; + while(null!=(strLine=streamReader.ReadLine())) + { + if(!entries.ContainsKey(strLine))entries.Add(strLine,strLine); + } + Console.WriteLine(String.Format("Loaded {0} entries from session file:{1}",entries.Count,strPathFileName)); + streamReader.Close(); + streamReader.Dispose(); + fileStream.Close(); + fileStream.Dispose(); + fileStream=new FileStream(strPathFileName,FileMode.Append); + streamWriter=new StreamWriter(fileStream); + } + return true; + } + catch(Exception exception) + { + Console.WriteLine(String.Format("Exception:{0}",exception)); + return false; + } + } + private bool IsExpired(String strPathFileName) + { + try + { + DateGenerator dateGenerator=new DateGenerator(); + DateTime creationTime=File.GetCreationTime(strPathFileName); + int daysElapsed=Math.Abs(dateGenerator.DaysBetweenActual(creationTime,DateTime.Now)); + if(daysElapsed>5) + { + Console.WriteLine(String.Format("{0} is expired. {1} days old.",strPathFileName,daysElapsed)); + return true; + } + return false; + } + catch(Exception exception) + { + Console.WriteLine(String.Format("Exception:{0}",exception)); + return true; + } + } + public List Entries + { + get{return new List(entries.Keys);} + } + public void Add(String entry) + { + if(null==streamWriter)return; + streamWriter.WriteLine(entry); + streamWriter.Flush(); + } + public void Dispose() + { + if(null!=streamWriter){streamWriter.Close();streamWriter.Dispose();} + if(null!=fileStream){fileStream.Close();fileStream.Dispose();} + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/Utility.cs b/eNavigator/MarketDataLib/Utility/Utility.cs new file mode 100755 index 0000000..453e4d9 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/Utility.cs @@ -0,0 +1,575 @@ +using System.Text; +using System.IO.Compression; +using System.Globalization; +using System.Diagnostics; +using MarketData.MarketDataModel; + +namespace MarketData.Utils +{ + public class Utility + { + private static DateTime epoch = DateTime.Parse("01-01-0001"); + private static TimeSpan oneDay=new TimeSpan(1,0,0,0); + + public static String ToUrl(String prefix, String ipAddress, String postfix) + { + return prefix + ipAddress + postfix; + } + + public static String Pad(string str, char filler, int length) + { + int stringLength = str.Length; + if (stringLength >= length) return str; + StringBuilder sb = new StringBuilder(); + while (stringLength < length) + { + sb.Append(filler); + stringLength++; + } + return sb.ToString() + str; + } + public static String RemoveHtml(String strItem) + { + String[] codes = { "'","»" }; + if(null==strItem)return strItem; + foreach (String code in codes) + { + strItem = strItem.Replace(code,"'"); + } + return strItem; +// String str=strItem.Replace("'","'"); + // return str; + } + public static String RemoveDivs(String strItem) + { + StringBuilder sb=new StringBuilder(); + bool inDiv=false; + if(null==strItem)return strItem; + for(int index=0;index'))inDiv=false; + else if(!inDiv)sb.Append(ch); + } + return sb.ToString(); + } + public static String BetweenString(String strItem, String strBegin, String strEnd) + { + if (null == strItem) return null; + int index=-1; + if(null==strBegin)index=0; + else index = strItem.IndexOf(strBegin); + if (-1 == index) return null; + String str = null; + if(null!=strBegin)str=strItem.Substring(index + strBegin.Length); + else str=strItem; + if(null==strEnd)return str; + index = str.IndexOf(strEnd); + if (-1 == index) return null; + StringBuilder sb = new StringBuilder(); + for (int strIndex = 0; strIndex < str.Length; strIndex++) + { + if (index == strIndex) break; + sb.Append(str[strIndex]); + } + return sb.ToString(); + } + public static String RemoveAfter(String strItem, char charItem) + { + StringBuilder sb = new StringBuilder(); + for (int index = 0; index < strItem.Length; index++) + { + char ch = strItem[index]; + if (ch.Equals(charItem)) break; + sb.Append(ch); + } + return sb.ToString(); + } + public static bool OutOfRange(double value) + { + return value > 100000000000000000000.00 || value< -99999999999999999999.99; + } + public static String RemoveControlChars(String strItem) + { + StringBuilder sb=new StringBuilder(); + for(int index=0;index=1000) + { + value/=1000; + strValue=Utility.FormatNumber(value,places,commas)+"K"; + } + else if(value>=1000000) + { + value/=1000000; + strValue=Utility.FormatNumber(value,places,commas)+"M"; + } + else if(value>=1000000000) + { + value/=1000000000; + strValue=Utility.FormatNumber(value,places,commas)+"B"; + } + else + { + strValue=Utility.FormatNumber(value,places,commas); + } + return strValue; + } + public static String FormatNumber(double number,int places,bool commas=false) + { + StringBuilder sb = new StringBuilder(); + + StringBuilder formatString=new StringBuilder(); + if (commas&&number>=1000.00) formatString.Append("{0:0,0."); + else formatString.Append("{0:0."); + for(int index=0;index list,char separator=',') + { + StringBuilder sb=new StringBuilder(); + if (null == list || 0 == list.Count) return null; + for(int index=0;index ToList(String items,char separator=',') + { + List list = items.Split(separator).ToList(); + list=(from String s in list select s.Trim()).ToList(); + return list; + } + public static String FromList(List items,String postFix=",") + { + StringBuilder sb=new StringBuilder(); + for(int index=0;index 0) outputStream.Write(decompressedBytesBuffer, 0, count); + else break; + } + decompressionStream.Close(); + compressedStream.Close(); + String strDecompressed = System.Text.Encoding.UTF8.GetString(outputStream.ToArray()); + outputStream.Close(); + outputStream = null; + compressedStream = null; + decompressionStream = null; + return strDecompressed; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception); + return null; + } + finally + { + if (null != outputStream) + { + outputStream.Close(); + outputStream = null; + } + if (null != decompressionStream) + { + decompressionStream.Close(); + decompressionStream = null; + } + if (null != compressedStream) + { + compressedStream.Close(); + compressedStream = null; + } + } + } + public static void LaunchBrowserSearch(String searchTerm) + { + Process.Start("https://www.google.com/search?q="+Uri.EscapeDataString(searchTerm)+"/"); +// OpenWebCommand = new Command(async () => await Browser.OpenAsync("https://www.google.com")); + } + public static bool IsZeroOrNaN(double value) + { + return IsNaN(value)||IsZero(value); + } + private static bool IsZero(double value) + { + if(value==0.00)return true; + return false; + } + private static bool IsNaN(double value) + { + return double.IsNaN(value); + } + public static void DeleteFile(String pathFileName) + { + if(!File.Exists(pathFileName))return; + try{File.Delete(pathFileName);}catch(Exception){;} + } + private static DateTime GetRunDate(String strPathFileName) + { + DateTime runDate=DateTime.Now.Date; + DateGenerator dateGenerator=new DateGenerator(); + StreamWriter streamWriter=null; + StreamReader streamReader=null; + + try + { + if(!File.Exists(strPathFileName)) + { + streamWriter=File.CreateText(strPathFileName); + streamWriter.WriteLine(Utility.DateTimeToStringMMHDDHYYYY(runDate)); + streamWriter.Flush(); + streamWriter.Close(); + streamWriter=null; + return runDate; + } + streamReader=File.OpenText(strPathFileName); + String strLine=streamReader.ReadLine(); + streamReader.Close(); + streamReader=null; + runDate=Utility.ParseDate(strLine); + if(dateGenerator.DaysBetweenActual(runDate,DateTime.Now)>5) + { + File.Delete(strPathFileName); + runDate=DateTime.Now.Date; + streamWriter=File.CreateText(strPathFileName); + streamWriter.WriteLine(Utility.DateTimeToStringMMHDDHYYYY(runDate)); + streamWriter.Flush(); + streamWriter.Close(); + streamWriter=null; + return runDate; + } + return runDate; + } + catch(Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("GetRunDate:{0}",exception.ToString())); + return runDate; + } + finally + { + if(null!=streamWriter)streamWriter.Close(); + if(null!=streamReader)streamReader.Close(); + } + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigator.sln b/eNavigator/eNavigator.sln new file mode 100644 index 0000000..3c01a0d --- /dev/null +++ b/eNavigator/eNavigator.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eNavigator", "eNavigatorUI\eNavigator.csproj", "{761D4A8A-CC84-EDB8-3B37-A4566C635D5D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataLib", "MarketDataLib\MarketDataLib.csproj", "{983D586E-D91F-4110-92C6-2643042F8356}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Release|Any CPU.Build.0 = Release|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Debug|Any CPU.Build.0 = Debug|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Release|Any CPU.ActiveCfg = Release|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E2F0E253-B0AA-4D62-AC99-DE54428780BA} + EndGlobalSection +EndGlobal diff --git a/eNavigator/eNavigatorUI/.vscode/launch.json b/eNavigator/eNavigatorUI/.vscode/launch.json new file mode 100755 index 0000000..5bb46e0 --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "name": "Blazor WebAssembly Debug (Launch)", + "request": "launch", + "url": "http://localhost:7062", + "port": 7062, + "inspectUri": "{wsProtocol}://localhost:7062/_framework/debug/ws-proxy?browser={browserInspectUri}", + "runtimeExecutable": "/usr/bin/chromium-browser", + "runtimeArgs": [ + "--remote-debugging-port=9222", + "--user-data-dir=${workspaceFolder}/.vscode/chrome-debug" + ] + } + ] +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/.vscode/settings.json b/eNavigator/eNavigatorUI/.vscode/settings.json new file mode 100755 index 0000000..b4b8e2b --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/settings.json @@ -0,0 +1,16 @@ + +{ + "github.copilot.editor.enableAutoCompletions": false, + "github.copilot.chat.agent.runTasks": false, + "github.copilot.chat.codeGeneration.useInstructionFiles": false, + "github.copilot.chat.fixTestFailure.enabled": false, + "github.copilot.chat.useProjectTemplates": false, + "github.copilot.editor.enableCodeActions": false, + "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true, + "dotnetAcquisitionExtension.existingDotnetPath": [ + { + "extensionId": "ms-dotnettools.csharp", + "path": "/usr/local/bin/dotnet" + } + ], +} diff --git a/eNavigator/eNavigatorUI/.vscode/tasks.json b/eNavigator/eNavigatorUI/.vscode/tasks.json new file mode 100755 index 0000000..31c0dd7 --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/tasks.json @@ -0,0 +1,53 @@ +{ + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/eNavigator.csproj" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "runBlazorApp", + "command": "dotnet", + "type": "process", + "args": [ + "run", + "--configuration", + "Debug", + "--project", + "${workspaceFolder}/eNavigator.csproj" + ], + "problemMatcher": "$msCompile", + "dependsOn": "build" + }, + { + "label": "cleanup", + "command": "pkill", + "type": "process", + "args": [ + "-f", + "chromium-browser" + ], + "problemMatcher": [] + }, + { + "label": "delay", + "type": "shell", + "command": "sleep 5", + "problemMatcher": [] + }, + { + "label": "runBlazorAppWithDelay", + "dependsOn": ["runBlazorApp", "delay"], + "problemMatcher": [] + } + ] + } + + + + \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/App.razor b/eNavigator/eNavigatorUI/App.razor new file mode 100755 index 0000000..623580d --- /dev/null +++ b/eNavigator/eNavigatorUI/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs b/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs new file mode 100644 index 0000000..f7d8f50 --- /dev/null +++ b/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs @@ -0,0 +1,33 @@ +using System.Security.Claims; +using eNavigator.Interfaces; +using eNavigator.Models; +using Microsoft.AspNetCore.Components.Authorization; + +namespace eNavigator.Authentication +{ + public class NavigatorAuthenticationStateProvider : AuthenticationStateProvider + { + private readonly IStateContainer stateContainer; + + public NavigatorAuthenticationStateProvider(IStateContainer stateContainer) + { + this.stateContainer = stateContainer ?? throw new ArgumentNullException(nameof(stateContainer)); + } + + public override async Task GetAuthenticationStateAsync() + { + String accessToken = stateContainer.Coalesce(StateStrings.Token, default(String)); + bool authenticated = default == accessToken ? false : true; + + ClaimsIdentity identity = authenticated + ? new ClaimsIdentity(null, "Basic") + : new ClaimsIdentity(); + + ClaimsPrincipal principal = new ClaimsPrincipal(identity); + + AuthenticationState authenticationState = new AuthenticationState(principal); + + return await Task.FromResult(authenticationState); + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor new file mode 100644 index 0000000..0383947 --- /dev/null +++ b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor @@ -0,0 +1,17 @@ +
+ + @if (!String.IsNullOrEmpty(Message)) + { + + + + @Message + + + + } + + + + +
diff --git a/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs new file mode 100644 index 0000000..ac00069 --- /dev/null +++ b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; +using System.Text; + +namespace eNavigator.Components.Shared +{ + public partial class BusyIndicator + { + [Parameter] + public bool IsBusy { get; set; } + + [Parameter] + public String Message { get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs b/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs new file mode 100644 index 0000000..eb2ee37 --- /dev/null +++ b/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs @@ -0,0 +1,31 @@ +using MarketData.Service; + +namespace eNavigator.Interfaces +{ + public interface IMarketDataServiceClient + { + public Task Ping(); + public Task Login(String user, String password); + public Task IsAuthorized(); + public Task GetDistinctConsumerPriceIndices(); + public Task GetGetConsumerPriceIndex(String indexCode); + public Task GetLatestPremarketData(String market,DateTime marketDate); + public Task GetAvailableMarkets(); + public Task GetAvailableMarketDates(String market); + public Task GetStopLimit(String symbol); + public Task GetPortfolioTradesWithParityPrice(String symbol); + public Task GetPositionsWithDescription(); + public Task GetWatchList(String watchList); + public Task GetHeadlines(DateTime headlineDate); + public Task GetHeadlineDates(); + public Task GetLatestHeadlines(); + public Task GetLatestPricingDate(); + public Task GetGainLossDetails(DateTime selectedDate,String account); + public Task GetGainLossDetails(DateTime selectedDate); + public Task GetCompoundGainLoss(int selectedDays); + public Task GetAccountsWithOpenTrades(); + public Task GetPrices(String symbol, int days); + public Task GetCompanyNameForSymbol(String symbol); + public Task GetBollingerBands(String symbol,int dayCount); + } +} diff --git a/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs b/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs new file mode 100644 index 0000000..bc58b7e --- /dev/null +++ b/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; + +namespace eNavigator.Interfaces +{ + public interface IStateContainer + { + public T Get(String name, [CallerMemberName] string callerMember = null); + public T Coalesce(String name, T defaultValue = default(T),[CallerMemberName] String callerMember = null); + public List GetNames(); + public void Clear(); + public IStateContainer InsertOrUpdate(String name, Object value, [CallerMemberName] String callerMember = null); + public void Remove(String name); + public bool Has(String name); + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Layout/MainLayout.razor b/eNavigator/eNavigatorUI/Layout/MainLayout.razor new file mode 100755 index 0000000..17b0745 --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/MainLayout.razor @@ -0,0 +1,53 @@ +@inherits LayoutComponentBase + +@* Required *@ +@* *@ + + + +@* Needed for dialogs *@ + + + + +
+ + +
+
+ @Body +
+
+
+ +@* @code { + MudTheme CustomTheme = new MudTheme() + { + Typography = new Typography() + { + H6 = new H6Typography() + { + FontFamily = new[] { "Roboto", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.25rem", + FontWeight = "500", + LineHeight = "1.6", + LetterSpacing = ".0075em" + } + } + }; +} *@ + +@* @code { + MudTheme CustomTheme = new MudTheme() + { + Typography = new Typography() + { + Default = new DefaultTypography() + { + FontFamily = new[] { "Poppins", "Helvetica", "Arial", "sans-serif" },FontSize = ".625rem" + } + } + }; +} *@ diff --git a/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css b/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css new file mode 100755 index 0000000..baef3ee --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css @@ -0,0 +1,77 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/eNavigator/eNavigatorUI/Layout/NavMenu.razor b/eNavigator/eNavigatorUI/Layout/NavMenu.razor new file mode 100755 index 0000000..97b5c2d --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/NavMenu.razor @@ -0,0 +1,54 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css b/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css new file mode 100755 index 0000000..07d4c0f --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css @@ -0,0 +1,83 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/eNavigator/eNavigatorUI/Models/Selectable.cs b/eNavigator/eNavigatorUI/Models/Selectable.cs new file mode 100644 index 0000000..ebe8a91 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/Selectable.cs @@ -0,0 +1,34 @@ +namespace eNavigator.Models +{ + public interface ISelectable + { + public bool Equals(ISelectable item); + public int GetHashCode(); + public String ToString(); + public int GetIndex(); + } + + public class Selectable : ISelectable + { + public int Index { get; set; } + + public String Name { get; set; } + + public bool Equals(ISelectable item) + { + return item.GetIndex().Equals(GetIndex()); + } + + public override int GetHashCode() => Index.GetHashCode(); + + public int GetIndex() + { + return Index; + } + + public override String ToString() + { + return Name; + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs b/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs new file mode 100644 index 0000000..92ce4fc --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs @@ -0,0 +1,6 @@ +namespace eNavigator.Models +{ + public class SelectableSymbol : Selectable + { + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/StateContainer.cs b/eNavigator/eNavigatorUI/Models/StateContainer.cs new file mode 100644 index 0000000..c0f1ba9 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateContainer.cs @@ -0,0 +1,100 @@ +#pragma warning disable CS8601 // Possible null reference assignment. + +using System.Runtime.CompilerServices; +using eNavigator.Interfaces; +using MarketData.MarketDataModel; + +namespace eNavigator.Models +{ + public class StateContainer : IStateContainer + { + private Dictionary stateContainer = new Dictionary(); + + public StateContainer() + { + } + + public T Get(String name, [CallerMemberName] string callerMember = null) + { + T result = default(T); + + if(!Has(name)) + { + String message=$"Item {name}, referenced from {callerMember} does not exist in the state container"; + throw new ArgumentOutOfRangeException(message); + } + + StateItem stateItem = stateContainer[name]; + Object value = stateItem.StateObject; + + if(value is null)return result; + + String typeName = value.GetType().Name; + + if(value.GetType().Equals(typeof(T)) || !(value is IConvertible))result = (T)value; + else result = (T)Convert.ChangeType(stateContainer[name].StateObject,typeof(T)); + return result; + } + + public T Coalesce(String name, T defaultValue = default(T),[CallerMemberName] String callerMember = null) + { + T result = default(T); + + if(!Has(name))return defaultValue; + + StateItem stateItem = stateContainer[name]; + Object value = stateItem.StateObject; + + if(value is null)return result; + + String typeName = value.GetType().Name; + + if(value.GetType().Equals(typeof(T)) || !(value is IConvertible))result = (T)value; + else result = (T)Convert.ChangeType(stateContainer[name].StateObject,typeof(T)); + return result; + } + + public List GetNames() + { + List names = stateContainer.Keys.ToList(); + names.Sort(); + return names; + } + + public void Clear() + { + stateContainer = new Dictionary(); + } + + public IStateContainer InsertOrUpdate(String name, Object value, [CallerMemberName] String callerMember = null) + { + if(Has(name)) + { + StateItem stateItem = stateContainer[name]; + stateItem.CallerMember = callerMember; + stateItem.StateObject = value; + return this; + } + else + { + stateContainer.Add(name, new StateItem(){StateObject = value, CallerMember= callerMember}); + return this; + } + } + + public void Remove(String name) + { + if(!stateContainer.ContainsKey(name))return; + + Object o = Get(name); + if(0 != default && o is IDisposable)(o as IDisposable).Dispose(); + stateContainer.Remove(name); + } + + public bool Has(String name) + { + return stateContainer.ContainsKey(name); + } + } +} +#pragma warning restore CS8601 // Possible null reference assignment. diff --git a/eNavigator/eNavigatorUI/Models/StateItem.cs b/eNavigator/eNavigatorUI/Models/StateItem.cs new file mode 100644 index 0000000..3b92ee6 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateItem.cs @@ -0,0 +1,9 @@ +namespace eNavigator.Models +{ + public class StateItem + { + public Object StateObject { get; set; } + + public String CallerMember { get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/StateStrings.cs b/eNavigator/eNavigatorUI/Models/StateStrings.cs new file mode 100644 index 0000000..8666333 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateStrings.cs @@ -0,0 +1,9 @@ +namespace eNavigator.Models +{ + public static class StateStrings + { + public const String Token = "Token"; + public const String User = "User"; + public const String Password = "Password"; + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Pages/BollingerBands.razor b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor new file mode 100644 index 0000000..63a1cdb --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor @@ -0,0 +1,56 @@ +@using System.Text.RegularExpressions +@using System.ComponentModel.DataAnnotations +@using MarketData.MarketDataModel +@using eNavigator.Interfaces +@using eNavigator.Models +@using eNavigator.Routes +@using eNavigator.Components.Shared +@using Microsoft.AspNetCore.Components.Web.Virtualization +@inject IMarketDataServiceClient marketDataServiceClient +@inject IStateContainer stateContainer +@inject ISnackbar snackbarService +@attribute [Route(PageRoute.BollingerBands)] + +
+
+ +
+ + + + + + + @context.Name + + + + + + + + @dayCount + + + + + Refresh + + + + + + @Heading + + + + + + + + + +
diff --git a/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs new file mode 100644 index 0000000..ee46776 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs @@ -0,0 +1,285 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; +using MarketData.Service; +using Microsoft.AspNetCore.Components.Authorization; +using eNavigator.Routes; +using MarketData.Utils; +using MarketData.MarketDataModel; +using eNavigator.Models; +using System.Text; + +namespace eNavigator.Pages +{ + public partial class BollingerBands + { + [Inject] + private AuthenticationStateProvider authenticationStateProvider { get; set; } = default; + + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + protected bool IsBusy { get; set; } = false; + protected String BusyMessage { get; set;} = ""; + + protected List AvailableSymbols { get; set;} = new List{new SelectableSymbol(){Index=0,Name="---"}}; + protected SelectableSymbol SelectedSymbol { get; set; } = new SelectableSymbol(){Index=0,Name="---"}; + + protected List BollingerBandElements { get; set; } = new List(); + + protected List AvailableDayCounts { get; set; } = new List{60,90,120,180,360,720,1440}; + protected int SelectedDayCount { get; set; } = 120; + + protected String Heading { get; set; } = ""; + + protected List ChartSeriesCollection { get; set; } = new List(); + protected ChartOptions ChartingOptions{ get; set; } = new ChartOptions(); + + protected String[] XAxisLabels { get; set; } = new String[]{""}; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + AuthenticationState authenticationState = await authenticationStateProvider.GetAuthenticationStateAsync(); + if(!authenticationState.User.Identity.IsAuthenticated) + { + NavigationManager.NavigateTo(PageRoute.Login); + return; + } + await LoadSymbols(); + SelectedSymbol = AvailableSymbols.Count()>0 ? AvailableSymbols[0] : SelectedSymbol; + await LoadBollingerBands(SelectedSymbol.Name, SelectedDayCount); + StateHasChanged(); + Task.Run(async () => await Task.Yield()).GetAwaiter(); + } + + private async Task LoadSymbols() + { + BusyMessage = $"Loading symbols..."; + IsBusy = true; + ServiceResult serviceResult = await marketDataServiceClient.GetWatchList("Valuations"); + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load latest headlines."); + return; + } + List availableSymbolsList = (serviceResult.ContextSpecificResult as List); + List availableSymbols = new List(); + for(int index=0;index); + DisplayToast($"Loaded {AvailableSymbols.Count} symbols in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + IsBusy = false; + } + + private async Task LoadBollingerBands(String symbol,int dayCount) + { + String companyName = ""; + BusyMessage = $"Loading {dayCount} day bollinger bands for {symbol} ..."; + IsBusy = true; + + ServiceResult serviceResult = await marketDataServiceClient.GetCompanyNameForSymbol(symbol); + if(serviceResult.Success) + { + companyName = (serviceResult.ContextSpecificResult as String); + } + + serviceResult = await marketDataServiceClient.GetBollingerBands(symbol,dayCount); + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load bollinger bands."); + return; + } + BollingerBandElements = (serviceResult.ContextSpecificResult as List); + // if(BollingerBandElements.Count()>0) + // { + // Heading = SelectedSymbol + " - " + companyName + "("+ BollingerBandElements[BollingerBandElements.Count()-1].Date.ToShortDateString() + " Thru " + BollingerBandElements[0].Date.ToShortDateString()+ ")"; + // } + DisplayToast($"Loaded {Utility.FormatNumber(BollingerBandElements.Count*13,0,true)} data points in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + CreateHeading(companyName); + CreateChartSeries(); + CreateChartOptions(); + CreateXAxisLabels(); + + IsBusy = false; + } + + private void DisplayToast(String message) + { + snackbarService.Add(new MarkupString($"
  • {message}
")); + } + + private async Task OnSymbolChanged() + { + await LoadBollingerBands(SelectedSymbol.Name, SelectedDayCount); + } + + private async Task OnDayCountChanged() + { + await LoadBollingerBands(SelectedSymbol.Name, SelectedDayCount); + } + + protected async Task RefreshClicked() + { + await Task.FromResult(true); + await LoadBollingerBands(SelectedSymbol.Name,SelectedDayCount); + StateHasChanged(); + Task.Run(async () => await Task.Yield()).GetAwaiter(); + } + + private void CreateHeading(String companyName) + { + if(0==BollingerBandElements.Count()) + { + Heading = ""; + return; + } + BollingerBandElement bollingerBandElementCurrent = BollingerBandElements[0]; + BollingerBandElement bollingerBandElementPrev = BollingerBandElements[1]; + + StringBuilder sb = new StringBuilder(); + sb.Append(companyName); + sb.Append(" ("); + sb.Append(SelectedSymbol ); + sb.Append(") "); + sb.Append(BollingerBandElements[BollingerBandElements.Count()-1].Date.ToShortDateString()); + sb.Append(" Thru "); + sb.Append(BollingerBandElements[0].Date.ToShortDateString()); + + if(BollingerBandElements.Count()<2) + { + Heading = sb.ToString(); + return; + } + + double change=double.NaN; + if(0.00!=bollingerBandElementCurrent.Close) + { + change = (bollingerBandElementCurrent.Close - bollingerBandElementPrev.Close) / bollingerBandElementCurrent.Close; + } + + sb.Append(" "); + sb.Append("("); + sb.Append(Utility.FormatCurrency(bollingerBandElementCurrent.Close)); + sb.Append("/"); + sb.Append(Utility.FormatCurrency(bollingerBandElementCurrent.Low)); + if(!double.IsNaN(change)) + { + sb.Append(","); + sb.Append(change>=0.00?"+":"").Append(Utility.FormatPercent((double)change,2)); + } + sb.Append(")"); + + Heading = sb.ToString(); + } + + private void CreateXAxisLabels() + { + if(0==BollingerBandElements.Count()) + { + return; + } + XAxisLabels = BuildXAxisLabels(6).ToArray(); + } + + private List BuildXAxisLabels(int labels) + { + List axisLabels = new List(); + if(0==BollingerBandElements.Count()) + { + return axisLabels; + } + long dataPoints = BollingerBandElements.Count(); + int intervals = (int)( (double)dataPoints/(double)labels); + for(int index=BollingerBandElements.Count()-1;index>=0;index--) + { + if(0==(index%intervals)) + { + StringBuilder sb = new StringBuilder(); + DateTime date = BollingerBandElements[index].Date; + sb.Append(date.Month.ToString()); + sb.Append("/"); + sb.Append(date.Year.ToString()); + axisLabels.Add(sb.ToString()); + } + else + { + axisLabels.Add(""); + } + } + return axisLabels; + } + + private void CreateChartOptions() + { + ChartingOptions = new ChartOptions() + { + LineStrokeWidth = 1, + XAxisLines = true, + YAxisFormat="c2", + ChartPalette = new[] + { + "#0000FF", // High + "#FF0000", // Low + "#000000", // Close + "#800080", // SMAN + "#13A10E", // K + "#13A10E", // L + "#13A10E", // KL1 + "#13A10E" // LP1 + } + }; + } + + private void CreateChartSeries() + { + ChartSeriesCollection = new List(); + + if(0==BollingerBandElements.Count()) + { + return; + } + + double[] highData = new double[BollingerBandElements.Count()]; + double[] lowData = new double[BollingerBandElements.Count()]; + double[] closeData = new double[BollingerBandElements.Count()]; + double[] smanData = new double[BollingerBandElements.Count()]; + double[] kData = new double[BollingerBandElements.Count()]; + double[] lData = new double[BollingerBandElements.Count()]; + double[] kl1Data = new double[BollingerBandElements.Count()]; + double[] lp1Data = new double[BollingerBandElements.Count()]; + + for(int index=0;indexCounter + +

Counter

+ +

Current count: @currentCount

+ +Default + + diff --git a/eNavigator/eNavigatorUI/Pages/Counter.razor.cs b/eNavigator/eNavigatorUI/Pages/Counter.razor.cs new file mode 100755 index 0000000..8e710fd --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Counter.razor.cs @@ -0,0 +1,34 @@ +using eNavigator.Routes; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using System.Text; + +namespace eNavigator.Pages +{ + public partial class Counter : ComponentBase + { + private int currentCount = 0; + + private void IncrementCount() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Hello"); + currentCount++; + } + + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + [Inject] + private AuthenticationStateProvider authenticationStateProvider { get; set; } = default; + + protected override async Task OnInitializedAsync() + { + AuthenticationState authenticationState = await authenticationStateProvider.GetAuthenticationStateAsync(); + if(!authenticationState.User.Identity.IsAuthenticated) + { + NavigationManager.NavigateTo(PageRoute.Login); + } + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Pages/Headlines.razor b/eNavigator/eNavigatorUI/Pages/Headlines.razor new file mode 100644 index 0000000..0aea953 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Headlines.razor @@ -0,0 +1,64 @@ +@using System.Text.RegularExpressions +@using System.ComponentModel.DataAnnotations +@using MarketData.MarketDataModel +@using MarketData.Utils +@using eNavigator.Interfaces +@using eNavigator.Models +@using eNavigator.Routes +@using eNavigator.Components.Shared +@using Microsoft.AspNetCore.Components.Web.Virtualization +@inject IMarketDataServiceClient marketDataServiceClient +@inject ISnackbar snackbarService +@attribute [Route(PageRoute.Headlines)] + +
+
+ +
+ + + + + + + + + @date.ToShortDateString() + + + + Refresh + + + + + Date + Modified + Symbol + Source + Company Name + Headline + + + @context.Date.ToShortDateString() + @Utility.DateTimeToStringHHMMSSTT(context.Modified) + @context.Symbol + @context.Source + @context.CompanyName + @context.Entry + + + + +
diff --git a/eNavigator/eNavigatorUI/Pages/Headlines.razor.cs b/eNavigator/eNavigatorUI/Pages/Headlines.razor.cs new file mode 100644 index 0000000..d43aeea --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Headlines.razor.cs @@ -0,0 +1,128 @@ +using eNavigator.Routes; +using MarketData.MarketDataModel; +using MarketData.Service; +using MarketData.Utils; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.JSInterop; +using MudBlazor; + +namespace eNavigator.Pages +{ + public partial class Headlines + { + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + [Inject] + private AuthenticationStateProvider authenticationStateProvider { get; set; } = default; + + [Inject] + private IJSRuntime JSRuntime { get; set; } = default; + + public bool IsBusy { get; set; } = false; + public String BusyMessage { get; set;} = ""; + public List HeadlinesCollection { get; set;} = new List(); + + public List AvailableDates { get; set;} = new List(); + + public DateTime SelectedDate { get; set; } = Utility.Epoch; + + private int selectedRowNumber = -1; + private MudTable mudTable; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + AuthenticationState authenticationState = await authenticationStateProvider.GetAuthenticationStateAsync(); + if(!authenticationState.User.Identity.IsAuthenticated) + { + NavigationManager.NavigateTo(PageRoute.Login); + return; + } + await LoadAvailableHeadlineDates(); + SelectedDate = AvailableDates.Count()>0 ? AvailableDates[0] : SelectedDate; + await LoadHeadlines(SelectedDate); + StateHasChanged(); + Task.Run(async () => await Task.Yield()).GetAwaiter(); + } + + private async Task OnValueChanged() + { + await LoadHeadlines(SelectedDate); + } + + private async Task LoadHeadlines(DateTime headlineDate) + { + BusyMessage = $"Loading Headlines for {headlineDate.ToShortDateString()}..."; + IsBusy=true; + ServiceResult serviceResult = await marketDataServiceClient.GetHeadlines(headlineDate); + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load latest headlines."); + return; + } + HeadlinesCollection = (serviceResult.ContextSpecificResult as List); + DisplayToast($"Loaded {HeadlinesCollection.Count} headlines for {headlineDate.ToShortDateString()} in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + IsBusy = false; + } + + private async Task LoadAvailableHeadlineDates() + { + BusyMessage = "Loading Available Headline Dates..."; + IsBusy=true; + ServiceResult serviceResult = await marketDataServiceClient.GetHeadlineDates(); + IsBusy = false; + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load headline dates."); + return; + } + List availableDates = (serviceResult.ContextSpecificResult as List); + availableDates = availableDates.Take(30).ToList(); + for(int index=0;index DateTime.Parse(x)).ToList(); + IsBusy = false; + DisplayToast($"Loaded {AvailableDates.Count} headline dates in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + } + + protected void RowClickEvent(TableRowClickEventArgs tableRowClickEventArgs) + { + JSRuntime.InvokeAsync("open", $"https://www.google.com/search?q="+Uri.EscapeDataString(tableRowClickEventArgs.Item.Entry)); + } + + protected async Task RefreshClicked() + { + SelectedDate = AvailableDates.Count()>0 ? AvailableDates[0] : SelectedDate; + await LoadHeadlines(SelectedDate); + StateHasChanged(); + Task.Run(async () => await Task.Yield()).GetAwaiter(); + } + + protected string SelectedRowClassFunc(Headline headline, int rowNumber) + { + if (selectedRowNumber == rowNumber) + { + selectedRowNumber = -1; + return string.Empty; + } + else if (mudTable.SelectedItem != null && mudTable.SelectedItem.Equals(headline)) + { + selectedRowNumber = rowNumber; + return "selected"; + } + else + { + return string.Empty; + } + } + + private void DisplayToast(String message) + { + snackbarService.Add(new MarkupString($"
  • {message}
")); + } + } +} diff --git a/eNavigator/eNavigatorUI/Pages/Home.razor b/eNavigator/eNavigatorUI/Pages/Home.razor new file mode 100755 index 0000000..16f898d --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Home.razor @@ -0,0 +1,13 @@ +@using eNavigator.Routes +@attribute [Route(PageRoute.Home)] + +Home + +

eNavigator

+ + +@{ + String today = "Today is " + DateTime.Now.ToShortDateString(); +} + +

@today

\ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Pages/Login.razor b/eNavigator/eNavigatorUI/Pages/Login.razor new file mode 100644 index 0000000..087b1f8 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Login.razor @@ -0,0 +1,31 @@ +@using System.Text.RegularExpressions +@using System.ComponentModel.DataAnnotations +@using MarketData.MarketDataModel +@using eNavigator.Interfaces +@using eNavigator.Models +@using eNavigator.Routes +@using eNavigator.Components.Shared +@inject IMarketDataServiceClient marketDataServiceClient +@inject IStateContainer stateContainer +@inject ISnackbar snackbarService +@attribute [Route(PageRoute.Login)] + +
+
+ +
+ + + + + + +
+ Submit +
+ +
+
+
+
+
\ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Pages/Login.razor.cs b/eNavigator/eNavigatorUI/Pages/Login.razor.cs new file mode 100644 index 0000000..60490e9 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Login.razor.cs @@ -0,0 +1,131 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; +using MarketData.Service; +using eNavigator.Models; + +namespace eNavigator.Pages +{ + public partial class Login + { + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + bool isLoggedIn = false; + string[] errors = { }; + + public String User { get; set; } + + public String Password { get; set;} + + public String Status { get; set;} = "Enter credentials then click Submit."; + + public bool IsBusy { get; set; } = false; + + public String BusyMessage { get; set;} = ""; + + MudForm loginForm; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + String accessToken = stateContainer.Coalesce(StateStrings.Token, default(String)); + + if(default != accessToken) + { + isLoggedIn = true; + User=stateContainer.Coalesce(StateStrings.User, default(String)); + Password=stateContainer.Coalesce(StateStrings.Password, default(String)); + Status="Logged in."; + } + } + + private async Task IsLoggedIn() + { + return await Task.FromResult(stateContainer.Has(StateStrings.Token)); + // return await marketDataServiceClient.IsAuthorized(); + } + + public bool SubmitEnabled + { + get + { + if(isLoggedIn) + { + Console.WriteLine("SubmitEnabled : false"); + return false; + } + if(User==default || Password==default) + { + Console.WriteLine("SubmitEnabled : false"); + return false; + } + Console.WriteLine("SubmitEnabled : true"); + return true; + } + } + + private async Task PerformLogin() + { + try + { + BusyMessage = "Logging you in..."; + IsBusy = true; + bool result = await marketDataServiceClient.Ping(); + if(!result) + { + Console.WriteLine("Ping failed."); + Status="Cannot reach host."; + return; + } + else + { + ServiceResult serviceResult = await marketDataServiceClient.Login(User, Password); + isLoggedIn = serviceResult.Success; + if(serviceResult.Success) + { + stateContainer.InsertOrUpdate(StateStrings.Token,serviceResult.ContextSpecificResult as String); + stateContainer.InsertOrUpdate(StateStrings.User,User); + stateContainer.InsertOrUpdate(StateStrings.Password,Password); + Status="Logged in.."; + DisplayToast($"User {User} is logged in. {serviceResult.ElapsedTimeMS}(ms)"); + Console.WriteLine($"Login succeeded. Token {serviceResult.ContextSpecificResult as String}"); + } + else + { + Status="Login failed, try again."; + DisplayToast("Login failed."); + Console.WriteLine($"Login failed."); + } + } + } + finally + { + IsBusy = false; + } + } + + /// + /// Login cliked handler. Should not be able o click this once login has succeeded + /// + /// + private async Task LoginClicked() + { + if(!await IsLoggedIn()) + { + await PerformLogin(); + } + else + { + Console.WriteLine("Already logged in"); + } + + return ; + } + + private void DisplayToast(String message) + { + snackbarService.Add(new MarkupString($"
  • {message}
")); + } + } +} + diff --git a/eNavigator/eNavigatorUI/Pages/Weather.razor b/eNavigator/eNavigatorUI/Pages/Weather.razor new file mode 100755 index 0000000..d0a7c71 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Weather.razor @@ -0,0 +1,66 @@ +@using Microsoft.AspNetCore.Components.Authorization +@using eNavigator.Routes +@inject HttpClient Http +@attribute [Route(PageRoute.Weather)] + +Weather + +

Weather

+ +

This component demonstrates fetching data from the server.

+ +@if (forecasts == null) +{ +

Loading...

+} +else +{ + + + + + + + + + + + @foreach (var forecast in forecasts) + { + + + + + + + } + +
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
+} + +@* @code { + private WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + forecasts = await Http.GetFromJsonAsync("sample-data/weather.json"); + } + + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public string? Summary { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } +} *@ + @* using Microsoft.AspNetCore.Components.Authorization; + +#line default +#line hidden +#nullable disable +#nullable restore +#line 4 "/home/pi/Projects/Blazor/eNavigatorB/eNavigatorUI/Pages/Weather.razor" *@ diff --git a/eNavigator/eNavigatorUI/Pages/Weather.razor.cs b/eNavigator/eNavigatorUI/Pages/Weather.razor.cs new file mode 100644 index 0000000..56d868f --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/Weather.razor.cs @@ -0,0 +1,39 @@ +using System.Net.Http.Json; +using eNavigator.Routes; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace eNavigator.Pages +{ + public partial class Weather + { + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + [Inject] + private AuthenticationStateProvider authenticationStateProvider { get; set; } = default; + + public WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + AuthenticationState authenticationState = await authenticationStateProvider.GetAuthenticationStateAsync(); + if(!authenticationState.User.Identity.IsAuthenticated) + { + NavigationManager.NavigateTo(PageRoute.Login); + } + forecasts = await Http.GetFromJsonAsync("sample-data/weather.json"); + } + + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public string? Summary { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } + } +} diff --git a/eNavigator/eNavigatorUI/Program.cs b/eNavigator/eNavigatorUI/Program.cs new file mode 100755 index 0000000..81fe1d7 --- /dev/null +++ b/eNavigator/eNavigatorUI/Program.cs @@ -0,0 +1,53 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using eNavigator; +using MudBlazor.Services; +using eNavigator.Models; +using MudBlazor; +using Microsoft.AspNetCore.Components.Authorization; +using eNavigator.Authentication; +using eNavigator.Service; +using eNavigator.Interfaces; +//using eNavigator.Model; +//using eNavigator.Model; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); +builder.Services.AddMudServices(); +Console.WriteLine($"HostEnvironment.BaseAddress={builder.HostEnvironment.BaseAddress}"); +builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + +builder.Services.AddSingleton(); +// builder.Services.AddScoped(); + +builder.Services.AddHttpClient(httpClient => +{ + String baseUri = builder.Configuration["Service_BaseUri"]; + String baseUriPort = builder.Configuration["Service_BaseUriPort"]; + String serviceProtocol = builder.Configuration["Service_Protocol"]; + + String baseAddress = $"{serviceProtocol}{baseUri}:{baseUriPort}"; + Console.WriteLine($"Configuring {nameof(MarketDataServiceClient)} to {baseAddress}"); + httpClient.BaseAddress = new Uri(baseAddress); +}); + +builder.Services.AddMudServices(config => +{ + config.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomRight; + config.SnackbarConfiguration.PreventDuplicates = false; + config.SnackbarConfiguration.NewestOnTop = true; + config.SnackbarConfiguration.ShowCloseIcon = true; + config.SnackbarConfiguration.VisibleStateDuration = 10000; + config.SnackbarConfiguration.HideTransitionDuration = 500; + config.SnackbarConfiguration.ShowTransitionDuration = 500; + config.SnackbarConfiguration.SnackbarVariant = Variant.Filled; +}); + +builder.Services.AddScoped (); + +var app = builder.Build(); + +await app.RunAsync(); + diff --git a/eNavigator/eNavigatorUI/Properties/launchSettings.json b/eNavigator/eNavigatorUI/Properties/launchSettings.json new file mode 100755 index 0000000..aa81e74 --- /dev/null +++ b/eNavigator/eNavigatorUI/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "profiles": { + "eNavigator": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:7062", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "http://localhost:7062", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/eNavigator/eNavigatorUI/Routes/PageRoute.cs b/eNavigator/eNavigatorUI/Routes/PageRoute.cs new file mode 100644 index 0000000..6c9691a --- /dev/null +++ b/eNavigator/eNavigatorUI/Routes/PageRoute.cs @@ -0,0 +1,17 @@ +namespace eNavigator.Routes +{ + public static class PageRoute + { + public const String Home = "/"; + + public const String Counter = "/counter"; + + public const String Login = "/login"; + + public const String Weather = "/weather"; + + public const String Headlines = "/headlines"; + + public const String BollingerBands = "/bollingerbands"; + } +} diff --git a/eNavigator/eNavigatorUI/Service/MarketDataServiceClient.cs b/eNavigator/eNavigatorUI/Service/MarketDataServiceClient.cs new file mode 100755 index 0000000..39687e1 --- /dev/null +++ b/eNavigator/eNavigatorUI/Service/MarketDataServiceClient.cs @@ -0,0 +1,506 @@ +using eNavigator.Interfaces; +using MarketData.MarketDataModel; +using MarketData.MarketDataModel.GainLoss; +using MarketData.Service; +using MarketData.Utils; +using Newtonsoft.Json; +using System.Text; +using System.Web; + +namespace eNavigator.Service +{ + public class MarketDataServiceClient : IMarketDataServiceClient + { + private readonly HttpClient httpClient; + private readonly IStateContainer stateContainer; + private List exceptions = new List(); + + public MarketDataServiceClient(HttpClient httpClient,IStateContainer stateContainer) + { + this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + this.stateContainer = stateContainer ?? throw new ArgumentNullException(nameof(stateContainer)); + } + + protected String AccessToken + { + get + { + return stateContainer.Coalesce("Token", default(String)); + } + set + { + stateContainer.InsertOrUpdate("Token", value); + } + } + + public async Task IsAuthorized() + { + if (default == AccessToken) return await Task.FromResult(false); + return true; + } + + public async Task Ping() + { + bool result = false; + try + { + Profiler profiler = new Profiler(); + Console.WriteLine($"Contacting host at {httpClient.BaseAddress}"); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Ping/GetPing"); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + result = JsonConvert.DeserializeObject(json); + Console.WriteLine($"Ping took {profiler.End()}MS"); + return result; + } + catch(Exception exception) + { + Console.WriteLine(exception.ToString()); + return result; + } + } + + public async Task Login(String user, String password) + { + try + { + Profiler profiler = new Profiler(); + StringBuilder sb = new StringBuilder(); + user = Authorizations.Xor(user); + password = Authorizations.Xor(password); + sb.Append("api/Authorization/GetToken?").Append("user=").Append(user); + sb.Append("&password=").Append(password); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + AccessToken = JsonConvert.DeserializeObject(json); + if(default == AccessToken)return new ServiceResult(false); + return new ServiceResult(AccessToken){ElapsedTimeMS=profiler.End()}; + } + catch(Exception exception) + { + Console.WriteLine(exception.ToString()); + return new ServiceResult(false); + } + } + + public async Task GetDistinctConsumerPriceIndices() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/PriceIndex/GetDistinctPriceIndices?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List priceIndices = JsonConvert.DeserializeObject>(json); + return new ServiceResult(priceIndices){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetGetConsumerPriceIndex(String indexCode) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/PriceIndex/GetConsumerPriceIndex?").Append("token=").Append(AccessToken).Append("&").Append("indexCode=").Append(HttpUtility.UrlEncode(indexCode)); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List priceIndices = JsonConvert.DeserializeObject>(json); + return new ServiceResult(priceIndices){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetLatestPremarketData(String market,DateTime marketDate) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/PreMarket/GetLatestPremarketData?").Append("token=").Append(AccessToken).Append("&").Append("market=").Append(HttpUtility.UrlEncode(market)); + sb.Append("&").Append("marketDate=").Append(marketDate); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List premarketData = JsonConvert.DeserializeObject>(json); + return new ServiceResult(premarketData){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetAvailableMarkets() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/PreMarket/GetAvailableMarkets?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List availableMarkets = JsonConvert.DeserializeObject>(json); + return new ServiceResult(availableMarkets){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetAvailableMarketDates(String market) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/PreMarket/GetAvailableMarketDates?").Append("token=").Append(AccessToken).Append("&").Append("market=").Append(HttpUtility.UrlEncode(market)); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List availableMarketDates = JsonConvert.DeserializeObject>(json); + return new ServiceResult(availableMarketDates){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetStopLimit(String symbol) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Portfolio/GetStopLimit?").Append("token=").Append(AccessToken).Append("&").Append("symbol=").Append(symbol); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + if(null==json)return new ServiceResult(null); + StopLimit stopLimit= JsonConvert.DeserializeObject(json); + return new ServiceResult(stopLimit){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetPortfolioTradesWithParityPrice(String symbol) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Portfolio/GetPortfolioTradesWithParityPrice?").Append("token=").Append(AccessToken).Append("&").Append("symbol=").Append(symbol); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + PortfolioTradesWithParityPrice portfolioTradesWithParityPrice= JsonConvert.DeserializeObject(json); + return new ServiceResult(portfolioTradesWithParityPrice){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetPositionsWithDescription() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false, "Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Portfolio/GetOpenPositionsWithDescription?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List positionsWithDescription = JsonConvert.DeserializeObject>(json); + return new ServiceResult(positionsWithDescription){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false, exception.ToString()); + } + } + + public async Task GetWatchList(String watchList) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/WatchList/GetWatchList?").Append("token=").Append(AccessToken).Append("&").Append("watchList=").Append(watchList); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List symbols= JsonConvert.DeserializeObject>(json); + return new ServiceResult(symbols){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetHeadlines(DateTime headlineDate) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Headlines/GetHeadlines?").Append("token=").Append(AccessToken).Append("&").Append("headlineDate=").Append(headlineDate); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List headlines= JsonConvert.DeserializeObject>(json); + return new ServiceResult(headlines){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetHeadlineDates() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Headlines/GetHeadlineDates?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List headlineDates= JsonConvert.DeserializeObject>(json); + return new ServiceResult(headlineDates){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetLatestHeadlines() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."){ElapsedTimeMS=profiler.Stop()}; + StringBuilder sb = new StringBuilder(); + sb.Append("api/Headlines/GetLatestHeadlines?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List latestHeadlines= JsonConvert.DeserializeObject>(json); + return new ServiceResult(latestHeadlines){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetLatestPricingDate() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Price/GetLatestPricingDate?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + DateTime latestPricingDate= JsonConvert.DeserializeObject(json); + return new ServiceResult(latestPricingDate){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetGainLossDetails(DateTime selectedDate,String account) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/GainLoss/GetGainLossWithDetail?").Append("token=").Append(AccessToken).Append("&selectedDate=").Append(selectedDate.ToShortDateString()).Append("&").Append("account=").Append(account); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List gainLossSummaryDetail = JsonConvert.DeserializeObject>(json); + return new ServiceResult(gainLossSummaryDetail){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetGainLossDetails(DateTime selectedDate) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/GainLoss/GetGainLossWithDetail?").Append("token=").Append(AccessToken).Append("&selectedDate=").Append(selectedDate.ToShortDateString()); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List gainLossSummaryDetail = JsonConvert.DeserializeObject>(json); + return new ServiceResult(gainLossSummaryDetail){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetCompoundGainLoss(int selectedDays) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + bool includeDividends=false; + sb.Append("api/GainLoss/GetCompoundGainLoss?").Append("token=").Append(AccessToken).Append("&selectedDays=").Append(selectedDays).Append("&").Append("includeDividends=").Append(includeDividends);; + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + GainLossCompoundModelCollection gainLossCompoundModelCollection = JsonConvert.DeserializeObject(json); + return new ServiceResult(gainLossCompoundModelCollection){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + exceptions.Add(exception); + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetAccountsWithOpenTrades() + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized()) return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Portfolio/GetAccountsWithOpenTrades?").Append("token=").Append(AccessToken); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List accounts = JsonConvert.DeserializeObject>(json); + return new ServiceResult(accounts){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + Console.WriteLine(exception.ToString()); + return null; + } + } + + public async Task GetPrices(String symbol, int days) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized())return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Price/GetPrices?").Append("token=").Append(AccessToken).Append("&").Append("symbol=").Append(symbol).Append("&").Append("days=").Append(days); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List prices = JsonConvert.DeserializeObject>(json); + return new ServiceResult(prices){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetCompanyNameForSymbol(String symbol) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized())return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("api/Price/GetCompanyNameForSymbol?").Append("token=").Append(AccessToken).Append("&").Append("symbol=").Append(symbol); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + String companyName = JsonConvert.DeserializeObject(json); + return new ServiceResult(companyName){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + + public async Task GetBollingerBands(String symbol,int dayCount) + { + try + { + Profiler profiler = new Profiler(); + if (!await IsAuthorized())return new ServiceResult(false,"Unauthorized."); + StringBuilder sb = new StringBuilder(); + sb.Append("/api/Price/GetBollingerBands?").Append("token=").Append(AccessToken).Append("&").Append("symbol=").Append(symbol).Append("&").Append("dayCount=").Append(dayCount); + Console.WriteLine(httpClient.BaseAddress+sb.ToString()); + String json = await httpClient.GetStringAsync(sb.ToString()); + List bollingerBands=JsonConvert.DeserializeObject>(json); + return new ServiceResult(bollingerBands){ElapsedTimeMS=profiler.End()}; + } + catch (Exception exception) + { + Console.WriteLine(exception.ToString()); + return new ServiceResult(false,exception.ToString()); + } + } + } +} diff --git a/eNavigator/eNavigatorUI/_Imports.razor b/eNavigator/eNavigatorUI/_Imports.razor new file mode 100755 index 0000000..87df3f5 --- /dev/null +++ b/eNavigator/eNavigatorUI/_Imports.razor @@ -0,0 +1,11 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using eNavigator +@using eNavigator.Layout +@using MudBlazor diff --git a/eNavigator/eNavigatorUI/eNavigator.csproj b/eNavigator/eNavigatorUI/eNavigator.csproj new file mode 100755 index 0000000..2f05e56 --- /dev/null +++ b/eNavigator/eNavigatorUI/eNavigator.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + CS8765;CS8622;CS8612;CS0108;CS8602;CS8620;CS8618;CS8603;CS8767;CS8625;CS8604;CS8600;CS8604;CS8601 + + + + + + + + + + + + + + + diff --git a/eNavigator/eNavigatorUI/settings.json b/eNavigator/eNavigatorUI/settings.json new file mode 100755 index 0000000..1f45ed2 --- /dev/null +++ b/eNavigator/eNavigatorUI/settings.json @@ -0,0 +1,3 @@ +{ +"debug.javascript.usePreview": false +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/wwwroot/appsettings.json b/eNavigator/eNavigatorUI/wwwroot/appsettings.json new file mode 100644 index 0000000..12456a1 --- /dev/null +++ b/eNavigator/eNavigatorUI/wwwroot/appsettings.json @@ -0,0 +1,7 @@ +{ + "Service_BaseUri": "diversified-software.com", + "Service_BaseUriPort": "8000", + "Service_Protocol": "http://", + "ServiceUser": "sean", + "ServicePassword": "MN5191306" +} diff --git a/eNavigator/eNavigatorUI/wwwroot/css/app.css b/eNavigator/eNavigatorUI/wwwroot/css/app.css new file mode 100755 index 0000000..0a4519e --- /dev/null +++ b/eNavigator/eNavigatorUI/wwwroot/css/app.css @@ -0,0 +1,103 @@ +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css b/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100755 index 0000000..02ae65b --- /dev/null +++ b/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css.map b/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100755 index 0000000..afcd9e3 --- /dev/null +++ b/eNavigator/eNavigatorUI/wwwroot/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`