diff --git a/.vs/Guardian/v17/.wsuo b/.vs/Guardian/v17/.wsuo new file mode 100644 index 00000000..da4e51d0 Binary files /dev/null and b/.vs/Guardian/v17/.wsuo differ diff --git a/.vs/Guardian/v17/DocumentLayout.json b/.vs/Guardian/v17/DocumentLayout.json new file mode 100644 index 00000000..423417ac --- /dev/null +++ b/.vs/Guardian/v17/DocumentLayout.json @@ -0,0 +1,12 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\HP\\OneDrive\\Pictures\\Documents\\GitHub\\Guardian\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [] + } + ] +} \ No newline at end of file diff --git a/.vs/Guardian/v17/workspaceFileList.bin b/.vs/Guardian/v17/workspaceFileList.bin new file mode 100644 index 00000000..62506db4 Binary files /dev/null and b/.vs/Guardian/v17/workspaceFileList.bin differ diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..6b611411 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 00000000..58ede2c5 Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/AI Guardian/Alert_System/Alert_System (1).ipynb b/AI Guardian/Alert_System/Alert_System (1).ipynb new file mode 100644 index 00000000..99556f5d --- /dev/null +++ b/AI Guardian/Alert_System/Alert_System (1).ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"code","execution_count":17,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Xho6wPnq3c9t","outputId":"4e6754f2-35f9-4857-8822-a058bcb00ccc","executionInfo":{"status":"ok","timestamp":1758507911254,"user_tz":-600,"elapsed":2861,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Drvsf3Fq4JtD","outputId":"f3cbaf7b-3b1e-4274-de0d-34b350ca1c0a","executionInfo":{"status":"ok","timestamp":1758507911283,"user_tz":-600,"elapsed":33,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["TF: 2.19.0\n"]}],"source":["# -------- CONFIG --------\n","CSV_PATH = \"/content/drive/MyDrive/New AI spreadsheet - Sheet1.csv\" # <-- change to your path\n","SAVE_DIR = \"/content\" # <-- change to Drive folder if you like\n","\n","PATIENT_ID_COL = \"patientId\"\n","TIME_START_COL = \"observationStart\"\n","TIME_END_COL = \"observationEnd\"\n","\n","# features: vitals + behaviours (includes mealsSkipped now)\n","FEATURE_COLUMNS_RAW = [\n"," \"heartRate\",\"spo2\",\"temperature\",\"bloodPressure\",\n"," \"stepsTaken\",\"calorieIntake\",\"sleepHours\",\"waterIntakeMl\",\n"," \"exerciseMinutes\",\"bathroomVisits\",\"mealsSkipped\"\n","]\n","\n","# sequence config\n","SEQ_LEN = 12\n","SEQ_STRIDE= 1\n","\n","# training config\n","EPOCHS = 30\n","BATCH_SIZE = 64\n","LR = 1e-3\n","VAL_SPLIT = 0.2\n","PATIENCE = 6\n","ANOMALY_PERCENTILE = 95 # for AE fallback\n","\n","# ------------------------\n","import re, json, math, numpy as np, pandas as pd\n","from datetime import datetime\n","from sklearn.preprocessing import StandardScaler\n","from sklearn.model_selection import train_test_split\n","from sklearn.metrics import classification_report, confusion_matrix\n","import matplotlib.pyplot as plt\n","import tensorflow as tf\n","from tensorflow import keras\n","from tensorflow.keras import layers\n","\n","print(\"TF:\", tf.__version__)"]},{"cell_type":"code","execution_count":19,"metadata":{"id":"07Sxqosl4Jpm","executionInfo":{"status":"ok","timestamp":1758507911303,"user_tz":-600,"elapsed":10,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Load ----------\n","df = pd.read_csv(CSV_PATH)\n","\n","# sanity check\n","req_base = [PATIENT_ID_COL, TIME_START_COL] + FEATURE_COLUMNS_RAW\n","missing = [c for c in req_base if c not in df.columns]\n","if missing:\n"," raise ValueError(f\"Missing required columns: {missing}\")"]},{"cell_type":"code","execution_count":20,"metadata":{"id":"8cuVMvN94Jnh","executionInfo":{"status":"ok","timestamp":1758507911317,"user_tz":-600,"elapsed":7,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Parsers ----------\n","def parse_num(x):\n"," if pd.isna(x): return np.nan\n"," if isinstance(x,(int,float)): return float(x)\n"," m = re.search(r\"([\\d\\.]+)\", str(x))\n"," return float(m.group(1)) if m else np.nan\n","\n","def parse_heart_rate(x): return parse_num(x) # \"65 bpm\" -> 65\n","def parse_spo2(x): return parse_num(x) # \"97%\" -> 97\n","def parse_temperature(x):return parse_num(x) # \"36.5 °C\" -> 36.5\n","def parse_bp(x):\n"," if pd.isna(x): return (np.nan, np.nan)\n"," if isinstance(x,(int,float)): return (float(x), np.nan)\n"," m = re.search(r\"(\\d+)\\s*/\\s*(\\d+)\", str(x))\n"," return (float(m.group(1)), float(m.group(2))) if m else (np.nan,np.nan)\n"]},{"cell_type":"code","execution_count":21,"metadata":{"id":"JBhKwLDT4JlN","executionInfo":{"status":"ok","timestamp":1758507911333,"user_tz":-600,"elapsed":9,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Timestamp & sort ----------\n","df[\"_ts\"] = pd.to_datetime(df[TIME_START_COL], errors=\"coerce\")\n","df = df.dropna(subset=[\"_ts\", PATIENT_ID_COL]).copy()\n","df = df.sort_values([PATIENT_ID_COL, \"_ts\"]).reset_index(drop=True)"]},{"cell_type":"code","execution_count":22,"metadata":{"id":"vXJONJA74Jix","executionInfo":{"status":"ok","timestamp":1758507911407,"user_tz":-600,"elapsed":60,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Parse features ----------\n","df[\"_hr\"] = df[\"heartRate\"].apply(parse_heart_rate)\n","df[\"_spo2\"] = df[\"spo2\"].apply(parse_spo2)\n","df[\"_temp\"] = df[\"temperature\"].apply(parse_temperature)\n","bp = df[\"bloodPressure\"].apply(parse_bp)\n","df[\"_bp_sys\"] = [b[0] for b in bp]\n","df[\"_bp_dia\"] = [b[1] for b in bp]\n","df[\"_steps\"] = df[\"stepsTaken\"].apply(parse_num) if \"stepsTaken\" in df.columns else np.nan\n","df[\"_cal\"] = df[\"calorieIntake\"].apply(parse_num) if \"calorieIntake\" in df.columns else np.nan\n","df[\"_sleep\"] = df[\"sleepHours\"].apply(parse_num) if \"sleepHours\" in df.columns else np.nan\n","df[\"_water\"] = df[\"waterIntakeMl\"].apply(parse_num) if \"waterIntakeMl\" in df.columns else np.nan\n","df[\"_exercise\"]= df[\"exerciseMinutes\"].apply(parse_num) if \"exerciseMinutes\" in df.columns else np.nan\n","df[\"_bathroom\"]= df[\"bathroomVisits\"].apply(parse_num) if \"bathroomVisits\" in df.columns else np.nan\n","df[\"_meals\"] = df[\"mealsSkipped\"].apply(parse_num) if \"mealsSkipped\" in df.columns else np.nan\n","\n","FEATURE_COLS = [\"_hr\",\"_spo2\",\"_temp\",\"_bp_sys\",\"_bp_dia\",\"_steps\",\"_cal\",\"_sleep\",\"_water\",\"_exercise\",\"_bathroom\",\"_meals\"]"]},{"cell_type":"code","execution_count":23,"metadata":{"id":"qHZAIDzO4JgJ","executionInfo":{"status":"ok","timestamp":1758507911446,"user_tz":-600,"elapsed":30,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# drop rows where all features NaN\n","df = df.dropna(subset=FEATURE_COLS, how=\"all\").copy()"]},{"cell_type":"code","execution_count":24,"metadata":{"id":"mcE8cwjn4Jdr","executionInfo":{"status":"ok","timestamp":1758507911467,"user_tz":-600,"elapsed":16,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["for col in FEATURE_COLS:\n"," df[col] = df.groupby(PATIENT_ID_COL)[col].ffill().bfill()\n","\n","df[FEATURE_COLS] = df[FEATURE_COLS].fillna(df[FEATURE_COLS].median())"]},{"cell_type":"code","execution_count":25,"metadata":{"id":"D8hU3PiZ4JbL","executionInfo":{"status":"ok","timestamp":1758507911520,"user_tz":-600,"elapsed":48,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Optional labels (state) ----------\n","def clean_state(s):\n"," if pd.isna(s): return None\n"," s = str(s).strip().lower()\n"," if s in (\"\", \"nan\", \"none\"): return None\n"," return s\n","\n","if \"state\" in df.columns:\n"," df[\"_state_clean\"] = df[\"state\"].apply(clean_state)\n","else:\n"," df[\"_state_clean\"] = None"]},{"cell_type":"code","execution_count":26,"metadata":{"id":"oPx2jQIY4JYs","executionInfo":{"status":"ok","timestamp":1758507911559,"user_tz":-600,"elapsed":31,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"860d8e6d-5879-413a-992d-0f954500ca26"},"outputs":[{"output_type":"stream","name":"stdout","text":["Labels detected for supervised training? True\n"]}],"source":["# Map common labels to 3-class risk {Low, Medium, High}\n","state_map = {\n"," \"low\": \"low\", \"normal\": \"low\", \"ok\": \"low\", \"stable\": \"low\",\n"," \"medium\": \"medium\", \"moderate\": \"medium\",\n"," \"high\": \"high\", \"critical\": \"high\", \"alert\": \"high\", \"abnormal\": \"high\"\n","}\n","def map_to_risk(s):\n"," if s is None: return None\n"," # accept phrases like \"high risk\", \"medium alert\"\n"," if \"high\" in s: return \"high\"\n"," if \"medium\" in s or \"moderate\" in s: return \"medium\"\n"," if \"low\" in s or \"normal\" in s or \"stable\" in s or \"ok\" in s: return \"low\"\n"," # fallback via dict exacts\n"," return state_map.get(s, None)\n","\n","df[\"_risk3\"] = df[\"_state_clean\"].apply(map_to_risk)\n","has_labels = df[\"_risk3\"].notna().any()\n","\n","print(\"Labels detected for supervised training?\" , has_labels)"]},{"cell_type":"code","execution_count":27,"metadata":{"id":"dh623n0Z4JWO","executionInfo":{"status":"ok","timestamp":1758507911566,"user_tz":-600,"elapsed":4,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}}},"outputs":[],"source":["# --------- Scale ----------\n","scaler = StandardScaler()\n","df_scaled = df.copy()\n","df_scaled[FEATURE_COLS] = scaler.fit_transform(df[FEATURE_COLS])"]},{"cell_type":"code","execution_count":28,"metadata":{"id":"kyeSLjYy50CW","executionInfo":{"status":"ok","timestamp":1758507911602,"user_tz":-600,"elapsed":33,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"5a7ec35a-4f30-42c7-cf50-755efd437b91"},"outputs":[{"output_type":"stream","name":"stdout","text":["X shape: (1755, 12, 12) | y shape: (1755,)\n"]}],"source":["# --------- Build sequences per patient ----------\n","def build_sequences(group, seq_len=SEQ_LEN, stride=SEQ_STRIDE, include_labels=False):\n"," X, y, meta = [], [], []\n"," feats = group[FEATURE_COLS].values\n"," times = group[\"_ts\"].values\n"," risks = group[\"_risk3\"].values if include_labels else None\n","\n"," for i in range(0, len(feats) - seq_len + 1, stride):\n"," X.append(feats[i:i+seq_len])\n"," if include_labels:\n"," # label at sequence end (you can choose majority vote instead)\n"," lbl = risks[i+seq_len-1]\n"," y.append(lbl)\n"," meta.append((i, i+seq_len-1, times[i+seq_len-1]))\n"," X = np.array(X, dtype=np.float32)\n"," y = np.array(y) if include_labels else None\n"," return X, y, meta\n","\n","all_X, all_y, all_meta = [], [], []\n","for pid, g in df_scaled.groupby(PATIENT_ID_COL):\n"," Xp, yp, mp = build_sequences(g, include_labels=has_labels)\n"," if len(Xp) > 0:\n"," all_X.append(Xp)\n"," all_meta += [(pid, *m) for m in mp]\n"," if has_labels:\n"," all_y.append(yp)\n","\n","X = np.concatenate(all_X, axis=0)\n","y = np.concatenate(all_y, axis=0) if has_labels else None\n","\n","print(\"X shape:\", X.shape, \"| y shape:\", (None if y is None else y.shape))"]},{"cell_type":"code","execution_count":29,"metadata":{"id":"M64KyHbi5z-2","executionInfo":{"status":"ok","timestamp":1758508000176,"user_tz":-600,"elapsed":88575,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"35742ead-984e-4ac2-c893-5edf9c33f7b0"},"outputs":[{"output_type":"stream","name":"stdout","text":["Only one (or zero) label present after windowing -> switching to Autoencoder path.\n","[AE] Total sequences: 1755 | meta entries: 1755\n"]},{"output_type":"display_data","data":{"text/plain":["\u001b[1mModel: \"functional_1\"\u001b[0m\n"],"text/html":["
Model: \"functional_1\"\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ input_layer_1 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_4 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m72,192\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_5 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m49,408\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m2,080\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ repeat_vector_1 (\u001b[38;5;33mRepeatVector\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_6 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m24,832\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_7 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m98,816\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ time_distributed_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m1,548\u001b[0m │\n","│ (\u001b[38;5;33mTimeDistributed\u001b[0m) │ │ │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n"],"text/html":["
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃ Layer (type)                     Output Shape                  Param # ┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ input_layer_1 (InputLayer)      │ (None, 12, 12)         │             0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_4 (LSTM)                   │ (None, 12, 128)        │        72,192 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_5 (LSTM)                   │ (None, 64)             │        49,408 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense_2 (Dense)                 │ (None, 32)             │         2,080 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ repeat_vector_1 (RepeatVector)  │ (None, 12, 32)         │             0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_6 (LSTM)                   │ (None, 12, 64)         │        24,832 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm_7 (LSTM)                   │ (None, 12, 128)        │        98,816 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ time_distributed_1              │ (None, 12, 12)         │         1,548 │\n","│ (TimeDistributed)               │                        │               │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Total params: \u001b[0m\u001b[38;5;34m248,876\u001b[0m (972.17 KB)\n"],"text/html":["
 Total params: 248,876 (972.17 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m248,876\u001b[0m (972.17 KB)\n"],"text/html":["
 Trainable params: 248,876 (972.17 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"],"text/html":["
 Non-trainable params: 0 (0.00 B)\n","
\n"]},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Epoch 1/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 136ms/step - loss: 0.9988 - val_loss: 0.9348\n","Epoch 2/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 133ms/step - loss: 0.9560 - val_loss: 0.9131\n","Epoch 3/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 101ms/step - loss: 0.9099 - val_loss: 0.8882\n","Epoch 4/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 75ms/step - loss: 0.8896 - val_loss: 0.8690\n","Epoch 5/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 73ms/step - loss: 0.8678 - val_loss: 0.8495\n","Epoch 6/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 76ms/step - loss: 0.8407 - val_loss: 0.8306\n","Epoch 7/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 81ms/step - loss: 0.8288 - val_loss: 0.8119\n","Epoch 8/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 91ms/step - loss: 0.8134 - val_loss: 0.7950\n","Epoch 9/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 136ms/step - loss: 0.8035 - val_loss: 0.7829\n","Epoch 10/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 74ms/step - loss: 0.7695 - val_loss: 0.7786\n","Epoch 11/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 70ms/step - loss: 0.7701 - val_loss: 0.7691\n","Epoch 12/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 76ms/step - loss: 0.7577 - val_loss: 0.7591\n","Epoch 13/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 75ms/step - loss: 0.7348 - val_loss: 0.7287\n","Epoch 14/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 136ms/step - loss: 0.7169 - val_loss: 0.7187\n","Epoch 15/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 75ms/step - loss: 0.7142 - val_loss: 0.6927\n","Epoch 16/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 73ms/step - loss: 0.6893 - val_loss: 0.6889\n","Epoch 17/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 75ms/step - loss: 0.6893 - val_loss: 0.6776\n","Epoch 18/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 94ms/step - loss: 0.6643 - val_loss: 0.6571\n","Epoch 19/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 139ms/step - loss: 0.6555 - val_loss: 0.6483\n","Epoch 20/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 74ms/step - loss: 0.6492 - val_loss: 0.6493\n","Epoch 21/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 76ms/step - loss: 0.6331 - val_loss: 0.6617\n","Epoch 22/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 74ms/step - loss: 0.6499 - val_loss: 0.6405\n","Epoch 23/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 74ms/step - loss: 0.6222 - val_loss: 0.6398\n","Epoch 24/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 82ms/step - loss: 0.6127 - val_loss: 0.6309\n","Epoch 25/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 122ms/step - loss: 0.6240 - val_loss: 0.6283\n","Epoch 26/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 73ms/step - loss: 0.5987 - val_loss: 0.6153\n","Epoch 27/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 73ms/step - loss: 0.5936 - val_loss: 0.6047\n","Epoch 28/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 72ms/step - loss: 0.5871 - val_loss: 0.6111\n","Epoch 29/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 80ms/step - loss: 0.5852 - val_loss: 0.6017\n","Epoch 30/30\n","\u001b[1m22/22\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 123ms/step - loss: 0.5815 - val_loss: 0.6004\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["[AE] Threshold p95: 0.950427\n","Saved: /content/guardian_lstm_autoencoder.keras /content/scaler.npy /content/guardian_ae_predictions.csv\n","Notebook ready: trains classifier if labels exist; otherwise trains AE fallback.\n"]}],"source":["# SUPERVISED: LSTM Classifier (if labels exist)\n","if has_labels:\n"," # Drop sequences with unknown labels first (built earlier when constructing y)\n"," unique_labels = pd.Series(y).dropna().unique().tolist()\n"," if len(unique_labels) < 2:\n"," print(\"Only one (or zero) label present after windowing -> switching to Autoencoder path.\")\n"," has_labels = False # force AE path below\n","\n","if has_labels:\n"," # Determine final label set and index mapping\n"," # Keep canonical order but only include present classes\n"," canonical = [\"low\", \"medium\", \"high\"]\n"," present = [c for c in canonical if c in unique_labels]\n"," cls_to_idx = {c: i for i, c in enumerate(present)}\n","\n"," # Filter to present classes only\n"," keep = np.array([lbl in cls_to_idx for lbl in y])\n"," X = X[keep]\n"," y = y[keep]\n"," filtered_all_meta = [all_meta[i] for i, v in enumerate(keep) if v]\n"," y_idx = np.array([cls_to_idx[lbl] for lbl in y], dtype=np.int64)\n","\n"," timesteps, n_features = X.shape[1], X.shape[2]\n","\n"," # Choose head: binary vs softmax\n"," num_classes = len(present)\n"," binary_mode = (num_classes == 2)\n","\n"," # Safe split: only stratify when >1 class and class counts okay\n"," try:\n"," X_train, X_val, y_train, y_val = train_test_split(\n"," X, y_idx, test_size=VAL_SPLIT, random_state=42, stratify=y_idx\n"," )\n"," except Exception as e:\n"," print(\"Stratified split failed (often due to tiny class counts). Falling back to non-stratified split.\", e)\n"," X_train, X_val, y_train, y_val = train_test_split(\n"," X, y_idx, test_size=VAL_SPLIT, random_state=42, shuffle=True\n"," )\n","\n"," # Model\n"," inputs = keras.Input(shape=(timesteps, n_features))\n"," x = layers.Masking()(inputs)\n"," x = layers.LSTM(128, return_sequences=True, dropout=0.2)(x)\n"," x = layers.LSTM(64, return_sequences=False, dropout=0.2)(x)\n"," x = layers.Dense(64, activation=\"relu\")(x)\n"," x = layers.Dropout(0.3)(x)\n","\n"," if binary_mode:\n"," outputs = layers.Dense(1, activation=\"sigmoid\")(x)\n"," loss_fn = \"binary_crossentropy\"\n"," metrics = [\"accuracy\"]\n"," else:\n"," outputs = layers.Dense(num_classes, activation=\"softmax\")(x)\n"," loss_fn = \"sparse_categorical_crossentropy\"\n"," metrics = [\"accuracy\"]\n","\n"," clf = keras.Model(inputs, outputs)\n"," clf.compile(optimizer=keras.optimizers.Adam(LR), loss=loss_fn, metrics=metrics)\n"," clf.summary()\n","\n"," cb = [keras.callbacks.EarlyStopping(monitor=\"val_loss\", patience=PATIENCE, restore_best_weights=True)]\n"," hist = clf.fit(X_train, y_train, validation_data=(X_val, y_val),\n"," epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=cb, verbose=1)\n","\n"," # Plots\n"," plt.figure(figsize=(6,4))\n"," plt.plot(hist.history[\"loss\"], label=\"train_loss\")\n"," plt.plot(hist.history[\"val_loss\"], label=\"val_loss\")\n"," plt.xlabel(\"Epoch\"); plt.ylabel(\"Loss\"); plt.title(\"Classifier Training\"); plt.legend(); plt.show()\n","\n"," # Evaluation\n"," if binary_mode:\n"," y_prob = clf.predict(X_val, batch_size=256, verbose=0).ravel()\n"," y_pred_val = (y_prob >= 0.5).astype(int)\n"," target_names = [present[i] for i in sorted(range(num_classes))]\n"," else:\n"," y_pred_val = np.argmax(clf.predict(X_val, batch_size=256, verbose=0), axis=1)\n"," target_names = [present[i] for i in sorted(np.unique(y_val))]\n","\n"," from sklearn.metrics import classification_report, confusion_matrix\n"," print(classification_report(y_val, y_pred_val, target_names=target_names))\n"," print(\"Confusion matrix:\\n\", confusion_matrix(y_val, y_pred_val))\n","\n"," # Save model + scaler\n"," MODEL_PATH = f\"{SAVE_DIR}/guardian_lstm_classifier.keras\"\n"," SCALER_PATH = f\"{SAVE_DIR}/scaler.npy\"\n"," np.save(SCALER_PATH, {\"mean_\": scaler.mean_, \"scale_\": scaler.scale_, \"feature_names\": FEATURE_COLS}, allow_pickle=True)\n"," clf.save(MODEL_PATH)\n"," print(\"Saved:\", MODEL_PATH, \"and\", SCALER_PATH)\n","\n"," # Predictions for ALL sequences (filtered)\n"," if binary_mode:\n"," y_prob_all = clf.predict(X, batch_size=256, verbose=0).ravel()\n"," y_pred_all = (y_prob_all >= 0.5).astype(int)\n"," inv_idx = {i: c for c, i in cls_to_idx.items()}\n"," risk_pred = [inv_idx[i] for i in y_pred_all]\n"," else:\n"," y_pred_all = np.argmax(clf.predict(X, batch_size=256, verbose=0), axis=1)\n"," inv_idx = {i: c for c, i in cls_to_idx.items()}\n"," risk_pred = [inv_idx[i] for i in y_pred_all]\n","\n"," res = pd.DataFrame({\n"," \"patientId_seqEnd\": [m[0] for m in filtered_all_meta],\n"," \"seq_start_idx\": [m[1] for m in filtered_all_meta],\n"," \"seq_end_idx\": [m[2] for m in filtered_all_meta],\n"," \"seq_end_time\": [m[3] for m in filtered_all_meta],\n"," \"risk_pred\": risk_pred\n"," })\n"," res[\"risk_true\"] = [inv_idx[i] for i in y_idx]\n"," OUT_PATH = f\"{SAVE_DIR}/guardian_classifier_predictions.csv\"\n"," res.to_csv(OUT_PATH, index=False)\n"," print(\"Saved predictions:\", OUT_PATH)\n","\n","\n","# =========================\n","# UNSUPERVISED: LSTM Autoencoder (fallback)\n","# =========================\n","else:\n"," # Debug: check sequence/meta sizes before split\n"," print(f\"[AE] Total sequences: {len(X)} | meta entries: {len(all_meta)}\")\n","\n"," X_train, X_val = train_test_split(X, test_size=VAL_SPLIT, random_state=42, shuffle=True)\n"," timesteps, n_features = X.shape[1], X.shape[2]\n","\n"," inputs = keras.Input(shape=(timesteps, n_features))\n"," # Encoder\n"," x = layers.LSTM(128, return_sequences=True)(inputs)\n"," x = layers.LSTM(64, return_sequences=False)(x)\n"," encoded = layers.Dense(32, activation=\"relu\")(x)\n"," # Decoder\n"," x = layers.RepeatVector(timesteps)(encoded)\n"," x = layers.LSTM(64, return_sequences=True)(x)\n"," x = layers.LSTM(128, return_sequences=True)(x)\n"," outputs = layers.TimeDistributed(layers.Dense(n_features))(x)\n","\n"," ae = keras.Model(inputs, outputs)\n"," ae.compile(optimizer=keras.optimizers.Adam(LR), loss=\"mse\")\n"," ae.summary()\n","\n"," cb = [keras.callbacks.EarlyStopping(monitor=\"val_loss\", patience=PATIENCE, restore_best_weights=True)]\n"," hist = ae.fit(X_train, X_train, validation_data=(X_val, X_val),\n"," epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=cb, verbose=1)\n","\n"," # Plot\n"," plt.figure(figsize=(6,4))\n"," plt.plot(hist.history[\"loss\"], label=\"train_loss\")\n"," plt.plot(hist.history[\"val_loss\"], label=\"val_loss\")\n"," plt.xlabel(\"Epoch\"); plt.ylabel(\"MSE\"); plt.title(\"Autoencoder Training\"); plt.legend(); plt.show()\n","\n"," # Errors\n"," def recon_err(m, Xb):\n"," Xh = m.predict(Xb, batch_size=256, verbose=0)\n"," return np.mean((Xh - Xb)**2, axis=(1,2))\n","\n"," train_err = recon_err(ae, X_train)\n"," thr = np.percentile(train_err, ANOMALY_PERCENTILE)\n"," print(f\"[AE] Threshold p{ANOMALY_PERCENTILE}: {thr:.6f}\")\n","\n"," all_err = recon_err(ae, X)\n"," is_anom = (all_err >= thr).astype(int)\n","\n"," def err_to_risk(e, t):\n"," if e < t: return \"low\"\n"," elif e < 1.5*t: return \"medium\"\n"," else: return \"high\"\n","\n"," risk = [err_to_risk(e, thr) for e in all_err]\n","\n"," # --- Align meta and error arrays if lengths differ (common after partial re-runs)\n"," len_meta = len(all_meta)\n"," len_err = len(all_err)\n"," if len_meta != len_err:\n"," print(f\"[AE] Warning: meta ({len_meta}) != errors ({len_err}). Aligning to min length.\")\n"," k = min(len_meta, len_err)\n"," all_meta = all_meta[:k]\n"," all_err = all_err[:k]\n"," is_anom = is_anom[:k]\n"," risk = risk[:k]\n","\n"," # Build results\n"," res = pd.DataFrame({\n"," \"patientId_seqEnd\": [m[0] for m in all_meta],\n"," \"seq_start_idx\": [m[1] for m in all_meta],\n"," \"seq_end_idx\": [m[2] for m in all_meta],\n"," \"seq_end_time\": [m[3] for m in all_meta],\n"," \"recon_error\": all_err,\n"," \"is_anomaly\": is_anom,\n"," \"risk_pred\": risk\n"," })\n","\n"," # Save artifacts\n"," MODEL_PATH = f\"{SAVE_DIR}/guardian_lstm_autoencoder.keras\"\n"," SCALER_PATH = f\"{SAVE_DIR}/scaler.npy\"\n"," np.save(SCALER_PATH, {\"mean_\": scaler.mean_, \"scale_\": scaler.scale_, \"feature_names\": FEATURE_COLS}, allow_pickle=True)\n"," ae.save(MODEL_PATH)\n","\n"," OUT_PATH = f\"{SAVE_DIR}/guardian_ae_predictions.csv\"\n"," res.to_csv(OUT_PATH, index=False)\n"," print(\"Saved:\", MODEL_PATH, SCALER_PATH, OUT_PATH)\n","\n","# =========================\n","# Inference helper (later for API)\n","# =========================\n","def make_sequence_from_rows(rows_df, scaler_obj=None, feature_cols=FEATURE_COLS, seq_len=SEQ_LEN):\n"," tmp = rows_df.copy()\n"," # parse again\n"," tmp[\"_hr\"] = tmp[\"heartRate\"].apply(parse_heart_rate)\n"," tmp[\"_spo2\"] = tmp[\"spo2\"].apply(parse_spo2)\n"," tmp[\"_temp\"] = tmp[\"temperature\"].apply(parse_temperature)\n"," bp = tmp[\"bloodPressure\"].apply(parse_bp)\n"," tmp[\"_bp_sys\"] = [b[0] for b in bp]\n"," tmp[\"_bp_dia\"] = [b[1] for b in bp]\n"," tmp[\"_steps\"] = tmp[\"stepsTaken\"].apply(parse_num) if \"stepsTaken\" in tmp.columns else np.nan\n"," tmp[\"_cal\"] = tmp[\"calorieIntake\"].apply(parse_num) if \"calorieIntake\" in tmp.columns else np.nan\n"," tmp[\"_sleep\"] = tmp[\"sleepHours\"].apply(parse_num) if \"sleepHours\" in tmp.columns else np.nan\n"," tmp[\"_water\"] = tmp[\"waterIntakeMl\"].apply(parse_num) if \"waterIntakeMl\" in tmp.columns else np.nan\n"," tmp[\"_exercise\"]= tmp[\"exerciseMinutes\"].apply(parse_num) if \"exerciseMinutes\" in tmp.columns else np.nan\n"," tmp[\"_bathroom\"]= tmp[\"bathroomVisits\"].apply(parse_num) if \"bathroomVisits\" in tmp.columns else np.nan\n"," tmp[\"_meals\"] = tmp[\"mealsSkipped\"].apply(parse_num) if \"mealsSkipped\" in tmp.columns else np.nan\n","\n"," tmp = tmp.sort_values(TIME_START_COL)\n"," feats = tmp[feature_cols].ffill().bfill()\n"," feats = feats.fillna(feats.median())\n","\n"," if scaler_obj is not None:\n"," # scaler_obj should be dict with mean_ and scale_\n"," mean_ = np.array(scaler_obj.item().get(\"mean_\")) if hasattr(scaler_obj, \"item\") else scaler_obj[\"mean_\"]\n"," scale_= np.array(scaler_obj.item().get(\"scale_\")) if hasattr(scaler_obj, \"item\") else scaler_obj[\"scale_\"]\n"," feats = (feats.values - mean_) / scale_\n"," else:\n"," # If scaler_obj is None, return the raw (filled) features\n"," feats = feats.values\n","\n"," if len(feats) != seq_len:\n"," raise ValueError(f\"Need exactly {seq_len} rows to form one sequence, got {len(feats)}.\")\n"," return np.expand_dims(feats.astype(np.float32), axis=0)\n","\n","print(\"Notebook ready: trains classifier if labels exist; otherwise trains AE fallback.\")"]},{"cell_type":"code","execution_count":30,"metadata":{"id":"hRF4MaHg5z5p","executionInfo":{"status":"ok","timestamp":1758508000290,"user_tz":-600,"elapsed":104,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"0829b8f7-44a4-40b4-ea45-0884c0ba3dc3"},"outputs":[{"output_type":"stream","name":"stdout","text":["=== Defining Behavioral Features ===\n","Behavioral features defined: ['stepsTaken', 'calorieIntake', 'sleepHours', 'waterIntakeMl', 'exerciseMinutes', 'bathroomVisits', 'mealsSkipped']\n","=== Implementing Alert Logic ===\n","Behavioral alert levels calculated successfully!\n","Alert distribution:\n","behavioral_alert\n","medium 1873\n","high 47\n","Name: count, dtype: int64\n"]}],"source":["# =========================\n","# DEFINE BEHAVIORAL FEATURES\n","# =========================\n","print(\"=== Defining Behavioral Features ===\")\n","\n","BEHAVIORAL_FEATURES = [\n"," \"stepsTaken\", \"calorieIntake\", \"sleepHours\", \"waterIntakeMl\",\n"," \"exerciseMinutes\", \"bathroomVisits\", \"mealsSkipped\"\n","]\n","\n","print(\"Behavioral features defined:\", BEHAVIORAL_FEATURES)\n","\n","# =========================\n","# ALERT LOGIC IMPLEMENTATION\n","# =========================\n","print(\"=== Implementing Alert Logic ===\")\n","\n","# Define alert thresholds for behavioral features\n","ALERT_THRESHOLDS = {\n"," 'stepsTaken': {'low': 2000, 'high': 15000, 'critical_low': 1000, 'critical_high': 20000},\n"," 'calorieIntake': {'low': 1200, 'high': 3500, 'critical_low': 800, 'critical_high': 4500},\n"," 'sleepHours': {'low': 4, 'high': 10, 'critical_low': 3, 'critical_high': 12},\n"," 'waterIntakeMl': {'low': 1500, 'high': 4000, 'critical_low': 1000, 'critical_high': 5000},\n"," 'exerciseMinutes': {'low': 15, 'high': 120, 'critical_low': 5, 'critical_high': 180},\n"," 'bathroomVisits': {'low': 3, 'high': 12, 'critical_low': 1, 'critical_high': 15},\n"," 'mealsSkipped': {'low': 0, 'high': 2, 'critical_low': 0, 'critical_high': 3}\n","}\n","\n","def calculate_behavioral_alert_level(row):\n"," \"\"\"\n"," Calculate risk level based on behavioral feature thresholds\n"," Returns: 'low', 'medium', or 'high'\n"," \"\"\"\n"," alert_scores = []\n","\n"," for feature in BEHAVIORAL_FEATURES:\n"," if feature in row and not pd.isna(row[feature]):\n"," value = parse_num(row[feature])\n"," thresholds = ALERT_THRESHOLDS[feature]\n","\n"," if value < thresholds['critical_low'] or value > thresholds['critical_high']:\n"," # High alert for extreme values\n"," alert_scores.append(2)\n"," elif value < thresholds['low'] or value > thresholds['high']:\n"," # Medium alert for borderline values\n"," alert_scores.append(1)\n"," else:\n"," # Low alert for normal values\n"," alert_scores.append(0)\n","\n"," if not alert_scores:\n"," return \"low\"\n","\n"," avg_score = sum(alert_scores) / len(alert_scores)\n","\n"," if avg_score >= 1.5:\n"," return \"high\"\n"," elif avg_score >= 0.5:\n"," return \"medium\"\n"," else:\n"," return \"low\"\n","\n","# Apply alert logic to the dataframe\n","df['behavioral_alert'] = df.apply(calculate_behavioral_alert_level, axis=1)\n","\n","print(\"Behavioral alert levels calculated successfully!\")\n","print(\"Alert distribution:\")\n","print(df['behavioral_alert'].value_counts())"]},{"cell_type":"code","source":["# ===== Simple classifier from behaviour features (RF + MLP) =====\n","import numpy as np\n","import pandas as pd\n","from sklearn.model_selection import train_test_split\n","from sklearn.metrics import classification_report\n","from sklearn.ensemble import RandomForestClassifier\n","from sklearn.neural_network import MLPClassifier\n","import joblib\n","\n","print(\"=== Training Behavioral Sequence Classifier ===\")\n","\n","# Load the AE predictions\n","ae_df = pd.read_csv(f\"{SAVE_DIR}/guardian_ae_predictions.csv\", parse_dates=[\"seq_end_time\"])\n","\n","# Build compact tabular features per sequence from X\n","def seq_vector(seq):\n"," B = seq # (T,F)\n"," mu = B.mean(axis=0); sd = B.std(axis=0)\n"," last = B[-1]; delta = B[-1] - B[0]\n"," t = np.arange(B.shape[0])[:, None]; t_c = t - t.mean()\n"," slope = (t_c*(B - B.mean(axis=0))).sum(axis=0) / (t_c**2).sum()\n"," return np.concatenate([mu, sd, last, delta, slope], axis=0)\n","\n","# Create feature vectors from sequences\n","Z = np.vstack([seq_vector(x) for x in X]) # features from your sequences\n","y_bin = (ae_df[\"risk_pred\"].isin([\"medium\",\"high\"])).astype(int).to_numpy() # weak labels\n","\n","print(f\"Feature matrix shape: {Z.shape}\")\n","print(f\"Target labels shape: {y_bin.shape}\")\n","print(f\"Class distribution: {pd.Series(y_bin).value_counts()}\")\n","\n","# Split data\n","Z_tr, Z_te, y_tr, y_te = train_test_split(Z, y_bin, test_size=0.2, stratify=y_bin, random_state=42)\n","\n","print(f\"Shape of Z_tr: {Z_tr.shape}\")\n","print(f\"Shape of y_tr: {y_tr.shape}\")\n","print(f\"Shape of Z_te: {Z_te.shape}\")\n","print(f\"Shape of y_te: {y_te.shape}\")\n","\n","# Train Random Forest\n","print(\"\\n--- Training Random Forest ---\")\n","rf = RandomForestClassifier(n_estimators=400, class_weight=\"balanced\", random_state=42, n_jobs=-1)\n","rf.fit(Z_tr, y_tr)\n","print(\"[RF]\\n\", classification_report(y_te, rf.predict(Z_te), zero_division=0))\n","\n","# Train MLP\n","print(\"\\n--- Training MLP ---\")\n","mlp = MLPClassifier(hidden_layer_sizes=(64,32), activation=\"relu\", max_iter=200,\n"," early_stopping=True, random_state=42, validation_fraction=0.1)\n","mlp.fit(Z_tr, y_tr)\n","print(\"[MLP]\\n\", classification_report(y_te, mlp.predict(Z_te), zero_division=0))\n","\n","# Save models\n","joblib.dump(rf, f\"{SAVE_DIR}/guardian_behavior_rf.joblib\")\n","joblib.dump(mlp, f\"{SAVE_DIR}/guardian_behavior_mlp.joblib\")\n","print(\"Models saved successfully!\")\n","\n","# Create predictions for all sequences\n","def prob_to_risk(p): # map prob → Low/Med/High\n"," return \"low\" if p < 0.30 else (\"medium\" if p < 0.60 else \"high\")\n","\n","rf_prob = rf.predict_proba(Z)[:,1]\n","mlp_prob = mlp.predict_proba(Z)[:,1]\n","\n","# Create output DataFrame\n","out = pd.DataFrame({\n"," \"patientId_seqEnd\": ae_df[\"patientId_seqEnd\"],\n"," \"seq_end_time\": ae_df[\"seq_end_time\"],\n"," \"rf_prob\": rf_prob,\n"," \"rf_risk\": [prob_to_risk(p) for p in rf_prob],\n"," \"mlp_prob\": mlp_prob,\n"," \"mlp_risk\": [prob_to_risk(p) for p in mlp_prob],\n","})\n","out.to_csv(f\"{SAVE_DIR}/guardian_classifier_predictions.csv\", index=False)\n","print(f\"Saved {SAVE_DIR}/guardian_classifier_predictions.csv\")\n","\n","# ===== CREATE COMBINED ALERTS DASHBOARD =====\n","print(\"\\n=== Creating Combined Alerts Dashboard ===\")\n","\n","# Load both prediction files\n","ae = pd.read_csv(f\"{SAVE_DIR}/guardian_ae_predictions.csv\", parse_dates=[\"seq_end_time\"])\n","clf = pd.read_csv(f\"{SAVE_DIR}/guardian_classifier_predictions.csv\", parse_dates=[\"seq_end_time\"])\n","\n","# Merge AE and classifier predictions\n","alerts = ae[[\"patientId_seqEnd\",\"seq_end_time\",\"recon_error\",\"risk_pred\"]].merge(\n"," clf[[\"patientId_seqEnd\",\"seq_end_time\",\"rf_prob\",\"rf_risk\",\"mlp_prob\",\"mlp_risk\"]],\n"," on=[\"patientId_seqEnd\",\"seq_end_time\"], how=\"outer\"\n",").rename(columns={\"patientId_seqEnd\":\"user_id\",\"seq_end_time\":\"timestamp\"})\n","\n","# Choose one risk for dashboard (prefer RF if present, else AE)\n","alerts[\"risk\"] = alerts[\"rf_risk\"].fillna(alerts[\"risk_pred\"])\n","alerts = alerts.sort_values([\"risk\",\"timestamp\"], key=lambda s: s.map({\"high\":0,\"medium\":1,\"low\":2}))\n","\n","# Save full dashboard\n","alerts.to_csv(f\"{SAVE_DIR}/alerts_dashboard.csv\", index=False)\n","\n","# Create top alerts (high and medium risk only)\n","top = alerts[alerts[\"risk\"].isin([\"high\",\"medium\"])].sort_values([\"risk\",\"timestamp\"], ascending=[True, False]).head(30)\n","top.to_csv(f\"{SAVE_DIR}/top_alerts.csv\", index=False)\n","\n","print(\"Dashboard columns:\", alerts.columns.tolist())\n","print(f\"Saved {SAVE_DIR}/alerts_dashboard.csv\")\n","print(f\"Saved {SAVE_DIR}/top_alerts.csv\")\n","print(f\"Total alerts: {len(alerts)}\")\n","print(f\"High risk alerts: {len(alerts[alerts['risk'] == 'high'])}\")\n","print(f\"Medium risk alerts: {len(alerts[alerts['risk'] == 'medium'])}\")\n","print(f\"Low risk alerts: {len(alerts[alerts['risk'] == 'low'])}\")\n","\n","# Show sample of top alerts\n","print(\"\\n=== Top 5 High/Medium Risk Alerts ===\")\n","print(top[['user_id', 'timestamp', 'risk', 'recon_error', 'rf_prob']].head().to_string(index=False))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"kJTH0ceaKm0y","executionInfo":{"status":"ok","timestamp":1758508003653,"user_tz":-600,"elapsed":3356,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"outputId":"735478db-746f-43e8-e098-ceccd84ef6c8"},"execution_count":31,"outputs":[{"output_type":"stream","name":"stdout","text":["=== Training Behavioral Sequence Classifier ===\n","Feature matrix shape: (1755, 60)\n","Target labels shape: (1755,)\n","Class distribution: 0 1664\n","1 91\n","Name: count, dtype: int64\n","Shape of Z_tr: (1404, 60)\n","Shape of y_tr: (1404,)\n","Shape of Z_te: (351, 60)\n","Shape of y_te: (351,)\n","\n","--- Training Random Forest ---\n","[RF]\n"," precision recall f1-score support\n","\n"," 0 0.97 0.99 0.98 333\n"," 1 0.64 0.39 0.48 18\n","\n"," accuracy 0.96 351\n"," macro avg 0.80 0.69 0.73 351\n","weighted avg 0.95 0.96 0.95 351\n","\n","\n","--- Training MLP ---\n","[MLP]\n"," precision recall f1-score support\n","\n"," 0 0.95 1.00 0.97 333\n"," 1 0.00 0.00 0.00 18\n","\n"," accuracy 0.95 351\n"," macro avg 0.47 0.50 0.49 351\n","weighted avg 0.90 0.95 0.92 351\n","\n","Models saved successfully!\n","Saved /content/guardian_classifier_predictions.csv\n","\n","=== Creating Combined Alerts Dashboard ===\n","Dashboard columns: ['user_id', 'timestamp', 'recon_error', 'risk_pred', 'rf_prob', 'rf_risk', 'mlp_prob', 'mlp_risk', 'risk']\n","Saved /content/alerts_dashboard.csv\n","Saved /content/top_alerts.csv\n","Total alerts: 1755\n","High risk alerts: 82\n","Medium risk alerts: 11\n","Low risk alerts: 1662\n","\n","=== Top 5 High/Medium Risk Alerts ===\n","user_id timestamp risk recon_error rf_prob\n"," P0001 2025-07-30 18:00:00 high 1.105155 0.6850\n"," P0001 2025-07-27 00:00:00 high 1.006605 0.6625\n"," P0001 2025-07-25 06:00:00 high 1.154535 0.7175\n"," P0001 2025-07-25 00:00:00 high 1.160858 0.7800\n"," P0001 2025-07-24 18:00:00 high 1.095987 0.8375\n"]}]},{"cell_type":"code","source":["# =========================\n","# VISUALIZATION OF BEHAVIORAL THRESHOLDS\n","# =========================\n","print(\"\\n=== Visualizing Behavioral Thresholds ===\")\n","\n","import matplotlib.pyplot as plt\n","\n","# Create visualizations for each behavioral feature\n","fig, axes = plt.subplots(2, 4, figsize=(15, 8))\n","axes = axes.ravel()\n","\n","for i, feature in enumerate(BEHAVIORAL_FEATURES):\n"," if i >= 7: # Only 7 subplots needed\n"," break\n","\n"," data = df[feature].apply(parse_num).dropna()\n"," thresholds = ALERT_THRESHOLDS[feature]\n","\n"," axes[i].hist(data, bins=30, alpha=0.7, color='skyblue')\n"," axes[i].axvline(thresholds['low'], color='orange', linestyle='--', label='Low Threshold')\n"," axes[i].axvline(thresholds['high'], color='red', linestyle='--', label='High Threshold')\n"," axes[i].axvline(thresholds['critical_low'], color='darkred', linestyle=':', label='Critical Low')\n"," axes[i].axvline(thresholds['critical_high'], color='darkred', linestyle=':', label='Critical High')\n","\n"," axes[i].set_title(f'{feature} Distribution')\n"," axes[i].set_xlabel('Value')\n"," axes[i].set_ylabel('Frequency')\n"," axes[i].legend()\n","\n","# Remove empty subplot\n","if len(BEHAVIORAL_FEATURES) < 8:\n"," axes[7].set_visible(False)\n","\n","plt.tight_layout()\n","plt.savefig(f\"{SAVE_DIR}/behavioral_thresholds_visualization.png\")\n","plt.show()\n","\n","print(\"Behavioral thresholds visualization saved!\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":859},"id":"VjIX8j5NSNie","executionInfo":{"status":"ok","timestamp":1758508007476,"user_tz":-600,"elapsed":3815,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"outputId":"61ae4792-5492-4840-9c17-1e23ba51a1f3"},"execution_count":32,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","=== Visualizing Behavioral Thresholds ===\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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vDn0ej3Kli2LV155BTk5OQCAdevWISgoCAaDAQBw6NAhSJKEV155RV7+2WefxaBBgwqsV6fTITw8XH55e3tDr9ebzLs/CH/99deIiIhAYGAg+vfvjzt37siftWvXDmPGjMGECRNQpkwZxMTEAACOHTuGrl27ws/PD2FhYXj66adx48YNeblVq1ahfv368Pb2RunSpdGpUyekpqaa5PP9999H2bJlUbp0acTGxspP/AaA27dv45lnnkGpUqXg4+ODrl274syZM0Uez1mzZiEsLAz+/v4YPnw4MjIyiv0fEBEREREREZF74/gLx1/cEQfQncSYnobLrWvjcuvaMKanWbSM1pCKJ3cHAcslICe12PQOlZNa+MuQYXnanHTL0trRf//9h27duqFZs2Y4fPgwFi1ahM8//xxvv/02AKBNmza4c+cODh48CCA32JcpU8bkV8vt27ejXbt2D5SPc+fOYc2aNVi3bh3WrVuH7du3Y9asWSZpvvzyS+h0OuzYsQOLFy9GYmIiOnTogMaNG2Pfvn3YuHEjEhIS0LdvXwDA1atXMWDAAAwbNgwnT55EXFwcevXqBXHf05W3bduGc+fOYdu2bfjyyy+xbNkyLFu2TP58yJAh2LdvH37++Wfs3LkTQgh069bNJMjfb8WKFZg2bRreeecd7Nu3D2XLls19+npaGrBvX+6lQSVUdloaFpcvj8XlyyM7zbJ6TmQpW9oRq+Sk5rY3rtDmkGtKTc29ZZck5U67OcZ0UjOHlV+2FZRHZW0CYzopweZyZ8v4S3YykPBH7is7meMv7j7+YimDATh2DPj339wxGzehREznLVycRQgYEq7K06qzwq/wz8p1A9qtv/f+x1DAUEgBDo0GOsXde782Asi8UTDdU/Y7RgsXLkTFihUxf/58SJKEyMhIXLlyBS+//DLeeOMNBAYGolGjRoiLi0PTpk0RFxeHF154AdOnT0dKSgqSkpJw9uxZREdHP1A+jEYjli1bBn9/fwDA008/ja1bt2LGjBlymho1amD27Nny+7fffhuNGzfGO++8I8/74osvULFiRZw+fRopKSnIyclBr169ULlyZQBA/fr1TbZbqlQpzJ8/H1qtFpGRkejevTu2bt2KESNG4MyZM/j555+xY8cOtGrVCgDw7bffomLFilizZg2efPLJAvsxd+5cDB8+HMOHD5fzuGXzZmTc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2LJlC5599lmrllPL/8uS/kZ+aut/5Q2e//vvv9i8eXORZ5+bU1yZpsKprazkp/b+uDv2u92tf11S+tGuPh7JAXQr6HQ6REVFYevWrfI8o9GIrVu3mpxJoGYpKSk4d+4cypYti6ioKHh6eprs76lTp3Dx4kV5f1u2bImjR4+aNAZ5HY46derIae5fR14aVz1mVapUQXh4uEmek5OTsXv3bpP9TkxMxP79++U0v/32G4xGI1q0aCGn+f3335GdnS2n2bx5M2rVqoVSpUrJadRybC5fvoybN2+ibNmyANznGAghMGbMGPz000/47bffUKVKFZPPnVUPSkJ8UYo7H1tnxitncJX6qCSj0YjMzEy329eOHTvi6NGjOHTokPxq2rQpBg4cKE+70/6S49gS09VSLoqLgZYwGAw4evSo3F9zVfd/5zBHLf+zPEuXLkVoaCi6d+9u1XJq+X9Z0t/IT039r7zB8zNnzmDLli0oXbq01esorkxT4dRUVsxRa3+8JPW71d6/Lin9aJcfj7T6saMl3Pfffy/0er1YtmyZOHHihBg5cqQICgoyeeqrmkyaNEnExcWJ8+fPix07dohOnTqJMmXKiGvXrgkhhHjuuedEpUqVxG+//Sb27dsnWrZsKVq2bCkvn5OTI+rVqyc6d+4sDh06JDZu3ChCQkLElClT5DT//POP8PHxES+++KI4efKkWLBggdBqtWLjxo1O3988d+7cEQcPHhQHDx4UAMScOXPEwYMH5Setz5o1SwQFBYm1a9eKI0eOiB49eogqVaqI9PR0eR1dunQRjRs3Frt37xZ//vmnqFGjhhgwYID8eWJioggLCxNPP/20OHbsmPj++++Fj4+PWLJkiZxmx44dwsPDQ7z//vvi5MmTYurUqcLT01McPXpU0WNw584dMXnyZLFz505x/vx5sWXLFtGkSRNRo0YNkZGR4TbHQAghnn/+eREYGCji4uLE1atX5VdaWpqcxln1wN3iiytR87F1lXjlDK5UH53hlVdeEdu3bxfnz58XR44cEa+88oqQJEn8+uuvbrev5kRHR4vx48fL7919f8l+iovpTz/9tHjllVfk9Er3NSxlSQzMv2/Tp08XmzZtEufOnRP79+8X/fv3F15eXuL48eNK7EKhivvOodb/mRBCGAwGUalSJfHyyy8X+ExN/y979Dc6dOgg5s2bJ793lf5XUfuWlZUlHn/8cVGhQgVx6NAhk7qXmZlZ6L4VV6bJOq5SVgrjjv1xd+13l5T+tTv0o9U2HskBdBvMmzdPVKpUSeh0OtG8eXOxa9cupbNks379+omyZcsKnU4nypcvL/r16yfOnj0rf56eni5Gjx4tSpUqJXx8fMQTTzwhrl69arKOCxcuiK5duwpvb29RpkwZMWnSJJGdnW2SZtu2baJRo0ZCp9OJqlWriqVLlzpj9wq1bds2AaDAa/DgwUIIIYxGo3j99ddFWFiY0Ov1omPHjuLUqVMm67h586YYMGCA8PPzEwEBAWLo0KHizp07JmkOHz4sHn74YaHX60X58uXFrFmzCuRlxYoVombNmkKn04m6deuK9evXO2y/71fUMUhLSxOdO3cWISEhwtPTU1SuXFmMGDGiQAdG7cdACGH2GAAwKaPOrAfuFF9cjVqPrSvFK0dztfroaMOGDROVK1cWOp1OhISEiI4dO8qdeyHca1/Nyd/xd/f9JfsqKqZHR0fLMTKPkn0NS1kSA/Pv24QJE+TjEBYWJrp16yYOHDjg/MwXo7jvHGr9nwkhxKZNmwSAAm2vEOr6f9mjv1G5cmUxdepUk3mu0P8qat/Onz9faN3btm2bvI78+1ZcmSbruUJZKYw79sfdtd9dUvrX7tCPVtt4pCSEENaft05ERERERERERERE5N54D3QiIiIiIiIiIiIiIjM4gE5EREREREREREREZAYH0ImIiIiIiIiIiIiIzOAAOhERERERERERERGRGRxAJyIiIiIiIiIiIiIygwPoRERERERERERERERmcACdiIiIiIiIiIiIiMgMDqATPYB27dphwoQJSmeDiIjsgDGdiMh9MKYTEbkXxnVSEgfQqcR67LHH0KVLF7Of/fHHH5AkCUeOHHFyroiIyBaM6URE7oMxnYjIvTCuk9pxAJ1KrOHDh2Pz5s24fPlygc+WLl2Kpk2bokGDBgrkjIiIrMWYTkTkPhjTiYjcC+M6qR0H0KnEevTRRxESEoJly5aZzE9JScHKlSvRs2dPDBgwAOXLl4ePjw/q16+P7777rsh1SpKENWvWmMwLCgoy2calS5fQt29fBAUFITg4GD169MCFCxfss1NERCUUYzoRkftgTCcici+M66R2HECnEsvDwwPPPPMMli1bBiGEPH/lypUwGAwYNGgQoqKisH79ehw7dgwjR47E008/jT179ti8zezsbMTExMDf3x9//PEHduzYAT8/P3Tp0gVZWVn22C0iohKJMZ2IyH0wphMRuRfGdVI7DqBTiTZs2DCcO3cO27dvl+ctXboUvXv3RuXKlTF58mQ0atQIVatWxdixY9GlSxesWLHC5u398MMPMBqN+Oyzz1C/fn3Url0bS5cuxcWLFxEXF2eHPSIiKrkY04mI3AdjOhGRe2FcJzXjADqVaJGRkWjVqhW++OILAMDZs2fxxx9/YPjw4TAYDHjrrbdQv359BAcHw8/PD5s2bcLFixdt3t7hw4dx9uxZ+Pv7w8/PD35+fggODkZGRgbOnTtnr90iIiqRGNOJiNwHYzoRkXthXCc181A6A0RKGz58OMaOHYsFCxZg6dKlqFatGqKjo/Huu+/io48+wty5c1G/fn34+vpiwoQJRV7qI0mSyeVIQO5lQ3lSUlIQFRWFb7/9tsCyISEh9tspIqISijGdiMh9MKYTEbkXxnVSKw6gU4nXt29fjB8/HsuXL8dXX32F559/HpIkYceOHejRowcGDRoEADAajTh9+jTq1KlT6LpCQkJw9epV+f2ZM2eQlpYmv2/SpAl++OEHhIaGIiAgwHE7RURUQjGmExG5D8Z0IiL3wrhOasVbuFCJ5+fnh379+mHKlCm4evUqhgwZAgCoUaMGNm/ejL/++gsnT57EqFGjkJCQUOS6OnTogPnz5+PgwYPYt28fnnvuOXh6esqfDxw4EGXKlEGPHj3wxx9/4Pz584iLi8O4ceNw+fJlR+4mEVGJwJhOROQ+GNOJiNwL4zqpFQfQiZB7GdHt27cRExODcuXKAQBee+01NGnSBDExMWjXrh3Cw8PRs2fPItfzwQcfoGLFimjTpg2eeuopTJ48GT4+PvLnPj4++P3331GpUiX06tULtWvXxvDhw5GRkcFfRImI7IQxnYjIfTCmExG5F8Z1UiNJ5L9hEBERERERERERERER8Qx0IiIiIiIiIiIiIiJzOIBORERERERERERERGQGB9CJiIiIiIiIiIiIiMzgADoRERERERERERERkRkcQCciIiIiIiIiIiIiMoMD6EREREREREREREREZnAAnYiIiIiIiIiIiIjIDA6gExERERERERERERGZwQF0IiIiIiIiIiIiIiIzOIBORERERERERERERGQGB9CJiIiIiIiIiIiIiMzgADoRERERERERERERkRkcQCciIiIiIiIiIiIiMoMD6EREREREREREREREZnAAnYiIiIiIiIiIiIjIDA6gExERERERERERERGZwQF0IiIiIiIiIiIiIiIzOIBOFrlw4QIkScKyZcuUzooJV82X0iIiIjBkyBCHb8fc8R8yZAj8/Pwcvu08kiRh2rRpTtsekSWmTZsGSZJw48YNh29r2bJlkCQJ+/btc/i2XFW7du3Qrl07q5bJO24XLlxwSJ5s5cx8DRkyBBEREfL7vJj+/vvvO3zbwL16QkQPzpY4aA1JkjBmzJgi06ilX+7IOJs/rjpS/v6+s/sDji5zREREroQD6OQS8r5EazQaXLp0qcDnycnJ8Pb2tqjz7ggbNmxQbJC2Xbt2kCRJPj4BAQGoVasWnn76aWzevNlu21FyH4vjynkjcpaFCxe6/KCEPVy7dg0eHh4YNGhQoWnu3LkDb29v9OrVy67btvcxjouLk+O3JEnQ6/UICwtDu3bt8M477+D69et22U5aWhqmTZuGuLg4u6zPnlw5b0QEHD16FH369EHlypXh5eWF8uXL45FHHsG8efOUzpri8r6f5L18fHxQqVIlPPbYY1i6dCkyMzPtsp0TJ05g2rRpLveDLuDaeSMiInImD6UzQOpQuXJlpKenw9PT06Hb0ev1+O677/DSSy+ZzF+9erWi+dqwYQMWLFig2CBuhQoVMHPmTABAamoqzp49i9WrV+Obb75B37598c0335gcg1OnTkGjse73MVv20RWOf3p6Ojw8GMrI/S1cuBBlypRxytUlSgoNDcUjjzyCtWvXIi0tDT4+PgXSrF69GhkZGfIg+6+//mr1dp5++mn0798fer1enueoYzxu3Dg0a9YMBoMB169fx19//YWpU6dizpw5WLFiBTp06FBkvoqTlpaG6dOnA4BVZwN++umnMBqNFqe3RVF5e+211/DKK684dPtEVLi//voL7du3R6VKlTBixAiEh4fj0qVL2LVrFz766COMHTvWqvU5q1/obIsWLYKfnx8yMzPx33//YdOmTRg2bBjmzp2LdevWoWLFinJaW+LqiRMnMH36dLRr186qs9dt6e9bq6i82dL2EhERqRVHnUowIQQyMjLg7e1dbFpJkuDl5eXwPHXr1s3sAPry5cvRvXt3/Pjjj4rkS2mBgYEFzsacNWsWxo0bh4ULFyIi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SHAbkgugoKCAEydOXPC+FhkZGa7p0KFDXvk8RjA/LcNtEqdVq1Zx1VVXERoaSmJiIn//+98pKCgAYNGiRcTGxmKz2QDn0G8mk4m///3vrvX/+te/ctddd52z3ZCQEBISElxTeHg4oaGhbs+FFDs78P/+7/9ITk4mJiaGgQMHcurUKddrXbp0YeTIkYwaNYratWvTo0cPAH788Ud69epFVFQUdevW5e677+b33393rfef//yH5s2bEx4eTq1atejWrRvZ2dlu5Zw8eTKJiYnUqlWL1NRU140FwXkz33vuuYeaNWsSERFBr1692Lt37wW/z5deeom6detSo0YNhg0bRq4ubQ8I2dnZXHnllUybNu2c13Jycti6dSvPPPMMW7duZcGCBezevZs//elPbssNGjSIHTt2sHTpUtf9jEaMGOF6PTMzk+7du1O/fn22bNnCpEmTGDt2LP/6178q/fOdnZ/KUWNTrivXRUREjEzXNYqIiFd07NiR3bt3uz23Z88e6hdeLpuSkkJCQgLLly93vZ6ZmcmGDRto37494LyvRXp6Olu2bHEt880332C32103kT5bZd7XoloryD7/ZMst+7IFp0tf1ot+/fVXevfuTbt27fjuu++YMWMGb7/9Ns8//zwA1113HadOnWLbtm2As1Omdu3arFy50rWNVatW0aVLF4/KkZaWxsKFC1m0aBGLFi1i1apVvPTSS27LzJkzh5CQENasWcPMmTNJT0/nhhtuoFWrVmzevJnFixdz7NgxBgwYAMCRI0e44447+Mtf/sKuXbtYuXIl/fr1w+FwuLa5YsUK0tLSWLFiBXPmzGH27NnMnj3b9fqQIUPYvHkzn332GevWrcPhcNC7d2+3zpjiPvroI8aOHcuLL77I5s2bSUxMZPr06R59N+IfevXqxfPPP8+tt956zmsxMTEsXbqUAQMG0KhRI6655hreeOMNtmzZ4vqnaNFNn//9739z9dVXc+211/L666/zwQcfuM5Unzt3Lvn5+bzzzjs0a9aMgQMH8uCDD/LKK69U6WcNCH6a6aBcV66LiIgYXzW8L71vFeTmsmjgQABu+uADgsLCyrHyaVjWyTnfbTUEhVdCCSWgnT4NnQr3sdWrIVz7mDd51P6rgYcffpgOHTrw4osvMmDAADZu3Mi//vUv15mGJpOJUaNG8fzzz9OwYUNSUlJ45pln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xZafj9liISgs7ILLlseJEydYvHgxL7zwApElnB129uXyY8eO5aWXXmLKlCkEBQXx008/uV7r0KEDU6ZMYcyYMezevRuAqKhzz0a12+306tWLU6dO8d5773HppZeyc+dOLBYLALm5ubRp04YnnniC6OhovvjiC+6++24uvfRSrrrqqnJ/xpLev6iTZdWqVRQUFJCamsrtt9/OypUriYmJoWXLlqxcuZK2bdvyww8/YDKZ2LZtG1lZWa71Onfu7HFZysxshlatzsxXQ4bMBilVcI3aPJh+jM/2Z2KPrIXJ1wWqIkbNdFCulyvX9+whq2FDoszmqs/1ak6ZLiIinqief/H4kMlkIiQykpDISNeP13KsDEGRzqm864qUhckEkZHOSfuY13nU/quBsWPHus4GK5oaN27sej03N5fU1FRq1apFVFQU/fv3d52JVeTgwYP06dOHiIgI4uPjeeyxxygoKKjUchuy3gqPBzZL5bXVqVFRTI2K4vTvv7ue2zRpElOjolg+cqTbstPj45kaFUXmwYOu57ZPm8bUqCiWDBvmtuxbyclMjYrij127KlSuffv24XA43PadC7nzzjsZOnQoDRo04JJLLnF7LSQkhJiYGEwmEwkJCSQkJJTY0bJs2TI2btzIggULuPHGG2nQoAE33XQTvXr1AuCiiy7i0UcfpWXLljRo0IAHHniAnj178tFHH1XoM55t+fLl/PDDD8ybN482bdpw9dVX8+6777Jq1So2bdoEOG9mt3LlSsB5Q70bb7yRJk2a8O2337qeq9KOFpMJLBbnZJR242WGzAYplclsJiQmHkeNOhXu8PVHRs10UK6XO9fXrQOTqepzvZpTpouIiCcC51eliIhUumbNmnHkyBHXVNS5B/Dwww/z+eefM3/+fFatWsXhw4fp16+f63WbzUafPn3Iz89n7dq1zJkzh9mzZzNmzBhffBTxkfLe2Ktt27Yev+f27du5+OKLufzyy0t83WazMX78eJo3b05cXBxRUVEsWbKEg8U6nzyxa9cu6tWr53apftOmTYmNjWVXYadV586d+fbbb7HZbKxatYouXbq4Ol8OHz7Mvn376NKli1fKIyLiTcp1J+W6iIiI/9IQLl5my89n7bhxAHR49lksISHlWDkPNt7rnL/qTbCEXnh5kfLKy4N7C/exN9+EUO1j3uRR+68mgoKCSrzRV0ZG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QfRHD0G+biIqfiQActWXAj3TRUTEMxrCxcsK8vL49NZbAXgwK4uQoHJ8xfZ82DzSOd9gCJiDvV9ACWz5+TCycB8bMgSCtY95k0ft38/VqFGDK664wu25yMhIatWq5Xp+2LBhjB49mri4OKKjo3nggQdo374911xzDQDdu3enadOm3H333UycOJGjR4/y9NNPk5qaSmhoaKWVvXi91fv+V0xGqLfC40Fr4ECdO7GhtioGEwDHk0DOdICPPvqIuXPnMm/ePJo1a8b27dsZNWoUSUlJDB48uNLe19NhuQpOn+LT1LcASO71NI6QcK+XUaRSBECu+lKgZ7qIiHhGRw0vM5nNJHXo4JoXkcCh9n9hr776Kmazmf79+5OXl0ePHj2YPn2663WLxcKiRYu47777aN++PZGRkQwePJjnnnuuUstVVG9/5NpA9SYihQI90x977DHXWegAzZs35+eff2bChAkMHjzYNbTWsWPHSExMdK137NgxWrZsCTiH3yp+VRFAQUEBJ06cOO/QXKGhoR7909RkNpPUsPCBWaOgi4hToGe6iIh4Rh3oXhYcHs6da9b4uhgi4gNq/+5Wrlzp9jgsLIxp06Yxbdq0865Tv359vvzyy0oumbuieptvpJuIiojPBXqm5+TkYD6rk8lisWC32wFISUkhISGB5cuXuzrMMzMz2bBhA/fddx/gHJorPT2dLVu20KZNGwC++eYb7HY7V199daWUOzg8nDvHOucXhIVjq5R3ERF/E+iZLiIinlEHuoiIiIiIuLn55pt54YUXuOSSS2jWrBnbtm3jlVde4S9/+QsAJpOJUaNG8fzzz9OwYUNSUlJ45plnSEpKom/fvgA0adKEnj17Mnz4cGbOnInVamXkyJEMHDiQpKQkH346EREREZGyUwe6iIiIiIi4ef3113nmmWe4//77OX78OElJSdx7772MGTPGtczjjz9OdnY2I0aMID09nWuvvZbFixcTFhbmWmbu3LmMHDmSrl27uobxmjp1qi8+koiIiIhIhagD3cusp0/zQadOAAxcvZrgcN24SCRQqP37p6J6O5lno+77X2IOU72JiDK9Ro0aTJkyhSlTppx3GZPJxHPPPXfBe1XExcUxb968SihhyaynT/PBM8758E9OQ2Rklb23iBhXoGe6iIh4pkId6D/99BMNGjTwdlmqBYfdzrHNm13zIhI4/LX9B3qmF683/KjeRKRyGTXTAz2zS+Ow2zn2k3M+2e7wbWFExDCMmukiIuIfKtSBftlll9G5c2eGDRvGn//8Z7fLNANdUGgoty5a5JovF3ModF50Zl7E20JDoXD/pLz7p5TKo/bvQ4Ge6UX19u2RbEwhBqm3wuPBf49kY9fxQIwoAI4nRs30QM/s0gSFR3PrnGfZcSKXvLAavi6OSNkFQK76klEzXURE/IPJ4XCU+9SM7du3M2vWLN5//33y8/O5/fbbGTZsGFdddVVllLHSZWZmEhMTQ0ZGBtHR0WVeb35aBrddGlOJJRORQFDRDPIWZbrT/LQMt8ee5HvxbXlrO55uS0SqRmVnenXL7NJ4K9OLKEdFpDx8/TtdRESMwVyRlVq2bMlrr73G4cOHeeeddzhy5AjXXnstV1xxBa+88gq//fZbmbazevVqbr75ZpKSkjCZTCxcuNDt9SFDhmAymdymnj17ui1z4sQJBg0aRHR0NLGxsQwbNoysrKyKfCwRkYDkrUwXEZHKp8wWEREREalaFepALxIUFES/fv2YP38+L7/8Mvv27ePRRx+lXr163HPPPRw5cuSC62dnZ3PllVcybdq08y7Ts2dPjhw54pref/99t9cHDRrEjh07WLp0KYsWLWL16tWMGDHCk4/lEbvNxoGlSzmwdCl2m62cK1vhp9nOyW6tjOJJoLNaYfZs52TVPuZtHrV/A/A00/1VUb2d/nYFDqPUW+HxoP5vczHpeCBGFADHE6NneqBmdmns1lwOvPsY0V88DdZcXxdHpOwCIFd9yeiZLiIixlahIVyKbN68mXfeeYcPPviAyMhIBg8ezLBhw/jll18YN24cmZmZbNy4sWwFMZn45JNP6Nu3r+u5IUOGkJ6efs6Z6UV27dpF06ZN2bRpE23btgVg8eLF9O7dm19++YWkpKQyvbc3h3DJz85malQUAA9mZRESGVnm7VGQDR8512VAFgSVY12RssjOhsL9k6wsKM/+KaWqaPs3yqWh3sx0Xyrv91m83up9/yvmCGe9+XQIl2LHgwVtf8Vm8bxMIl4VAMcTo2d6dcns0pQ70zOOMzW2LgDJ2/biqFHH7XXlqBhWAOSqLxk900VExNgqdBPRV155hVmzZrF792569+7Nu+++S+/evTGbnSe0p6SkMHv2bJKTkz0u4MqVK4mPj6dmzZrccMMNPP/889SqVQuAdevWERsb6+o8B+jWrRtms5kNGzZw6623evz+5WUym6lz5ZWueREJHP7a/qsy042oqN7S823gR/UmIpXLqJke6JldGpPZTJ1LCh+YTT4ti4gYh1EzXURE/EOFOtBnzJjBX/7yF4YMGUJiYmKJy8THx/P22297VLiePXvSr18/UlJSSEtL4x//+Ae9evVi3bp1WCwWjh49Snx8vNs6QUFBxMXFcfTo0fNuNy8vj7y8PNfjzMxMj8pZXHB4OIO3b/fa9kTEf/hr+6+qTDeqono73w3nRCQwGTXTAz2zSxMcHs7gCc75BWHhaKAGEQHjZrqIiPiHCnWg7927t9RlQkJCGDx4cEU27zJw4EDXfPPmzWnRogWXXnopK1eupGvXrhXe7oQJExg3bpxHZRMRqS6qKtNFRMRzymwRERERkapVoWuXZs2axfz58895fv78+cyZM8fjQp1PgwYNqF27Nvv27QMgISGB48ePuy1TUFDAiRMnSEhIOO92nnzySTIyMlzToUOHKq3MIiJG56tMFxGR8lNmi4iIiIhUrQp1oE+YMIHatWuf83x8fDwvvviix4U6n19++YU//vjDdblq+/btSU9PZ8uWLa5lvvnmG+x2O1dfffV5txMaGkp0dLTb5C3W06f5oEsXPujSBevp017brogYn7+2f19lulEU1dvRO/tgz/WfehORymXUTA/0zC6N9fRpPngePngeZbqIuBg100VExD9UaAiXgwcPkpKScs7z9evX5+DBg2XeTlZWlutscoD9+/ezfft24uLiiIuLY9y4cfTv35+EhATS0tJ4/PHHueyyy+jRowcATZo0oWfPngwfPpyZM2ditVoZOXIkAwcOJCkpqSIfzWMOu51fVq1yzYtI4PDX9u+tTPdXxesNP6o3EalcRs30QM/s0jjsdn7Z5ZxPtjt8WxgRMQyjZrqIiPiHCnWgx8fH8/3335OcnOz2/HfffUetWrXKvJ3Nmzdz/fXXux6PHj0agMGDBzNjxgy+//575syZQ3p6OklJSXTv3p3x48cTGhrqWmfu3LmMHDmSrl27Yjab6d+/P1OnTq3Ix/KKoNBQbv7oI9d8uZhD4dqPzsyLeFtoKBTun5R3/5RSedT+fchbme6viupt3dEcTCEGqbfC48G6oznYdTwQIwqA44lRMz3QM7s0QeHR3Dz9Yfak55EbVsPX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1q1bR/Pmzd2GdOnRoweZmZmus9grQ1G9He7WBkeuQeqt8HjQZdfNWHQ8ECMKgOOJv2V6ZfwO//XXX7nrrruoVasW4eHhNG/enM2bN7tedzgcjBkzhsTERMLDw+nWrRt79+5128aJEycYNGgQ0dHRxMbGMmzYMLKysrxazuKs2Sd5u8Pd/Nj3Xsw56ZX2PiJeFwC56kv+lukiImIsFbqJ6Geffeb22OFwcOTIEd544w06duzolYL5s9AYja0oEqj8sf17M9N/+OEH2rdvT25uLlFRUXzyySc0bdqU7du3ExISQmxsrNvydevW5ejRowAcPXrUrfO86PWi184nLy+PvLw81+PMzMxylRmc9ZZvL/ctQUSkmjNiplfV7/CTJ0/SsWNHrr/+er766ivq1KnD3r173cZgnzhxIlOnTmXOnDmkpKTwzDPP0KNHD3bu3ElYWBgAgwYN4siRIyxduhSr1crQoUMZMWIE8+bN81pZzxYaUWmblkIljTGv8eXF6IyY6SIi4h8q1IHet29ft8cmk4k6depwww038M9//tMb5fJbIZGRPJCeXuyZkm9gJCLVz7nt3z94M9MbNWrE9u3bycjI4D//+Q+DBw9m1apVXiztuSZMmMC4ceMqvH5RvZ3vhnMiEpiMmulV9Tv85Zdfpl69esyaNcv1XEpKimve4XAwZcoUnn76aW655RYA3n33XerWrcvChQsZOHAgu3btYvHixWzatIm2bdsC8Prrr9O7d28mT55MUlKS18pbJCQykgfecs4viIhAA2GICBg300VExD9UqAPdrjHDRESqDW9mekhICJdddhkAbdq0YdOmTbz22mvcfvvt5Ofnk56e7nYW+rFjx0hISAAgISGBjRs3um3v2LFjrtfO58knn2T06NGux5mZmdSrV89bH0lExFCq6nf4Z599Ro8ePbjttttYtWoVF110Effffz/Dhw8HYP/+/Rw9etRtaK6YmBiuvvpq1q1bx8CBA1m3bh2xsbGuznOAbt26YTab2bBhA7feeus57+uNq4pERERERLzJq2Ogi4iIFGe328nLy6NNmzYEBwezfPly12u7d+/m4MGDtG/fHoD27dvzww8/cPz4cdcyS5cuJTo6mqZNm573PUJDQ4mOjnabRETEMz/99BMzZsygYcOGLFmyhPvuu48HH3yQOXPmAGeG1ipp6K3iQ3PFx8e7vR4UFERcXNx5h+aaMGECMTExrkn/EBURERERX6vQGejFz/QrzSuvvFKRt/BbBXl5LL33XgBufPNNH5dGRKrS2e0/KDTUxyUqG29l+pNPPkmvXr245JJLOHXqFPPmzWPlypUsWbKEmJgYhg0bxujRo4mLiyM6OpoHHniA9u3bc8011wDQvXt3mjZtyt13383EiRM5evQoTz/9NKmpqYRW4ndZVG+/n8qn1vgpmPyk3kSkchk106vqd7jdbqdt27a8+OKLALRq1Yoff/yRmTNnMnjw4ApvtzSeXlVUkJfH0pnOecf0PAiP9HYRRcQPGTXTRUTEP1SoA33btm1s27YNq9VKo0aNANizZw8Wi4XWrVu7ljOZTN4ppR+xFxSwo/DMnK7Tpvm4NCJSlc5p/37yw9xbmX78+HHuuecejhw5QkxMDC1atGDJkiXceOONALz66quYzWb69+9PXl4ePXr0YPr06a71LRYLixYt4r777qN9+/ZERkYyePBgnnvuuUr41GcUr7e4sZMx4R/1JiKVy6iZXlW/wxMTE8+5+qdJkyZ8/PHHwJmhtY4dO0ZiYqJrmWPHjtGyZUvXMsWvKgIoKCjgxIkT5x2aKzQ01KN/mtoLCtjxX+d8coFGQBcRJ6NmuoiI+IcKdaDffPPN1KhRgzlz5lCzZk0ATp48ydChQ7nuuut45JFHvFpIf2IJDqbTxImueSgo+8qmYGg58cy8iLcFB0Ph/kmw9jFvO7f9+wdvZfrbb799wdfDwsKYNm0a0y7wz8X69evz5Zdflr3wXlBUb9//kYspyCD1Vng8+O6PXOw6HogRBcDxxKiZXlW/wzt27Mju3bvdntuzZw/169cHnDcUTUhIYPny5a4O88zMTDZs2MB9990HOIfmSk9PZ8uWLbRp0waAb775BrvdztVXX+2Vcp7NEhJBp0d6cySngPzg8Ep5D5FKEQC56ktGzXQREfEPJofD4SjvShdddBFff/01zZo1c3v+xx9/pHv37hw+fNhrBawKmZmZxMTEkJGRUa6xc+enZXDbpTFlXqZovizriUjgqGgGeYsy3Wl+WobbY09yuvi2vLUdT7clIlWjsjO9qjJ706ZNdOjQgXHjxjFgwAA2btzI8OHD+de//sWgQYMAePnll3nppZeYM2cOKSkpPPPMM3z//ffs3LmTsLAwAHr16sWxY8eYOXMmVquVoUOH0rZtW+bNm1emcngr04soR72jpO9X361UR77+nS4iIsZQoTPQMzMz+e233855/rfffuPUqVMeF0pERKqOMl1ExH9UVWa3a9eOTz75hCeffJLnnnuOlJQUpkyZ4uo8B3j88cfJzs5mxIgRpKenc+2117J48WJX5znA3LlzGTlyJF27dnUN4zV16lSvlVNEREREpLJVqAP91ltvZejQofzzn//kqquuAmDDhg089thj9OvXz6sF9DcOu52sI0cAiCo2HmSZ2G1wcqtzvmZrMFu8XDoJeDYbbC3cx1q3Bov2MW86u/2bzGYfl6hsAj3Ti+qt4GgmlvgEY9Rb4fGgZlYWJyOvBJPaqhhMABxPjJrpVZnZN910EzfddNN5XzeZTDz33HMXvFdFXFxcmc829wZHgZWs/31N5OFsspJvwGTRUA3iJwIgV33JqJkuIiL+oUId6DNnzuTRRx/lzjvvxGq1OjcUFMSwYcOYNGmSVwvob6ynT/PmxRcD8GBWVvlWtufCEucfQgzIAnOkl0snAS83Fwr/2CYrCyK1j3nT2e0/xE++30DP9OL1Vu/7XzFFGKDeCo8H3YAFbX/FZjFAmUSKC4DjiVEzPdAzuzTW7JO82dzZ6Z+8bS+OGnV8XCKRMgqAXPUlo2a6iIj4hwp1oEdERDB9+nQmTZpEWloaAJdeeimROggBYA4Kwn7Wc+cbh1FEqhdzUIVi1aeU6SXntoiIETNdmV06XcQpIiUxYqaLiIh/8OgIcuTIEY4cOUKnTp0IDw/H4XBgMpm8VTa/FBIZyWirlflpGYX/1VbHuUigKGr//ipQM714bouIFDF6pgdqZpcmJDKS0e865xdERGDzbXFExCCMnukiImJsFRr4648//qBr165cfvnl9O7dmyOFY4kNGzaMRx55xKsFFBGRyqVMFxHxH8psEREREZGqVaEO9Icffpjg4GAOHjxIRESE6/nbb7+dxYsXe61wIiJS+ZTpIiL+Q5ktIiIiIlK1KjSEy9dff82SJUu4uPAmHEUaNmzIzz//7JWC+auCvDxWjh7NHxn5FLz9hq+LIyJVqKj9A3R55RWCQkN9XKKyCfRML57bcf94AZOf1JuIVC6jZnqgZ3ZpCvLyWDnLOe9okQfhGhteRIyb6SIi4h8qdAZ6dna22xkvRU6cOEFogB+I7AUFbJ8+nay5/8ZeUODr4ohIFSpq/9unT/er9h/omV48tx02/6k3EalcRs30QM/s0tgLCti+DLYvA0eBRkAXESejZrqIiPiHCp2Bft111/Huu+8yfvx4AEwmE3a7nYkTJ3L99dd7tYD+xhIcTPtnn2XniVwswcFAOQ7OpmC44tkz8yLeFhwMzz57Zl68qqj9F837i0DP9OK5bQoySL0VHg92nMzFruOBGFEAHE+MmumBntmlsYRE0P5vnfntdAHW4HBfF0ek7AIgV33JqJkuIiL+oUId6BMnTqRr165s3ryZ/Px8Hn/8cXbs2MGJEydYs2aNt8voVywhIXQcO5bDaRlYQkKA0+VZGVqMrayiiUBICIwd6+tSVFtF7d/fBHqmF89twyg8Huw0UplEiguA44lRMz3QM7s0lvAoOs5YyXzlp/ibAMhVXzJqpouIiH+o0BAuV1xxBXv27OHaa6/llltuITs7m379+rFt2zYuvfRSb5dRREQqkTJdRMR/KLNFRERERKpWuc9At1qt9OzZk5kzZ/LUU09VRpn8msPhIC8jA3tmBg5HdDlXtkPGLud8TBMwVej/GyLnZ7fDrsJ9rEkTMGsf86ai9g8QGhODyWTycYlKp0x3z21TDYPUW+HxIDrnFJnhjXQ8EOMJgOOJETNdmV06h91G3qGNRB7NIiu+DSazxddFEimbAMhVXzJipouIiP8odwd6cHAw33//fWWUpVqw5uTwRs2azvmsrPKtbDsNX17hnB+QBUGRXi6dBLzTp+GKwn0sKwsitY95U/H2/2BWFiF+8P0q093rrd73v2KKMEC9FR4PegAL2v6KzWKAMokUFwDHEyNmujK7dNZTf/BGcgcAkrftxVGjjo9LJFJGAZCrvmTETBcREf9RoX9r33XXXbz99tveLouIiPiAMl1ExH8os0VEREREqlaFbiJaUFDAO++8w7Jly2jTpg2RZ/339pVXXvFK4fxRcEQED+fn83FaBsEREUCmr4skIlWkqP0DmIMqFK8+EeiZXjy38aN6E5HKZdRMD/TMLk1wRAQPz3HOLwwPx+Hb4oiIQRg100VExD+U68jx008/kZyczI8//kjr1q0B2LNnj9sy5RlLbPXq1UyaNIktW7Zw5MgRPvnkE/r27et63eFw8Oyzz/LWW2+Rnp5Ox44dmTFjBg0bNnQtc+LECR544AE+//xzzGYz/fv357XXXiMqKqo8H81rTCYTluBgTMHBGldNJMAUtX9/4e1M91fFc1tEpIjRMl2ZXTYmkwlL0Jl5EREwXqaLiIh/KVcHesOGDTly5AgrVqwA4Pbbb2fq1KnUrVu3Qm+enZ3NlVdeyV/+8hf69et3zusTJ05k6tSpzJkzh5SUFJ555hl69OjBzp07CQsLA2DQoEEcOXKEpUuXYrVaGTp0KCNGjGDevHkVKpOISKDwdqaLiEjlUWaLiIiIiPhGuTrQHQ73iyC/+uorsrOzK/zmvXr1olevXud9rylTpvD0009zyy23APDuu+9St25dFi5cyMCBA9m1axeLFy9m06ZNtG3bFoDXX3+d3r17M3nyZJKSkipctoqy5efz36ee4mR6HrZpk6v8/UXEd4raP8B1L7yAJSTExyW6MG9nur8qntuxo5/BZPB6E5GqYbRMV2aXjS0/n/8WnkfjaJEP4bpRoIgYL9NFRMS/VOgmokXO/iHvTfv37+fo0aN069bN9VxMTAxXX30169atA2DdunXExsa6Os8BunXrhtlsZsOGDZVWtguxWa1snjyZzH+/js1q9UkZRMQ3itr/5smT/bL9V2amG1nx3HYU+F+9iUjlMHqmB2pml8ZmtbL5C9j8BTgKCnxdHBExCKNnuoiIGFu5zkA3mUznjCVYWWMLHj16FOCcy1Lr1q3reu3o0aPEx8e7vR4UFERcXJxrmZLk5eWRl5fnepyZ6b0bfVqCg2n76KPsSc8rHGOtHD/cTcHQ5NEz8yLeFhwMjz56Zl68qqj9F80bXVVmupEVz21TkEHqrfB4sDs9D7uOB2JEAXA8MVqmK7PLxhISQdu723Iyz0ZBcLiviyNSdgGQq75ktEwXERH/Uu4hXIYMGUJoaCgAubm5/O1vfyMy0v3SyAULFnivhJVgwoQJjBs3rlK2bQkJocukSfyWllF4Wdjp8qwMrSZVSrlEAAgJgUnaxypLUfv3F9Ul0z1VPLcNo/B48L2RyiRSXAAcT4yW6crssrGER9Hl3U3MV36KvwmAXPUlo2W6iIj4l3J1oA8ePNjt8V133eXVwhSXkJAAwLFjx0hMTHQ9f+zYMVq2bOla5vjx427rFRQUcOLECdf6JXnyyScZPXq063FmZib16tXzYulFRIyvKjNdREQ8o8wWEREREfGNcnWgz5o1q7LKcY6UlBQSEhJYvny5q8M8MzOTDRs2cN999wHQvn170tPT2bJlC23atAHgm2++wW63c/XVV59326Ghoa6zd7zN4XBgLyjAYbWWf2xKhx2yDzrnIy8Bk0dD1Iucy26Hg4X72CWXgFn7mDcVtX8Ac1CQ4S+tr8pMN7LiuY1R6q3weBCRl0lOSD0dD8R4AuB4YrRMV2aXjcNuw57xE+FZmeREpGAyW3xdJJGyCYBc9SWjZbqIiPiXcnWge1tWVhb79u1zPd6/fz/bt28nLi6OSy65hFGjRvH888/TsGFDUlJSeOaZZ0hKSqJv374ANGnShJ49ezJ8+HBmzpyJ1Wpl5MiRDBw4kKSkJJ98JmtODlOjopzzWVnlW9l2Gj5Lcc4PyIKgyAsvL1Jep09DSuE+lpUFkdrHvKl4+38wK4sQfb9+oXi91fv+V0wRBqi3wuNBH2BB21+xWQxQJpHiAuB4okz3T9ZTfzA17nIAkrftxVGjjo9LJFJGAZCrvqRMFxERT/i0A33z5s1cf/31rsdFw6oMHjyY2bNn8/jjj5Odnc2IESNIT0/n2muvZfHixYSFhbnWmTt3LiNHjqRr166YzWb69+/P1KlTq/yzVIb5aRncdmmMr4shIiIiIiIiIiIiEpB82oHepUuXCw5zYjKZeO6553juuefOu0xcXBzz5s2rjOJVSHBEBCNPnuTT/RkER0QAmb4ukohUkaL2XzQv/qF4bpvCVW8i4qRM90/BERGM/Jdz/ovwcMo5oKKIVFPKdBER8YRPO9CrI5PJRFhsLOZok8ZVEwkwRe1f/Evx3BYRKaJM908mk4mwyDPzIiKgTBcREc/oziQiIiIiIiIiIiIiIiXQGeheZsvPZ/2LL5J+Ihfb5PMPPSMi1U9R+we45h//wBIS4uMSSVkUz+2Y+x7BpHoTEZTp/sqWn8/6j53zjhb5EK4bBYqIMl1ERDyjDnQvs1mtrBs3zjk/4Rkfl0ZEqlLx9t/uscf0w9xPFK+36OEPqgNdRABlur+yWa2sW+CcT36mwLeFERHDUKaLiIgn1IHuZeagIFrefz/7MvIxBwUB5fjhbgqChvefmS+27vy0DG67NMarZZUAFBQE999/Zl68qqj9F82Lfyie2yaLQeqt8HiwLyMfh8kgZRIpLgCOJ8p0/2QODqPln68gI8+GIzjU18URKbsAyFVfUqaLiIgndOTwsqDQULpNm8bJtAyCQkOB3LKvbAmFdtOKPVGOdUXKIjQUpk0rfTmpkKL2L/6leG4bRuHxYJuRyiRSXAAcT5Tp/ikoIppu839gvvJT/E0A5KovKdNFRMQTuomoiIiIiIiIiIiIiEgJ1IFuJA4H5P7mnBwOX5dGqiOHA377zTlpHxMxrsLjQYj1d7VVMSYdT8SolJ/ir5SrIiIihqUOdC/Lz87mleBgfm5cm/zs7PKtbMuBBfHOyZZTOQWUwJaTA/HxzilH+5i3FbX/V4KDy9/+xWeK57Y9xyD1Vng8uGXrZVjsaqtiQAFwPFGm+6f8zN94JSqetCsuw5T1u6+LI1J2AZCrvqRMFxERT2gM9EpgLyjHjUNFpFpR+/dPqjcRKYmywT/Zbb4ugYgYkTJdREQqSh3oXhYcHs69v/zCogOZBIeHA6d8XSQRqSJF7b9oXvxD8dw2haneRMRJme6fgsPDufd15/zXYWFoIAwRAWW6iIh4RkO4eJnJbKbGRRcRlJCEyayvVySQFLX/GhddFJDtf8KECbRr144aNWoQHx9P37592b17t9syubm5pKamUqtWLaKioujfvz/Hjh1zW+bgwYP06dOHiIgI4uPjeeyxxyioxDOGlNsiUpJAz3R/ZTKbqREHNeJQvYmIizJdREQ8oSOHiIh4xapVq0hNTWX9+vUsXboUq9VK9+7dyS42zuTDDz/M559/zvz581m1ahWHDx+mX79+rtdtNht9+vQhPz+ftWvXMmfOHGbPns2YMWN88ZFEREREREREJMCpA93LbPn5bJw0iYy3pmLLz/d1cUSkChW1/42TJgVk+1+8eDFDhgyhWbNmXHnllcyePZuDBw+yZcsWADIyMnj77bd55ZVXuOGGG2jTpg2zZs1i7dq1rF+/HoCvv/6anTt38t5779GyZUt69erF+PHjmTZtGvmV9J0Wz21HANabiJQs0DP9bC+99BImk4lRo0a5njPiVUW2/Hw2LoKNi1Cmi4iLMl1ERDyhDnQvs1mtrH78cdJfHoPNavV1cUSkChW1/9WPP672j7PDHCAuLg6ALVu2YLVa6datm2uZxo0bc8kll7Bu3ToA1q1bR/Pmzalbt65rmR49epCZmcmOHTtKfJ+8vDwyMzPdpvIontuOAtWbiDgp08/YtGkTb775Ji1atHB73ohXFdmsVla/D6vfB4duGCgihZTpIiLiCd1E1MvMQUE0GzyYA6fyMQcFAeX44W4KgpTBZ+bLs65IWQQFweDBZ+bFq4raf9F8ILPb7YwaNYqOHTtyxRVXAHD06FFCQkKIjY11W7Zu3bocPXrUtUzxzvOi14teK8mECRMYN25chctaPLdNFoPUW+Hx4MCpfBwmg5RJpLgAOJ4o052ysrIYNGgQb731Fs8//7zr+aKriubNm8cNN9wAwKxZs2jSpAnr16/nmmuucV1VtGzZMurWrUvLli0ZP348TzzxBGPHjiUkJMTr5TUHh9Gs96VkWe0QHOr17YtUmgDIVV9SpouIiCd05PCyoNBQes2ezfy0DIJCQ4Hcsq9sCYX2s4s94Vx3flqGN4sogSw0FGbP9nUpqq2i9i+QmprKjz/+yLffflvp7/Xkk08yevRo1+PMzEzq1atX5vWL57ZhFB4PNhmpTCLFBcDxRJnulJqaSp8+fejWrZtbB3ppVxVdc801572q6L777mPHjh20atXqnPfLy8sjLy/P9bi8VxUFRUTT64t9zE/LwFGuNUV8LABy1ZeU6SIi4gl1oIuIiFeNHDmSRYsWsXr1ai6++GLX8wkJCeTn55Oenu52FvqxY8dISEhwLbNx40a37RWNp1u0zNlCQ0MJDdVZhiIi3vbBBx+wdetWNm3adM5rRr2qSERERETE2zQGupE4HFCQ7ZwcOmdGKoHDAdnZzkn7mHiZw+Fg5MiRfPLJJ3zzzTekpKS4vd6mTRuCg4NZvny567ndu3dz8OBB2rdvD0D79u354YcfOH78uGuZpUuXEh0dTdOmTavmgxhB4fHAYlNbFYPS8aTaO3ToEA899BBz584lLCysyt73ySefJCMjwzUdOnSofBtQfoq/Uq6KiIgYls5A97L87GzevOgi8u0O8o8cLt/Kthz4KMo5PyDL+4UrJ5vNhlU3WKlecnKgdWvn/NatEBHhk2KEhIRgNle//98VtX+Ae3/9lZDISB+XqGqlpqYyb948Pv30U2rUqOE6uzAmJobw8HBiYmIYNmwYo0ePJi4ujujoaB544AHat2/PNddcA0D37t1p2rQpd999NxMnTuTo0aM8/fTTpKamVtpZ5sVz++I1uzBHGKDeCo8H/YAFbX/FZjFAmUSKy8mBqMLfLFlZUA3zLtAzfcuWLRw/fpzWRb8bcP42XL16NW+88QZLliwx5FVF+Zm/8WaS8yz3xDV7cdSoU+FtiVSpAMhVXwr0TBcREc+oA70S5GX495i1DoeDo0ePkp6e7uuiiLfZ7TBzpnP+yBHwUSe22WwmJSWlUm4e5mv+3v49MWPGDAC6dOni9vysWbMYMmQIAK+++ipms5n+/fuTl5dHjx49mD59umtZi8XCokWLuO+++2jfvj2RkZEMHjyY5557rlLLHsj1JiLnF8jZ0LVrV3744Qe354YOHUrjxo154oknqFevnuuqov79+wMlX1X0wgsvcPz4ceLj44GquaooL6fSNi0ifiyQM11ERDyjDnQvCw4PZ9iePXx18BTB4eHAKV8XqdyKOs/j4+OJiIjAZDL5ukjiLTYbnD7tnE9OBoulyotgt9s5fPgwR44c4ZJLLqlW+1dR+y+aDzSOMlxuHBYWxrRp05g2bdp5l6lfvz5ffvmlN4t2QcVz2xQWePUmIiUL9EyvUaMGV1xxhdtzkZGR1KpVy/W8Ea8qCg4PZ9g/nfPfhIXpRqIiAijTRUTEM+pA9zKT2UzNhg0JNmdg8uDs3gU/ZYAPLtm32WyuzvNatWpV+ftLJbPZzsyHhfmkAx2gTp06HD58mIKCAoKDg31ShspQ1P7FvxTPbRGRIsr00hnxqiKT2UzNhDPzIiKgTBcREc+oA13cFI15HuGjsbElMBQN3WKz2apVB7qIiEh1tnLlSrfHRryqSERERETE23RahpfZrFa2TZvGqf97C9sFbsA5P83YZzpWp2E1xHiq6/5V1P63TZt2wfYvxlI8tx2qNxEppEz3TzarlW1fw7avUaaLiIsyXUREPKEOdC+z5eezfORITox7DFt+vq+LIwYxduxYWrZsWeXvO2TIEPr27evRNmbPnk1sbOwFl/HV5zOaova/fORItX8/Ujy3HVbVm4g4KdP9ky0/n+VzYPkcdaCLyBnKdBER8YSGcPEys8XC5X/+M79kWTFbLEBB2Vc2WaDenwFwmHwzNrW/GjJkCOnp6SxcuLBK33flypVcf/31F1xmxYoVVVSaMjCZoGbNM/PiVUXtv2he/EPx3DYZpd4KjweHsq06HogxWSxQmHe+up9GZVOm+ydzUAiXd7mInAIHjiANEyd+JABy1ZeU6SIi4gl1oHtZUFgYf5o/n/lpGQSFhQF5pa4zPy2D2y6NAUsYXDcfALvBh3gRpw4dOnDkyBHX44ceeojMzExmzZrlei4uLu6cMUPLIj8/3zVWuNeYzXDppd7dprgUtX/xL8Vz2zAKjwfrjVQmkeLCwqCa550y3T8FRcbypxW/GCvTRcoiAHLVl5TpIiLiCQ3h4mNn/7jXj/3KsWrVKq666ipCQ0NJTEzk73//OwUFzqsDFi1aRGxsLDabDYDt27djMpn4+9//7lr/r3/9K3fdddc52w0JCSEhIcE1hYeHExoa6vZc8U7w//u//yM5OZmYmBgGDhzIqVOnXK916dKFkSNHMmrUKGrXrk2PHj0A+PHHH+nVqxdRUVHUrVuXu+++m99//9213n/+8x+aN29OeHg4tWrVolu3bmRnZ7uVc/LkySQmJlKrVi1SU1NdN4sFOHnyJPfccw81a9YkIiKCXr16sXfv3gt+ny+99BJ169alRo0aDBs2jNzc3FLrQERERERERERExN+oA12qvV9//ZXevXvTrl07vvvuO2bMmMHbb7/N888/D8B1113HqVOn2LZtG+DsbK9du7bbWeOrVq2iS5cuHpUjLS2NhQsXsmjRIhYtWsSqVat46aWX3JaZM2cOISEhrFmzhpkzZ5Kens4NN9xAq1at2Lx5M4sXL+bYsWMMGDAAgCNHjnDHHXfwl7/8hV27drFy5Ur69euHw+FwbXPFihWkpaWxYsUK5syZw+zZs5k9e7br9SFDhrB582Y+++wz1q1bh8PhoHfv3m6d7MV99NFHjB07lhdffJHNmzeTmJjI9OnTPfpuREREREREREREjEhDuHiZNSeHtxs25LTNgfWnfeVbuSCb2zbEwgawtP0VmyWyUspYIQXZ53/NZHEON1CWZTFDUHjpywZ577NPnz6devXq8cYbb2AymWjcuDGHDx/miSeeYMyYMcTExNCyZUtWrlxJ27ZtWblyJQ8//DDjxo0jKyuLjIwM9u3bR+fOnT0qh91uZ/bs2dSoUQOAu+++m+XLl/PCCy+4lmnYsCETJ050PX7++edp1aoVL774ouu5d955h3r16rFnzx6ysrIoKCigX79+1K9fH4DmzZu7vW/NmjV54403sFgsNG7YkD4dOrB8/nyG/+Uv7P3pJz777DPWrFlDhw4dAJg7dy716tVj4cKF3Hbbbed8jilTpjBs2DCGDRvmKuOyZct0Fjpn2j/AsL17CY6I8HGJpCyK53bSsi2Yww1QbwXZ8FEUtwELjHY8EAHIzoaoKOd8VhZEVr99VJnun6yZv/F2cjwAtVfswxFV28clEimjAMhVX1Kmi4iIJ9SB7mUOh4Osw4dd89XGR1Hnfy2pN3T54szjj+PBllPysvGdodvKM48/TYa8389d7k7vfXe7du2iffv2mIrdNLNjx45kZWXxyy+/cMkll9C5c2dWrlzJI488wn//+18mTJjARx99xLfffsuJEydISkqiYeEPropKTk52dZ4DJCYmcvz4cbdl2rRp4/b4u+++Y8WKFURFnfv9p6Wl0b17d7p27Urz5s3p0aMH3bt3589//jM1i24UCjRr1gxLsRvlJNaqxQ9paa7vJigoiKuvvtr1eq1atWjUqBG7du0q8XPs2rWLv/3tb27PtW/f3lg3S/WRatv+q7ni9YbqTUQKKdP9k8PhIOukc7626k1ECinTRUTEE+pA97KgsDDu2baNpYdOFd5ENMvXRZIy6NKlC++88w7fffcdwcHBNG7cmC5durBy5UpOnjzp8dnnAMHBwW6PTSYTdrvd7bnIs840ycrK4uabb+bll18+Z3uJiYlYLBaWLl3K2rVr+frrr3n99dd56qmn2LBhAykpKWV+X/GOovZfNC/+oXhum0JVbyLipEz3T0FhYdxTeHHff0NDUTeZiIAyXUREPKMOdC8zWyzEt2xJSI0MzMXO+vV7Ay7wjwDTWZ+z//GSlwPOGXb/lgMVLVGZNWnShI8//hiHw+E6C33NmjXUqFGDiy++GDgzDvqrr77q6izv0qULL730EidPnuSRRx6p9HKWpHXr1nz88cckJycTFFRyczWZTHTs2JGOHTsyZswY6tevzyeffMLo0aNL3X6TJk0oKChgw4YNriFc/vjjD3bv3k3Tpk3Pu86GDRu45557XM+tX7++Ap+u+ilq/+Jfiue2iEgRZbp/MlssxCc7503V6be4iHhEmS4iIp7QTUSlbIIizz9Zwsq+bPHxzy+0bAVkZGSwfft2t+nQoUPcf//9HDp0iAceeID//e9/fPrppzz77LOMHj0as9nZBGrWrEmLFi2YO3eu62ahnTp1YuvWrezZs8crZ6BXRGpqKidOnOCOO+5g06ZNpKWlsWTJEoYOHYrNZmPDhg2um3kePHiQBQsW8Ntvv9GkSZMybb9hw4bccsstDB8+nG+//ZbvvvuOu+66i4suuohbbrmlxHUeeugh3nnnHWbNmsWePXt49tln2bFjhzc/toiIiIiIiIiIiCHoDHQvs1mt7Jo7l6zjOdgeHu7r4gSUlStX0qpVK7fnhg0bxr///W++/PJLHnvsMa688kri4uIYNmwYTz/9tNuynTt3Zvv27a4O9Li4OJo2bcqxY8do1KhRVX0MN0lJSaxZs4YnnniC7t27k5eXR/369enZsydms5no6GhWr17NlClTyMzMpH79+vzzn/+kV69eZX6PWbNm8dBDD3HTTTeRn59Pp06d+PLLL88Z+qXI7bffTlpaGo8//ji5ubn079+f++67jyVLlnjrY/utovYP0GTQICzn+Q7FWIrnduSfBmBSvZVqfpr72fq3XRrjo5KIVB5lun+yWa3sWuWcd1xpBZ2ELiIo00VExDMmh+6gQWZmJjExMWRkZBAdHV3m9eanZZzTaZCfnc3Uwhs+PpiVxadHC7jt0hhXZ8OF5inIdt2sc0HbX7FZIt2WcS1XiXJzc9m/fz8pKSmEaWy46sdmg8Kx/2jVCnx0aXN13c/Obv8hkWW7mqKiGSQlK+/3Wbze6n3/K+YIZ715krce53YJxwNPy+RN6kAXsrOh6AbXWVlQxrzzJ8p0Yyh3pmccZ2psXQCSt+3FUaOO2+vKK+84+zgA+m49FgC56kvKdBER8YTOQPcys8VCSu/eHM0pKBwDvaDsK5ssHIntTmJEEI6zxxUX8QaTCWJizsyLVxW1/6J58Q/Fc9sw4+WaLJDUmyM5BToeiDFZLFCYd776Z2xlU6b7J3NQCClX1yHP5sARpDNMxY8EQK76kjJdREQ8oQ50LwsKC6P/F18wPy2j8O7eeWVf2RLGt40+4rZLY7CXcFaHiMfMZmjY0NelqLaK2r/4l+K5bRiWMOjyBd8aqUwixYWFQTXPO2W6fwqKjKX/+uPGynSRsgiAXPUlZbqIiHhCNxEVERERERERERERESmBzkAXEREJABq3XERERERERKT8dAa6l1lzcvh3w4b82rU11pyc8q1ckM2tm5Lgw0gstuzKKaAENpsNtm51Tjabr0tT7RS1/383bFj+9i8+Uzy37acNUm8F2fBhJLduStLxQIwpO9t5g7vISOd8NaRM90/WzN/4d6KZjGtrYsr63dfFESm7AMhVX1Kmi4iIJ3QGupc5HA7S9+1zzZdXkF0Hc6lkdruvS/D/7d17XFRl/gfwz5mBAQYEGuWqIuINUdDES2gpJQZWJhu7mmmJy2oXtIjYbd28Vqa7tkUm6e62Sf022yTTSktDC8q7aW5e8AJqaALeAuTOzJzfHwMjIyMyzgxnLp/36zUvnznX7zkP53vGZ848j8My9/onabSsN9hSvWlqeJMm2+bgDRDM6fZJFEWUl+rqy5f1RvbGwfOqlJjTiYjIHPy/uYW5uLtjyo4d+OaXqqZBRKukDomIOkjz9d9cJvvQMm8Lbqw3ItJhTrdPLu7umLJAV97j5gY2kxERwJxORETmYQO6hcnkcnQdNQruRRWQyeVSh0NEHaj5+if70jJvExE1Y063TzK5HF376coCP4sTURPmdCIiMgf7QCciIiIiIiIiIiIiMoIN6BamVatxIicH1V9uhFatljocukF2djZ8fX1NWic5ORmJiYkWj0UQBGzcuNHi223L2bNnIQwbhkMnTpi1ndDQUGRmZra5jBTHJ7Xm6/9ETg6vfzvSMm+LrDciasKcbp+0ajVO7AVO7AVzOhHpMacTEZE52IBuYer6enwxaRIuP5sMdX291OE4jZs1cufl5UEQBJSXlwMAJk+ejJMnT1o1ltjYWAiCcNNXbGysVfdP0mm+/r+YNInXvx1pmbfFBtYbEekwp9sndX09vlgBfLECEBsapA6HiGwEczoREZmDfaBbUE5RBRKDFeg2Zgwu1aohyEz7fmL9mWu4p9Mo+Hu4QBT43YY1eHh4wMPDw6r7+PTTT9HQ9B+2c+fOYfjw4di2bRsGDBgAAFAoFLe1XVEUodFo4OJixmUrCLp/PT2vl8liBJkM3caM0ZfJPjTX26VaNWAz9SYD/MfgYq2a9wOyTTIZ0JTvbOe6sSzmdPskyFzQLcoHjVoRIvtAJ3viBHlVSszpRERkDt45LMzVwwOP5uUhcO1muJrYUKuVeSA/YjMQlwetzLqNvM7KWBcur776Kvz9/dGpUyf84Q9/wJ///GcMHjy41bqvv/46goKC0LlzZ6SmpqKxsdHoPlQqFQIDAxEYGAg/Pz8AQOfOnfXTVCqVftnLly/jN7/5DZRKJfr06YPPP/9cP6/56fmvvvoK0dHRcHNzw44dO6DVarF06VL07NkTHh4eGDRoED755BP9er/++iumTp0KPz8/eHh4oE+fPlizZo1uZtOHxdNaLe4dOxZKpRKDBg3C7t27DY5h/fr1GDBgANzc3BAaGoq///3vbZ7XU6dOYfTo0XB3d0dERARyc3PbXN5RNV//j+blmXz9k3Ra5m2Zu43Um4sHEJeH/IjNvB+QbfLwAPLydC8HzXfM6fbJtZMKj/6vHO4biwGl6tYrENkKJ8irUmJOJyIic9h0A/qiRYtadX8RHh6un19XV4fU1FR07twZXl5eSEpKQllZmYQRO7Dq6pu/6urav2xtbfuW7SAffvghlixZgr/+9a84cOAAQkJCsGrVqlbLffvttygqKsK3336L999/H9nZ2cjOzjZ7/4sXL8akSZPw008/4YEHHsDUqVNx9epVg2X+/Oc/Y9myZSgoKEBUVBSWLl2KDz74AKtXr8bRo0fx/PPPY9q0acjPzwcAzJ8/H8eOHcNXX32FgoICrFq1Cl26dDHY5ksvvYSMjAwcOnQIffv2xZQpU6Bu6gvwwIEDmDRpEh599FEcPnwYixYtwvz58296vFqtFo888ggUCgX27t2L1atX48UXXzT73BAREREREREREUnN5rtwGTBgALZt26Z/37L7iueffx6bN29GTk4OfHx8MHv2bDzyyCPYuXOnFKE6Ni+vm8974AFg8+br7/39gZoa48uOGaN7qqJZaChw+XLr5UTR5BA3bdoErxvi1Gg0ba7z9ttvIyUlBTNmzAAALFiwAF9//TWqqqoMlrvjjjuwcuVKyOVyhIeH48EHH8T27dsxc+ZMk+NsKTk5GVOmTAEAvPbaa1ixYgX27duHhIQE/TIvv/wyxo0bBwCor6/Ha6+9hm3btiEmJgYAEBYWhh07duAf//gHxowZg+LiYtx5550YOnQoAN2AnzfKyMjAgw8+CEDXiD9gwAAUFhYiPDwcb7zxBsaOHYv58+cDAPr27Ytjx45h+fLlSE5ObrWtbdu24fjx49i6dSuCg4P1xzJ+/Hizzg0REREREREREZHUbPoJdEDXYN7c9UVgYKD+SdqKigr8+9//xhtvvIH77rsP0dHRWLNmDXbt2oU9e/ZIFm9jbS3eHzwYFybcjcYbn7a+BbmmGg8f6AWs94Nc03FPYTuKe++9F4cOHTJ4vfvuu22uc+LECQwfPtxg2o3vAd0XOfIW/WgGBQXh4sWLZsccFRWlL3t6esLb27vVdpsbwgGgsLAQNTU1GDduHLy8vPSvDz74AEVFRQCAp59+Gv/9738xePBg/OlPf8KuXbuub6zpC4Uod3d9OSgoCAD0+y0oKMCoUaMMYhg1ahROnTpl9AuJgoICdO/eXd94DkDfuO9smq//9wcPNvn6J+m0zNvaOhupN3U1sN4PDx/oxfsB2abqasDPT/fqwF+OdSTmdPvUeO0y3u/pguqxnSFUG3lIg8hWOUFelRJzOhERmcPmn0A/deoUgoOD4e7ujpiYGCxduhQhISE4cOAAGhsbERcXp182PDwcISEh2L17N+66666bbrO+vh71LUberqystFi8olaLS//7n75sKjf1FUBtsXAs54Ynsg3cOEBTWw3LNw7YcvbsbYd0I09PT/Tu3dtg2vnz5y2ybVdXV4P3giBAexv1ezvb9fT01Jebn4zfvHkzunbtarCcm5sbAGD8+PH4+eef8eWXXyI3Nxdjx45FamoqXn/99ev7vWGfACxyPM7O3OufpNGy3mBL9VZ/GW5Sx0DUFmO/IHMgzOn2SdRqcems7gt/L63pv2gkkpSD51UpMacTEZE5bLoBfcSIEcjOzka/fv1QUlKCxYsX45577sGRI0dQWloKhULRakDIgIAAlJaWtrndpUuXYvHixVaJ2cXdHb/9+mt8d6EaLu7uANpoeLYnLRpxJVvWCvr164f9+/fjiSee0E/bv3+/hBG1LSIiAm5ubiguLsaYplHkjfHz88P06dMxffp03HPPPfjjH/9o0IDelv79+7fqBmnnzp3o27evwVP4LZc/d+4cSkpK9E+zS/krECk1X//NZbIPLfO24MZ6IyId5nT75OLujt/+WVc+4OYGNqETEcCcTkRE5rHpBvSWfShHRUVhxIgR6NGjB9atWwcPM0bOnjt3LtLT0/XvKysr0b17d7NibSaTyxE6bhz2F1VAZqSxkWzLnDlzMHPmTAwdOhQjR47Exx9/jJ9++glhYWFSh2ZUp06dkJGRgeeffx5arRZ33303KioqsHPnTnh7e2P69OlYsGABoqOjMWDAANTX12PTpk3o379/u/fxwgsvYNiwYXjllVcwefJk7N69GytXrsQ777xjdPm4uDj07dsX06dPx/Lly1FZWYmXXnrJUodsV5qvf7IvLfM2EVEz5nT7JJPLERqpKx/kZ3EiasKcTkRE5rDpBvQb+fr6om/fvigsLMS4cePQ0NCA8vJyg6fQy8rKEBgY2OZ23Nzc9N1dkHObOnUqTp8+jYyMDNTV1WHSpElITk7Gvn37pA7tpl555RX4+flh6dKlOH36NHx9fTFkyBD85S9/AQAoFArMnTsXZ8+ehYeHB+655x7897//bff2hwwZgnXr1mHBggV45ZVXEBQUhJdfftnoAKIAIJPJsGHDBqSkpGD48OEIDQ3FihUrDAZCJSIiIiIiIiIiskd21YBeVVWFoqIiPP7444iOjoarqyu2b9+OpKQkALoBIYuLiyUdwFCrVuPM1q2oKamGtscjksXhbLKzs41Oj42NhShe//FucnJyq4bg+fPnY/78+fr348aNM+hL3di2MzMz2xVXaGiowf5bMja9vLz8prE3EwQBzz33HJ577jmj2503bx7mzZt383hu6KLG19e31X6SkpL015UxZ2/ou75v3774/vvvDabd7LgdWfP1DwA94+Mhc7GrFOu0WuZtj3vGQmC9ERGY0+2VVq3GmR91ZXGwGuBD6EQE5nQiIjKPTd81MjIyMGHCBPTo0QMXLlzAwoULIZfLMWXKFPj4+CAlJQXp6elQqVTw9vbGnDlzEBMT0+YAotamrq/Hhoce0pWnOEj/5w6spqYGq1evRnx8PORyOT766CNs27YNubm5UodGdqjl9f9sVRUU/GBuF1rWW/effmEDOhEBYE63V+r6emxoGvYldGoDOBozEQHM6UREZB6bvmucP38eU6ZMwZUrV+Dn54e7774be/bsgZ+fHwDgzTffhEwmQ1JSEurr6xEfH3/Tfpo7iiCTIWDoUPxar4Egk5m0rijIcNXzTqjc5BAF09al2yMIAr788kssWbIEdXV16NevH9avX4+4uDipQ7MOQQCUyutlsqjm67+5TPahZd6GzdSbDFANxdV6De8HZJtkMqAp39nOdWNZzOn2SZC5IKCPEhoRENkHOtkTJ8irUmJOJyIic9h0A/qt+m12d3dHVlYWsrKyOiiiW3P18MDj+/cjp6gCrh4eABrava5W5oHtA7/F73r5QMvB7DqEh4cHtm3bJnUYHUcmAyIipI7CYTVf/2RfWuZtm+HiASTsx3ZbiomoJQ8PwMHzHXO6fXLtpMLjJ6ttK6cTtYcT5FUpMacTEZE5+NUrERFZxHfffYcJEyYgODgYgiBg48aNBvNFUcSCBQsQFBQEDw8PxMXF4dSpUwbLXL16FVOnToW3tzd8fX2RkpKCqip2h0VE1NGWLl2KYcOGoVOnTvD390diYiJOnDhhsExdXR1SU1PRuXNneHl5ISkpCWVlZQbLFBcX48EHH4RSqYS/vz/++Mc/Qq1Wd+ShEBERERGZhQ3oRERkEdXV1Rg0aNBNfxX0t7/9DStWrMDq1auxd+9eeHp6Ij4+HnV1dfplpk6diqNHjyI3NxebNm3Cd999h1mzZnXUIRARUZP8/HykpqZiz549yM3NRWNjI+6//35UV1frl3n++efxxRdfICcnB/n5+bhw4QIeeeQR/XyNRoMHH3wQDQ0N2LVrF95//31kZ2djwYIFUhwSEREREdFtsekuXOxRY20tcuLicKVOg8Yd35q0rlxTg/ifRgBHZJD33w2NXGmlKMlpaTTA0aO68oABAPsGtajm6x8AfrdtW1M3Ts5j/PjxGD9+vNF5oigiMzMT8+bNw8SJEwEAH3zwAQICArBx40Y8+uijKCgowJYtW7B//34Mbeqj8u2338YDDzyA119/HcHBwVaJu2Xe9v9gI2TuNlBv6hpgcwQeaNRia9Re3g/I9tTUXO8S7Nix6+NrOBBnz+lbtmwxeJ+dnQ1/f38cOHAAo0ePRkVFBf79739j7dq1uO+++wAAa9asQf/+/bFnzx7cdddd+Prrr3Hs2DFs27YNAQEBGDx4MF555RW8+OKLWLRoERQKhcXjbrx2BTnDu0IrinBfVwDRs7PF90FkFU6QV6Xk7DmdiIjMwyfQLUzUanFh1y7UH9wLUas1dW14NpwDqn8GIFojPCKgoUH3Iotrvv4v7Np1G9e/Yztz5gxKS0sNBuj18fHBiBEjsHv3bgDA7t274evrq288B4C4uDjIZDLs3bv3ptuur69HZWWlwcsULfM2bKbeRKD6Z909gfcDskWiCPz8s+4lOubfKHO6oYoKXZ/iKpUKAHDgwAE0NjYa5PXw8HCEhIQY5PXIyEgEBATol4mPj0dlZSWONn+hb2GiVoMLx+tReqLBhnI6UTs4QV6VEnM6ERGZg0+gW5iLmxsmbtiAXaXVcHFzA8A+HomcRfP131ym60pLSwHAoBGl+X3zvNLSUvj7+xvMd3FxgUql0i9jzNKlS7F48eLbjq1l3hYUrDci0mFOv06r1SItLQ2jRo3CwIEDAehytkKhgK+vr8GyN+Z1Y3m/eZ4x9fX1qK+v17839UtRFzc3THxeV/5JoeBXkEQEgDmdiIjMwwZ0C5O5uKBPYiIOFVVA5sLTS+RMmq9/6lhz585Fenq6/n1lZSW6d+/e7vVb5m0iombM6delpqbiyJEj2LFjh9X3Ze6XojIXF/Rp+iHTYX4WJ6ImzOlERGQOduFCTi8vLw+CIKC8vLzN5UJDQ5GZmWmx/cbGxiItLc1i2yOyZYGBgQCAsrIyg+llZWX6eYGBgbh48aLBfLVajatXr+qXMcbNzQ3e3t4GLyIisozZs2dj06ZN+Pbbb9GtWzf99MDAQDQ0NLT6/HRjXjeW95vnGTN37lxUVFToX+fOnbPg0RARERERmY4N6GbKueGJRa1Gg+K8PNTt+R5ajUaiqJxTaWkp5syZg7CwMLi5uaF79+6YMGECtm/f3uZ6I0eORElJCXx8fADoBsm68efIALB//37MmjXLGqEbdbM4yHY1X//FeXm8/m/Qs2dPBAYGGlyPlZWV2Lt3L2JiYgAAMTExKC8vx4EDB/TLfPPNN9BqtRgxYoTVYmuZt0XWGxE1cfacLooiZs+ejQ0bNuCbb75Bz549DeZHR0fD1dXVIK+fOHECxcXFBnn98OHDBl+O5ubmwtvbGxHNgyXewNwvRbUaDYqPAcXHwJxORHrOntOJiMg8/F2jhanr6rDu3nt15cQqiaNxHmfPnsWoUaPg6+uL5cuXIzIyEo2Njdi6dStSU1Nx/Phxo+s1NjZCoVC0+XRrMz8/P0uHTQ6m5fX/bFUVFJ6eEkfUsaqqqlBYWKh/f+bMGRw6dAgqlQohISFIS0vDq6++ij59+qBnz56YP38+goODkdj0c9r+/fsjISEBM2fOxOrVq9HY2IjZs2fj0UcfRXBwsNXibllv3X/6BYLSueqNiIxz9pyempqKtWvX4rPPPkOnTp30fZb7+PjAw8MDPj4+SElJQXp6OlQqFby9vTFnzhzExMTgrrvuAgDcf//9iIiIwOOPP46//e1vKC0txbx585Camgo3K/VBrK6rw7olunLob+sBhVV2Q0R2xtlzOhERmYdPoFuYIAjoHBEB197hEATB1LVR4REO+EQAMHVd5/bMM89AEATs27cPSUlJ6Nu3LwYMGID09HTs2bNHv5wgCFi1ahUefvhheHp6YsmSJQZduOTl5WHGjBmoqKiAIAgQBAGLFi0C0LoLl/Lycjz55JMICAiAu7s7Bg4ciE2bNgEArly5gilTpqBr165QKpWIjIzERx99ZNFjLi4uxsSJE+Hl5QVvb29MmjRJ/7PoiooKyOVy/PDDDwB0g3+pVCrcNXIk4O4OuLvjPx9+aFI/0XRrzdd/54iI27j+7d8PP/yAO++8E3feeScAID09HXfeeScWLFgAAPjTn/6EOXPmYNasWRg2bBiqqqqwZcsWuLu767fx4YcfIjw8HGPHjsUDDzyAu+++G//85z+tGnfLvA2bqTcB8InQ3RN4PyBbJAhARITuZTPXjWU5e05ftWoVKioqEBsbi6CgIP3r448/1i/z5ptv4qGHHkJSUhJGjx6NwMBAfPrpp/r5crkcmzZtglwuR0xMDKZNm4YnnngCL7/8stXiFgQZOoe4wbe7wmH/NslBOUFelZKz53QiIjIPn0C3MFelEjOOHkVOUQVclUoA7R+UTiNX4uuoPfhdLx9obGwwu4bqagC642v+wKFpaICmsREyFxeDkcz1y3p4QJDpvqPRNDZC09AAmVwOlxaNZTdbVu7q2u7Yrl69ii1btmDJkiXwNPIkwY3doCxatAjLli1DZmYmXFxccPr0af28kSNHIjMzEwsWLMCJEycAAF5eXq22qdVqMX78eFy7dg3/+c9/0KtXLxw7dgxyuRwAUFdXh+joaLz44ovw9vbG5s2b8fjjj6NXr14YPnx4u4/tZrRarb7xPD8/H2q1GqmpqZg8eTLy8vLg4+ODwYMHIy8vD0OHDsXhw4chCAJ+PHQIVaGhuvXeegtjxowxOxa6rvn6d1axsbEQRfGm8wVBwMsvv9xmw4lKpcLatWutEd5NtczbNsNFCTx4FF/bUkxELSmVgIPnO2fP6W3l82bu7u7IyspCVlbWTZfp0aMHvvzyS0uG1iZX7y6Y8XMdcooqcOsjILIhTpBXpeTsOZ2IiMzDJ9CpXVZ4eWGFlxdqL1/WT9u/fDlWeHlh++zZBsu+4++PFV5eqCwu1k87lJWFFV5e2JqSYrDsv0JDscLLC1cKCvTTjmZnmxRbYWEhRFFEeHh4u5Z/7LHHMGPGDISFhSEkJMRgnkKhgI+PDwRBQGBgIAIDA402oG/btg379u3Dp59+inHjxiEsLAwPPfQQxo8fDwDo2rUrMjIyMHjwYISFhWHOnDlISEjAunXrTDq2m9m+fTsOHz6MtWvXIjo6GiNGjMAHH3yA/Px87N+/H4CuMTMvLw+AbqDUcePGoX///tixY4d+GhvQiYiIiIiIiIiIbo4N6GT32vOEVEtDhw41e5+HDh1Ct27d0LdvX6PzNRoNXnnlFURGRkKlUsHLywtbt25FcYsvFcxRUFCA7t27G3TBEhERAV9fXxQ0fRkxZswY7NixAxqNBvn5+YiNjdU3ql+4cAGFhYWIjY21SDxERERERERERESOiF24WFhjbS02PvwwymrVaMw17eeqck0Nxh69Dzgug7zPNmjkSitFabpnq3QDouq6pdEZ9sc/YkhaGmQuhn9Gz1y8qFvWw0M/bXBqKiJnzoSsqYuTZjPPnm217IDkZJNi69OnDwRBuOlAoTcy1s2LqTxaxGvM8uXL8dZbbyEzMxORkZHw9PREWloaGhoazN53e40ePRrXrl3DwYMH8d133+G1115DoL8/li1ejEEqFYKDg9GnT58Oi8cZNF//AJD4+ecGf9dku1rmbb9/fASZuw3Um7oG2DoM9zdosX3ANzZ1PyACANTUAMOG6cr79+u6HnAwzOn2qfHaFWwc3QNqrQjX/zsM0bOz1CERtY8T5FUpMacTEZE52IBuYaJWi5+3bdOXTVwbPrXHgVpd2ZYYG6VcrlBArlC0b1lXV6P9mt9sWVOoVCrEx8cjKysLzz77bKsG8vLy8lb9oLdFoVBAo9G0uUxUVBTOnz+PkydPGn0KfefOnZg4cSKmTZsGQNdn+cmTJxEREdHuONrSv39/nDt3DufOndM/hX7s2DGUl5fr9+Hr64uoqCisXLkSrq6uCA8Ph3/nzphcUIBN33yDMaNHWyQWus6865+k0rLeYDP1JgIVx+DTXCayNaIIHDt2veyAmNPtk6jV4OdDujF2QllvZE+cIK9KiTmdiIjMwQZ0C3Nxc8MD//kP9pbVNA2sqZY6JKeQlZWFUaNGYfjw4Xj55ZcRFRUFtVqN3NxcrFq1St+tSXuEhoaiqqoK27dvx6BBg6BUKqG84QmQMWPGYPTo0UhKSsIbb7yB3r174/jx4xAEAQkJCejTpw8++eQT7Nq1C3fccQfeeOMNlJWVmdyArtFocOjQIYNpbm5uiIuLQ2RkJKZOnYrMzEyo1Wo888wzGDNmjEEXNbGxsXj77bfx29/+FoDuy4b+oaH4eNs2ZL39tkmx0K01X//NZbIPLfO2oGC9EZEOc7p9cnFzwwPP6MoFCgW/giQiAMzpRERkHjagW5jMxQURU6fiaFFFq65NyHrCwsJw8OBBLFmyBC+88AJKSkrg5+eH6OhorFq1yqRtjRw5Ek899RQmT56MK1euYOHChVi0aFGr5davX4+MjAxMmTIF1dXV6N27N5YtWwYAmDdvHk6fPo34+HgolUrMmjULiYmJqKioMCmWqqoq3HnnnQbTevXqhcLCQnz22WeYM2cORo8eDZlMhoSEBLx9Q6P4mDFjkJmZadDXeWx0NP536hRiOYCoxTVf/2RfWuZtIqJmzOn2SebigohRuvJxfhYnoibM6UREZA5+qiSHERQUhJUrV2LlypU3XcbYgKOxsbGtpq9atapVw/vZpv7am6lUKrz33ntG96NSqbBx48Y2483Ly2tzfnJyMpLb6A8+JCQEn332WZvbSExMbHVsmS+8gMwXXgD69WtzXSIiIiIiIiIiImfHBnQL02o0KDt4EPXnq6ANZR/TRM6k+foHgIAhQ1oNmku2qWXeVgwYBIH1RkRgTrdXWo0GZUW6sninBmC1ERGY04mIyDxsQLcwdV0dPhw+XFeuqpI4GiLqSC2v/2erqowOkku2p2W9df/pFwhK1hsRMafbK3VdHT5coCuHTqgHWo93T0ROiDmdiIjMwQZ0CxMEAfKu3fVlE9dGtaI7PF1lAExdl6idFPyfpLUIggDvHj30ZbIPzfVWrdYCNlNvAuDZA9WNWvB+QDZJEICmfGc7141lMafbJ0GQwdtPrhs8lPVG9sQJ8qqUmNOJiMgcbEC3kJymwedclUp0yz+sLwPtH5ROI1fiyzsP43e9fKDhYHZkDXI5EBUldRQOy1WpxKwb+son29dcbzm2lHddlMDEs/jSlmIiakmpBBw83zGn2ydX7y6YdVGNnKIKtB75hsiGOUFelRJzOhERmUMmdQBERERERERERERERLaIDehEREREREREREREREawAd3C1HV1uPjUY7j41GNQ19WZtK5MW4uxR+4FtgyDTFtrpQjJqWm1wLFjupdWK3U0DkddV4eNiYnYmJho8vVP0mmut4tPPQax3kbqTV0LbBmGsUfu5f2AbFNtLTBsmO5V65h/o8zp9kld9Ss2jrwD4mM9gNpfpQ6HqP2cIK9KiTmdiIjMwT7QLUyr0aB225f6sikEUQtV9Y9ANSCEsXGTrEAUgZqa62WyKK1Gg8LPPtOXyT60rDdRo7GRITu1wNUfoILu3kBkc7Ra4IcfrpcdEHO6fdJqGlG4uxwAEKpWsx90sh9OkFelxJxORETmYAO6hckVCqhefUtfBtTSBkREHUauUOD+f/5TXyb70FxvP1ysheDKeiMiHeZ0+yRXKHB/iq58ytWVDehEBIA5nYiIzMMGdAuTu7qi06PT9WWyfXl5ebj33nvx66+/wtfX96bLhYaGIi0tDWlpaRbZb2xsLAYPHozMzEyztnP27Fn07NkTP/74IwYPHtyudbK/+AJpcXEoLy83a99kSO7qiqiZM6UOg0zUXG8niiqkDsUp5bQ477/r5SNhJESGmNPtk9zVFVH36cqF/CxORE2Y04mIyBzsA50cRmlpKebMmYOwsDC4ubmhe/fumDBhArZv397meiNHjkRJSQl8fHQNN9nZ2UYb0vfv349Zs2ZZI3SjbhYHAAiCgI0bNwIAunfvjpKSEgwcOLDDYiMiIiIiIiIiInIGfALdwkStFg0nC3TlnsMljsZ5nD17FqNGjYKvry+WL1+OyMhINDY2YuvWrUhNTcXx48eNrtfY2AiFQoHAwMBb7sPPz8/SYVuEXC5vV/xkfaJWiysFuuu/c//+EGT8jtIeNNdbQ/E1uPbux3ojIgDM6fZK1Gpx5XxTeYgWkEsbDxHZBuZ0IiIyB+8aFtZYW4uSB2JQ8kAMGjl6eod55plnIAgC9u3bh6SkJPTt2xcDBgxAeno69uzZo19OEASsWrUKDz/8MDw9PbFkyRLk5eVBEASUl5cjLy8PM2bMQEVFBQRBgCAIWLRoEQBdFy4tu1spLy/Hk08+iYCAALi7u2PgwIHYtGkTAODKlSuYMmUKunbtCqVSicjISHz00UdWOfazZ89CEAQcOnRIP+3zzz9Hnz594O7ujnvvvRfvv/++/hhb2rp1K/r37w8vLy8kJCSgpKTEKjE6i8baWmQPHIjsgQN5/duR5noreSAGYh3rjYh0mNPtU2NtLbJfBLJfBMS6OqnDISIbwZxORETm4BPoViC7o/Ntr1vv0hlucsGC0VhGQ3U1AMBVqYQg6OLTNDRA09gImYsLXNzcWi/r4aH/Zl/T2AhNQwNkcjlc3N1vuawp/cdfvXoVW7ZswZIlS+Dp6dlq/o3doCxatAjLli1DZmYmXFxccPr0af28kSNHIjMzEwsWLMCJEycAAF5eXq22qdVqMX78eFy7dg3/+c9/0KtXLxw7dgxyue4xp7q6OkRHR+PFF1+Et7c3Nm/ejMcffxy9evXC8OHW/WXCmTNn8Nvf/hbPPfcc/vCHP+DHH39ERkbG9QVcXAC5HDU1NXj99dfxf//3f5DJZJg2bRoyMjLw4YcfWjU+R+fRpYvUIdBt8OjSBfUaGxtqzs0GYyJqyQnyHXO6ffLwFiAyfZI9Ys6xKuZ0IiK6XWxAtzCFpye67y/Sl4H2D0qnkXvi8+gi/K6XDzQ2NpjdiqZG5GcuXoSyqSuT/cuXY8e8eYj8wx8Q/69/6Zd9x98f6poazDxzBj6hoQCAQ1lZ+Pb559H/scfwYIsG2n+FhqL28mUkHzmCLgMGAACOZmebNMBLYWEhRFFEeHh4u5Z/7LHHMGPGDP37lg3oCoUCPj4+EAShzW5Rtm3bhn379qGgoAB9+/YFAISFhennd+3a1aDRes6cOdi6dSvWrVtnUgN6RUWF0Qb8tvzjH/9Av379sHz5cgBAv379cOTIESxZsgSQy4HBg4FDh9DY2IjVq1ejV69eAIDZs2fj5ZdfNmlfZEjh6YnUS5ekDoNM1FxvObaUd108gaRL+NyWYiJqydMTcPB8x5xunxQ+/kit0CKnqAJsQydbZvRzx55CDqhtJczpRERkDjagk90TTXzEaOjQoWbv89ChQ+jWrZu+8fxGGo0Gr732GtatW4dffvkFDQ0NqK+vh1KpNGk/nTp1wsGDB1tN79Onz03XOXHiBIYNG2YwzVijvVKp1DeeA0BQUBAuXrxoUnxERFJq2fjABgciIiIiIiKyBjagU7s8W1UFQNeFS7Nhf/wjhqSlQeZi+Gf0TFMjrKuHh37a4NRURM6cCZnccCSnmWfPtlp2QHKySbH16dMHgiDcdKDQGxnr5sVUHi3iNWb58uV46623kJmZicjISHh6eiItLQ0NDQ0m7Ucmk6F3797mhHpTrjd0kyMIgslfRhARERERERERETkyDiJqYeq6OlxKn4lL6TOhNnHgIpm2FmOOPQhsi4VMa1sDmyg8PaHw9NT3fw4AcoUCCk9Pg/7PDZZtMbK53NVVt2yL/s/bWtYUKpUK8fHxyMrKQnVTn+ot3Thw5q0oFApoNJo2l4mKisL58+dx8uRJo/N37tyJiRMnYtq0aRg0aBDCwsJuuqyl9evXDz/88IPBtP379+sKWi1w4gTAwUKtQl1Xh81Tp2Lz1KkmX/8kneZ6u5Q+E2K9jdSbuhbYFosxxx60ufsBEQCgthaIjdW9HHQwNuZ0+6Su+hWbxwZAltIbqP1V6nCI2k1WV4sxjz3o0HlVSszpRERkDjagW5hWo0HN5zmo+TwH2ls0wt5IELXwv7YTuJgPQdRaKULHlJWVBY1Gg+HDh2P9+vU4deoUCgoKsGLFCsTExJi0rdDQUFRVVWH79u24fPkyampqWi0zZswYjB49GklJScjNzcWZM2fw1VdfYcuWLQB0T8Xn5uZi165dKCgowJNPPomysjKLHOutPPnkkzh+/DhefPFFnDx5EuvWrUN2djYAQACAa9cAfmi0Cq1Gg4K1a1Gwdq3J1z9Jp7neaj7PgWgz9aYFLubD/9pO3g/INmm1QH6+7qV1zL9R5nT7pNU0ouCbiziTfxmCWi11OETtJmi18N+306HzqpSY04mIyBzswsXC5AoF7njpNX0Z4Af3jhAWFoaDBw9iyZIleOGFF1BSUgI/Pz9ER0dj1apVJm1r5MiReOqppzB58mRcuXIFCxcuxKJFi1ott379emRkZGDKlCmorq5G7969sWzZMgDAvHnzcPr0acTHx0OpVGLWrFlITExERYX1BwTs2bMnPvnkE7zwwgt46623EBMTg5deeglPP/003G74tQBZllyhwL1vvqkvk31orrdDl2shuLLeiEiHOd0+yRUK3DtNVz7r6sqBRIkIAHM6ERGZhw3oFiZ3dYX3jGf0Zeo4QUFBWLlyJVauXHnTZYz18R0bG9tq+qpVq1o1vJ9t6q+9mUqlwnvvvWd0PyqVChs3bmwz3ry8vDbnJycnI/km/cG3jDc0NLRV/A8//DAefvhh/fslS5agW7ducG/qQid5wgQkL1hgsE5iYiL7QDeT3NUV0WlpUodBJmqut9NF1v+Ci4jsB3O6fZK7uiJ6vK78Mz+LE1ET5nQiIjIHG9CJHNA777yDYcOGoXPnzti5cyeWL1+O2bNnSx0WERERERERERGRXWEDuoWJWi3U53/WlXsOlDgaclanTp3Cq6++iqtXryIkJAQvvPAC5s6dK3VYDk/UalFZXAwA8A4JMRgcl2xXc72pz1dCHtyd9UZEAJjT7ZWo1aLy0vUy5NLGQ0S2gTmdiIjMwQZ0C2usrcUvsYN05aoqiaMhZ/Xmm2/izaY+/gxwwByraqytxb969gQAPFtVBYWnp8QRUXu0rLfuP/0CQcl6IyLmdHvVWFuLf6XpyqE/1gGunSSNh4hsA3M6ERGZgw3oViB4KG97XbVMCRfBgsEQ3YhPW1iVi/L2r3+SjotSCY2tDQEgV0JtazERteQE+Y453T65cMx0slNqD/5f0JqY04mI6HaxAd3CFJ6eCDl8QV8G2j8onUbuiQ3DLuB3vXyg4WB2ZA1yOTBkiNRROCyFpyfSqqulDoNM1FxvObaUd108gcnV2GBLMRG15OkJOHi+Y063Twoff6TVicgpqgC/gyR7olF6YsNh3f8FyfKY04mIyBx8FJWMEkX+l4Osh39fRERERERERERkD9iATgZcXV0BADU1NRJHQo6soaEBACCXc2QvIiIiIiIiIiKyXezCxcLU9fW48pdndeUP/mnSujJtHUaeegI45wJZ1/eglblbI8Q2yeVy+Pr64uLFiwAApVIJQWBHfA5DqwWaRp9HSIgk/aFrtVpcunQJSqUSLi6OlYLU9fXYPns2AGDsypVwcWMnrPagud6uVDZAtXA5BFuoN00d8H0S7q5RY1efDyS5HxC1qa4OSErSldevB9wd72+UOd0+qWsqsH1SJFzUWmj+vguiO7vDIPsgq6/DyNQnAKWLw+ZVKTGnExGRORyr9coGaNVqVK37QFd+7x2T1hVEDYLKvwbKASFYY4Xo2icwMBAA9I3o5EC0WuDcOV1Zo5FsQFGZTIaQkBCH+3JGq1bj8LvvAgDuzcwE+MHcLrSstzvmLYUAG6g3UQNc+BJB0N0biGyORgN8+eX1sgNiTrdP2sZ6HN6s+6wTuqwBYBsk2QlBo0FQ3te6Nw6aV6XEnE5EROZgA7qFyV1d4Zs+T18G1NIGdBsEQUBQUBD8/f3R2NgodThkSTU1wIMP6soHDwISjUSvUCggk6jx3prkrq64+9VX9WWyD831duRqHQQX1hsR6TCn2ye5qyvu/p2u/IuLCwcSJSIAzOlERGQeh2lAz8rKwvLly1FaWopBgwbh7bffxvDhwzs8DrlCAZ9nMvRloLbDY7AUuVzOPqodjUYD/Pyzruzmxp+GWphcocBdL70kdRgOoSNzenO9nSuqsMr2icg+MadbTofn9ERd+VOFwir7ICL7w5xORETmcIhHQD/++GOkp6dj4cKFOHjwIAYNGoT4+Hh2QUJEZIeY04mIHAdzOhERERHZO4doQH/jjTcwc+ZMzJgxAxEREVi9ejWUSiXee++9Do9FFEVorlyG5spliCJ/NErkTERRRM2lS6i5dInXvxk6Oqc31xvzNhG1xJxuGZLk9EqgphKsNyLSY04nIiJz2H0DekNDAw4cOIC4uDj9NJlMhri4OOzevbvD42msqcH5Eb1xfkRvNNbUdPj+iUg6jTU1eMffH+/4+/P6v01S5PTmejs/ojfEWtYbEekwp5tPspz+NPDO04BYa79dKRKRZTGnExGROey+D/TLly9Do9EgICDAYHpAQACOHz9udJ36+nrU19fr31dU6Pq9raysNGnfNdcqm9YTrpeVLqhrml9ZWYmaa2rD+W2Vq66hsuleXlN1DRqZxmCZ5uWIblt19fVyZaWuT3SymIbqaoPrX9HO89uce/g0jDQ5vWW91VRdg6yp3szJt2bnbXU1cMP9wJIx2eq2TN0O748ScoL7CXO6+STJ6ZXXDHK6CDeD+cwVlnHjfQDguTXVjedQXlsD/RQHzatSYk4nIiJz2H0D+u1YunQpFi9e3Gp69+7db2t7yTeZPj84uNX89pR1wo1Ov9m+iEzW9PdJ1jH/Ns7vtWvX4OPjY4VoHJtFc/rIcH0x2YyYWjJ/O5aPyVa3Zc52LBUD3QYnuJ8wp3cci+b0e4a0mpR8GzFR+yRLHYAjcYK8KiXmdCIiMpXdN6B36dIFcrkcZWVlBtPLysoQGBhodJ25c+ciPT1d/16r1eLq1avo3LkzBKF9T05UVlaie/fuOHfuHLy9vW//ABwYz9Gt8RzdmjOcI1EUce3aNQTzP0uS5XRqP2e4Jm0Rz7s0bue8M6dfx8/pjonn13p4bq2LOZ2IiG6X3TegKxQKREdHY/v27UhMTASg+6C9fft2zJ492+g6bm5ucHMz/Dmnr6/vbe3f29ubH25ugefo1niObs3RzxGfaNGROqdT+zn6NWmreN6lYep5Z07XkTqn83qxLp5f6+G5tS7mdCIiMpXdN6ADQHp6OqZPn46hQ4di+PDhyMzMRHV1NWbMmCF1aEREZCLmdCIix8GcTkRERET2ziEa0CdPnoxLly5hwYIFKC0txeDBg7Fly5ZWAxYREZHtY04nInIczOlEREREZO8cogEdAGbPnn3Tn4Jag5ubGxYuXNjqJ6Z0Hc/RrfEc3RrPkXPq6JxO7cdrUho879LgebcMfk53LDy/1sNza108v0REdLsEURRFqYMgIiIiIiIiIiIiIrI1MqkDICIiIiIiIiIiIiKyRWxAJyIiIiIiIiIiIiIygg3oRERERERERERERERGsAH9NmRlZSE0NBTu7u4YMWIE9u3bJ3VIklm0aBEEQTB4hYeH6+fX1dUhNTUVnTt3hpeXF5KSklBWViZhxNb33XffYcKECQgODoYgCNi4caPBfFEUsWDBAgQFBcHDwwNxcXE4deqUwTJXr17F1KlT4e3tDV9fX6SkpKCqqqoDj8K6bnWOkpOTW/1dJSQkGCzj6OeIyNbcKt+TZVjiHkKmscQ9iWwLP6tbx62uFbp9S5cuxbBhw9CpUyf4+/sjMTERJ06ckDosh7Bq1SpERUXB29sb3t7eiImJwVdffSV1WEREZGfYgG6ijz/+GOnp6Vi4cCEOHjyIQYMGIT4+HhcvXpQ6NMkMGDAAJSUl+teOHTv0855//nl88cUXyMnJQX5+Pi5cuIBHHnlEwmitr7q6GoMGDUJWVpbR+X/729+wYsUKrF69Gnv37oWnpyfi4+NRV1enX2bq1Kk4evQocnNzsWnTJnz33XeYNWtWRx2C1d3qHAFAQkKCwd/VRx99ZDDf0c8RkS1qK9+TZVjiHkKmscQ9iWwHP6tbT3uuFbo9+fn5SE1NxZ49e5Cbm4vGxkbcf//9qK6uljo0u9etWzcsW7YMBw4cwA8//ID77rsPEydOxNGjR6UOjYiI7IlIJhk+fLiYmpqqf6/RaMTg4GBx6dKlEkYlnYULF4qDBg0yOq+8vFx0dXUVc3Jy9NMKCgpEAOLu3bs7KEJpARA3bNigf6/VasXAwEBx+fLl+mnl5eWim5ub+NFHH4miKIrHjh0TAYj79+/XL/PVV1+JgiCIv/zyS4fF3lFuPEeiKIrTp08XJ06ceNN1nO0cEdmCtvI9Wcft3EPIPLdzTyLbws/qHcPYtUKWc/HiRRGAmJ+fL3UoDumOO+4Q3333XanDICIiO8In0E3Q0NCAAwcOIC4uTj9NJpMhLi4Ou3fvljAyaZ06dQrBwcEICwvD1KlTUVxcDAA4cOAAGhsbDc5XeHg4QkJCnPZ8nTlzBqWlpQbnxMfHByNGjNCfk927d8PX1xdDhw7VLxMXFweZTIa9e/d2eMxSycvLg7+/P/r164enn34aV65c0c/jOSKSxs3yPXWM9txDyDrauieR7eBndXIUFRUVAACVSiVxJI5Fo9Hgv//9L6qrqxETEyN1OEREZEdcpA7Anly+fBkajQYBAQEG0wMCAnD8+HGJopLWiBEjkJ2djX79+qGkpASLFy/GPffcgyNHjqC0tBQKhQK+vr4G6wQEBKC0tFSagCXWfNzG/oaa55WWlsLf399gvouLC1QqldOct4SEBDzyyCPo2bMnioqK8Je//AXjx4/H7t27IZfLeY6IJNBWvu/UqZPU4TmF9txDyPJudU8i28HP6uQItFot0tLSMGrUKAwcOFDqcBzC4cOHERMTg7q6Onh5eWHDhg2IiIiQOiwiIrIjbEAns4wfP15fjoqKwogRI9CjRw+sW7cOHh4eEkZG9uzRRx/VlyMjIxEVFYVevXohLy8PY8eOlTAyIufVVr5PSUmRMDIi6+I9iYg6UmpqKo4cOcJxRiyoX79+OHToECoqKvDJJ59g+vTpyM/PZyM6ERG1G7twMUGXLl0gl8tRVlZmML2srAyBgYESRWVbfH190bdvXxQWFiIwMBANDQ0oLy83WMaZz1fzcbf1NxQYGNhqoCu1Wo2rV6867XkLCwtDly5dUFhYCIDniMgWtMz31DHacw8h67vxnkS2g5/Vyd7Nnj0bmzZtwrfffotu3bpJHY7DUCgU6N27N6Kjo7F06VIMGjQIb731ltRhERGRHWEDugkUCgWio6Oxfft2/TStVovt27ezD7UmVVVVKCoqQlBQEKKjo+Hq6mpwvk6cOIHi4mKnPV89e/ZEYGCgwTmprKzE3r179eckJiYG5eXlOHDggH6Zb775BlqtFiNGjOjwmG3B+fPnceXKFQQFBQHgOSKyBS3zPXWM9txDyPpuvCeR7eBndbJXoihi9uzZ2LBhA7755hv07NlT6pAcmlarRX19vdRhEBGRHWEXLiZKT0/H9OnTMXToUAwfPhyZmZmorq7GjBkzpA5NEhkZGZgwYQJ69OiBCxcuYOHChZDL5ZgyZQp8fHyQkpKC9PR0qFQqeHt7Y86cOYiJicFdd90ldehWU1VVZfBU2pkzZ3Do0CGoVCqEhIQgLS0Nr776Kvr06YOePXti/vz5CA4ORmJiIgCgf//+SEhIwMyZM7F69Wo0NjZi9uzZePTRRxEcHCzRUVlWW+dIpVJh8eLFSEpKQmBgIIqKivCnP/0JvXv3Rnx8PADnOEdEtqatfE+WY+49hExn7j2JbAs/q1vPrfIT3b7U1FSsXbsWn332GTp16qQf18LHx4fdYppp7ty5GD9+PEJCQnDt2jWsXbsWeXl52Lp1q9ShERGRPRHJZG+//bYYEhIiKhQKcfjw4eKePXukDkkykydPFoOCgkSFQiF27dpVnDx5slhYWKifX1tbKz7zzDPiHXfcISqVSvE3v/mNWFJSImHE1vftt9+KAFq9pk+fLoqiKGq1WnH+/PliQECA6ObmJo4dO1Y8ceKEwTauXLkiTpkyRfTy8hK9vb3FGTNmiNeuXZPgaKyjrXNUU1Mj3n///aKfn5/o6uoq9ujRQ5w5c6ZYWlpqsA1HP0dEtuZW+Z4swxL3EDKNJe5JZFv4Wd06bpWf6PYZO68AxDVr1kgdmt37/e9/L/bo0UNUKBSin5+fOHbsWPHrr7+WOiwiIrIzgiiKYge00xMRERERERERERER2RX2gU5EREREREREREREZAQb0ImIiIiIiIiIiIiIjGADOhERERERERERERGREWxAJyIiIiIiIiIiIiIygg3oRERERERERERERERGsAGdiIiIiIiIiIiIiMgINqATERERERERERERERnBBnQiIiIiIiIiIiIiIiPYgE5khtjYWKSlpUkdBhERWQBzOhGR42BOJyIiIkthAzo5rQkTJiAhIcHovO+//x6CIOCnn37q4KiIiOh2MKcTETkO5nQiIiKyJWxAJ6eVkpKC3NxcnD9/vtW8NWvWYOjQoYiKipIgMiIiMhVzOhGR42BOJyIiIlvCBnRyWg899BD8/PyQnZ1tML2qqgo5OTlITEzElClT0LVrVyiVSkRGRuKjjz5qc5uCIGDjxo0G03x9fQ32ce7cOUyaNAm+vr5QqVSYOHEizp49a5mDIiJyUszpRESOgzmdiIiIbAkb0Mlpubi44IknnkB2djZEUdRPz8nJgUajwbRp0xAdHY3NmzfjyJEjmDVrFh5//HHs27fvtvfZ2NiI+Ph4dOrUCd9//z127twJLy8vJCQkoKGhwRKHRUTklJjTiYgcB3M6ERER2RI2oJNT+/3vf4+ioiLk5+frp61ZswZJSUno0aMHMjIyMHjwYISFhWHOnDlISEjAunXrbnt/H3/8MbRaLd59911ERkaif//+WLNmDYqLi5GXl2eBIyIicl7M6UREjoM5nYiIiGwFG9DJqYWHh2PkyJF47733AACFhYX4/vvvkZKSAo1Gg1deeQWRkZFQqVTw8vLC1q1bUVxcfNv7+9///ofCwkJ06tQJXl5e8PLygkqlQl1dHYqKiix1WERETok5nYjIcTCnExERka1wkToAIqmlpKRgzpw5yMrKwpo1a9CrVy+MGTMGf/3rX/HWW28hMzMTkZGR8PT0RFpaWps/4RQEweBnpoDu56DNqqqqEB0djQ8//LDVun5+fpY7KCIiJ8WcTkTkOJjTiYiIyBawAZ2c3qRJk/Dcc89h7dq1+OCDD/D0009DEATs3LkTEydOxLRp0wAAWq0WJ0+eRERExE235efnh5KSEv37U6dOoaamRv9+yJAh+Pjjj+Hv7w9vb2/rHRQRkZNiTicichzM6URERGQL2IULOT0vLy9MnjwZc+fORUlJCZKTkwEAffr0QW5uLnbt2oWCggI8+eSTKCsra3Nb9913H1auXIkff/wRP/zwA5566im4urrq50+dOhVdunTBxIkT8f333+PMmTPIy8vDs88+i/Pnz1vzMImInAJzOhGR42BOJyIiIlvABnQi6H4e+uuvvyI+Ph7BwcEAgHnz5mHIkCGIj49HbGwsAgMDkZiY2OZ2/v73v6N79+6455578NhjjyEjIwNKpVI/X6lU4rvvvkNISAgeeeQR9O/fHykpKairq+OTLkREFsKcTkTkOJjTiYiISGqCeGNHcERERERERERERERExCfQiYiIiIiIiIiIiIiMYQM6EREREREREREREZERbEAnIiIiIiIiIiIiIjKCDehEREREREREREREREawAZ2IiIiIiIiIiIiIyAg2oBMRERERERERERERGcEGdCIiIiIiIiIiIiIiI9iATkRERERERERERERkBBvQiYiIiIiIiIiIiIiMYAM6EREREREREREREZERbEAnIiIiIiIiIiIiIjKCDehEREREREREREREREb8P/pIlX3v3cUZAAAAAElFTkSuQmCC\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Behavioral thresholds visualization saved!\n"]}]},{"cell_type":"code","source":["# Uncomment to Copy files to your Google Drive\n","# !cp /content/*.csv /content/*.npy /content/*.keras /content/drive/MyDrive/"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"p8xG8XYMVdm_","executionInfo":{"status":"ok","timestamp":1758508054529,"user_tz":-600,"elapsed":4747,"user":{"displayName":"An Nguyen","userId":"13883403275356628550"}},"outputId":"85b978ba-8d1d-4821-fa2a-571084556c4e"},"execution_count":34,"outputs":[{"output_type":"stream","name":"stdout","text":["Files copied to Google Drive!\n"]}]}],"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.10"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file diff --git a/AI Guardian/Alert_System/alert_system.py b/AI Guardian/Alert_System/alert_system.py new file mode 100644 index 00000000..23bf0e2a --- /dev/null +++ b/AI Guardian/Alert_System/alert_system.py @@ -0,0 +1,419 @@ +# -*- coding: utf-8 -*- +"""Alert System + +Automatically generated by Colab. + +Original file is located at + https://colab.research.google.com/drive/1IZWWYLAHrK7D1q-clIQkPqOKi5M0FwjT +""" + +from google.colab import drive +drive.mount('/content/drive') + +# -------- CONFIG -------- +CSV_PATH = "/content/drive/MyDrive/New AI spreadsheet - Sheet1.csv" # <-- change to your path +SAVE_DIR = "/content" # <-- change to Drive folder if you like + +PATIENT_ID_COL = "patientId" +TIME_START_COL = "observationStart" +TIME_END_COL = "observationEnd" + +# features: vitals + behaviours (includes mealsSkipped now) +FEATURE_COLUMNS_RAW = [ + "heartRate","spo2","temperature","bloodPressure", + "stepsTaken","calorieIntake","sleepHours","waterIntakeMl", + "exerciseMinutes","bathroomVisits","mealsSkipped" +] + +# sequence config +SEQ_LEN = 12 +SEQ_STRIDE= 1 + +# training config +EPOCHS = 30 +BATCH_SIZE = 64 +LR = 1e-3 +VAL_SPLIT = 0.2 +PATIENCE = 6 +ANOMALY_PERCENTILE = 95 # for AE fallback + +# ------------------------ +import re, json, math, numpy as np, pandas as pd +from datetime import datetime +from sklearn.preprocessing import StandardScaler +from sklearn.model_selection import train_test_split +from sklearn.metrics import classification_report, confusion_matrix +import matplotlib.pyplot as plt +import tensorflow as tf +from tensorflow import keras +from tensorflow.keras import layers + +print("TF:", tf.__version__) + +# --------- Load ---------- +df = pd.read_csv(CSV_PATH) + +# sanity check +req_base = [PATIENT_ID_COL, TIME_START_COL] + FEATURE_COLUMNS_RAW +missing = [c for c in req_base if c not in df.columns] +if missing: + raise ValueError(f"Missing required columns: {missing}") + +# --------- Parsers ---------- +def parse_num(x): + if pd.isna(x): return np.nan + if isinstance(x,(int,float)): return float(x) + m = re.search(r"([\d\.]+)", str(x)) + return float(m.group(1)) if m else np.nan + +def parse_heart_rate(x): return parse_num(x) # "65 bpm" -> 65 +def parse_spo2(x): return parse_num(x) # "97%" -> 97 +def parse_temperature(x):return parse_num(x) # "36.5 °C" -> 36.5 +def parse_bp(x): + if pd.isna(x): return (np.nan, np.nan) + if isinstance(x,(int,float)): return (float(x), np.nan) + m = re.search(r"(\d+)\s*/\s*(\d+)", str(x)) + return (float(m.group(1)), float(m.group(2))) if m else (np.nan,np.nan) + +# --------- Timestamp & sort ---------- +df["_ts"] = pd.to_datetime(df[TIME_START_COL], errors="coerce") +df = df.dropna(subset=["_ts", PATIENT_ID_COL]).copy() +df = df.sort_values([PATIENT_ID_COL, "_ts"]).reset_index(drop=True) + +# --------- Parse features ---------- +df["_hr"] = df["heartRate"].apply(parse_heart_rate) +df["_spo2"] = df["spo2"].apply(parse_spo2) +df["_temp"] = df["temperature"].apply(parse_temperature) +bp = df["bloodPressure"].apply(parse_bp) +df["_bp_sys"] = [b[0] for b in bp] +df["_bp_dia"] = [b[1] for b in bp] +df["_steps"] = df["stepsTaken"].apply(parse_num) if "stepsTaken" in df.columns else np.nan +df["_cal"] = df["calorieIntake"].apply(parse_num) if "calorieIntake" in df.columns else np.nan +df["_sleep"] = df["sleepHours"].apply(parse_num) if "sleepHours" in df.columns else np.nan +df["_water"] = df["waterIntakeMl"].apply(parse_num) if "waterIntakeMl" in df.columns else np.nan +df["_exercise"]= df["exerciseMinutes"].apply(parse_num) if "exerciseMinutes" in df.columns else np.nan +df["_bathroom"]= df["bathroomVisits"].apply(parse_num) if "bathroomVisits" in df.columns else np.nan +df["_meals"] = df["mealsSkipped"].apply(parse_num) if "mealsSkipped" in df.columns else np.nan + +FEATURE_COLS = ["_hr","_spo2","_temp","_bp_sys","_bp_dia","_steps","_cal","_sleep","_water","_exercise","_bathroom","_meals"] + +# drop rows where all features NaN +df = df.dropna(subset=FEATURE_COLS, how="all").copy() + +for col in FEATURE_COLS: + df[col] = df.groupby(PATIENT_ID_COL)[col].ffill().bfill() + +df[FEATURE_COLS] = df[FEATURE_COLS].fillna(df[FEATURE_COLS].median()) + +# --------- Optional labels (state) ---------- +def clean_state(s): + if pd.isna(s): return None + s = str(s).strip().lower() + if s in ("", "nan", "none"): return None + return s + +if "state" in df.columns: + df["_state_clean"] = df["state"].apply(clean_state) +else: + df["_state_clean"] = None + +# Map common labels to 3-class risk {Low, Medium, High} +state_map = { + "low": "low", "normal": "low", "ok": "low", "stable": "low", + "medium": "medium", "moderate": "medium", + "high": "high", "critical": "high", "alert": "high", "abnormal": "high" +} +def map_to_risk(s): + if s is None: return None + # accept phrases like "high risk", "medium alert" + if "high" in s: return "high" + if "medium" in s or "moderate" in s: return "medium" + if "low" in s or "normal" in s or "stable" in s or "ok" in s: return "low" + # fallback via dict exacts + return state_map.get(s, None) + +df["_risk3"] = df["_state_clean"].apply(map_to_risk) +has_labels = df["_risk3"].notna().any() + +print("Labels detected for supervised training?" , has_labels) + +# --------- Scale ---------- +scaler = StandardScaler() +df_scaled = df.copy() +df_scaled[FEATURE_COLS] = scaler.fit_transform(df[FEATURE_COLS]) + +# --------- Build sequences per patient ---------- +def build_sequences(group, seq_len=SEQ_LEN, stride=SEQ_STRIDE, include_labels=False): + X, y, meta = [], [], [] + feats = group[FEATURE_COLS].values + times = group["_ts"].values + risks = group["_risk3"].values if include_labels else None + + for i in range(0, len(feats) - seq_len + 1, stride): + X.append(feats[i:i+seq_len]) + if include_labels: + # label at sequence end (you can choose majority vote instead) + lbl = risks[i+seq_len-1] + y.append(lbl) + meta.append((i, i+seq_len-1, times[i+seq_len-1])) + X = np.array(X, dtype=np.float32) + y = np.array(y) if include_labels else None + return X, y, meta + +all_X, all_y, all_meta = [], [], [] +for pid, g in df_scaled.groupby(PATIENT_ID_COL): + Xp, yp, mp = build_sequences(g, include_labels=has_labels) + if len(Xp) > 0: + all_X.append(Xp) + all_meta += [(pid, *m) for m in mp] + if has_labels: + all_y.append(yp) + +X = np.concatenate(all_X, axis=0) +y = np.concatenate(all_y, axis=0) if has_labels else None + +print("X shape:", X.shape, "| y shape:", (None if y is None else y.shape)) + +# SUPERVISED: LSTM Classifier (if labels exist) +if has_labels: + # Drop sequences with unknown labels first (built earlier when constructing y) + unique_labels = pd.Series(y).dropna().unique().tolist() + if len(unique_labels) < 2: + print("Only one (or zero) label present after windowing -> switching to Autoencoder path.") + has_labels = False # force AE path below + +if has_labels: + # Determine final label set and index mapping + # Keep canonical order but only include present classes + canonical = ["low", "medium", "high"] + present = [c for c in canonical if c in unique_labels] + cls_to_idx = {c: i for i, c in enumerate(present)} + + # Filter to present classes only + keep = np.array([lbl in cls_to_idx for lbl in y]) + X = X[keep] + y = y[keep] + filtered_all_meta = [all_meta[i] for i, v in enumerate(keep) if v] + y_idx = np.array([cls_to_idx[lbl] for lbl in y], dtype=np.int64) + + timesteps, n_features = X.shape[1], X.shape[2] + + # Choose head: binary vs softmax + num_classes = len(present) + binary_mode = (num_classes == 2) + + # Safe split: only stratify when >1 class and class counts okay + try: + X_train, X_val, y_train, y_val = train_test_split( + X, y_idx, test_size=VAL_SPLIT, random_state=42, stratify=y_idx + ) + except Exception as e: + print("Stratified split failed (often due to tiny class counts). Falling back to non-stratified split.", e) + X_train, X_val, y_train, y_val = train_test_split( + X, y_idx, test_size=VAL_SPLIT, random_state=42, shuffle=True + ) + + # Model + inputs = keras.Input(shape=(timesteps, n_features)) + x = layers.Masking()(inputs) + x = layers.LSTM(128, return_sequences=True, dropout=0.2)(x) + x = layers.LSTM(64, return_sequences=False, dropout=0.2)(x) + x = layers.Dense(64, activation="relu")(x) + x = layers.Dropout(0.3)(x) + + if binary_mode: + outputs = layers.Dense(1, activation="sigmoid")(x) + loss_fn = "binary_crossentropy" + metrics = ["accuracy"] + else: + outputs = layers.Dense(num_classes, activation="softmax")(x) + loss_fn = "sparse_categorical_crossentropy" + metrics = ["accuracy"] + + clf = keras.Model(inputs, outputs) + clf.compile(optimizer=keras.optimizers.Adam(LR), loss=loss_fn, metrics=metrics) + clf.summary() + + cb = [keras.callbacks.EarlyStopping(monitor="val_loss", patience=PATIENCE, restore_best_weights=True)] + hist = clf.fit(X_train, y_train, validation_data=(X_val, y_val), + epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=cb, verbose=1) + + # Plots + plt.figure(figsize=(6,4)) + plt.plot(hist.history["loss"], label="train_loss") + plt.plot(hist.history["val_loss"], label="val_loss") + plt.xlabel("Epoch"); plt.ylabel("Loss"); plt.title("Classifier Training"); plt.legend(); plt.show() + + # Evaluation + if binary_mode: + y_prob = clf.predict(X_val, batch_size=256, verbose=0).ravel() + y_pred_val = (y_prob >= 0.5).astype(int) + target_names = [present[i] for i in sorted(range(num_classes))] + else: + y_pred_val = np.argmax(clf.predict(X_val, batch_size=256, verbose=0), axis=1) + target_names = [present[i] for i in sorted(np.unique(y_val))] + + from sklearn.metrics import classification_report, confusion_matrix + print(classification_report(y_val, y_pred_val, target_names=target_names)) + print("Confusion matrix:\n", confusion_matrix(y_val, y_pred_val)) + + # Save model + scaler + MODEL_PATH = f"{SAVE_DIR}/guardian_lstm_classifier.keras" + SCALER_PATH = f"{SAVE_DIR}/scaler.npy" + np.save(SCALER_PATH, {"mean_": scaler.mean_, "scale_": scaler.scale_, "feature_names": FEATURE_COLS}, allow_pickle=True) + clf.save(MODEL_PATH) + print("Saved:", MODEL_PATH, "and", SCALER_PATH) + + # Predictions for ALL sequences (filtered) + if binary_mode: + y_prob_all = clf.predict(X, batch_size=256, verbose=0).ravel() + y_pred_all = (y_prob_all >= 0.5).astype(int) + inv_idx = {i: c for c, i in cls_to_idx.items()} + risk_pred = [inv_idx[i] for i in y_pred_all] + else: + y_pred_all = np.argmax(clf.predict(X, batch_size=256, verbose=0), axis=1) + inv_idx = {i: c for c, i in cls_to_idx.items()} + risk_pred = [inv_idx[i] for i in y_pred_all] + + res = pd.DataFrame({ + "patientId_seqEnd": [m[0] for m in filtered_all_meta], + "seq_start_idx": [m[1] for m in filtered_all_meta], + "seq_end_idx": [m[2] for m in filtered_all_meta], + "seq_end_time": [m[3] for m in filtered_all_meta], + "risk_pred": risk_pred + }) + res["risk_true"] = [inv_idx[i] for i in y_idx] + OUT_PATH = f"{SAVE_DIR}/guardian_classifier_predictions.csv" + res.to_csv(OUT_PATH, index=False) + print("Saved predictions:", OUT_PATH) + + +# ========================= +# UNSUPERVISED: LSTM Autoencoder (fallback) +# ========================= +else: + # Debug: check sequence/meta sizes before split + print(f"[AE] Total sequences: {len(X)} | meta entries: {len(all_meta)}") + + X_train, X_val = train_test_split(X, test_size=VAL_SPLIT, random_state=42, shuffle=True) + timesteps, n_features = X.shape[1], X.shape[2] + + inputs = keras.Input(shape=(timesteps, n_features)) + # Encoder + x = layers.LSTM(128, return_sequences=True)(inputs) + x = layers.LSTM(64, return_sequences=False)(x) + encoded = layers.Dense(32, activation="relu")(x) + # Decoder + x = layers.RepeatVector(timesteps)(encoded) + x = layers.LSTM(64, return_sequences=True)(x) + x = layers.LSTM(128, return_sequences=True)(x) + outputs = layers.TimeDistributed(layers.Dense(n_features))(x) + + ae = keras.Model(inputs, outputs) + ae.compile(optimizer=keras.optimizers.Adam(LR), loss="mse") + ae.summary() + + cb = [keras.callbacks.EarlyStopping(monitor="val_loss", patience=PATIENCE, restore_best_weights=True)] + hist = ae.fit(X_train, X_train, validation_data=(X_val, X_val), + epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=cb, verbose=1) + + # Plot + plt.figure(figsize=(6,4)) + plt.plot(hist.history["loss"], label="train_loss") + plt.plot(hist.history["val_loss"], label="val_loss") + plt.xlabel("Epoch"); plt.ylabel("MSE"); plt.title("Autoencoder Training"); plt.legend(); plt.show() + + # Errors + def recon_err(m, Xb): + Xh = m.predict(Xb, batch_size=256, verbose=0) + return np.mean((Xh - Xb)**2, axis=(1,2)) + + train_err = recon_err(ae, X_train) + thr = np.percentile(train_err, ANOMALY_PERCENTILE) + print(f"[AE] Threshold p{ANOMALY_PERCENTILE}: {thr:.6f}") + + all_err = recon_err(ae, X) + is_anom = (all_err >= thr).astype(int) + + def err_to_risk(e, t): + if e < t: return "low" + elif e < 1.5*t: return "medium" + else: return "high" + + risk = [err_to_risk(e, thr) for e in all_err] + + # --- Align meta and error arrays if lengths differ (common after partial re-runs) + len_meta = len(all_meta) + len_err = len(all_err) + if len_meta != len_err: + print(f"[AE] Warning: meta ({len_meta}) != errors ({len_err}). Aligning to min length.") + k = min(len_meta, len_err) + all_meta = all_meta[:k] + all_err = all_err[:k] + is_anom = is_anom[:k] + risk = risk[:k] + + # Build results + res = pd.DataFrame({ + "patientId_seqEnd": [m[0] for m in all_meta], + "seq_start_idx": [m[1] for m in all_meta], + "seq_end_idx": [m[2] for m in all_meta], + "seq_end_time": [m[3] for m in all_meta], + "recon_error": all_err, + "is_anomaly": is_anom, + "risk_pred": risk + }) + + # Save artifacts + MODEL_PATH = f"{SAVE_DIR}/guardian_lstm_autoencoder.keras" + SCALER_PATH = f"{SAVE_DIR}/scaler.npy" + np.save(SCALER_PATH, {"mean_": scaler.mean_, "scale_": scaler.scale_, "feature_names": FEATURE_COLS}, allow_pickle=True) + ae.save(MODEL_PATH) + + OUT_PATH = f"{SAVE_DIR}/guardian_ae_predictions.csv" + res.to_csv(OUT_PATH, index=False) + print("Saved:", MODEL_PATH, SCALER_PATH, OUT_PATH) + +# ========================= +# Inference helper (later for API) +# ========================= +def make_sequence_from_rows(rows_df, scaler_obj=None, feature_cols=FEATURE_COLS, seq_len=SEQ_LEN): + tmp = rows_df.copy() + # parse again + tmp["_hr"] = tmp["heartRate"].apply(parse_heart_rate) + tmp["_spo2"] = tmp["spo2"].apply(parse_spo2) + tmp["_temp"] = tmp["temperature"].apply(parse_temperature) + bp = tmp["bloodPressure"].apply(parse_bp) + tmp["_bp_sys"] = [b[0] for b in bp] + tmp["_bp_dia"] = [b[1] for b in bp] + tmp["_steps"] = tmp["stepsTaken"].apply(parse_num) if "stepsTaken" in tmp.columns else np.nan + tmp["_cal"] = tmp["calorieIntake"].apply(parse_num) if "calorieIntake" in tmp.columns else np.nan + tmp["_sleep"] = tmp["sleepHours"].apply(parse_num) if "sleepHours" in tmp.columns else np.nan + tmp["_water"] = tmp["waterIntakeMl"].apply(parse_num) if "waterIntakeMl" in tmp.columns else np.nan + tmp["_exercise"]= tmp["exerciseMinutes"].apply(parse_num) if "exerciseMinutes" in tmp.columns else np.nan + tmp["_bathroom"]= tmp["bathroomVisits"].apply(parse_num) if "bathroomVisits" in tmp.columns else np.nan + tmp["_meals"] = tmp["mealsSkipped"].apply(parse_num) if "mealsSkipped" in tmp.columns else np.nan + + tmp = tmp.sort_values(TIME_START_COL) + feats = tmp[feature_cols].ffill().bfill() + feats = feats.fillna(feats.median()) + + if scaler_obj is not None: + # scaler_obj should be dict with mean_ and scale_ + mean_ = np.array(scaler_obj.item().get("mean_")) if hasattr(scaler_obj, "item") else scaler_obj["mean_"] + scale_= np.array(scaler_obj.item().get("scale_")) if hasattr(scaler_obj, "item") else scaler_obj["scale_"] + feats = (feats.values - mean_) / scale_ + else: + # If scaler_obj is None, return the raw (filled) features + feats = feats.values + + if len(feats) != seq_len: + raise ValueError(f"Need exactly {seq_len} rows to form one sequence, got {len(feats)}.") + return np.expand_dims(feats.astype(np.float32), axis=0) + +print("Notebook ready: trains classifier if labels exist; otherwise trains AE fallback.") + + + + + diff --git a/AI Guardian/Alert_System/models/guardian_lstm_autoencoder.keras b/AI Guardian/Alert_System/models/guardian_lstm_autoencoder.keras new file mode 100644 index 00000000..8d7342ae Binary files /dev/null and b/AI Guardian/Alert_System/models/guardian_lstm_autoencoder.keras differ diff --git a/AI Guardian/Alert_System/models/scaler.npy b/AI Guardian/Alert_System/models/scaler.npy new file mode 100644 index 00000000..9ace11f8 Binary files /dev/null and b/AI Guardian/Alert_System/models/scaler.npy differ diff --git a/AI Guardian/Alert_System/outputs/alerts_dashboard.csv b/AI Guardian/Alert_System/outputs/alerts_dashboard.csv new file mode 100644 index 00000000..31b632b6 --- /dev/null +++ b/AI Guardian/Alert_System/outputs/alerts_dashboard.csv @@ -0,0 +1,1756 @@ +user_id,timestamp,recon_error,risk_pred,rf_prob,rf_risk,mlp_prob,mlp_risk,risk +P0001,2025-06-05 00:00:00,1.2263898,medium,0.7875,high,0.0964642750801267,low,high +P0001,2025-07-04 12:00:00,1.2347184,medium,0.69,high,0.1984332906154697,low,high +P0001,2025-07-04 18:00:00,1.3824437,medium,0.6675,high,0.28987883012635,low,high +P0001,2025-07-05 00:00:00,1.1466162,medium,0.6025,high,0.197841384347843,low,high +P0001,2025-07-05 06:00:00,1.0920345,medium,0.8425,high,0.1500604039240201,low,high +P0001,2025-07-05 12:00:00,0.97103256,medium,0.71,high,0.1915664148655021,low,high +P0001,2025-07-05 18:00:00,1.1260548,medium,0.645,high,0.1205947110086612,low,high +P0001,2025-07-06 00:00:00,1.0789114,medium,0.735,high,0.1683661431216898,low,high +P0001,2025-07-06 06:00:00,1.1078057,medium,0.835,high,0.2256859861542105,low,high +P0001,2025-07-06 12:00:00,1.116456,medium,0.785,high,0.0984371721996247,low,high +P0001,2025-07-07 00:00:00,0.97074753,medium,0.815,high,0.1922393587689516,low,high +P0001,2025-07-13 12:00:00,1.0947971,medium,0.76,high,0.081267248678622,low,high +P0001,2025-07-14 18:00:00,0.99633723,medium,0.845,high,0.176255112610304,low,high +P0001,2025-07-15 00:00:00,0.9490874,low,0.72,high,0.1926429135894562,low,high +P0001,2025-07-15 06:00:00,0.99679404,medium,0.9475,high,0.1911028215630789,low,high +P0001,2025-07-15 18:00:00,1.433092,high,0.975,high,0.2819614052169838,low,high +P0001,2025-07-16 00:00:00,1.400368,medium,0.8525,high,0.0973907929661996,low,high +P0001,2025-07-16 06:00:00,1.664824,high,0.86,high,0.1556317281356007,low,high +P0001,2025-07-16 12:00:00,1.5141187,high,0.855,high,0.1065616433524509,low,high +P0001,2025-07-16 18:00:00,1.4037213,medium,0.8475,high,0.0943891273610256,low,high +P0001,2025-07-17 00:00:00,1.305201,medium,0.7675,high,0.0940017426491267,low,high +P0001,2025-07-17 06:00:00,1.2313502,medium,0.9425,high,0.0943446817333828,low,high +P0001,2025-07-17 12:00:00,1.2006096,medium,0.865,high,0.1376257266004481,low,high +P0001,2025-07-17 18:00:00,0.95264775,medium,0.8275,high,0.195972202945876,low,high +P0001,2025-07-18 06:00:00,0.9215423,low,0.6975,high,0.0824219329162445,low,high +P0001,2025-07-18 12:00:00,1.0333142,medium,0.7775,high,0.0859415918996947,low,high +P0001,2025-07-19 06:00:00,1.0263627,medium,0.76,high,0.2775532963152937,low,high +P0001,2025-07-19 12:00:00,1.2750401,medium,0.7275,high,0.1182818586871251,low,high +P0001,2025-07-19 18:00:00,1.2347757,medium,0.78,high,0.1566864118268897,low,high +P0001,2025-07-20 00:00:00,1.2606425,medium,0.81,high,0.1473805800959862,low,high +P0001,2025-07-20 18:00:00,1.3085321,medium,0.8575,high,0.11812705191987,low,high +P0001,2025-07-21 00:00:00,1.2877522,medium,0.7975,high,0.1060751293040197,low,high +P0001,2025-07-21 18:00:00,0.9649722,medium,0.7925,high,0.1283698999169995,low,high +P0001,2025-07-22 00:00:00,0.9803611,medium,0.715,high,0.1605547128938156,low,high +P0001,2025-07-22 12:00:00,1.296288,medium,0.7925,high,0.1910409245135426,low,high +P0001,2025-07-22 18:00:00,1.3352492,medium,0.735,high,0.2260284152009084,low,high +P0001,2025-07-23 00:00:00,1.2556379,medium,0.78,high,0.1744695087033181,low,high +P0001,2025-07-23 06:00:00,1.1406858,medium,0.7925,high,0.1178600634338368,low,high +P0001,2025-07-23 12:00:00,1.1404407,medium,0.88,high,0.2252187468841999,low,high +P0001,2025-07-23 18:00:00,1.3669305,medium,0.8925,high,0.1193363585084335,low,high +P0001,2025-07-24 00:00:00,1.2326787,medium,0.955,high,0.192646020966743,low,high +P0001,2025-07-24 06:00:00,1.2829137,medium,0.9575,high,0.2115280930670908,low,high +P0001,2025-07-24 12:00:00,1.3775542,medium,0.6225,high,0.1230863142722966,low,high +P0001,2025-07-24 18:00:00,1.0959871,medium,0.8375,high,0.1203663668061376,low,high +P0001,2025-07-25 00:00:00,1.1608577,medium,0.78,high,0.1519465415289957,low,high +P0001,2025-07-25 06:00:00,1.1545347,medium,0.7175,high,0.0589354205491982,low,high +P0001,2025-07-27 00:00:00,1.006605,medium,0.6625,high,0.1544527914470802,low,high +P0001,2025-07-30 18:00:00,1.1051549,medium,0.685,high,0.1833042669621959,low,high +P0002,2025-06-05 00:00:00,1.2930202,medium,0.9025,high,0.0939338432629591,low,high +P0002,2025-06-09 06:00:00,1.0303268,medium,0.68,high,0.2578149661362334,low,high +P0002,2025-06-09 12:00:00,1.0075892,medium,0.86,high,0.2563696149696565,low,high +P0002,2025-06-09 18:00:00,0.99126774,medium,0.8875,high,0.2740576195955108,low,high +P0003,2025-06-25 18:00:00,0.98395896,medium,0.67,high,0.0888570936875439,low,high +P0004,2025-06-07 00:00:00,0.950496,medium,0.7275,high,0.1998326006979762,low,high +P0004,2025-06-07 06:00:00,1.0181898,medium,0.8125,high,0.2721456789885699,low,high +P0004,2025-06-08 12:00:00,0.9677796,medium,0.635,high,0.0772215276081083,low,high +P0004,2025-06-28 18:00:00,1.0594412,medium,0.7675,high,0.1158383369589128,low,high +P0004,2025-06-29 00:00:00,1.0850165,medium,0.7575,high,0.2023227176280913,low,high +P0004,2025-06-29 06:00:00,1.0847352,medium,0.875,high,0.2083156810223385,low,high +P0004,2025-06-29 12:00:00,1.1179532,medium,0.73,high,0.1116668645818791,low,high +P0006,2025-06-20 18:00:00,1.1497148,medium,0.675,high,0.1357966931551656,low,high +P0006,2025-06-21 00:00:00,1.0858322,medium,0.705,high,0.0523829200351695,low,high +P0007,2025-06-15 00:00:00,1.256888,medium,0.8225,high,0.0979132208321531,low,high +P0007,2025-06-23 00:00:00,1.162792,medium,0.7225,high,0.2395599066002379,low,high +P0007,2025-06-23 06:00:00,1.0289922,medium,0.78,high,0.1202275613309883,low,high +P0007,2025-06-24 12:00:00,1.1346345,medium,0.645,high,0.3264339872386572,medium,high +P0008,2025-06-18 18:00:00,1.0202755,medium,0.62,high,0.2057152608051647,low,high +P0009,2025-06-22 18:00:00,0.9956433,medium,0.755,high,0.1245756390874602,low,high +P0009,2025-06-23 00:00:00,1.1310877,medium,0.7775,high,0.1609464625617011,low,high +P0009,2025-06-23 12:00:00,1.1104287,medium,0.7725,high,0.1447009484513609,low,high +P0011,2025-06-25 00:00:00,1.2930202,medium,0.9025,high,0.0939338432629591,low,high +P0012,2025-06-09 12:00:00,0.9792133,medium,0.745,high,0.1732414249514512,low,high +P0012,2025-06-09 18:00:00,1.0308292,medium,0.7125,high,0.1814501993336878,low,high +P0012,2025-06-10 00:00:00,1.0079234,medium,0.7525,high,0.1575854412644897,low,high +P0012,2025-06-10 06:00:00,1.0218309,medium,0.76,high,0.1703188022202612,low,high +P0012,2025-06-21 18:00:00,1.0421693,medium,0.76,high,0.0926817588008659,low,high +P0012,2025-06-22 00:00:00,1.021899,medium,0.905,high,0.2128791565017015,low,high +P0012,2025-06-22 06:00:00,1.070549,medium,0.8375,high,0.1636260679512769,low,high +P0012,2025-06-22 12:00:00,0.9898103,medium,0.83,high,0.0906100886613643,low,high +P0013,2025-06-10 18:00:00,1.1108485,medium,0.775,high,0.2585569912019537,low,high +P0015,2025-06-04 06:00:00,1.0360417,medium,0.725,high,0.145726026657144,low,high +P0015,2025-06-04 12:00:00,1.0555543,medium,0.88,high,0.3095154503186396,medium,high +P0001,2025-07-06 18:00:00,1.0199196,medium,0.385,medium,0.1252576625474049,low,medium +P0001,2025-07-15 12:00:00,0.7954225,low,0.5525,medium,0.1293967167217391,low,medium +P0001,2025-07-18 00:00:00,0.9960244,medium,0.435,medium,0.0863218268974577,low,medium +P0001,2025-07-20 06:00:00,1.0232816,medium,0.435,medium,0.1975063114118092,low,medium +P0001,2025-07-30 00:00:00,0.9794102,medium,0.4225,medium,0.1959318568829309,low,medium +P0004,2025-06-06 18:00:00,0.9119057,low,0.315,medium,0.1891571681113589,low,medium +P0006,2025-06-29 06:00:00,0.6650651,low,0.5725,medium,0.1165958635387277,low,medium +P0007,2025-06-14 00:00:00,0.29607528,low,0.3275,medium,0.2223773109491923,low,medium +P0009,2025-06-23 06:00:00,1.139668,medium,0.4925,medium,0.0668631786551294,low,medium +P0013,2025-06-10 06:00:00,0.9375963,low,0.3975,medium,0.1065330146625196,low,medium +P0013,2025-06-10 12:00:00,0.9848908,medium,0.3825,medium,0.2334438891278784,low,medium +P0001,2025-06-03 18:00:00,0.34809983,low,0.0125,low,0.2092148623456424,low,low +P0001,2025-06-04 00:00:00,0.3289746,low,0.04,low,0.1866149306891479,low,low +P0001,2025-06-04 06:00:00,0.32447752,low,0.0075,low,0.1213175397749546,low,low +P0001,2025-06-04 12:00:00,0.38789755,low,0.0575,low,0.1497833812753971,low,low +P0001,2025-06-04 18:00:00,0.4510293,low,0.01,low,0.2352180824943265,low,low +P0001,2025-06-05 06:00:00,0.83599114,low,0.0025,low,0.1227206820240966,low,low +P0001,2025-06-05 12:00:00,0.8133533,low,0.01,low,0.1913091945039273,low,low +P0001,2025-06-05 18:00:00,0.44501114,low,0.0,low,0.1293437221350245,low,low +P0001,2025-06-06 00:00:00,0.40934086,low,0.0,low,0.1623641681289532,low,low +P0001,2025-06-06 06:00:00,0.44524133,low,0.0,low,0.1702194796341496,low,low +P0001,2025-06-06 12:00:00,0.41019794,low,0.0,low,0.2098439687080826,low,low +P0001,2025-06-06 18:00:00,0.44140413,low,0.0,low,0.2251558717681878,low,low +P0001,2025-06-07 00:00:00,0.44674003,low,0.0025,low,0.1358102689586333,low,low +P0001,2025-06-07 06:00:00,0.43270674,low,0.0025,low,0.3011151944605325,medium,low +P0001,2025-06-07 12:00:00,0.5127645,low,0.005,low,0.1507523384916167,low,low +P0001,2025-06-07 18:00:00,0.7204825,low,0.0,low,0.2169268025645467,low,low +P0001,2025-06-08 00:00:00,0.7350834,low,0.0,low,0.4738069145225415,medium,low +P0001,2025-06-08 06:00:00,0.7704971,low,0.0025,low,0.2082255911007394,low,low +P0001,2025-06-08 12:00:00,0.7643453,low,0.005,low,0.2461514351303269,low,low +P0001,2025-06-08 18:00:00,0.7348229,low,0.01,low,0.2699795291620387,low,low +P0001,2025-06-09 00:00:00,0.7308077,low,0.0425,low,0.1896030631553805,low,low +P0001,2025-06-09 06:00:00,0.7398204,low,0.03,low,0.294564125441645,low,low +P0001,2025-06-09 12:00:00,0.73770165,low,0.0075,low,0.1596435807302204,low,low +P0001,2025-06-09 18:00:00,0.7139633,low,0.0025,low,0.2219896687054461,low,low +P0001,2025-06-10 00:00:00,0.70912427,low,0.005,low,0.1380307019920403,low,low +P0001,2025-06-10 06:00:00,0.7287893,low,0.015,low,0.097850969994711,low,low +P0001,2025-06-10 12:00:00,0.5526416,low,0.0075,low,0.1308190887164208,low,low +P0001,2025-06-10 18:00:00,0.5459912,low,0.0025,low,0.1944920098927383,low,low +P0001,2025-06-11 00:00:00,0.55424523,low,0.005,low,0.0923698828814486,low,low +P0001,2025-06-11 06:00:00,0.56248134,low,0.0,low,0.1713732669871935,low,low +P0001,2025-06-11 12:00:00,0.59409785,low,0.0,low,0.1426536599783871,low,low +P0001,2025-06-11 18:00:00,0.5711083,low,0.0,low,0.2432063211920443,low,low +P0001,2025-06-12 00:00:00,0.45822635,low,0.0,low,0.1640624156300898,low,low +P0001,2025-06-12 06:00:00,0.4937642,low,0.0,low,0.1026030934642911,low,low +P0001,2025-06-12 12:00:00,0.5356549,low,0.0,low,0.2194501468262367,low,low +P0001,2025-06-12 18:00:00,0.5468511,low,0.0,low,0.2317586568040027,low,low +P0001,2025-06-13 00:00:00,0.574147,low,0.0,low,0.1968316422143177,low,low +P0001,2025-06-13 06:00:00,0.49754608,low,0.0,low,0.4239976140634943,medium,low +P0001,2025-06-13 12:00:00,0.47691256,low,0.0,low,0.127188376035038,low,low +P0001,2025-06-13 18:00:00,0.50188446,low,0.0,low,0.3231842631726592,medium,low +P0001,2025-06-14 00:00:00,0.5470629,low,0.0,low,0.2007024936267882,low,low +P0001,2025-06-14 06:00:00,0.5562837,low,0.0,low,0.1600899207447241,low,low +P0001,2025-06-14 12:00:00,0.76148826,low,0.0,low,0.1191489089476098,low,low +P0001,2025-06-14 18:00:00,0.74352807,low,0.0,low,0.2113223152445844,low,low +P0001,2025-06-15 00:00:00,0.6471026,low,0.0,low,0.2384166725312272,low,low +P0001,2025-06-15 06:00:00,0.63301915,low,0.0,low,0.1689910901114803,low,low +P0001,2025-06-15 12:00:00,0.60006696,low,0.0,low,0.2936868096651288,low,low +P0001,2025-06-15 18:00:00,0.60326564,low,0.0025,low,0.2301937325211063,low,low +P0001,2025-06-16 00:00:00,0.52515364,low,0.0,low,0.1348086139775314,low,low +P0001,2025-06-16 06:00:00,0.51334506,low,0.0,low,0.1461936010034544,low,low +P0001,2025-06-16 12:00:00,0.49909437,low,0.0,low,0.1406407150748952,low,low +P0001,2025-06-16 18:00:00,0.47335842,low,0.0,low,0.2626144475880474,low,low +P0001,2025-06-17 00:00:00,0.40940043,low,0.0,low,0.1888910452385914,low,low +P0001,2025-06-17 06:00:00,0.43544248,low,0.0025,low,0.2873513239751447,low,low +P0001,2025-06-17 12:00:00,0.37183863,low,0.0,low,0.1969226916548893,low,low +P0001,2025-06-17 18:00:00,0.38118315,low,0.0,low,0.1549586538969544,low,low +P0001,2025-06-18 00:00:00,0.37676987,low,0.0,low,0.215904753513775,low,low +P0001,2025-06-18 06:00:00,0.39586687,low,0.0,low,0.2144631596780677,low,low +P0001,2025-06-18 12:00:00,0.4744126,low,0.0,low,0.132418668663797,low,low +P0001,2025-06-18 18:00:00,0.46279758,low,0.0,low,0.2650979467972048,low,low +P0001,2025-06-19 00:00:00,0.5442953,low,0.0,low,0.1800027279988543,low,low +P0001,2025-06-19 06:00:00,0.54123706,low,0.0,low,0.3759077680747434,medium,low +P0001,2025-06-19 12:00:00,0.53543866,low,0.0375,low,0.1044246349593052,low,low +P0001,2025-06-19 18:00:00,0.49200508,low,0.09,low,0.272127526853485,low,low +P0001,2025-06-20 00:00:00,0.65316224,low,0.1925,low,0.2782314855725759,low,low +P0001,2025-06-20 06:00:00,0.47860494,low,0.0025,low,0.3341771075623558,medium,low +P0001,2025-06-20 12:00:00,0.4628123,low,0.0025,low,0.2082057794445172,low,low +P0001,2025-06-20 18:00:00,0.41622722,low,0.0025,low,0.1532407402960084,low,low +P0001,2025-06-21 00:00:00,0.38109535,low,0.02,low,0.0698823848295017,low,low +P0001,2025-06-21 06:00:00,0.3890889,low,0.0,low,0.3203944787396519,medium,low +P0001,2025-06-21 12:00:00,0.39235467,low,0.005,low,0.0910151137200424,low,low +P0001,2025-06-21 18:00:00,0.41579136,low,0.005,low,0.1743804506063454,low,low +P0001,2025-06-22 00:00:00,0.3946569,low,0.0,low,0.1103595515855683,low,low +P0001,2025-06-22 06:00:00,0.43364534,low,0.005,low,0.0884110557802237,low,low +P0001,2025-06-22 12:00:00,0.45181382,low,0.0,low,0.2047467036172272,low,low +P0001,2025-06-22 18:00:00,0.4845333,low,0.0025,low,0.092078324689105,low,low +P0001,2025-06-23 00:00:00,0.45609632,low,0.0,low,0.2039383985052619,low,low +P0001,2025-06-23 06:00:00,0.46937433,low,0.0,low,0.5119549860380845,medium,low +P0001,2025-06-23 12:00:00,0.50113297,low,0.0,low,0.146184415665687,low,low +P0001,2025-06-23 18:00:00,0.5514853,low,0.0,low,0.3439241964316863,medium,low +P0001,2025-06-24 00:00:00,0.58391464,low,0.0,low,0.2180200351893538,low,low +P0001,2025-06-24 06:00:00,0.6149835,low,0.0,low,0.1574270036564058,low,low +P0001,2025-06-24 12:00:00,0.6481807,low,0.0,low,0.1238509856784631,low,low +P0001,2025-06-24 18:00:00,0.619268,low,0.0,low,0.3546429420043776,medium,low +P0001,2025-06-25 00:00:00,0.6278938,low,0.0,low,0.2317366108528658,low,low +P0001,2025-06-25 06:00:00,0.5941837,low,0.0,low,0.1839509775983323,low,low +P0001,2025-06-25 12:00:00,0.5649564,low,0.0,low,0.3609019797817128,medium,low +P0001,2025-06-25 18:00:00,0.57836944,low,0.005,low,0.3166417987561344,medium,low +P0001,2025-06-26 00:00:00,0.5623028,low,0.0,low,0.2204434199562613,low,low +P0001,2025-06-26 06:00:00,0.54392654,low,0.0,low,0.1537280982158938,low,low +P0001,2025-06-26 12:00:00,0.52896094,low,0.0,low,0.170016771003309,low,low +P0001,2025-06-26 18:00:00,0.5186747,low,0.0025,low,0.1261612951645197,low,low +P0001,2025-06-27 00:00:00,0.45152485,low,0.0,low,0.1507311311737149,low,low +P0001,2025-06-27 06:00:00,0.44798124,low,0.0,low,0.1395596330522993,low,low +P0001,2025-06-27 12:00:00,0.45453984,low,0.0,low,0.1830699480905229,low,low +P0001,2025-06-27 18:00:00,0.39179128,low,0.0,low,0.2051731758469255,low,low +P0001,2025-06-28 00:00:00,0.38842073,low,0.0,low,0.244996645343916,low,low +P0001,2025-06-28 06:00:00,0.38759166,low,0.0,low,0.158782606653493,low,low +P0001,2025-06-28 12:00:00,0.46401256,low,0.005,low,0.1470239697557223,low,low +P0001,2025-06-28 18:00:00,0.38928896,low,0.0,low,0.2135044139115191,low,low +P0001,2025-06-29 00:00:00,0.3848161,low,0.0,low,0.1729889212216921,low,low +P0001,2025-06-29 06:00:00,0.35906804,low,0.0,low,0.2166491477974747,low,low +P0001,2025-06-29 12:00:00,0.34081033,low,0.0,low,0.1465920330830682,low,low +P0001,2025-06-29 18:00:00,0.3434121,low,0.0,low,0.3907238791454414,medium,low +P0001,2025-06-30 00:00:00,0.35459757,low,0.0,low,0.2555667005125585,low,low +P0001,2025-06-30 06:00:00,0.37755322,low,0.0,low,0.1808492240885146,low,low +P0001,2025-06-30 12:00:00,0.5239087,low,0.0,low,0.1897677666372176,low,low +P0001,2025-06-30 18:00:00,0.6639881,low,0.0075,low,0.2578328194738423,low,low +P0001,2025-07-01 00:00:00,0.6877556,low,0.0,low,0.2057893813304639,low,low +P0001,2025-07-01 06:00:00,0.692752,low,0.0075,low,0.1759017433936349,low,low +P0001,2025-07-01 12:00:00,0.58905613,low,0.0,low,0.3416190991894992,medium,low +P0001,2025-07-01 18:00:00,0.55030847,low,0.0,low,0.1531215032521676,low,low +P0001,2025-07-02 00:00:00,0.5083455,low,0.0,low,0.1657166044170083,low,low +P0001,2025-07-02 06:00:00,0.53036183,low,0.0,low,0.2542267460994035,low,low +P0001,2025-07-02 12:00:00,0.59071976,low,0.0,low,0.1787243688470814,low,low +P0001,2025-07-02 18:00:00,0.6368803,low,0.0,low,0.18601424437563,low,low +P0001,2025-07-03 00:00:00,0.6495371,low,0.0,low,0.2357483773211454,low,low +P0001,2025-07-03 06:00:00,0.6487448,low,0.0025,low,0.3145091587508665,medium,low +P0001,2025-07-03 12:00:00,0.6482556,low,0.0,low,0.1562194379446569,low,low +P0001,2025-07-03 18:00:00,0.6174009,low,0.0,low,0.2533707463206042,low,low +P0001,2025-07-04 00:00:00,0.576484,low,0.005,low,0.307498383085606,medium,low +P0001,2025-07-04 06:00:00,0.5764498,low,0.0025,low,0.1237132754715471,low,low +P0001,2025-07-07 06:00:00,0.98002976,medium,0.125,low,0.1042480101536732,low,low +P0001,2025-07-07 12:00:00,0.8552654,low,0.055,low,0.1022801432362157,low,low +P0001,2025-07-07 18:00:00,0.67756706,low,0.045,low,0.2418247602835831,low,low +P0001,2025-07-08 00:00:00,0.8786733,low,0.025,low,0.169173972809092,low,low +P0001,2025-07-08 06:00:00,0.64532876,low,0.005,low,0.2014950685171181,low,low +P0001,2025-07-08 12:00:00,0.6913533,low,0.0125,low,0.254433976226593,low,low +P0001,2025-07-08 18:00:00,0.7895628,low,0.005,low,0.2168431959895952,low,low +P0001,2025-07-09 00:00:00,0.7777693,low,0.05,low,0.2319772311631711,low,low +P0001,2025-07-09 06:00:00,0.7893576,low,0.065,low,0.1415206137919415,low,low +P0001,2025-07-09 12:00:00,0.7276863,low,0.085,low,0.1693515751469625,low,low +P0001,2025-07-09 18:00:00,0.71737456,low,0.0775,low,0.2148345923279742,low,low +P0001,2025-07-10 00:00:00,0.7319603,low,0.165,low,0.223811175568324,low,low +P0001,2025-07-10 06:00:00,0.69118893,low,0.0675,low,0.2528467162565036,low,low +P0001,2025-07-10 12:00:00,0.701247,low,0.095,low,0.141739222999212,low,low +P0001,2025-07-10 18:00:00,0.5047335,low,0.0625,low,0.1158387332041505,low,low +P0001,2025-07-11 00:00:00,0.5742376,low,0.07,low,0.1461312417413226,low,low +P0001,2025-07-11 06:00:00,0.5842526,low,0.0225,low,0.1278616996332272,low,low +P0001,2025-07-11 12:00:00,0.65190303,low,0.0125,low,0.1404529224380708,low,low +P0001,2025-07-11 18:00:00,0.63565964,low,0.0175,low,0.2344273297315742,low,low +P0001,2025-07-12 00:00:00,0.7735646,low,0.03,low,0.1314380761518254,low,low +P0001,2025-07-12 06:00:00,0.44069746,low,0.0,low,0.1305089795277372,low,low +P0001,2025-07-12 12:00:00,0.6263294,low,0.0375,low,0.1311018879856257,low,low +P0001,2025-07-12 18:00:00,0.6483631,low,0.115,low,0.202525175881026,low,low +P0001,2025-07-13 00:00:00,0.79977214,low,0.025,low,0.1831061918749851,low,low +P0001,2025-07-13 06:00:00,0.8152363,low,0.0325,low,0.2675410792600292,low,low +P0001,2025-07-13 18:00:00,0.7410308,low,0.1875,low,0.1237276186160452,low,low +P0001,2025-07-14 00:00:00,0.76972306,low,0.0775,low,0.1869766235192088,low,low +P0001,2025-07-14 06:00:00,0.77163744,low,0.025,low,0.2963477319334081,low,low +P0001,2025-07-14 12:00:00,0.78696835,low,0.0125,low,0.3696184953612849,medium,low +P0001,2025-07-18 18:00:00,0.77557087,low,0.205,low,0.171975478584511,low,low +P0001,2025-07-19 00:00:00,0.85150146,low,0.04,low,0.0939676751996677,low,low +P0001,2025-07-20 12:00:00,1.0594075,medium,0.24,low,0.1513990466104188,low,low +P0001,2025-07-21 06:00:00,0.85572314,low,0.0775,low,0.1096415509141759,low,low +P0001,2025-07-21 12:00:00,0.8343719,low,0.0875,low,0.1512354448358746,low,low +P0001,2025-07-22 06:00:00,0.9500358,low,0.0825,low,0.221243646471642,low,low +P0001,2025-07-25 12:00:00,0.8937433,low,0.13,low,0.165496930585002,low,low +P0001,2025-07-25 18:00:00,0.7943772,low,0.065,low,0.1722772759023642,low,low +P0001,2025-07-26 00:00:00,0.77250105,low,0.18,low,0.1332429475930195,low,low +P0001,2025-07-26 06:00:00,0.73498386,low,0.0575,low,0.0893488590911448,low,low +P0001,2025-07-26 12:00:00,0.9352792,low,0.0275,low,0.0973857282165591,low,low +P0001,2025-07-26 18:00:00,0.8803298,low,0.04,low,0.2044107363460303,low,low +P0001,2025-07-27 06:00:00,0.595893,low,0.0225,low,0.1199698983446036,low,low +P0001,2025-07-27 12:00:00,0.7816488,low,0.035,low,0.1775387056824909,low,low +P0001,2025-07-27 18:00:00,0.69410574,low,0.1425,low,0.2037947069339237,low,low +P0001,2025-07-28 00:00:00,0.75223476,low,0.025,low,0.2591738666511459,low,low +P0001,2025-07-28 06:00:00,1.065681,medium,0.0475,low,0.3635505104694242,medium,low +P0001,2025-07-28 12:00:00,0.7743244,low,0.015,low,0.1804216608072002,low,low +P0001,2025-07-28 18:00:00,0.85958445,low,0.05,low,0.1976448481943118,low,low +P0001,2025-07-29 00:00:00,0.612581,low,0.01,low,0.1863727432544903,low,low +P0001,2025-07-29 06:00:00,0.5704989,low,0.02,low,0.1006406746874186,low,low +P0001,2025-07-29 12:00:00,0.77890474,low,0.03,low,0.2067547636377289,low,low +P0001,2025-07-29 18:00:00,0.88573056,low,0.0125,low,0.2058407627761782,low,low +P0001,2025-07-30 06:00:00,0.84889436,low,0.06,low,0.2326589531515443,low,low +P0001,2025-07-30 12:00:00,0.88453627,low,0.0975,low,0.2629030335589205,low,low +P0002,2025-06-03 18:00:00,0.33819968,low,0.01,low,0.2178251492273316,low,low +P0002,2025-06-04 00:00:00,0.34776184,low,0.0075,low,0.2312696503548409,low,low +P0002,2025-06-04 06:00:00,0.3468126,low,0.005,low,0.1216287750746862,low,low +P0002,2025-06-04 12:00:00,0.42538264,low,0.0325,low,0.1437863826903571,low,low +P0002,2025-06-04 18:00:00,0.6193704,low,0.01,low,0.2286254544727989,low,low +P0002,2025-06-05 06:00:00,0.79780287,low,0.0,low,0.122533983599514,low,low +P0002,2025-06-05 12:00:00,0.7795469,low,0.0025,low,0.1505615087671039,low,low +P0002,2025-06-05 18:00:00,0.42776877,low,0.0025,low,0.1351810294296463,low,low +P0002,2025-06-06 00:00:00,0.5295072,low,0.0025,low,0.1062808389267157,low,low +P0002,2025-06-06 06:00:00,0.5669845,low,0.0,low,0.3112989534103841,medium,low +P0002,2025-06-06 12:00:00,0.5195958,low,0.0,low,0.2965056276778398,low,low +P0002,2025-06-06 18:00:00,0.45843458,low,0.0,low,0.2016850169708743,low,low +P0002,2025-06-07 00:00:00,0.47464582,low,0.0,low,0.1839035549758984,low,low +P0002,2025-06-07 06:00:00,0.41952747,low,0.0,low,0.1527864401941348,low,low +P0002,2025-06-07 12:00:00,0.3986963,low,0.0,low,0.1291062602481306,low,low +P0002,2025-06-07 18:00:00,0.38016,low,0.0,low,0.2870872494327241,low,low +P0002,2025-06-08 00:00:00,0.30882934,low,0.0,low,0.2939279310778017,low,low +P0002,2025-06-08 06:00:00,0.3633924,low,0.0,low,0.1358521626960453,low,low +P0002,2025-06-08 12:00:00,0.35508487,low,0.0,low,0.2237878382978274,low,low +P0002,2025-06-08 18:00:00,0.37230498,low,0.0,low,0.1301237622650587,low,low +P0002,2025-06-09 00:00:00,0.8553132,low,0.0975,low,0.1645232436594706,low,low +P0002,2025-06-10 00:00:00,0.97025925,medium,0.115,low,0.3167026288160792,medium,low +P0002,2025-06-10 06:00:00,0.9439733,low,0.135,low,0.1514905861346624,low,low +P0002,2025-06-10 12:00:00,0.8824723,low,0.0125,low,0.1097655732061981,low,low +P0002,2025-06-10 18:00:00,0.8642529,low,0.0075,low,0.2213027187173758,low,low +P0002,2025-06-11 00:00:00,0.84701705,low,0.0025,low,0.3590208365658898,medium,low +P0002,2025-06-11 06:00:00,0.8118308,low,0.03,low,0.1604903079280389,low,low +P0002,2025-06-11 12:00:00,0.813637,low,0.01,low,0.2656546504473656,low,low +P0002,2025-06-11 18:00:00,0.8759177,low,0.055,low,0.1993210881271687,low,low +P0002,2025-06-12 00:00:00,0.47679085,low,0.0125,low,0.1394816483341829,low,low +P0002,2025-06-12 06:00:00,0.51386255,low,0.015,low,0.1162217104231419,low,low +P0002,2025-06-12 12:00:00,0.49177763,low,0.0,low,0.1930642651015414,low,low +P0002,2025-06-12 18:00:00,0.4331306,low,0.0,low,0.2209254499466521,low,low +P0002,2025-06-13 00:00:00,0.43693557,low,0.0,low,0.3995104941098836,medium,low +P0002,2025-06-13 06:00:00,0.47576088,low,0.0,low,0.0981724747914688,low,low +P0002,2025-06-13 12:00:00,0.58869773,low,0.0025,low,0.1686841907503649,low,low +P0002,2025-06-13 18:00:00,0.61003083,low,0.0,low,0.2431961555750915,low,low +P0002,2025-06-14 00:00:00,0.62737155,low,0.0025,low,0.1474046148791467,low,low +P0002,2025-06-14 06:00:00,0.55140346,low,0.005,low,0.1711393872723053,low,low +P0002,2025-06-14 12:00:00,0.5323423,low,0.0075,low,0.1487069044916975,low,low +P0002,2025-06-14 18:00:00,0.5647392,low,0.01,low,0.2905185053303424,low,low +P0002,2025-06-15 00:00:00,0.5886084,low,0.0,low,0.2877312725708064,low,low +P0002,2025-06-15 06:00:00,0.611389,low,0.0,low,0.2966638465069129,low,low +P0002,2025-06-15 12:00:00,0.5411928,low,0.0025,low,0.3269271769821089,medium,low +P0002,2025-06-15 18:00:00,0.6057065,low,0.0,low,0.1976327255495021,low,low +P0002,2025-06-16 00:00:00,0.5358327,low,0.0,low,0.1504017849216822,low,low +P0002,2025-06-16 06:00:00,0.4864186,low,0.0025,low,0.1432899859364655,low,low +P0002,2025-06-16 12:00:00,0.5723543,low,0.0,low,0.2154059574429548,low,low +P0002,2025-06-16 18:00:00,0.5843401,low,0.005,low,0.1659262008111249,low,low +P0002,2025-06-17 00:00:00,0.5603407,low,0.0,low,0.3445856931959585,medium,low +P0002,2025-06-17 06:00:00,0.50226474,low,0.0,low,0.3122503090762575,medium,low +P0002,2025-06-17 12:00:00,0.4995947,low,0.0025,low,0.0865444163464666,low,low +P0002,2025-06-17 18:00:00,0.54339015,low,0.0225,low,0.1276550526648222,low,low +P0002,2025-06-18 00:00:00,0.49556297,low,0.0125,low,0.2383021054460967,low,low +P0002,2025-06-18 06:00:00,0.46695116,low,0.015,low,0.1970266442300792,low,low +P0002,2025-06-18 12:00:00,0.75203145,low,0.0925,low,0.2113572021478729,low,low +P0002,2025-06-18 18:00:00,0.58092976,low,0.025,low,0.1654166258573758,low,low +P0002,2025-06-19 00:00:00,0.46276554,low,0.005,low,0.2259165771197829,low,low +P0002,2025-06-19 06:00:00,0.5601111,low,0.04,low,0.1313367719504402,low,low +P0002,2025-06-19 12:00:00,0.607085,low,0.0375,low,0.1625674851427417,low,low +P0002,2025-06-19 18:00:00,0.4645934,low,0.005,low,0.2044931113306378,low,low +P0002,2025-06-20 00:00:00,0.37881997,low,0.005,low,0.1256966433475035,low,low +P0002,2025-06-20 06:00:00,0.43494713,low,0.0025,low,0.1762628483243665,low,low +P0002,2025-06-20 12:00:00,0.5402924,low,0.0025,low,0.1368363819707714,low,low +P0002,2025-06-20 18:00:00,0.41623795,low,0.0,low,0.2063099116634044,low,low +P0002,2025-06-21 00:00:00,0.42607072,low,0.0,low,0.151490038505669,low,low +P0002,2025-06-21 06:00:00,0.49732548,low,0.0,low,0.1471684154712434,low,low +P0002,2025-06-21 12:00:00,0.4696403,low,0.0,low,0.0905880067366663,low,low +P0002,2025-06-21 18:00:00,0.48012128,low,0.0,low,0.1845556573578374,low,low +P0002,2025-06-22 00:00:00,0.44273686,low,0.0,low,0.1759725507024109,low,low +P0002,2025-06-22 06:00:00,0.47391224,low,0.0,low,0.1476927094337354,low,low +P0002,2025-06-22 12:00:00,0.46239895,low,0.0,low,0.1172420531075593,low,low +P0002,2025-06-22 18:00:00,0.45992061,low,0.0,low,0.1563037336341022,low,low +P0002,2025-06-23 00:00:00,0.44599402,low,0.0,low,0.2903551602082377,low,low +P0002,2025-06-23 06:00:00,0.4533987,low,0.0,low,0.2343353294461999,low,low +P0002,2025-06-23 12:00:00,0.46743596,low,0.0,low,0.3205330418205587,medium,low +P0002,2025-06-23 18:00:00,0.5026535,low,0.0,low,0.1089462476736328,low,low +P0002,2025-06-24 00:00:00,0.5592094,low,0.0,low,0.2074829157727499,low,low +P0002,2025-06-24 06:00:00,0.6417026,low,0.0,low,0.0999111706661017,low,low +P0002,2025-06-24 12:00:00,0.5978764,low,0.0,low,0.2261096249247711,low,low +P0002,2025-06-24 18:00:00,0.5796702,low,0.0,low,0.1497498052372876,low,low +P0002,2025-06-25 00:00:00,0.5194835,low,0.0,low,0.2967640325912999,low,low +P0002,2025-06-25 06:00:00,0.46731627,low,0.0,low,0.3666544414792195,medium,low +P0002,2025-06-25 12:00:00,0.48982784,low,0.0,low,0.2877750071025011,low,low +P0002,2025-06-25 18:00:00,0.43553436,low,0.0,low,0.3041549354910609,medium,low +P0002,2025-06-26 00:00:00,0.42889866,low,0.0,low,0.1348927737231617,low,low +P0002,2025-06-26 06:00:00,0.42702788,low,0.0,low,0.1642617720024997,low,low +P0002,2025-06-26 12:00:00,0.42414576,low,0.0,low,0.2962172090343628,low,low +P0002,2025-06-26 18:00:00,0.5212191,low,0.0,low,0.1947808675360421,low,low +P0002,2025-06-27 00:00:00,0.3885605,low,0.0,low,0.2346526172131676,low,low +P0002,2025-06-27 06:00:00,0.43994018,low,0.0,low,0.223922059715327,low,low +P0002,2025-06-27 12:00:00,0.46117312,low,0.0,low,0.1489151986736526,low,low +P0002,2025-06-27 18:00:00,0.44418442,low,0.0,low,0.1432647321360221,low,low +P0002,2025-06-28 00:00:00,0.46435452,low,0.0,low,0.1481917100565035,low,low +P0002,2025-06-28 06:00:00,0.46519676,low,0.0,low,0.1803995563396444,low,low +P0002,2025-06-28 12:00:00,0.71168387,low,0.0025,low,0.0982159666019747,low,low +P0002,2025-06-28 18:00:00,0.6754563,low,0.0,low,0.1636988954643089,low,low +P0002,2025-06-29 00:00:00,0.6674597,low,0.0,low,0.1552631317175022,low,low +P0002,2025-06-29 06:00:00,0.67080057,low,0.0,low,0.1634879643052502,low,low +P0002,2025-06-29 12:00:00,0.68609196,low,0.0,low,0.2252878632600183,low,low +P0002,2025-06-29 18:00:00,0.6840974,low,0.0,low,0.2334431789985866,low,low +P0002,2025-06-30 00:00:00,0.71181065,low,0.005,low,0.2587052534759917,low,low +P0002,2025-06-30 06:00:00,0.7833852,low,0.005,low,0.1456278789822943,low,low +P0002,2025-06-30 12:00:00,0.7862282,low,0.0075,low,0.2395023994412266,low,low +P0002,2025-06-30 18:00:00,0.8088063,low,0.0275,low,0.1343189979464931,low,low +P0003,2025-06-03 18:00:00,0.4670357,low,0.0,low,0.1918317949654556,low,low +P0003,2025-06-04 00:00:00,0.47692204,low,0.0,low,0.1289637542212128,low,low +P0003,2025-06-04 06:00:00,0.4450102,low,0.0,low,0.2481955584294211,low,low +P0003,2025-06-04 12:00:00,0.5457461,low,0.0025,low,0.1816899960654699,low,low +P0003,2025-06-04 18:00:00,0.5238939,low,0.0,low,0.288274429343703,low,low +P0003,2025-06-05 00:00:00,0.43030703,low,0.0,low,0.303180596760324,medium,low +P0003,2025-06-05 06:00:00,0.41710556,low,0.0,low,0.138059193413207,low,low +P0003,2025-06-05 12:00:00,0.43355322,low,0.0,low,0.2612916543675767,low,low +P0003,2025-06-05 18:00:00,0.5007533,low,0.0,low,0.2532410912169532,low,low +P0003,2025-06-06 00:00:00,0.52048993,low,0.0,low,0.2870703512415069,low,low +P0003,2025-06-06 06:00:00,0.38976142,low,0.0,low,0.2264742616682635,low,low +P0003,2025-06-06 12:00:00,0.405561,low,0.0,low,0.2258883904232353,low,low +P0003,2025-06-06 18:00:00,0.47081363,low,0.0,low,0.1433694249357324,low,low +P0003,2025-06-07 00:00:00,0.50673485,low,0.0,low,0.143573046781097,low,low +P0003,2025-06-07 06:00:00,0.49212265,low,0.0,low,0.1489728618200661,low,low +P0003,2025-06-07 12:00:00,0.46540695,low,0.0,low,0.3662220644356613,medium,low +P0003,2025-06-07 18:00:00,0.4345811,low,0.0,low,0.1211993111217382,low,low +P0003,2025-06-08 00:00:00,0.4162408,low,0.0,low,0.1807922877633929,low,low +P0003,2025-06-08 06:00:00,0.37977305,low,0.0,low,0.1572416830595372,low,low +P0003,2025-06-08 12:00:00,0.34138605,low,0.0,low,0.1811118060565844,low,low +P0003,2025-06-08 18:00:00,0.32195112,low,0.0,low,0.209135221415436,low,low +P0003,2025-06-09 00:00:00,0.32168594,low,0.0,low,0.2315970683455609,low,low +P0003,2025-06-09 06:00:00,0.3556991,low,0.0,low,0.2836090366638503,low,low +P0003,2025-06-09 12:00:00,0.41573143,low,0.0,low,0.1480966822457261,low,low +P0003,2025-06-09 18:00:00,0.43677065,low,0.0,low,0.2575648611336812,low,low +P0003,2025-06-10 00:00:00,0.47554123,low,0.0,low,0.2535990166953042,low,low +P0003,2025-06-10 06:00:00,0.5432405,low,0.005,low,0.2922339658154423,low,low +P0003,2025-06-10 12:00:00,0.60424644,low,0.005,low,0.0883619214684435,low,low +P0003,2025-06-10 18:00:00,0.60415924,low,0.0,low,0.2438275995740183,low,low +P0003,2025-06-11 00:00:00,0.627235,low,0.0,low,0.1122926175695513,low,low +P0003,2025-06-11 06:00:00,0.6272294,low,0.0,low,0.3158764538725532,medium,low +P0003,2025-06-11 12:00:00,0.63209003,low,0.0,low,0.1025611192420053,low,low +P0003,2025-06-11 18:00:00,0.6261233,low,0.0,low,0.1735078712956207,low,low +P0003,2025-06-12 00:00:00,0.5588978,low,0.0,low,0.170299154132814,low,low +P0003,2025-06-12 06:00:00,0.53751534,low,0.0,low,0.3771985570318584,medium,low +P0003,2025-06-12 12:00:00,0.6170633,low,0.0,low,0.1196285836882676,low,low +P0003,2025-06-12 18:00:00,0.6237962,low,0.0175,low,0.1644793788430784,low,low +P0003,2025-06-13 00:00:00,0.56911933,low,0.01,low,0.3911727474882275,medium,low +P0003,2025-06-13 06:00:00,0.5323003,low,0.025,low,0.1327586531477524,low,low +P0003,2025-06-13 12:00:00,0.50507903,low,0.0225,low,0.1189687674915608,low,low +P0003,2025-06-13 18:00:00,0.54081184,low,0.1625,low,0.2291413270894332,low,low +P0003,2025-06-14 00:00:00,0.5201006,low,0.155,low,0.2227550189642861,low,low +P0003,2025-06-14 06:00:00,0.5472537,low,0.065,low,0.1218649230173562,low,low +P0003,2025-06-14 12:00:00,0.5833204,low,0.1825,low,0.1983460073785987,low,low +P0003,2025-06-14 18:00:00,0.61992013,low,0.16,low,0.2287075381024881,low,low +P0003,2025-06-15 00:00:00,0.7374175,low,0.1875,low,0.0744941678330512,low,low +P0003,2025-06-15 06:00:00,0.72681195,low,0.125,low,0.0984879699700667,low,low +P0003,2025-06-15 12:00:00,0.8864795,low,0.025,low,0.1534570888230845,low,low +P0003,2025-06-15 18:00:00,0.47862306,low,0.0,low,0.1369121863429604,low,low +P0003,2025-06-16 00:00:00,0.50511384,low,0.005,low,0.1438326124188965,low,low +P0003,2025-06-16 06:00:00,0.57829475,low,0.0,low,0.2086530591262669,low,low +P0003,2025-06-16 12:00:00,0.50757354,low,0.0,low,0.1538887712883795,low,low +P0003,2025-06-16 18:00:00,0.47201464,low,0.0,low,0.1891933333230145,low,low +P0003,2025-06-17 00:00:00,0.51161724,low,0.0,low,0.1916991228776894,low,low +P0003,2025-06-17 06:00:00,0.45789635,low,0.0,low,0.1427395235828205,low,low +P0003,2025-06-17 12:00:00,0.40402254,low,0.0,low,0.1408043464949983,low,low +P0003,2025-06-17 18:00:00,0.4035708,low,0.0,low,0.1833508822444547,low,low +P0003,2025-06-18 00:00:00,0.36338174,low,0.0025,low,0.2291643418908318,low,low +P0003,2025-06-18 06:00:00,0.40058282,low,0.005,low,0.173731988865103,low,low +P0003,2025-06-18 12:00:00,0.4927471,low,0.005,low,0.2144967912782654,low,low +P0003,2025-06-18 18:00:00,0.47246566,low,0.0,low,0.2180658306721135,low,low +P0003,2025-06-19 00:00:00,0.4712692,low,0.005,low,0.3358887557650147,medium,low +P0003,2025-06-19 06:00:00,0.49386013,low,0.0025,low,0.205095330178897,low,low +P0003,2025-06-19 12:00:00,0.560305,low,0.01,low,0.2949753305574196,low,low +P0003,2025-06-19 18:00:00,0.56447524,low,0.0075,low,0.1448371509418146,low,low +P0003,2025-06-20 00:00:00,0.38613877,low,0.0,low,0.1798782368238836,low,low +P0003,2025-06-20 06:00:00,0.41243055,low,0.0025,low,0.2826687264449781,low,low +P0003,2025-06-20 12:00:00,0.42422426,low,0.0025,low,0.1607505531361013,low,low +P0003,2025-06-20 18:00:00,0.4073248,low,0.0,low,0.1847257327752587,low,low +P0003,2025-06-21 00:00:00,0.45585442,low,0.005,low,0.1250339571955153,low,low +P0003,2025-06-21 06:00:00,0.3890867,low,0.0,low,0.1923803879263653,low,low +P0003,2025-06-21 12:00:00,0.3841796,low,0.0,low,0.2344736905360437,low,low +P0003,2025-06-21 18:00:00,0.36967883,low,0.0,low,0.2303228033757696,low,low +P0003,2025-06-22 00:00:00,0.36495143,low,0.0,low,0.2927611201240486,low,low +P0003,2025-06-22 06:00:00,0.36307466,low,0.0,low,0.2143504350998586,low,low +P0003,2025-06-22 12:00:00,0.43674368,low,0.0,low,0.1344442414398942,low,low +P0003,2025-06-22 18:00:00,0.470038,low,0.0,low,0.1506220573643266,low,low +P0003,2025-06-23 00:00:00,0.71311545,low,0.03,low,0.1467098361374466,low,low +P0003,2025-06-23 06:00:00,0.86503863,low,0.02,low,0.2343844591726537,low,low +P0003,2025-06-23 12:00:00,0.7926005,low,0.0275,low,0.1215148533882953,low,low +P0003,2025-06-23 18:00:00,0.4591717,low,0.0075,low,0.2684626367538168,low,low +P0003,2025-06-24 00:00:00,0.5120018,low,0.0075,low,0.1778682561996687,low,low +P0003,2025-06-24 06:00:00,0.58333534,low,0.005,low,0.1647305229119684,low,low +P0003,2025-06-24 12:00:00,0.6434519,low,0.0525,low,0.12677072951831,low,low +P0003,2025-06-24 18:00:00,0.6619607,low,0.1525,low,0.1501542564022877,low,low +P0003,2025-06-25 00:00:00,0.67503923,low,0.2325,low,0.1746451986577393,low,low +P0003,2025-06-25 06:00:00,0.82271147,low,0.1275,low,0.1764563538046459,low,low +P0003,2025-06-25 12:00:00,0.876564,low,0.1975,low,0.1564350072946141,low,low +P0003,2025-06-26 00:00:00,0.7692139,low,0.01,low,0.1551910503935759,low,low +P0003,2025-06-26 06:00:00,0.75175995,low,0.0175,low,0.2248805968181269,low,low +P0003,2025-06-26 12:00:00,0.74268794,low,0.0075,low,0.0859359746623253,low,low +P0003,2025-06-26 18:00:00,0.7022224,low,0.005,low,0.3314614016783092,medium,low +P0003,2025-06-27 00:00:00,0.72362304,low,0.005,low,0.1376391734902214,low,low +P0003,2025-06-27 06:00:00,0.68068635,low,0.0275,low,0.0847105190482806,low,low +P0003,2025-06-27 12:00:00,0.6160004,low,0.0375,low,0.1821920317416314,low,low +P0003,2025-06-27 18:00:00,0.8279892,low,0.015,low,0.0464384145718405,low,low +P0003,2025-06-28 00:00:00,0.6166718,low,0.005,low,0.161458707220627,low,low +P0003,2025-06-28 06:00:00,0.5940053,low,0.0,low,0.2131857051394359,low,low +P0003,2025-06-28 12:00:00,0.56441146,low,0.0,low,0.2186386544406676,low,low +P0003,2025-06-28 18:00:00,0.60215324,low,0.0025,low,0.1002828439637268,low,low +P0003,2025-06-29 00:00:00,0.6536429,low,0.0025,low,0.1969576437729491,low,low +P0003,2025-06-29 06:00:00,0.568628,low,0.0,low,0.239551862725469,low,low +P0003,2025-06-29 12:00:00,0.48829672,low,0.0,low,0.1069619038628829,low,low +P0003,2025-06-29 18:00:00,0.46413538,low,0.0,low,0.3181210450028814,medium,low +P0003,2025-06-30 00:00:00,0.48053646,low,0.0,low,0.166927021914888,low,low +P0003,2025-06-30 06:00:00,0.5298771,low,0.0125,low,0.1332475102383512,low,low +P0003,2025-06-30 12:00:00,0.5500077,low,0.0,low,0.2383225690480475,low,low +P0003,2025-06-30 18:00:00,0.49558413,low,0.0,low,0.4699898149730842,medium,low +P0004,2025-06-03 18:00:00,0.4294718,low,0.0,low,0.2176664828588785,low,low +P0004,2025-06-04 00:00:00,0.4536707,low,0.0,low,0.1149100773766284,low,low +P0004,2025-06-04 06:00:00,0.4344389,low,0.0,low,0.2162219516018247,low,low +P0004,2025-06-04 12:00:00,0.50920963,low,0.0075,low,0.1375491495540627,low,low +P0004,2025-06-04 18:00:00,0.6718045,low,0.0025,low,0.1275966151636039,low,low +P0004,2025-06-05 00:00:00,0.7305286,low,0.0075,low,0.1471309335270828,low,low +P0004,2025-06-05 06:00:00,0.5431397,low,0.0,low,0.2134008787311036,low,low +P0004,2025-06-05 12:00:00,0.5427137,low,0.0,low,0.1759204798950509,low,low +P0004,2025-06-05 18:00:00,0.47499454,low,0.0025,low,0.1441914854325262,low,low +P0004,2025-06-06 00:00:00,0.5718577,low,0.015,low,0.2266713683346533,low,low +P0004,2025-06-06 06:00:00,0.78663635,low,0.0925,low,0.1237771996381845,low,low +P0004,2025-06-06 12:00:00,0.82565355,low,0.19,low,0.1073963014816452,low,low +P0004,2025-06-07 12:00:00,0.9060139,low,0.0175,low,0.0944747778835047,low,low +P0004,2025-06-07 18:00:00,0.84359765,low,0.0325,low,0.1487502713993013,low,low +P0004,2025-06-08 00:00:00,0.881285,low,0.085,low,0.2684153968183946,low,low +P0004,2025-06-08 06:00:00,0.9142742,low,0.0425,low,0.3133974473898404,medium,low +P0004,2025-06-08 18:00:00,0.67157793,low,0.0,low,0.169924665821058,low,low +P0004,2025-06-09 00:00:00,0.64794457,low,0.0025,low,0.183781170133488,low,low +P0004,2025-06-09 06:00:00,0.5662333,low,0.0,low,0.3236236018713351,medium,low +P0004,2025-06-09 12:00:00,0.59055305,low,0.0,low,0.4070609476816101,medium,low +P0004,2025-06-09 18:00:00,0.563197,low,0.0,low,0.395589481628734,medium,low +P0004,2025-06-10 00:00:00,0.56612194,low,0.0,low,0.1859047932337511,low,low +P0004,2025-06-10 06:00:00,0.46911156,low,0.0,low,0.2279659912927233,low,low +P0004,2025-06-10 12:00:00,0.5596978,low,0.0,low,0.2843409468586167,low,low +P0004,2025-06-10 18:00:00,0.59403294,low,0.0,low,0.252642952076768,low,low +P0004,2025-06-11 00:00:00,0.5548399,low,0.0,low,0.1666286504919545,low,low +P0004,2025-06-11 06:00:00,0.5705219,low,0.0,low,0.1357081926812095,low,low +P0004,2025-06-11 12:00:00,0.5506776,low,0.0,low,0.1767035283398719,low,low +P0004,2025-06-11 18:00:00,0.5728751,low,0.0025,low,0.1207892205490099,low,low +P0004,2025-06-12 00:00:00,0.5894713,low,0.0,low,0.2696896614622248,low,low +P0004,2025-06-12 06:00:00,0.61432064,low,0.0,low,0.1502581568760218,low,low +P0004,2025-06-12 12:00:00,0.6022699,low,0.0,low,0.2180438842582552,low,low +P0004,2025-06-12 18:00:00,0.74192786,low,0.0,low,0.1460782319459448,low,low +P0004,2025-06-13 00:00:00,0.75998616,low,0.01,low,0.1391830230457915,low,low +P0004,2025-06-13 06:00:00,0.690891,low,0.0025,low,0.3066875556290554,medium,low +P0004,2025-06-13 12:00:00,0.7578791,low,0.0,low,0.1497734155248728,low,low +P0004,2025-06-13 18:00:00,0.64107394,low,0.005,low,0.1721253551198936,low,low +P0004,2025-06-14 00:00:00,0.78372246,low,0.0,low,0.3054114658606545,medium,low +P0004,2025-06-14 06:00:00,0.7270973,low,0.0025,low,0.2350990067297235,low,low +P0004,2025-06-14 12:00:00,0.40104976,low,0.0,low,0.291147010488926,low,low +P0004,2025-06-14 18:00:00,0.40652177,low,0.0,low,0.1794895030286409,low,low +P0004,2025-06-15 00:00:00,0.4559155,low,0.0025,low,0.1595475852717586,low,low +P0004,2025-06-15 06:00:00,0.45387506,low,0.0,low,0.2170054234113353,low,low +P0004,2025-06-15 12:00:00,0.4764272,low,0.0025,low,0.131870717269718,low,low +P0004,2025-06-15 18:00:00,0.53162754,low,0.0,low,0.3988707852651004,medium,low +P0004,2025-06-16 00:00:00,0.4570418,low,0.0,low,0.3134232254397461,medium,low +P0004,2025-06-16 06:00:00,0.47174537,low,0.0,low,0.1756319519925472,low,low +P0004,2025-06-16 12:00:00,0.43210426,low,0.0,low,0.1434562931000613,low,low +P0004,2025-06-16 18:00:00,0.45315552,low,0.0025,low,0.2150895239627956,low,low +P0004,2025-06-17 00:00:00,0.45042017,low,0.0,low,0.2580298997685982,low,low +P0004,2025-06-17 06:00:00,0.54266596,low,0.0,low,0.2201308158265144,low,low +P0004,2025-06-17 12:00:00,0.54454845,low,0.0,low,0.1354628437186897,low,low +P0004,2025-06-17 18:00:00,0.5413561,low,0.0,low,0.2594887279130158,low,low +P0004,2025-06-18 00:00:00,0.4930059,low,0.0,low,0.1621005778625424,low,low +P0004,2025-06-18 06:00:00,0.50888443,low,0.0,low,0.2545366791619333,low,low +P0004,2025-06-18 12:00:00,0.49538168,low,0.0,low,0.2545193085080706,low,low +P0004,2025-06-18 18:00:00,0.46007526,low,0.01,low,0.1664984961626741,low,low +P0004,2025-06-19 00:00:00,0.4559239,low,0.015,low,0.1673388626927908,low,low +P0004,2025-06-19 06:00:00,0.43124008,low,0.005,low,0.2821640474785633,low,low +P0004,2025-06-19 12:00:00,0.4651245,low,0.01,low,0.1202862159944432,low,low +P0004,2025-06-19 18:00:00,0.4327834,low,0.0025,low,0.2912639064995456,low,low +P0004,2025-06-20 00:00:00,0.42765775,low,0.0075,low,0.1685860178422987,low,low +P0004,2025-06-20 06:00:00,0.41036943,low,0.0125,low,0.2051545783479615,low,low +P0004,2025-06-20 12:00:00,0.43494713,low,0.0025,low,0.1762628483243665,low,low +P0004,2025-06-20 18:00:00,0.6634193,low,0.0125,low,0.137939932579161,low,low +P0004,2025-06-21 00:00:00,0.56939816,low,0.0,low,0.0991144942659316,low,low +P0004,2025-06-21 06:00:00,0.65391856,low,0.0075,low,0.1259727897578137,low,low +P0004,2025-06-21 12:00:00,0.84513986,low,0.0075,low,0.1510315542616028,low,low +P0004,2025-06-21 18:00:00,0.59373367,low,0.0,low,0.244704404805284,low,low +P0004,2025-06-22 00:00:00,0.6180461,low,0.0025,low,0.2033042045422288,low,low +P0004,2025-06-22 06:00:00,0.57213616,low,0.0075,low,0.2831374832259483,low,low +P0004,2025-06-22 12:00:00,0.48112923,low,0.0,low,0.2076528035726699,low,low +P0004,2025-06-22 18:00:00,0.5200897,low,0.0,low,0.2061401630867166,low,low +P0004,2025-06-23 00:00:00,0.5209987,low,0.0025,low,0.1469194712855307,low,low +P0004,2025-06-23 06:00:00,0.5454133,low,0.01,low,0.1577446505334496,low,low +P0004,2025-06-23 12:00:00,0.597238,low,0.0025,low,0.1274260145937722,low,low +P0004,2025-06-23 18:00:00,0.550589,low,0.0,low,0.1623096389047658,low,low +P0004,2025-06-24 00:00:00,0.60690475,low,0.0225,low,0.0948292732593577,low,low +P0004,2025-06-24 06:00:00,0.5526506,low,0.0,low,0.141886962308287,low,low +P0004,2025-06-24 12:00:00,0.5095151,low,0.0,low,0.1604381753584788,low,low +P0004,2025-06-24 18:00:00,0.50690186,low,0.0,low,0.1974435704414648,low,low +P0004,2025-06-25 00:00:00,0.5396761,low,0.0,low,0.2414239730261662,low,low +P0004,2025-06-25 06:00:00,0.54457855,low,0.0,low,0.1502020792230762,low,low +P0004,2025-06-25 12:00:00,0.48084122,low,0.0025,low,0.1756621686684892,low,low +P0004,2025-06-25 18:00:00,0.46374595,low,0.0,low,0.2264673332650193,low,low +P0004,2025-06-26 00:00:00,0.48373488,low,0.0025,low,0.2014249687268571,low,low +P0004,2025-06-26 06:00:00,0.50294185,low,0.0,low,0.2644170154594376,low,low +P0004,2025-06-26 12:00:00,0.47067294,low,0.0,low,0.2034925197068811,low,low +P0004,2025-06-26 18:00:00,0.46640784,low,0.005,low,0.1222500237892441,low,low +P0004,2025-06-27 00:00:00,0.44904158,low,0.0025,low,0.1173823920444624,low,low +P0004,2025-06-27 06:00:00,0.9028541,low,0.0125,low,0.1022824646702996,low,low +P0004,2025-06-27 12:00:00,0.8541193,low,0.025,low,0.1912909275564158,low,low +P0004,2025-06-27 18:00:00,0.8810204,low,0.0225,low,0.1750368539195892,low,low +P0004,2025-06-28 00:00:00,0.7950846,low,0.025,low,0.2783466455701866,low,low +P0004,2025-06-28 06:00:00,0.80185,low,0.0175,low,0.1018520758322191,low,low +P0004,2025-06-28 12:00:00,0.8180117,low,0.075,low,0.1265382979954303,low,low +P0004,2025-06-29 18:00:00,0.77074295,low,0.015,low,0.2640905625489237,low,low +P0004,2025-06-30 00:00:00,0.7042861,low,0.0225,low,0.1254741883801032,low,low +P0004,2025-06-30 06:00:00,0.6736944,low,0.0,low,0.2906304012336389,low,low +P0004,2025-06-30 12:00:00,0.67843246,low,0.0025,low,0.1439726769353493,low,low +P0004,2025-06-30 18:00:00,0.6514561,low,0.0025,low,0.1367691320427222,low,low +P0005,2025-06-03 18:00:00,0.5520086,low,0.0075,low,0.0784274263615621,low,low +P0005,2025-06-04 00:00:00,0.49648842,low,0.0175,low,0.124004645494754,low,low +P0005,2025-06-04 06:00:00,0.4734956,low,0.035,low,0.3146388552943776,medium,low +P0005,2025-06-04 12:00:00,0.55147237,low,0.0175,low,0.2197997609222964,low,low +P0005,2025-06-04 18:00:00,0.6615274,low,0.0,low,0.2242460160108202,low,low +P0005,2025-06-05 00:00:00,0.9098023,low,0.0225,low,0.1478051936274275,low,low +P0005,2025-06-05 06:00:00,0.7343123,low,0.0,low,0.1536980478784081,low,low +P0005,2025-06-05 12:00:00,0.43357515,low,0.0,low,0.0907346436615807,low,low +P0005,2025-06-05 18:00:00,0.43782154,low,0.0,low,0.1351173627849536,low,low +P0005,2025-06-06 00:00:00,0.44595262,low,0.0,low,0.1658158719273925,low,low +P0005,2025-06-06 06:00:00,0.49037278,low,0.0,low,0.2398883501389239,low,low +P0005,2025-06-06 12:00:00,0.489185,low,0.0,low,0.4272352850835665,medium,low +P0005,2025-06-06 18:00:00,0.4870583,low,0.0,low,0.2762088306446315,low,low +P0005,2025-06-07 00:00:00,0.4723846,low,0.0,low,0.1286621918058781,low,low +P0005,2025-06-07 06:00:00,0.45674196,low,0.0,low,0.2016810856987284,low,low +P0005,2025-06-07 12:00:00,0.44111112,low,0.0,low,0.2166659705145302,low,low +P0005,2025-06-07 18:00:00,0.41319054,low,0.0,low,0.1794050641514227,low,low +P0005,2025-06-08 00:00:00,0.41607076,low,0.0,low,0.221954279403409,low,low +P0005,2025-06-08 06:00:00,0.4804777,low,0.0025,low,0.2709128416536989,low,low +P0005,2025-06-08 12:00:00,0.46341813,low,0.0,low,0.3172749739608937,medium,low +P0005,2025-06-08 18:00:00,0.45342138,low,0.0025,low,0.1661198392738233,low,low +P0005,2025-06-09 00:00:00,0.44974545,low,0.0,low,0.2322963657193794,low,low +P0005,2025-06-09 06:00:00,0.6588373,low,0.005,low,0.090098914151673,low,low +P0005,2025-06-09 12:00:00,0.74169374,low,0.0225,low,0.2053249872394086,low,low +P0005,2025-06-09 18:00:00,0.6978923,low,0.025,low,0.1708109136914707,low,low +P0005,2025-06-10 00:00:00,0.67362976,low,0.04,low,0.2674774114323183,low,low +P0005,2025-06-10 06:00:00,0.65868783,low,0.1025,low,0.1839200701962751,low,low +P0005,2025-06-10 12:00:00,0.67935514,low,0.0175,low,0.1323603272829766,low,low +P0005,2025-06-10 18:00:00,0.69214576,low,0.01,low,0.2123167568110018,low,low +P0005,2025-06-11 00:00:00,0.6678039,low,0.02,low,0.1336352478983607,low,low +P0005,2025-06-11 06:00:00,0.37957668,low,0.005,low,0.1386930424275986,low,low +P0005,2025-06-11 12:00:00,0.41698995,low,0.0025,low,0.2068253178720931,low,low +P0005,2025-06-11 18:00:00,0.53233063,low,0.0075,low,0.2178997336304815,low,low +P0005,2025-06-12 00:00:00,0.71369946,low,0.005,low,0.1440600095161817,low,low +P0005,2025-06-12 06:00:00,0.56213295,low,0.01,low,0.1255201448306374,low,low +P0005,2025-06-12 12:00:00,0.48229852,low,0.0,low,0.1410744265755933,low,low +P0005,2025-06-12 18:00:00,0.4865604,low,0.0,low,0.3183882924879119,medium,low +P0005,2025-06-13 00:00:00,0.40300488,low,0.0,low,0.305752006205251,medium,low +P0005,2025-06-13 06:00:00,0.39764526,low,0.0,low,0.1472874761053649,low,low +P0005,2025-06-13 12:00:00,0.4071275,low,0.0,low,0.4089958975045776,medium,low +P0005,2025-06-13 18:00:00,0.520752,low,0.0,low,0.1517856880632151,low,low +P0005,2025-06-14 00:00:00,0.51303756,low,0.0,low,0.2063008208584067,low,low +P0005,2025-06-14 06:00:00,0.50654995,low,0.0,low,0.2036978946820193,low,low +P0005,2025-06-14 12:00:00,0.44080645,low,0.0,low,0.219364412149652,low,low +P0005,2025-06-14 18:00:00,0.39659482,low,0.0025,low,0.2962337060462665,low,low +P0005,2025-06-15 00:00:00,0.34777233,low,0.0,low,0.1749447540192119,low,low +P0005,2025-06-15 06:00:00,0.3958123,low,0.0,low,0.1940283032965701,low,low +P0005,2025-06-15 12:00:00,0.40601248,low,0.0,low,0.1676240235745483,low,low +P0005,2025-06-15 18:00:00,0.44194233,low,0.0,low,0.2194188533682595,low,low +P0005,2025-06-16 00:00:00,0.41666687,low,0.0025,low,0.1418201309007087,low,low +P0005,2025-06-16 06:00:00,0.49543062,low,0.0075,low,0.3113152382466569,medium,low +P0005,2025-06-16 12:00:00,0.7428507,low,0.0025,low,0.3162270377695223,medium,low +P0005,2025-06-16 18:00:00,0.5389609,low,0.0,low,0.2691210291956172,low,low +P0005,2025-06-17 00:00:00,0.5205548,low,0.0,low,0.224889183489382,low,low +P0005,2025-06-17 06:00:00,0.5407516,low,0.0,low,0.2222414475352336,low,low +P0005,2025-06-17 12:00:00,0.5770329,low,0.0,low,0.2205205415149747,low,low +P0005,2025-06-17 18:00:00,0.5502904,low,0.0025,low,0.2228013885080172,low,low +P0005,2025-06-18 00:00:00,0.59238845,low,0.0025,low,0.3009519182698524,medium,low +P0005,2025-06-18 06:00:00,0.59364265,low,0.0025,low,0.163638700016133,low,low +P0005,2025-06-18 12:00:00,0.5875732,low,0.005,low,0.138918855594689,low,low +P0005,2025-06-18 18:00:00,0.5708865,low,0.0125,low,0.2557959404706283,low,low +P0005,2025-06-19 00:00:00,0.4934475,low,0.0,low,0.1504047105266108,low,low +P0005,2025-06-19 06:00:00,0.5359391,low,0.0025,low,0.1343692422738626,low,low +P0005,2025-06-19 12:00:00,0.5714381,low,0.0,low,0.2513687980495747,low,low +P0005,2025-06-19 18:00:00,0.5799949,low,0.0,low,0.303046001851313,medium,low +P0005,2025-06-20 00:00:00,0.5852319,low,0.0,low,0.1918285130304507,low,low +P0005,2025-06-20 06:00:00,0.5713019,low,0.0,low,0.1412893938187265,low,low +P0005,2025-06-20 12:00:00,0.58403164,low,0.0,low,0.1809129275056263,low,low +P0005,2025-06-20 18:00:00,0.5924113,low,0.0,low,0.1922125451872896,low,low +P0005,2025-06-21 00:00:00,0.48437807,low,0.0,low,0.2950809316886831,low,low +P0005,2025-06-21 06:00:00,0.52217895,low,0.0,low,0.4068438091708384,medium,low +P0005,2025-06-21 12:00:00,0.5630286,low,0.0,low,0.2395146284372312,low,low +P0005,2025-06-21 18:00:00,0.61652386,low,0.0,low,0.0972319530562059,low,low +P0005,2025-06-22 00:00:00,0.55979896,low,0.0,low,0.2677769351854681,low,low +P0005,2025-06-22 06:00:00,0.51461715,low,0.0,low,0.2705238517286542,low,low +P0005,2025-06-22 12:00:00,0.6003868,low,0.0,low,0.1901202167298273,low,low +P0005,2025-06-22 18:00:00,0.5805791,low,0.0075,low,0.1135483897709067,low,low +P0005,2025-06-23 00:00:00,0.5338368,low,0.005,low,0.2182938964167826,low,low +P0005,2025-06-23 06:00:00,0.4941133,low,0.0,low,0.2504441917296325,low,low +P0005,2025-06-23 12:00:00,0.4826186,low,0.0025,low,0.1578457903351115,low,low +P0005,2025-06-23 18:00:00,0.45101282,low,0.0025,low,0.0943614043207493,low,low +P0005,2025-06-24 00:00:00,0.45195422,low,0.0,low,0.2758301568634848,low,low +P0005,2025-06-24 06:00:00,0.46827686,low,0.0025,low,0.2078552925470536,low,low +P0005,2025-06-24 12:00:00,0.45966733,low,0.0025,low,0.1729739918120621,low,low +P0005,2025-06-24 18:00:00,0.36045334,low,0.0,low,0.1116994986212816,low,low +P0005,2025-06-25 00:00:00,0.382404,low,0.01,low,0.1105324661403522,low,low +P0005,2025-06-25 06:00:00,0.40793395,low,0.0025,low,0.2043374566509308,low,low +P0005,2025-06-25 12:00:00,0.46052763,low,0.005,low,0.1651812011433044,low,low +P0005,2025-06-25 18:00:00,0.4390298,low,0.0,low,0.1080046173653789,low,low +P0005,2025-06-26 00:00:00,0.37888706,low,0.0,low,0.2451903975257971,low,low +P0005,2025-06-26 06:00:00,0.57628655,low,0.0,low,0.2530495613291122,low,low +P0005,2025-06-26 12:00:00,0.5188868,low,0.0,low,0.1781908277383649,low,low +P0005,2025-06-26 18:00:00,0.485165,low,0.0,low,0.2590508320325701,low,low +P0005,2025-06-27 00:00:00,0.4948548,low,0.0,low,0.381943394364083,medium,low +P0005,2025-06-27 06:00:00,0.49093688,low,0.0,low,0.1824443270804991,low,low +P0005,2025-06-27 12:00:00,0.51296574,low,0.0,low,0.179057046035681,low,low +P0005,2025-06-27 18:00:00,0.5260156,low,0.0,low,0.0817255622587611,low,low +P0005,2025-06-28 00:00:00,0.51449037,low,0.0,low,0.1091348916181189,low,low +P0005,2025-06-28 06:00:00,0.48746914,low,0.0,low,0.2211977021714967,low,low +P0005,2025-06-28 12:00:00,0.48614264,low,0.0,low,0.1480411980943354,low,low +P0005,2025-06-28 18:00:00,0.5361913,low,0.0,low,0.183690454360629,low,low +P0005,2025-06-29 00:00:00,0.53392005,low,0.0,low,0.163365116973275,low,low +P0005,2025-06-29 06:00:00,0.5076907,low,0.0,low,0.181167337684962,low,low +P0005,2025-06-29 12:00:00,0.50554395,low,0.0,low,0.1461133252562604,low,low +P0005,2025-06-29 18:00:00,0.537637,low,0.0,low,0.2339111196644392,low,low +P0005,2025-06-30 00:00:00,0.54218423,low,0.0025,low,0.2196412257763464,low,low +P0005,2025-06-30 06:00:00,0.5511253,low,0.0025,low,0.1538807424618906,low,low +P0005,2025-06-30 12:00:00,0.4974626,low,0.0,low,0.2401588920451873,low,low +P0005,2025-06-30 18:00:00,0.50892586,low,0.0,low,0.2963539044194561,low,low +P0006,2025-06-03 18:00:00,0.50585616,low,0.0,low,0.1278181799125288,low,low +P0006,2025-06-04 00:00:00,0.4365121,low,0.0,low,0.1767742363022277,low,low +P0006,2025-06-04 06:00:00,0.6537492,low,0.0,low,0.1975224641087176,low,low +P0006,2025-06-04 12:00:00,0.65323323,low,0.0,low,0.2031192918080987,low,low +P0006,2025-06-04 18:00:00,0.6617383,low,0.0,low,0.3082538989067803,medium,low +P0006,2025-06-05 00:00:00,0.7299275,low,0.0,low,0.1569999700462392,low,low +P0006,2025-06-05 06:00:00,0.75395286,low,0.0,low,0.1906688479960032,low,low +P0006,2025-06-05 12:00:00,0.69375575,low,0.0,low,0.2824865474978883,low,low +P0006,2025-06-05 18:00:00,0.7320828,low,0.0025,low,0.2084436619417684,low,low +P0006,2025-06-06 00:00:00,0.7144792,low,0.005,low,0.0818140646839253,low,low +P0006,2025-06-06 06:00:00,0.7374493,low,0.005,low,0.1998177463420161,low,low +P0006,2025-06-06 12:00:00,0.73246884,low,0.0,low,0.1347859285605414,low,low +P0006,2025-06-06 18:00:00,0.42254537,low,0.0,low,0.2915005762249055,low,low +P0006,2025-06-07 00:00:00,0.47435582,low,0.0,low,0.2215993726558607,low,low +P0006,2025-06-07 06:00:00,0.49371466,low,0.0,low,0.1423738177025397,low,low +P0006,2025-06-07 12:00:00,0.48380503,low,0.0,low,0.3365379354548717,medium,low +P0006,2025-06-07 18:00:00,0.4707846,low,0.0,low,0.2910012847350908,low,low +P0006,2025-06-08 00:00:00,0.44032633,low,0.0,low,0.1290459858985124,low,low +P0006,2025-06-08 06:00:00,0.3911707,low,0.0,low,0.2696941477370262,low,low +P0006,2025-06-08 12:00:00,0.37225667,low,0.0,low,0.1376992065168339,low,low +P0006,2025-06-08 18:00:00,0.3703022,low,0.0,low,0.1569588660733084,low,low +P0006,2025-06-09 00:00:00,0.40150198,low,0.0,low,0.3126692482549602,medium,low +P0006,2025-06-09 06:00:00,0.40111908,low,0.0,low,0.231733308890652,low,low +P0006,2025-06-09 12:00:00,0.42885455,low,0.0,low,0.1929248734321782,low,low +P0006,2025-06-09 18:00:00,0.49312747,low,0.005,low,0.2208104311955007,low,low +P0006,2025-06-10 00:00:00,0.4952084,low,0.0,low,0.172278258023206,low,low +P0006,2025-06-10 06:00:00,0.47177586,low,0.0,low,0.2161005221134642,low,low +P0006,2025-06-10 12:00:00,0.45655224,low,0.0,low,0.1732011314428897,low,low +P0006,2025-06-10 18:00:00,0.45699278,low,0.0,low,0.2605596269556039,low,low +P0006,2025-06-11 00:00:00,0.4435376,low,0.0,low,0.2175582704434584,low,low +P0006,2025-06-11 06:00:00,0.41675887,low,0.0,low,0.2482370764105063,low,low +P0006,2025-06-11 12:00:00,0.44479507,low,0.0,low,0.1808228701831842,low,low +P0006,2025-06-11 18:00:00,0.4690478,low,0.0,low,0.2702870040032906,low,low +P0006,2025-06-12 00:00:00,0.446658,low,0.0,low,0.2043741220788553,low,low +P0006,2025-06-12 06:00:00,0.43649563,low,0.0,low,0.1391093726802235,low,low +P0006,2025-06-12 12:00:00,0.46559143,low,0.0,low,0.3697447548046336,medium,low +P0006,2025-06-12 18:00:00,0.4476607,low,0.0,low,0.2126618012147466,low,low +P0006,2025-06-13 00:00:00,0.46159875,low,0.0,low,0.1252657211874245,low,low +P0006,2025-06-13 06:00:00,0.47343594,low,0.0,low,0.4295875016833897,medium,low +P0006,2025-06-13 12:00:00,0.5157201,low,0.0,low,0.1392734319739859,low,low +P0006,2025-06-13 18:00:00,0.5472256,low,0.0,low,0.1596448930294044,low,low +P0006,2025-06-14 00:00:00,0.5372979,low,0.0,low,0.1848094580620408,low,low +P0006,2025-06-14 06:00:00,0.56609017,low,0.0,low,0.2861258251375513,low,low +P0006,2025-06-14 12:00:00,0.5495828,low,0.0,low,0.2199149572402446,low,low +P0006,2025-06-14 18:00:00,0.538857,low,0.0,low,0.382078539427773,medium,low +P0006,2025-06-15 00:00:00,0.5138696,low,0.0,low,0.269904779878922,low,low +P0006,2025-06-15 06:00:00,0.6314091,low,0.0,low,0.1480410240447303,low,low +P0006,2025-06-15 12:00:00,0.5998895,low,0.0,low,0.2152759874658727,low,low +P0006,2025-06-15 18:00:00,0.5747061,low,0.0,low,0.2574969402655855,low,low +P0006,2025-06-16 00:00:00,0.63174754,low,0.0,low,0.1012664388272835,low,low +P0006,2025-06-16 06:00:00,0.6001798,low,0.0,low,0.1245488247217134,low,low +P0006,2025-06-16 12:00:00,0.58896,low,0.0,low,0.1285722678524853,low,low +P0006,2025-06-16 18:00:00,0.5566418,low,0.0,low,0.4746188296591923,medium,low +P0006,2025-06-17 00:00:00,0.5531476,low,0.0,low,0.1209902184842044,low,low +P0006,2025-06-17 06:00:00,0.56201625,low,0.0,low,0.2122657124544903,low,low +P0006,2025-06-17 12:00:00,0.56472707,low,0.0,low,0.2512076960365759,low,low +P0006,2025-06-17 18:00:00,0.5325613,low,0.0,low,0.1453747300737095,low,low +P0006,2025-06-18 00:00:00,0.47786734,low,0.0,low,0.2599357614383252,low,low +P0006,2025-06-18 06:00:00,0.5373667,low,0.0,low,0.2719506908282528,low,low +P0006,2025-06-18 12:00:00,0.7039844,low,0.0025,low,0.0650406531599102,low,low +P0006,2025-06-18 18:00:00,0.5233949,low,0.0,low,0.2159378899134279,low,low +P0006,2025-06-19 00:00:00,0.8172993,low,0.0,low,0.1835406328376238,low,low +P0006,2025-06-19 06:00:00,0.75796103,low,0.0025,low,0.2169529946717815,low,low +P0006,2025-06-19 12:00:00,0.738498,low,0.0,low,0.1922331554857317,low,low +P0006,2025-06-19 18:00:00,0.7537447,low,0.01,low,0.1850542917376587,low,low +P0006,2025-06-20 00:00:00,0.75811267,low,0.015,low,0.2558627139661862,low,low +P0006,2025-06-20 06:00:00,0.78179836,low,0.0025,low,0.0845247226330148,low,low +P0006,2025-06-20 12:00:00,0.8137977,low,0.0,low,0.1903490578844206,low,low +P0006,2025-06-21 06:00:00,0.8445767,low,0.0025,low,0.2946574884874729,low,low +P0006,2025-06-21 12:00:00,0.81806344,low,0.0075,low,0.1100374973864831,low,low +P0006,2025-06-21 18:00:00,0.815697,low,0.01,low,0.1534165309268519,low,low +P0006,2025-06-22 00:00:00,0.5561068,low,0.0,low,0.1438864326085828,low,low +P0006,2025-06-22 06:00:00,0.5460703,low,0.0,low,0.0990746037465211,low,low +P0006,2025-06-22 12:00:00,0.6016551,low,0.0,low,0.149005162844329,low,low +P0006,2025-06-22 18:00:00,0.5643105,low,0.0,low,0.229009757517834,low,low +P0006,2025-06-23 00:00:00,0.5693419,low,0.0,low,0.2476742531971901,low,low +P0006,2025-06-23 06:00:00,0.5521504,low,0.0,low,0.3291627111047543,medium,low +P0006,2025-06-23 12:00:00,0.6205727,low,0.005,low,0.3317300411715267,medium,low +P0006,2025-06-23 18:00:00,0.49515927,low,0.0,low,0.2368305741934781,low,low +P0006,2025-06-24 00:00:00,0.4269942,low,0.0025,low,0.1997858327922108,low,low +P0006,2025-06-24 06:00:00,0.42340952,low,0.0,low,0.2230670263194411,low,low +P0006,2025-06-24 12:00:00,0.43127123,low,0.0,low,0.1240994484441956,low,low +P0006,2025-06-24 18:00:00,0.44405732,low,0.0025,low,0.2338609268925042,low,low +P0006,2025-06-25 00:00:00,0.45372283,low,0.0025,low,0.228486474863375,low,low +P0006,2025-06-25 06:00:00,0.4556091,low,0.0025,low,0.1121758563783871,low,low +P0006,2025-06-25 12:00:00,0.42716777,low,0.0,low,0.2542303185870541,low,low +P0006,2025-06-25 18:00:00,0.39768922,low,0.0,low,0.1354651398586666,low,low +P0006,2025-06-26 00:00:00,0.40462917,low,0.0,low,0.2107084042720334,low,low +P0006,2025-06-26 06:00:00,0.46901014,low,0.0025,low,0.1277290679784523,low,low +P0006,2025-06-26 12:00:00,0.48900303,low,0.0,low,0.3979152111518743,medium,low +P0006,2025-06-26 18:00:00,0.4539086,low,0.0,low,0.2229080194591925,low,low +P0006,2025-06-27 00:00:00,0.40253282,low,0.0,low,0.1066993944023507,low,low +P0006,2025-06-27 06:00:00,0.45543474,low,0.0,low,0.1984539559655334,low,low +P0006,2025-06-27 12:00:00,0.4049207,low,0.0,low,0.0806902464737897,low,low +P0006,2025-06-27 18:00:00,0.37526494,low,0.0,low,0.1238152501599523,low,low +P0006,2025-06-28 00:00:00,0.4377123,low,0.0,low,0.274375950744015,low,low +P0006,2025-06-28 06:00:00,0.4464601,low,0.0275,low,0.2077015227125011,low,low +P0006,2025-06-28 12:00:00,0.5343793,low,0.02,low,0.1121504124187306,low,low +P0006,2025-06-28 18:00:00,0.53056145,low,0.0125,low,0.2604685482154183,low,low +P0006,2025-06-29 00:00:00,0.5178319,low,0.03,low,0.1193153825624836,low,low +P0006,2025-06-29 12:00:00,0.9408544,low,0.085,low,0.2056761925114887,low,low +P0006,2025-06-29 18:00:00,0.7588773,low,0.04,low,0.1058310284647477,low,low +P0006,2025-06-30 00:00:00,0.5945316,low,0.0025,low,0.2168966839448637,low,low +P0006,2025-06-30 06:00:00,0.5418123,low,0.0,low,0.3436812269199126,medium,low +P0006,2025-06-30 12:00:00,0.5351839,low,0.0,low,0.2268518365179601,low,low +P0006,2025-06-30 18:00:00,0.45636114,low,0.0,low,0.173352259751814,low,low +P0007,2025-06-03 18:00:00,0.6062289,low,0.0025,low,0.29265324414647,low,low +P0007,2025-06-04 00:00:00,0.52221227,low,0.0,low,0.1186727344206725,low,low +P0007,2025-06-04 06:00:00,0.48176855,low,0.0,low,0.1516763479873948,low,low +P0007,2025-06-04 12:00:00,0.53445023,low,0.0,low,0.1894051970478764,low,low +P0007,2025-06-04 18:00:00,0.53071946,low,0.0,low,0.1297731870093304,low,low +P0007,2025-06-05 00:00:00,0.5618014,low,0.0,low,0.2734262880144571,low,low +P0007,2025-06-05 06:00:00,0.53750503,low,0.0,low,0.2989187513833256,low,low +P0007,2025-06-05 12:00:00,0.51969695,low,0.0,low,0.1117581872512177,low,low +P0007,2025-06-05 18:00:00,0.5140953,low,0.0,low,0.4465195454329395,medium,low +P0007,2025-06-06 00:00:00,0.49210188,low,0.0,low,0.3293467082268758,medium,low +P0007,2025-06-06 06:00:00,0.5734592,low,0.0,low,0.2806463361799243,low,low +P0007,2025-06-06 12:00:00,0.59122777,low,0.0,low,0.1432683002284774,low,low +P0007,2025-06-06 18:00:00,0.5627751,low,0.0,low,0.1711594680499729,low,low +P0007,2025-06-07 00:00:00,0.55160236,low,0.0,low,0.183675121011233,low,low +P0007,2025-06-07 06:00:00,0.5043717,low,0.0,low,0.2349155980296607,low,low +P0007,2025-06-07 12:00:00,0.50728935,low,0.0,low,0.2344066128820368,low,low +P0007,2025-06-07 18:00:00,0.40128958,low,0.0,low,0.3814581935792566,medium,low +P0007,2025-06-08 00:00:00,0.39784494,low,0.0,low,0.2758802056657585,low,low +P0007,2025-06-08 06:00:00,0.45727846,low,0.0,low,0.1903199695831719,low,low +P0007,2025-06-08 12:00:00,0.49988207,low,0.0,low,0.1954165773520447,low,low +P0007,2025-06-08 18:00:00,0.4736362,low,0.0,low,0.2272500292487636,low,low +P0007,2025-06-09 00:00:00,0.4731297,low,0.0,low,0.2865807701643904,low,low +P0007,2025-06-09 06:00:00,0.42614532,low,0.0025,low,0.1924789892542045,low,low +P0007,2025-06-09 12:00:00,0.46637854,low,0.0075,low,0.1575574418922634,low,low +P0007,2025-06-09 18:00:00,0.5494844,low,0.0,low,0.1747424345510336,low,low +P0007,2025-06-10 00:00:00,0.5721282,low,0.0,low,0.2710387151864341,low,low +P0007,2025-06-10 06:00:00,0.55341107,low,0.01,low,0.2579356387594362,low,low +P0007,2025-06-10 12:00:00,0.5960707,low,0.0125,low,0.1518199364159056,low,low +P0007,2025-06-10 18:00:00,0.6365837,low,0.01,low,0.2716286618043142,low,low +P0007,2025-06-11 00:00:00,0.6843033,low,0.0175,low,0.0549369651684017,low,low +P0007,2025-06-11 06:00:00,0.561799,low,0.0,low,0.2201316490410247,low,low +P0007,2025-06-11 12:00:00,0.5317811,low,0.0,low,0.1207113858801925,low,low +P0007,2025-06-11 18:00:00,0.5026953,low,0.0,low,0.1856584388322565,low,low +P0007,2025-06-12 00:00:00,0.4676237,low,0.0,low,0.2153870618902051,low,low +P0007,2025-06-12 06:00:00,0.47562483,low,0.0125,low,0.2490186331535008,low,low +P0007,2025-06-12 12:00:00,0.5157102,low,0.0,low,0.1268850325626931,low,low +P0007,2025-06-12 18:00:00,0.5234233,low,0.01,low,0.1556372315728569,low,low +P0007,2025-06-13 00:00:00,0.43186766,low,0.0025,low,0.3618061209566818,medium,low +P0007,2025-06-13 06:00:00,0.42901123,low,0.0325,low,0.2642339324291132,low,low +P0007,2025-06-13 12:00:00,0.3509719,low,0.01,low,0.1149272862935387,low,low +P0007,2025-06-13 18:00:00,0.33407432,low,0.01,low,0.2355989676955599,low,low +P0007,2025-06-14 06:00:00,0.31009868,low,0.0875,low,0.1243182361270888,low,low +P0007,2025-06-14 12:00:00,0.37076676,low,0.28,low,0.1474926528633456,low,low +P0007,2025-06-14 18:00:00,0.456704,low,0.0875,low,0.2307782953803475,low,low +P0007,2025-06-15 06:00:00,0.8476148,low,0.0175,low,0.3256947399279276,medium,low +P0007,2025-06-15 12:00:00,0.8187033,low,0.015,low,0.2275230906551567,low,low +P0007,2025-06-15 18:00:00,0.4978317,low,0.0,low,0.1338370734939999,low,low +P0007,2025-06-16 00:00:00,0.5316455,low,0.005,low,0.1626436341408801,low,low +P0007,2025-06-16 06:00:00,0.5855105,low,0.0,low,0.1291005245567072,low,low +P0007,2025-06-16 12:00:00,0.53211117,low,0.0025,low,0.3202929234101823,medium,low +P0007,2025-06-16 18:00:00,0.4748051,low,0.0,low,0.204587582669181,low,low +P0007,2025-06-17 00:00:00,0.4600309,low,0.0,low,0.2004553359035108,low,low +P0007,2025-06-17 06:00:00,0.4399514,low,0.0,low,0.1784720618189685,low,low +P0007,2025-06-17 12:00:00,0.4757753,low,0.0,low,0.1413463529803163,low,low +P0007,2025-06-17 18:00:00,0.5459378,low,0.0,low,0.2852831543911645,low,low +P0007,2025-06-18 00:00:00,0.5494637,low,0.0,low,0.2725409019782419,low,low +P0007,2025-06-18 06:00:00,0.5953736,low,0.005,low,0.116277268647422,low,low +P0007,2025-06-18 12:00:00,0.59799695,low,0.0,low,0.2468850498774565,low,low +P0007,2025-06-18 18:00:00,0.57044137,low,0.0025,low,0.2295254669322599,low,low +P0007,2025-06-19 00:00:00,0.5435102,low,0.0,low,0.1534252827403699,low,low +P0007,2025-06-19 06:00:00,0.5023224,low,0.0,low,0.2518353821054767,low,low +P0007,2025-06-19 12:00:00,0.4592817,low,0.0,low,0.1500002145561083,low,low +P0007,2025-06-19 18:00:00,0.51164764,low,0.0,low,0.1739147750754925,low,low +P0007,2025-06-20 00:00:00,0.5647912,low,0.0,low,0.359120147621892,medium,low +P0007,2025-06-20 06:00:00,0.58442354,low,0.0,low,0.2796446383468999,low,low +P0007,2025-06-20 12:00:00,0.5309193,low,0.0,low,0.1922049217674752,low,low +P0007,2025-06-20 18:00:00,0.50457567,low,0.0,low,0.1515666316069582,low,low +P0007,2025-06-21 00:00:00,0.49561065,low,0.005,low,0.1017902791697768,low,low +P0007,2025-06-21 06:00:00,0.49337515,low,0.0,low,0.216309233796211,low,low +P0007,2025-06-21 12:00:00,0.55644387,low,0.0025,low,0.1262958076482738,low,low +P0007,2025-06-21 18:00:00,0.5231356,low,0.0,low,0.2006296207048353,low,low +P0007,2025-06-22 00:00:00,0.8149956,low,0.01,low,0.0772235287026681,low,low +P0007,2025-06-22 06:00:00,0.91493905,low,0.025,low,0.2488170574382223,low,low +P0007,2025-06-22 12:00:00,0.9170321,low,0.0125,low,0.2305592771782381,low,low +P0007,2025-06-22 18:00:00,0.8428404,low,0.0775,low,0.0917802674436258,low,low +P0007,2025-06-23 12:00:00,0.9089347,low,0.275,low,0.1879798541769757,low,low +P0007,2025-06-23 18:00:00,0.899265,low,0.1425,low,0.3572125057499324,medium,low +P0007,2025-06-24 00:00:00,0.9085632,low,0.085,low,0.1282068663916769,low,low +P0007,2025-06-24 06:00:00,0.8902024,low,0.04,low,0.0978747153003432,low,low +P0007,2025-06-24 18:00:00,0.87324715,low,0.04,low,0.1112127098359185,low,low +P0007,2025-06-25 00:00:00,0.4558718,low,0.0,low,0.1881958775672601,low,low +P0007,2025-06-25 06:00:00,0.4710049,low,0.0,low,0.1158188855807846,low,low +P0007,2025-06-25 12:00:00,0.52083516,low,0.0,low,0.1365685356664923,low,low +P0007,2025-06-25 18:00:00,0.42742258,low,0.0,low,0.2585714501859991,low,low +P0007,2025-06-26 00:00:00,0.51724976,low,0.0,low,0.2228255177883548,low,low +P0007,2025-06-26 06:00:00,0.5224483,low,0.0,low,0.4700226752254374,medium,low +P0007,2025-06-26 12:00:00,0.531368,low,0.0,low,0.3442469181819829,medium,low +P0007,2025-06-26 18:00:00,0.5203493,low,0.0,low,0.2923341079339927,low,low +P0007,2025-06-27 00:00:00,0.5209377,low,0.0,low,0.1512992882156546,low,low +P0007,2025-06-27 06:00:00,0.4848087,low,0.0,low,0.1486073385920633,low,low +P0007,2025-06-27 12:00:00,0.47009575,low,0.0,low,0.4671647764227232,medium,low +P0007,2025-06-27 18:00:00,0.45071113,low,0.0,low,0.3038285998537446,medium,low +P0007,2025-06-28 00:00:00,0.43543106,low,0.0125,low,0.3154656000596315,medium,low +P0007,2025-06-28 06:00:00,0.40637702,low,0.0,low,0.2251953375041045,low,low +P0007,2025-06-28 12:00:00,0.48606893,low,0.01,low,0.1240855598881165,low,low +P0007,2025-06-28 18:00:00,0.5695027,low,0.0075,low,0.1117153753438988,low,low +P0007,2025-06-29 00:00:00,0.52062446,low,0.0025,low,0.1291428450257404,low,low +P0007,2025-06-29 06:00:00,0.52932453,low,0.01,low,0.1073160710389951,low,low +P0007,2025-06-29 12:00:00,0.539078,low,0.02,low,0.1087001409166859,low,low +P0007,2025-06-29 18:00:00,0.6161446,low,0.015,low,0.0512230670234567,low,low +P0007,2025-06-30 00:00:00,0.7659637,low,0.01,low,0.1867550471131868,low,low +P0007,2025-06-30 06:00:00,0.832063,low,0.0,low,0.1113309278878575,low,low +P0007,2025-06-30 12:00:00,0.79472685,low,0.0,low,0.1447044258324344,low,low +P0007,2025-06-30 18:00:00,0.8226345,low,0.0,low,0.149410338592512,low,low +P0008,2025-06-03 18:00:00,0.624756,low,0.0,low,0.3349692465168915,medium,low +P0008,2025-06-04 00:00:00,0.62004435,low,0.0,low,0.1683184243899748,low,low +P0008,2025-06-04 06:00:00,0.5998286,low,0.0,low,0.2308835086480541,low,low +P0008,2025-06-04 12:00:00,0.6728165,low,0.0,low,0.1251114630854312,low,low +P0008,2025-06-04 18:00:00,0.6005105,low,0.0,low,0.2181683642998036,low,low +P0008,2025-06-05 00:00:00,0.5669219,low,0.005,low,0.2516176193354755,low,low +P0008,2025-06-05 06:00:00,0.55089223,low,0.0,low,0.1763941802779608,low,low +P0008,2025-06-05 12:00:00,0.50913584,low,0.0,low,0.2207758993012418,low,low +P0008,2025-06-05 18:00:00,0.49760458,low,0.0,low,0.2052924565995958,low,low +P0008,2025-06-06 00:00:00,0.4933174,low,0.0,low,0.2346106526727244,low,low +P0008,2025-06-06 06:00:00,0.43387628,low,0.0,low,0.1328403076174283,low,low +P0008,2025-06-06 12:00:00,0.4331836,low,0.0,low,0.2582454392161247,low,low +P0008,2025-06-06 18:00:00,0.37762427,low,0.0,low,0.3103785988656841,medium,low +P0008,2025-06-07 00:00:00,0.38386753,low,0.0,low,0.1684533027190768,low,low +P0008,2025-06-07 06:00:00,0.42879027,low,0.0025,low,0.2857971022739747,low,low +P0008,2025-06-07 12:00:00,0.39510477,low,0.0,low,0.1891008385492416,low,low +P0008,2025-06-07 18:00:00,0.38940233,low,0.0,low,0.156429287058303,low,low +P0008,2025-06-08 00:00:00,0.37564477,low,0.0,low,0.2958946718740426,low,low +P0008,2025-06-08 06:00:00,0.34862524,low,0.0,low,0.2102783022325585,low,low +P0008,2025-06-08 12:00:00,0.38501936,low,0.0,low,0.1338154500844953,low,low +P0008,2025-06-08 18:00:00,0.36082542,low,0.0,low,0.262521118640568,low,low +P0008,2025-06-09 00:00:00,0.42329276,low,0.0,low,0.1602565383435031,low,low +P0008,2025-06-09 06:00:00,0.45562124,low,0.0,low,0.3720183179680298,medium,low +P0008,2025-06-09 12:00:00,0.563133,low,0.025,low,0.101026896578358,low,low +P0008,2025-06-09 18:00:00,0.48193455,low,0.1025,low,0.2781297673536868,low,low +P0008,2025-06-10 00:00:00,0.5369428,low,0.065,low,0.2773426997175273,low,low +P0008,2025-06-10 06:00:00,0.47920513,low,0.0025,low,0.3360954873972702,medium,low +P0008,2025-06-10 12:00:00,0.45434508,low,0.0,low,0.1643283282904736,low,low +P0008,2025-06-10 18:00:00,0.39445254,low,0.0,low,0.1148616464561856,low,low +P0008,2025-06-11 00:00:00,0.3673593,low,0.0075,low,0.1012183770552613,low,low +P0008,2025-06-11 06:00:00,0.3491555,low,0.0025,low,0.2839760624660409,low,low +P0008,2025-06-11 12:00:00,0.34641692,low,0.0025,low,0.216259430236317,low,low +P0008,2025-06-11 18:00:00,0.39500698,low,0.005,low,0.1856295481973867,low,low +P0008,2025-06-12 00:00:00,0.4039469,low,0.0,low,0.1395111505000266,low,low +P0008,2025-06-12 06:00:00,0.4126121,low,0.0025,low,0.0875097317965356,low,low +P0008,2025-06-12 12:00:00,0.40463448,low,0.0,low,0.2001061002080518,low,low +P0008,2025-06-12 18:00:00,0.47377852,low,0.0,low,0.2238841245774274,low,low +P0008,2025-06-13 00:00:00,0.36851555,low,0.0,low,0.328151328871898,medium,low +P0008,2025-06-13 06:00:00,0.38205072,low,0.0,low,0.1470394554864008,low,low +P0008,2025-06-13 12:00:00,0.4632651,low,0.0,low,0.2011066329048821,low,low +P0008,2025-06-13 18:00:00,0.5757445,low,0.0,low,0.1045281108867012,low,low +P0008,2025-06-14 00:00:00,0.5580557,low,0.0,low,0.2019434663003009,low,low +P0008,2025-06-14 06:00:00,0.56382006,low,0.0,low,0.1491165191815309,low,low +P0008,2025-06-14 12:00:00,0.52659476,low,0.0025,low,0.1313277160771203,low,low +P0008,2025-06-14 18:00:00,0.4785045,low,0.0,low,0.3729585181872173,medium,low +P0008,2025-06-15 00:00:00,0.5062632,low,0.0,low,0.2861876935055684,low,low +P0008,2025-06-15 06:00:00,0.4572775,low,0.0,low,0.3067385267001966,medium,low +P0008,2025-06-15 12:00:00,0.45501772,low,0.0,low,0.1344472886701007,low,low +P0008,2025-06-15 18:00:00,0.45795572,low,0.0,low,0.1600310493597005,low,low +P0008,2025-06-16 00:00:00,0.56164384,low,0.0,low,0.2979368218657511,low,low +P0008,2025-06-16 06:00:00,0.52425545,low,0.0,low,0.2954357366747613,low,low +P0008,2025-06-16 12:00:00,0.46691227,low,0.0,low,0.2376300739545486,low,low +P0008,2025-06-16 18:00:00,0.7949437,low,0.01,low,0.1728616999822037,low,low +P0008,2025-06-17 00:00:00,0.7783508,low,0.0025,low,0.1703865546029985,low,low +P0008,2025-06-17 06:00:00,0.7125649,low,0.0025,low,0.3886381997855122,medium,low +P0008,2025-06-17 12:00:00,0.6959497,low,0.005,low,0.1877215129632507,low,low +P0008,2025-06-17 18:00:00,0.7479851,low,0.0025,low,0.1594532442645403,low,low +P0008,2025-06-18 00:00:00,0.74560195,low,0.0,low,0.0762275370273675,low,low +P0008,2025-06-18 06:00:00,0.7013066,low,0.0,low,0.1974804296008414,low,low +P0008,2025-06-18 12:00:00,0.741823,low,0.005,low,0.2912981187222899,low,low +P0008,2025-06-19 00:00:00,0.5939982,low,0.01,low,0.1528540119766645,low,low +P0008,2025-06-19 06:00:00,0.67238766,low,0.0,low,0.1878502949464381,low,low +P0008,2025-06-19 12:00:00,0.7459488,low,0.02,low,0.179250836518353,low,low +P0008,2025-06-19 18:00:00,0.55283713,low,0.0,low,0.1241951370750484,low,low +P0008,2025-06-20 00:00:00,0.58743155,low,0.0,low,0.1415519129606859,low,low +P0008,2025-06-20 06:00:00,0.56298983,low,0.0,low,0.1540522626478029,low,low +P0008,2025-06-20 12:00:00,0.5851312,low,0.0025,low,0.1303691932544177,low,low +P0008,2025-06-20 18:00:00,0.7689503,low,0.0325,low,0.1363555022368487,low,low +P0008,2025-06-21 00:00:00,0.6977379,low,0.0475,low,0.1082452592861276,low,low +P0008,2025-06-21 06:00:00,0.71526253,low,0.0875,low,0.1575371942964236,low,low +P0008,2025-06-21 12:00:00,0.7492717,low,0.055,low,0.1364913994737957,low,low +P0008,2025-06-21 18:00:00,0.5451911,low,0.0075,low,0.2356850637167279,low,low +P0008,2025-06-22 00:00:00,0.53770983,low,0.0075,low,0.1297508210995138,low,low +P0008,2025-06-22 06:00:00,0.49088,low,0.0025,low,0.1779190701863259,low,low +P0008,2025-06-22 12:00:00,0.47078398,low,0.0025,low,0.2145347708043429,low,low +P0008,2025-06-22 18:00:00,0.46815294,low,0.0075,low,0.2296533747758961,low,low +P0008,2025-06-23 00:00:00,0.4357055,low,0.0,low,0.1738963401490149,low,low +P0008,2025-06-23 06:00:00,0.47127452,low,0.005,low,0.0858156593896286,low,low +P0008,2025-06-23 12:00:00,0.5153978,low,0.0025,low,0.131328345745872,low,low +P0008,2025-06-23 18:00:00,0.52046627,low,0.01,low,0.0664896954217393,low,low +P0008,2025-06-24 00:00:00,0.49166214,low,0.0,low,0.1898163474291526,low,low +P0008,2025-06-24 06:00:00,0.5244021,low,0.0,low,0.1743120950494479,low,low +P0008,2025-06-24 12:00:00,0.51406354,low,0.0,low,0.2342384944182904,low,low +P0008,2025-06-24 18:00:00,0.5122302,low,0.0,low,0.2687015712493497,low,low +P0008,2025-06-25 00:00:00,0.4982139,low,0.0,low,0.3690749016613744,medium,low +P0008,2025-06-25 06:00:00,0.5359847,low,0.0,low,0.2340726277391228,low,low +P0008,2025-06-25 12:00:00,0.4671866,low,0.0,low,0.1311673540156814,low,low +P0008,2025-06-25 18:00:00,0.4537874,low,0.0,low,0.1848232781352227,low,low +P0008,2025-06-26 00:00:00,0.50859666,low,0.0,low,0.2744522766371085,low,low +P0008,2025-06-26 06:00:00,0.51306534,low,0.0,low,0.1496104775089993,low,low +P0008,2025-06-26 12:00:00,0.5040974,low,0.0,low,0.1472903276180356,low,low +P0008,2025-06-26 18:00:00,0.55664796,low,0.005,low,0.2827924808132167,low,low +P0008,2025-06-27 00:00:00,0.5260112,low,0.0,low,0.1533542355618339,low,low +P0008,2025-06-27 06:00:00,0.47117817,low,0.0025,low,0.2357141478122847,low,low +P0008,2025-06-27 12:00:00,0.45918757,low,0.0025,low,0.1676747220779859,low,low +P0008,2025-06-27 18:00:00,0.41638675,low,0.0,low,0.2111161154441281,low,low +P0008,2025-06-28 00:00:00,0.43987814,low,0.025,low,0.2113838981230963,low,low +P0008,2025-06-28 06:00:00,0.48100525,low,0.015,low,0.2547612779493731,low,low +P0008,2025-06-28 12:00:00,0.49754578,low,0.01,low,0.1506606305791157,low,low +P0008,2025-06-28 18:00:00,0.51451904,low,0.0075,low,0.1339762091142364,low,low +P0008,2025-06-29 00:00:00,0.5492486,low,0.02,low,0.2820451171705354,low,low +P0008,2025-06-29 06:00:00,0.51162297,low,0.0075,low,0.2823150461172862,low,low +P0008,2025-06-29 12:00:00,0.70697606,low,0.115,low,0.1364304081134255,low,low +P0008,2025-06-29 18:00:00,0.58689773,low,0.0025,low,0.1203371945539838,low,low +P0008,2025-06-30 00:00:00,0.62184364,low,0.0025,low,0.1939549935761741,low,low +P0008,2025-06-30 06:00:00,0.4955608,low,0.0025,low,0.1030307138916254,low,low +P0008,2025-06-30 12:00:00,0.5519608,low,0.0075,low,0.2625763564888196,low,low +P0008,2025-06-30 18:00:00,0.66326976,low,0.0025,low,0.2585581635412395,low,low +P0009,2025-06-03 18:00:00,0.48113707,low,0.0,low,0.0853390972528564,low,low +P0009,2025-06-04 00:00:00,0.46023306,low,0.0,low,0.1819486024924279,low,low +P0009,2025-06-04 06:00:00,0.48446172,low,0.0,low,0.1305541478658883,low,low +P0009,2025-06-04 12:00:00,0.4450102,low,0.0,low,0.2481955584294211,low,low +P0009,2025-06-04 18:00:00,0.5457461,low,0.0025,low,0.1816899960654699,low,low +P0009,2025-06-05 00:00:00,0.5238939,low,0.0,low,0.288274429343703,low,low +P0009,2025-06-05 06:00:00,0.43030703,low,0.0,low,0.303180596760324,medium,low +P0009,2025-06-05 12:00:00,0.41710556,low,0.0,low,0.138059193413207,low,low +P0009,2025-06-05 18:00:00,0.42546666,low,0.0,low,0.1616619871756384,low,low +P0009,2025-06-06 00:00:00,0.4276642,low,0.0,low,0.2934953090465488,low,low +P0009,2025-06-06 06:00:00,0.4807483,low,0.0,low,0.1932443754707827,low,low +P0009,2025-06-06 12:00:00,0.35824898,low,0.0,low,0.2266105304212798,low,low +P0009,2025-06-06 18:00:00,0.37193367,low,0.0,low,0.2224516091974498,low,low +P0009,2025-06-07 00:00:00,0.5158675,low,0.0,low,0.1463437378437012,low,low +P0009,2025-06-07 06:00:00,0.47116444,low,0.0,low,0.2395997536738451,low,low +P0009,2025-06-07 12:00:00,0.43586683,low,0.0,low,0.2345579923483947,low,low +P0009,2025-06-07 18:00:00,0.4367672,low,0.0,low,0.1968175326783703,low,low +P0009,2025-06-08 00:00:00,0.37909782,low,0.0,low,0.1455051792993646,low,low +P0009,2025-06-08 06:00:00,0.3540934,low,0.0,low,0.2582949399742547,low,low +P0009,2025-06-08 12:00:00,0.36357388,low,0.0025,low,0.1907085618032929,low,low +P0009,2025-06-08 18:00:00,0.36937857,low,0.0025,low,0.18489652172689,low,low +P0009,2025-06-09 00:00:00,0.39815038,low,0.0,low,0.2238455439766807,low,low +P0009,2025-06-09 06:00:00,0.40294832,low,0.03,low,0.1078483682078244,low,low +P0009,2025-06-09 12:00:00,0.5429838,low,0.03,low,0.1511540428639199,low,low +P0009,2025-06-09 18:00:00,0.6283195,low,0.0125,low,0.1571454255574246,low,low +P0009,2025-06-10 00:00:00,0.51942766,low,0.0,low,0.214735575795731,low,low +P0009,2025-06-10 06:00:00,0.49386466,low,0.005,low,0.19278177403713,low,low +P0009,2025-06-10 12:00:00,0.42776686,low,0.0175,low,0.137009020625503,low,low +P0009,2025-06-10 18:00:00,0.46046367,low,0.0075,low,0.2877413898723291,low,low +P0009,2025-06-11 00:00:00,0.42205787,low,0.0025,low,0.1433272641555769,low,low +P0009,2025-06-11 06:00:00,0.45967394,low,0.005,low,0.166732995760208,low,low +P0009,2025-06-11 12:00:00,0.47898048,low,0.005,low,0.2215253437203699,low,low +P0009,2025-06-11 18:00:00,0.42615935,low,0.0125,low,0.1381173670207578,low,low +P0009,2025-06-12 00:00:00,0.44842038,low,0.0175,low,0.1767108545712577,low,low +P0009,2025-06-12 06:00:00,0.504782,low,0.0125,low,0.2676203703738357,low,low +P0009,2025-06-12 12:00:00,0.6528568,low,0.0125,low,0.2446710599911775,low,low +P0009,2025-06-12 18:00:00,0.5863589,low,0.005,low,0.288213997879135,low,low +P0009,2025-06-13 00:00:00,0.6398016,low,0.005,low,0.1218406760724505,low,low +P0009,2025-06-13 06:00:00,0.7426161,low,0.005,low,0.2956887366412424,low,low +P0009,2025-06-13 12:00:00,0.54076505,low,0.0,low,0.2116960106646309,low,low +P0009,2025-06-13 18:00:00,0.4612807,low,0.0,low,0.1912344133651971,low,low +P0009,2025-06-14 00:00:00,0.4908193,low,0.0,low,0.1383087723398927,low,low +P0009,2025-06-14 06:00:00,0.49074724,low,0.0,low,0.2448438288020655,low,low +P0009,2025-06-14 12:00:00,0.47784963,low,0.0,low,0.1943704370986379,low,low +P0009,2025-06-14 18:00:00,0.5788393,low,0.0,low,0.1456271381031449,low,low +P0009,2025-06-15 00:00:00,0.5578773,low,0.0,low,0.1110111953397557,low,low +P0009,2025-06-15 06:00:00,0.6069242,low,0.0,low,0.2239403929530067,low,low +P0009,2025-06-15 12:00:00,0.564712,low,0.0,low,0.1619256346450603,low,low +P0009,2025-06-15 18:00:00,0.52037483,low,0.0,low,0.415473978636902,medium,low +P0009,2025-06-16 00:00:00,0.4579384,low,0.0,low,0.1333737456852043,low,low +P0009,2025-06-16 06:00:00,0.41962716,low,0.0,low,0.1714854116706017,low,low +P0009,2025-06-16 12:00:00,0.44642407,low,0.005,low,0.2609019210397844,low,low +P0009,2025-06-16 18:00:00,0.4343441,low,0.0025,low,0.1882959541372018,low,low +P0009,2025-06-17 00:00:00,0.37402567,low,0.0025,low,0.1779146093652325,low,low +P0009,2025-06-17 06:00:00,0.37526402,low,0.0,low,0.303551652616036,medium,low +P0009,2025-06-17 12:00:00,0.36753684,low,0.0025,low,0.258041132791493,low,low +P0009,2025-06-17 18:00:00,0.39397213,low,0.0325,low,0.1446886237448576,low,low +P0009,2025-06-18 00:00:00,0.46080282,low,0.01,low,0.3016896569551345,medium,low +P0009,2025-06-18 06:00:00,0.47407743,low,0.0125,low,0.0989803093209935,low,low +P0009,2025-06-18 12:00:00,0.53313506,low,0.005,low,0.1393708522807969,low,low +P0009,2025-06-18 18:00:00,0.51864666,low,0.0075,low,0.1194197942147203,low,low +P0009,2025-06-19 00:00:00,0.56248796,low,0.0125,low,0.2868797062021595,low,low +P0009,2025-06-19 06:00:00,0.6788314,low,0.0225,low,0.1307821679154196,low,low +P0009,2025-06-19 12:00:00,0.541376,low,0.0,low,0.1248433823970212,low,low +P0009,2025-06-19 18:00:00,0.56200266,low,0.0,low,0.1698334698283555,low,low +P0009,2025-06-20 00:00:00,0.5060338,low,0.0,low,0.2931148336129348,low,low +P0009,2025-06-20 06:00:00,0.4941933,low,0.0025,low,0.2040241134830879,low,low +P0009,2025-06-20 12:00:00,0.49039125,low,0.0,low,0.1595676643038894,low,low +P0009,2025-06-20 18:00:00,0.5430194,low,0.0,low,0.1455844366422591,low,low +P0009,2025-06-21 00:00:00,0.52299315,low,0.0,low,0.2342270659524166,low,low +P0009,2025-06-21 06:00:00,0.5038281,low,0.0,low,0.1523269411920167,low,low +P0009,2025-06-21 12:00:00,0.48648727,low,0.0025,low,0.1114990763270032,low,low +P0009,2025-06-21 18:00:00,0.6309345,low,0.005,low,0.1493256143240197,low,low +P0009,2025-06-22 00:00:00,0.6331947,low,0.0,low,0.1652500631176058,low,low +P0009,2025-06-22 06:00:00,0.6672801,low,0.0,low,0.2729824467225107,low,low +P0009,2025-06-22 12:00:00,0.7131203,low,0.0,low,0.1176946422666079,low,low +P0009,2025-06-23 18:00:00,0.8341335,low,0.0775,low,0.1969455914509185,low,low +P0009,2025-06-24 00:00:00,0.787321,low,0.02,low,0.2029288302341044,low,low +P0009,2025-06-24 06:00:00,0.8052003,low,0.1125,low,0.1379992070624703,low,low +P0009,2025-06-24 12:00:00,0.8662422,low,0.1,low,0.0777087683225253,low,low +P0009,2025-06-24 18:00:00,0.49990335,low,0.0025,low,0.119305397896162,low,low +P0009,2025-06-25 00:00:00,0.5366065,low,0.0075,low,0.1419936679372196,low,low +P0009,2025-06-25 06:00:00,0.6218479,low,0.025,low,0.2282425397847605,low,low +P0009,2025-06-25 12:00:00,0.5598238,low,0.01,low,0.177784457889335,low,low +P0009,2025-06-25 18:00:00,0.6848628,low,0.0025,low,0.1469896860116793,low,low +P0009,2025-06-26 00:00:00,0.3895665,low,0.0,low,0.2613351415692698,low,low +P0009,2025-06-26 06:00:00,0.3980325,low,0.0,low,0.1633305898424912,low,low +P0009,2025-06-26 12:00:00,0.430209,low,0.0,low,0.2252955311298279,low,low +P0009,2025-06-26 18:00:00,0.37620714,low,0.0,low,0.2422754015926152,low,low +P0009,2025-06-27 00:00:00,0.43996504,low,0.0,low,0.1348675867832516,low,low +P0009,2025-06-27 06:00:00,0.42861167,low,0.0,low,0.245629700098486,low,low +P0009,2025-06-27 12:00:00,0.4410871,low,0.0,low,0.3012069532113237,medium,low +P0009,2025-06-27 18:00:00,0.49914932,low,0.0,low,0.2064391212088283,low,low +P0009,2025-06-28 00:00:00,0.43814704,low,0.0,low,0.0852136679150931,low,low +P0009,2025-06-28 06:00:00,0.3528531,low,0.0,low,0.2226187403968812,low,low +P0009,2025-06-28 12:00:00,0.33594677,low,0.0,low,0.2530362902393546,low,low +P0009,2025-06-28 18:00:00,0.35298246,low,0.0,low,0.1102278960924476,low,low +P0009,2025-06-29 00:00:00,0.4160117,low,0.0,low,0.1700124294831115,low,low +P0009,2025-06-29 06:00:00,0.46773285,low,0.0,low,0.2186432632875918,low,low +P0009,2025-06-29 12:00:00,0.49716896,low,0.0,low,0.1411747939647178,low,low +P0009,2025-06-29 18:00:00,0.6370677,low,0.0,low,0.1936598964622266,low,low +P0009,2025-06-30 00:00:00,0.62684536,low,0.0,low,0.2232021701980449,low,low +P0009,2025-06-30 06:00:00,0.6047545,low,0.0,low,0.1002479382670332,low,low +P0009,2025-06-30 12:00:00,0.6163973,low,0.0,low,0.2350141793120409,low,low +P0009,2025-06-30 18:00:00,0.4280915,low,0.0,low,0.3511803340098065,medium,low +P0010,2025-06-03 18:00:00,0.44385755,low,0.0,low,0.2194765130478937,low,low +P0010,2025-06-04 00:00:00,0.4709085,low,0.0,low,0.2088536548816425,low,low +P0010,2025-06-04 06:00:00,0.44037873,low,0.0,low,0.1779448657344452,low,low +P0010,2025-06-04 12:00:00,0.44190285,low,0.0,low,0.2545836869163143,low,low +P0010,2025-06-04 18:00:00,0.47502947,low,0.0,low,0.1697975735351574,low,low +P0010,2025-06-05 00:00:00,0.4228008,low,0.0025,low,0.2020599310201638,low,low +P0010,2025-06-05 06:00:00,0.5094689,low,0.0,low,0.1805606949804037,low,low +P0010,2025-06-05 12:00:00,0.50074005,low,0.0,low,0.2132785075737101,low,low +P0010,2025-06-05 18:00:00,0.5032718,low,0.0,low,0.2298289823943004,low,low +P0010,2025-06-06 00:00:00,0.47262266,low,0.0,low,0.1877334279689325,low,low +P0010,2025-06-06 06:00:00,0.40876552,low,0.0,low,0.2021551358106077,low,low +P0010,2025-06-06 12:00:00,0.42830023,low,0.0,low,0.1950833733001212,low,low +P0010,2025-06-06 18:00:00,0.40939704,low,0.0,low,0.2440823788520453,low,low +P0010,2025-06-07 00:00:00,0.3940957,low,0.0,low,0.2819248702289311,low,low +P0010,2025-06-07 06:00:00,0.37379295,low,0.0,low,0.2677863373209481,low,low +P0010,2025-06-07 12:00:00,0.39168796,low,0.0,low,0.3117009839929202,medium,low +P0010,2025-06-07 18:00:00,0.340152,low,0.0,low,0.4331736754309739,medium,low +P0010,2025-06-08 00:00:00,0.3364486,low,0.0,low,0.3397780612216861,medium,low +P0010,2025-06-08 06:00:00,0.31239536,low,0.0025,low,0.1262114338215812,low,low +P0010,2025-06-08 12:00:00,0.28974402,low,0.0025,low,0.2936953640811744,low,low +P0010,2025-06-08 18:00:00,0.33405387,low,0.0025,low,0.2693907254850302,low,low +P0010,2025-06-09 00:00:00,0.32848454,low,0.0025,low,0.2371476591312311,low,low +P0010,2025-06-09 06:00:00,0.31470373,low,0.0,low,0.1588908294857807,low,low +P0010,2025-06-09 12:00:00,0.38887903,low,0.0,low,0.2856333691209546,low,low +P0010,2025-06-09 18:00:00,0.35767165,low,0.0,low,0.3826642176476613,medium,low +P0010,2025-06-10 00:00:00,0.39960724,low,0.0,low,0.3481412009050023,medium,low +P0010,2025-06-10 06:00:00,0.45082653,low,0.0,low,0.2668378838712811,low,low +P0010,2025-06-10 12:00:00,0.4787176,low,0.0,low,0.1847090349382751,low,low +P0010,2025-06-10 18:00:00,0.4849665,low,0.0,low,0.1425530733975153,low,low +P0010,2025-06-11 00:00:00,0.45591906,low,0.0,low,0.2643702871452242,low,low +P0010,2025-06-11 06:00:00,0.46138075,low,0.0,low,0.2004428598271206,low,low +P0010,2025-06-11 12:00:00,0.45007998,low,0.0,low,0.1657351547876032,low,low +P0010,2025-06-11 18:00:00,0.4293779,low,0.0025,low,0.2172254580367756,low,low +P0010,2025-06-12 00:00:00,0.4875237,low,0.0,low,0.3055021861541084,medium,low +P0010,2025-06-12 06:00:00,0.51051646,low,0.0,low,0.2370865939563682,low,low +P0010,2025-06-12 12:00:00,0.50994,low,0.0,low,0.1762617975579296,low,low +P0010,2025-06-12 18:00:00,0.5329717,low,0.0,low,0.2110704522780677,low,low +P0010,2025-06-13 00:00:00,0.5124164,low,0.0,low,0.2283723052001645,low,low +P0010,2025-06-13 06:00:00,0.6166073,low,0.0,low,0.2539033741670711,low,low +P0010,2025-06-13 12:00:00,0.48080635,low,0.0,low,0.2102662522648104,low,low +P0010,2025-06-13 18:00:00,0.46714538,low,0.0,low,0.1099084030416339,low,low +P0010,2025-06-14 00:00:00,0.47499678,low,0.0,low,0.1928178712954521,low,low +P0010,2025-06-14 06:00:00,0.50619835,low,0.005,low,0.1728375892555458,low,low +P0010,2025-06-14 12:00:00,0.55082536,low,0.0075,low,0.0972216773747279,low,low +P0010,2025-06-14 18:00:00,0.50200844,low,0.0075,low,0.138317350935241,low,low +P0010,2025-06-15 00:00:00,0.4484733,low,0.0025,low,0.1745808234543265,low,low +P0010,2025-06-15 06:00:00,0.52228665,low,0.01,low,0.2304929498440886,low,low +P0010,2025-06-15 12:00:00,0.47655806,low,0.17,low,0.1724681219376284,low,low +P0010,2025-06-15 18:00:00,0.6241189,low,0.075,low,0.1645099912908597,low,low +P0010,2025-06-16 00:00:00,0.7784993,low,0.085,low,0.1507845645608332,low,low +P0010,2025-06-16 06:00:00,0.7200617,low,0.04,low,0.2566194384959734,low,low +P0010,2025-06-16 12:00:00,0.5965837,low,0.015,low,0.232281036050826,low,low +P0010,2025-06-16 18:00:00,0.64929694,low,0.035,low,0.1676300847753136,low,low +P0010,2025-06-17 00:00:00,0.6283585,low,0.03,low,0.1157654839112623,low,low +P0010,2025-06-17 06:00:00,0.67667514,low,0.0025,low,0.2274813525496621,low,low +P0010,2025-06-17 12:00:00,0.6573173,low,0.0025,low,0.1077431939528546,low,low +P0010,2025-06-17 18:00:00,0.655689,low,0.0,low,0.1602826893799294,low,low +P0010,2025-06-18 00:00:00,0.6593384,low,0.0025,low,0.1432552899626597,low,low +P0010,2025-06-18 06:00:00,0.58008265,low,0.0,low,0.1621498741600472,low,low +P0010,2025-06-18 12:00:00,0.47489485,low,0.0,low,0.1886042769538631,low,low +P0010,2025-06-18 18:00:00,0.5287257,low,0.0,low,0.1494988996128884,low,low +P0010,2025-06-19 00:00:00,0.63644344,low,0.005,low,0.2545751653032083,low,low +P0010,2025-06-19 06:00:00,0.56246936,low,0.0025,low,0.4115894701623931,medium,low +P0010,2025-06-19 12:00:00,0.5422014,low,0.0,low,0.2281287439673046,low,low +P0010,2025-06-19 18:00:00,0.5125065,low,0.0,low,0.2050302692450619,low,low +P0010,2025-06-20 00:00:00,0.51014966,low,0.0,low,0.1652852587134564,low,low +P0010,2025-06-20 06:00:00,0.46613926,low,0.0,low,0.3334951717866152,medium,low +P0010,2025-06-20 12:00:00,0.6873987,low,0.02,low,0.1321171864641945,low,low +P0010,2025-06-20 18:00:00,0.6581526,low,0.005,low,0.1799095788566093,low,low +P0010,2025-06-21 00:00:00,0.8133123,low,0.0225,low,0.1685013756545025,low,low +P0010,2025-06-21 06:00:00,0.80904764,low,0.045,low,0.3005763651186319,medium,low +P0010,2025-06-21 12:00:00,0.66382533,low,0.045,low,0.2489424751529713,low,low +P0010,2025-06-21 18:00:00,0.67046374,low,0.03,low,0.1148750221212901,low,low +P0010,2025-06-22 00:00:00,0.6428128,low,0.0025,low,0.163804998191758,low,low +P0010,2025-06-22 06:00:00,0.7352437,low,0.0025,low,0.2210222704731817,low,low +P0010,2025-06-22 12:00:00,0.62957996,low,0.0025,low,0.1311747587200825,low,low +P0010,2025-06-22 18:00:00,0.71420485,low,0.0,low,0.2744365997209145,low,low +P0010,2025-06-23 00:00:00,0.59213376,low,0.0,low,0.2970582359581359,low,low +P0010,2025-06-23 06:00:00,0.58627856,low,0.0075,low,0.1240268432748832,low,low +P0010,2025-06-23 12:00:00,0.539407,low,0.0,low,0.2492461703142351,low,low +P0010,2025-06-23 18:00:00,0.5577695,low,0.0,low,0.15208713264741,low,low +P0010,2025-06-24 00:00:00,0.55682397,low,0.0,low,0.284223105398428,low,low +P0010,2025-06-24 06:00:00,0.49813715,low,0.0,low,0.1726701405593935,low,low +P0010,2025-06-24 12:00:00,0.5068625,low,0.0,low,0.2070330983148099,low,low +P0010,2025-06-24 18:00:00,0.5493256,low,0.0,low,0.3164292666994014,medium,low +P0010,2025-06-25 00:00:00,0.56041867,low,0.005,low,0.1593707450792187,low,low +P0010,2025-06-25 06:00:00,0.5386527,low,0.0,low,0.3253643005574238,medium,low +P0010,2025-06-25 12:00:00,0.57453376,low,0.0,low,0.2355831809874544,low,low +P0010,2025-06-25 18:00:00,0.5311329,low,0.0,low,0.2498810438367809,low,low +P0010,2025-06-26 00:00:00,0.6086536,low,0.0,low,0.2510426426746835,low,low +P0010,2025-06-26 06:00:00,0.57104427,low,0.0,low,0.2064184133144834,low,low +P0010,2025-06-26 12:00:00,0.8173549,low,0.0125,low,0.2681565665004352,low,low +P0010,2025-06-26 18:00:00,0.74604774,low,0.005,low,0.1724496755799174,low,low +P0010,2025-06-27 00:00:00,0.70344925,low,0.0025,low,0.2054466956170375,low,low +P0010,2025-06-27 06:00:00,0.7074654,low,0.0025,low,0.1534825567035978,low,low +P0010,2025-06-27 12:00:00,0.7505507,low,0.0575,low,0.1072030311024711,low,low +P0010,2025-06-27 18:00:00,0.7571596,low,0.045,low,0.2543570000274255,low,low +P0010,2025-06-28 00:00:00,0.6779675,low,0.0325,low,0.2337535409672099,low,low +P0010,2025-06-28 06:00:00,0.6704585,low,0.0425,low,0.2437635581602657,low,low +P0010,2025-06-28 12:00:00,0.6460136,low,0.025,low,0.2541669554963509,low,low +P0010,2025-06-28 18:00:00,0.7292892,low,0.015,low,0.1226970292240415,low,low +P0010,2025-06-29 00:00:00,0.5125445,low,0.015,low,0.2431435615138206,low,low +P0010,2025-06-29 06:00:00,0.6619748,low,0.05,low,0.084050336245722,low,low +P0010,2025-06-29 12:00:00,0.74598056,low,0.02,low,0.2574898322046761,low,low +P0010,2025-06-29 18:00:00,0.739423,low,0.0075,low,0.2628061300414863,low,low +P0010,2025-06-30 00:00:00,0.753581,low,0.04,low,0.2882719449795403,low,low +P0010,2025-06-30 06:00:00,0.734086,low,0.0775,low,0.0913110578389177,low,low +P0010,2025-06-30 12:00:00,0.55568224,low,0.0,low,0.0891736311969838,low,low +P0010,2025-06-30 18:00:00,0.53342164,low,0.0,low,0.2327066381762302,low,low +P0011,2025-06-03 18:00:00,0.47444126,low,0.0,low,0.1154902401124541,low,low +P0011,2025-06-04 00:00:00,0.46322548,low,0.0,low,0.123911601478964,low,low +P0011,2025-06-04 06:00:00,0.5036122,low,0.0,low,0.1846329429785697,low,low +P0011,2025-06-04 12:00:00,0.4783227,low,0.0,low,0.3308477483815127,medium,low +P0011,2025-06-04 18:00:00,0.48474184,low,0.0,low,0.2117882069747263,low,low +P0011,2025-06-05 00:00:00,0.47833475,low,0.0,low,0.4149709171153307,medium,low +P0011,2025-06-05 06:00:00,0.44325113,low,0.0,low,0.2692233823271924,low,low +P0011,2025-06-05 12:00:00,0.44632143,low,0.0,low,0.1921059310222468,low,low +P0011,2025-06-05 18:00:00,0.4725948,low,0.0,low,0.2626672462261292,low,low +P0011,2025-06-06 00:00:00,0.49483532,low,0.0,low,0.152831767384537,low,low +P0011,2025-06-06 06:00:00,0.47827488,low,0.0,low,0.2920684415716389,low,low +P0011,2025-06-06 12:00:00,0.5050409,low,0.0,low,0.3126502860610545,medium,low +P0011,2025-06-06 18:00:00,0.5180733,low,0.0,low,0.2275869568957771,low,low +P0011,2025-06-07 00:00:00,0.5782288,low,0.0,low,0.2008184782420747,low,low +P0011,2025-06-07 06:00:00,0.5600626,low,0.0025,low,0.157191268412157,low,low +P0011,2025-06-07 12:00:00,0.5785641,low,0.0,low,0.2614855783959974,low,low +P0011,2025-06-07 18:00:00,0.5274407,low,0.0,low,0.2012362710893527,low,low +P0011,2025-06-08 00:00:00,0.4989295,low,0.0,low,0.2015424491526964,low,low +P0011,2025-06-08 06:00:00,0.5070106,low,0.0,low,0.1066922842668358,low,low +P0011,2025-06-08 12:00:00,0.4949327,low,0.0025,low,0.077773429572156,low,low +P0011,2025-06-08 18:00:00,0.48823944,low,0.0,low,0.3648985145979698,medium,low +P0011,2025-06-09 00:00:00,0.49666277,low,0.0,low,0.2259792241061174,low,low +P0011,2025-06-09 06:00:00,0.6068294,low,0.0,low,0.1113895145162107,low,low +P0011,2025-06-09 12:00:00,0.590063,low,0.0,low,0.2070863638373228,low,low +P0011,2025-06-09 18:00:00,0.6036023,low,0.0,low,0.1651712646404642,low,low +P0011,2025-06-10 00:00:00,0.514399,low,0.0,low,0.3865924137129553,medium,low +P0011,2025-06-10 06:00:00,0.5358071,low,0.0,low,0.3205717698330181,medium,low +P0011,2025-06-10 12:00:00,0.5465176,low,0.0,low,0.2437866101518764,low,low +P0011,2025-06-10 18:00:00,0.6152457,low,0.0,low,0.1722706190696544,low,low +P0011,2025-06-11 00:00:00,0.59011286,low,0.0,low,0.1057503936210072,low,low +P0011,2025-06-11 06:00:00,0.63254887,low,0.0,low,0.3413102402939708,medium,low +P0011,2025-06-11 12:00:00,0.63412356,low,0.0,low,0.1361554136949454,low,low +P0011,2025-06-11 18:00:00,0.6391318,low,0.0,low,0.1533513970516438,low,low +P0011,2025-06-12 00:00:00,0.6447806,low,0.0,low,0.2530533309139218,low,low +P0011,2025-06-12 06:00:00,0.5982057,low,0.0,low,0.1467270436071616,low,low +P0011,2025-06-12 12:00:00,0.6142552,low,0.0,low,0.109101201785799,low,low +P0011,2025-06-12 18:00:00,0.62282616,low,0.0,low,0.1303917271031289,low,low +P0011,2025-06-13 00:00:00,0.5267831,low,0.0025,low,0.2878010505669285,low,low +P0011,2025-06-13 06:00:00,0.43358392,low,0.005,low,0.1002309964450857,low,low +P0011,2025-06-13 12:00:00,0.46205723,low,0.0,low,0.2833082673029817,low,low +P0011,2025-06-13 18:00:00,0.3712926,low,0.0025,low,0.2065630452192112,low,low +P0011,2025-06-14 00:00:00,0.6374709,low,0.04,low,0.125256199917727,low,low +P0011,2025-06-14 06:00:00,0.61657447,low,0.015,low,0.1205633347734889,low,low +P0011,2025-06-14 12:00:00,0.66276604,low,0.05,low,0.1508002451787895,low,low +P0011,2025-06-14 18:00:00,0.6567595,low,0.0225,low,0.2325870202093667,low,low +P0011,2025-06-15 00:00:00,0.94339776,low,0.2075,low,0.1029355988188713,low,low +P0011,2025-06-15 06:00:00,0.6516011,low,0.005,low,0.1304209790785767,low,low +P0011,2025-06-15 12:00:00,0.65512156,low,0.01,low,0.2069519200351288,low,low +P0011,2025-06-15 18:00:00,0.5572751,low,0.0,low,0.1290104616263207,low,low +P0011,2025-06-16 00:00:00,0.5265984,low,0.0025,low,0.1788707566268905,low,low +P0011,2025-06-16 06:00:00,0.43121532,low,0.01,low,0.10598770017462,low,low +P0011,2025-06-16 12:00:00,0.51011074,low,0.0,low,0.253624501666748,low,low +P0011,2025-06-16 18:00:00,0.5323479,low,0.0,low,0.145343473641132,low,low +P0011,2025-06-17 00:00:00,0.4057919,low,0.0,low,0.1969262651434326,low,low +P0011,2025-06-17 06:00:00,0.37821782,low,0.0,low,0.1735002846629322,low,low +P0011,2025-06-17 12:00:00,0.39349017,low,0.0,low,0.1600657577419126,low,low +P0011,2025-06-17 18:00:00,0.43710065,low,0.0,low,0.218727138372366,low,low +P0011,2025-06-18 00:00:00,0.39740956,low,0.0,low,0.3100082618680593,medium,low +P0011,2025-06-18 06:00:00,0.4707348,low,0.0,low,0.2764704723288442,low,low +P0011,2025-06-18 12:00:00,0.52937967,low,0.0,low,0.247269331927887,low,low +P0011,2025-06-18 18:00:00,0.5070641,low,0.0,low,0.2938583501081083,low,low +P0011,2025-06-19 00:00:00,0.4786257,low,0.0,low,0.3051719575991237,medium,low +P0011,2025-06-19 06:00:00,0.41525376,low,0.0,low,0.1707590422964018,low,low +P0011,2025-06-19 12:00:00,0.4896173,low,0.0,low,0.1646362636815682,low,low +P0011,2025-06-19 18:00:00,0.5007732,low,0.0,low,0.1353729257422257,low,low +P0011,2025-06-20 00:00:00,0.5835137,low,0.0025,low,0.3263988928136819,medium,low +P0011,2025-06-20 06:00:00,0.5954807,low,0.005,low,0.1707106519149281,low,low +P0011,2025-06-20 12:00:00,0.5676348,low,0.025,low,0.1612354130419803,low,low +P0011,2025-06-20 18:00:00,0.7173536,low,0.015,low,0.1380831725605858,low,low +P0011,2025-06-21 00:00:00,0.74986714,low,0.0225,low,0.0353739908555573,low,low +P0011,2025-06-21 06:00:00,0.43267015,low,0.0,low,0.2044756523535089,low,low +P0011,2025-06-21 12:00:00,0.45571825,low,0.0,low,0.1190556732140789,low,low +P0011,2025-06-21 18:00:00,0.5119477,low,0.0,low,0.1414729958730171,low,low +P0011,2025-06-22 00:00:00,0.60364175,low,0.0,low,0.1815268321122169,low,low +P0011,2025-06-22 06:00:00,0.4798137,low,0.0575,low,0.224751519818492,low,low +P0011,2025-06-22 12:00:00,0.5706227,low,0.0,low,0.1054824495685098,low,low +P0011,2025-06-22 18:00:00,0.54492736,low,0.005,low,0.1340528725795099,low,low +P0011,2025-06-23 00:00:00,0.50240254,low,0.01,low,0.3966718905046905,medium,low +P0011,2025-06-23 06:00:00,0.39229318,low,0.015,low,0.1755417944588469,low,low +P0011,2025-06-23 12:00:00,0.36194745,low,0.0075,low,0.1657831691275125,low,low +P0011,2025-06-23 18:00:00,0.33819968,low,0.01,low,0.2178251492273316,low,low +P0011,2025-06-24 00:00:00,0.34776184,low,0.0075,low,0.2312696503548409,low,low +P0011,2025-06-24 06:00:00,0.3468126,low,0.005,low,0.1216287750746862,low,low +P0011,2025-06-24 12:00:00,0.42538264,low,0.0325,low,0.1437863826903571,low,low +P0011,2025-06-24 18:00:00,0.6193704,low,0.01,low,0.2286254544727989,low,low +P0011,2025-06-25 06:00:00,0.80743206,low,0.0075,low,0.3261642768714309,medium,low +P0011,2025-06-25 12:00:00,0.788594,low,0.005,low,0.2188030069509028,low,low +P0011,2025-06-25 18:00:00,0.47877753,low,0.0,low,0.1344520565651801,low,low +P0011,2025-06-26 00:00:00,0.5021892,low,0.0,low,0.15927486348539,low,low +P0011,2025-06-26 06:00:00,0.5663534,low,0.0,low,0.1733926216192979,low,low +P0011,2025-06-26 12:00:00,0.536626,low,0.0,low,0.2387494713896369,low,low +P0011,2025-06-26 18:00:00,0.528956,low,0.0,low,0.282587256687242,low,low +P0011,2025-06-27 00:00:00,0.5215094,low,0.0,low,0.1340513507621875,low,low +P0011,2025-06-27 06:00:00,0.53366894,low,0.0,low,0.2684255691526032,low,low +P0011,2025-06-27 12:00:00,0.5686659,low,0.0,low,0.2466058951929874,low,low +P0011,2025-06-27 18:00:00,0.5636354,low,0.0,low,0.2171343968960382,low,low +P0011,2025-06-28 00:00:00,0.5940175,low,0.005,low,0.1885048269455164,low,low +P0011,2025-06-28 06:00:00,0.5797471,low,0.0,low,0.1948310919423471,low,low +P0011,2025-06-28 12:00:00,0.5608504,low,0.0,low,0.1308686821336369,low,low +P0011,2025-06-28 18:00:00,0.5102065,low,0.0,low,0.2392574002457294,low,low +P0011,2025-06-29 00:00:00,0.4883805,low,0.0,low,0.129803559792857,low,low +P0011,2025-06-29 06:00:00,0.50422853,low,0.0,low,0.3938106658358573,medium,low +P0011,2025-06-29 12:00:00,0.4787986,low,0.0,low,0.3057467084000162,medium,low +P0011,2025-06-29 18:00:00,0.5533661,low,0.0,low,0.1722256608256269,low,low +P0011,2025-06-30 00:00:00,0.5370567,low,0.0,low,0.3070905074896156,medium,low +P0011,2025-06-30 06:00:00,0.46780428,low,0.0,low,0.1440639018365991,low,low +P0011,2025-06-30 12:00:00,0.53291905,low,0.0,low,0.2349222407815549,low,low +P0011,2025-06-30 18:00:00,0.5461877,low,0.005,low,0.127288509368835,low,low +P0012,2025-06-03 18:00:00,0.40443528,low,0.0,low,0.1145236230152642,low,low +P0012,2025-06-04 00:00:00,0.35562712,low,0.0,low,0.2544973448364772,low,low +P0012,2025-06-04 06:00:00,0.3857529,low,0.0,low,0.2783252215306785,low,low +P0012,2025-06-04 12:00:00,0.37457138,low,0.0,low,0.209587741020583,low,low +P0012,2025-06-04 18:00:00,0.34209186,low,0.0,low,0.1605281017526217,low,low +P0012,2025-06-05 00:00:00,0.3636109,low,0.0,low,0.1095531219336644,low,low +P0012,2025-06-05 06:00:00,0.48473936,low,0.0,low,0.2388250358986476,low,low +P0012,2025-06-05 12:00:00,0.39688402,low,0.0275,low,0.2856178884329147,low,low +P0012,2025-06-05 18:00:00,0.5442756,low,0.0025,low,0.173204984741912,low,low +P0012,2025-06-06 00:00:00,0.48325533,low,0.0025,low,0.2604261052284394,low,low +P0012,2025-06-06 06:00:00,0.49238873,low,0.0,low,0.2269090797626169,low,low +P0012,2025-06-06 12:00:00,0.5833743,low,0.0025,low,0.1805392008032834,low,low +P0012,2025-06-06 18:00:00,0.5856123,low,0.055,low,0.2493035356939232,low,low +P0012,2025-06-07 00:00:00,0.4728011,low,0.0175,low,0.1740964853028265,low,low +P0012,2025-06-07 06:00:00,0.53070295,low,0.005,low,0.1653208798439257,low,low +P0012,2025-06-07 12:00:00,0.6454085,low,0.1725,low,0.2207718162144607,low,low +P0012,2025-06-07 18:00:00,0.73203385,low,0.2075,low,0.1605854176230582,low,low +P0012,2025-06-08 00:00:00,0.85909474,low,0.0775,low,0.2453991387806691,low,low +P0012,2025-06-08 06:00:00,1.1049527,medium,0.095,low,0.0936102206211099,low,low +P0012,2025-06-08 12:00:00,0.8728135,low,0.0,low,0.3261453621470974,medium,low +P0012,2025-06-08 18:00:00,0.80371773,low,0.0,low,0.118553101682891,low,low +P0012,2025-06-09 00:00:00,0.6436371,low,0.06,low,0.0897540107612258,low,low +P0012,2025-06-09 06:00:00,0.7285012,low,0.035,low,0.1403103871484772,low,low +P0012,2025-06-10 12:00:00,0.7266494,low,0.0025,low,0.2688694905360925,low,low +P0012,2025-06-10 18:00:00,0.7346035,low,0.0125,low,0.2963123860243196,low,low +P0012,2025-06-11 00:00:00,0.73308384,low,0.005,low,0.1043892549722308,low,low +P0012,2025-06-11 06:00:00,0.7047182,low,0.005,low,0.1943695085279287,low,low +P0012,2025-06-11 12:00:00,0.7059821,low,0.015,low,0.3363415225790596,medium,low +P0012,2025-06-11 18:00:00,0.76866376,low,0.01,low,0.1890783516722864,low,low +P0012,2025-06-12 00:00:00,0.44219467,low,0.0,low,0.1320327418366843,low,low +P0012,2025-06-12 06:00:00,0.48347706,low,0.0,low,0.076995274413384,low,low +P0012,2025-06-12 12:00:00,0.42958704,low,0.0,low,0.3084815184779443,medium,low +P0012,2025-06-12 18:00:00,0.55220443,low,0.0,low,0.1500626323890862,low,low +P0012,2025-06-13 00:00:00,0.5782621,low,0.0,low,0.1823591656541798,low,low +P0012,2025-06-13 06:00:00,0.53994495,low,0.0,low,0.2434019673183655,low,low +P0012,2025-06-13 12:00:00,0.5064685,low,0.0,low,0.1549963222485824,low,low +P0012,2025-06-13 18:00:00,0.4794909,low,0.0,low,0.0946454014440916,low,low +P0012,2025-06-14 00:00:00,0.4630499,low,0.0,low,0.18635565794707,low,low +P0012,2025-06-14 06:00:00,0.46192753,low,0.0,low,0.1417859119300165,low,low +P0012,2025-06-14 12:00:00,0.41901672,low,0.0,low,0.2819727192875023,low,low +P0012,2025-06-14 18:00:00,0.39796144,low,0.0,low,0.2242288078823324,low,low +P0012,2025-06-15 00:00:00,0.34782755,low,0.0,low,0.2675414526488853,low,low +P0012,2025-06-15 06:00:00,0.38726246,low,0.0,low,0.2599053488648551,low,low +P0012,2025-06-15 12:00:00,0.40946114,low,0.0,low,0.1021417148229569,low,low +P0012,2025-06-15 18:00:00,0.32574496,low,0.0,low,0.2347060436739533,low,low +P0012,2025-06-16 00:00:00,0.32403532,low,0.0,low,0.2073315627976849,low,low +P0012,2025-06-16 06:00:00,0.3896212,low,0.0,low,0.1505676694383343,low,low +P0012,2025-06-16 12:00:00,0.46582794,low,0.0,low,0.122241081411096,low,low +P0012,2025-06-16 18:00:00,0.45043415,low,0.005,low,0.165018679744066,low,low +P0012,2025-06-17 00:00:00,0.4734435,low,0.0075,low,0.1568464919513469,low,low +P0012,2025-06-17 06:00:00,0.46061054,low,0.0,low,0.2554082895509417,low,low +P0012,2025-06-17 12:00:00,0.44621903,low,0.005,low,0.2572432645897232,low,low +P0012,2025-06-17 18:00:00,0.42370734,low,0.0025,low,0.1521214966094005,low,low +P0012,2025-06-18 00:00:00,0.4093717,low,0.0025,low,0.0751667712723193,low,low +P0012,2025-06-18 06:00:00,0.3581903,low,0.0025,low,0.1886337022280295,low,low +P0012,2025-06-18 12:00:00,0.35823148,low,0.0025,low,0.1330110618736417,low,low +P0012,2025-06-18 18:00:00,0.38639408,low,0.005,low,0.255287208820486,low,low +P0012,2025-06-19 00:00:00,0.36608413,low,0.01,low,0.1477128546744673,low,low +P0012,2025-06-19 06:00:00,0.5575259,low,0.0025,low,0.2622897790484645,low,low +P0012,2025-06-19 12:00:00,0.5188252,low,0.005,low,0.0886307736012433,low,low +P0012,2025-06-19 18:00:00,0.5241258,low,0.0,low,0.3042272792293715,medium,low +P0012,2025-06-20 00:00:00,0.44331646,low,0.0,low,0.2682681169704825,low,low +P0012,2025-06-20 06:00:00,0.46887916,low,0.0,low,0.1598097560217133,low,low +P0012,2025-06-20 12:00:00,0.5448298,low,0.0,low,0.2886051526943452,low,low +P0012,2025-06-20 18:00:00,0.63023365,low,0.0,low,0.1443557464345836,low,low +P0012,2025-06-21 00:00:00,0.5310382,low,0.0,low,0.2263896790924586,low,low +P0012,2025-06-21 06:00:00,0.9175025,low,0.0325,low,0.1825059941161312,low,low +P0012,2025-06-21 12:00:00,0.8469121,low,0.0075,low,0.1203617542138433,low,low +P0012,2025-06-22 18:00:00,0.94622827,low,0.1675,low,0.1218365784328782,low,low +P0012,2025-06-23 00:00:00,0.8933971,low,0.0825,low,0.1347511172953381,low,low +P0012,2025-06-23 06:00:00,0.868375,low,0.0625,low,0.1891447619358402,low,low +P0012,2025-06-23 12:00:00,0.8898566,low,0.0475,low,0.1964584093871404,low,low +P0012,2025-06-23 18:00:00,0.66936916,low,0.0475,low,0.0823001501135221,low,low +P0012,2025-06-24 00:00:00,0.7083017,low,0.0325,low,0.0873101329230238,low,low +P0012,2025-06-24 06:00:00,0.5750191,low,0.01,low,0.2808025795903259,low,low +P0012,2025-06-24 12:00:00,0.57529765,low,0.0075,low,0.1678098637099213,low,low +P0012,2025-06-24 18:00:00,0.80636406,low,0.005,low,0.1990192667833384,low,low +P0012,2025-06-25 00:00:00,0.5708201,low,0.0,low,0.2699953842874596,low,low +P0012,2025-06-25 06:00:00,0.5663124,low,0.0,low,0.3547471129497357,medium,low +P0012,2025-06-25 12:00:00,0.4840205,low,0.0,low,0.3602680217841974,medium,low +P0012,2025-06-25 18:00:00,0.5303196,low,0.0,low,0.2077783291966326,low,low +P0012,2025-06-26 00:00:00,0.54872924,low,0.0,low,0.1417786115340589,low,low +P0012,2025-06-26 06:00:00,0.5374276,low,0.0,low,0.1853463258647612,low,low +P0012,2025-06-26 12:00:00,0.586688,low,0.0,low,0.2422127483328897,low,low +P0012,2025-06-26 18:00:00,0.59931743,low,0.0025,low,0.1414254760863491,low,low +P0012,2025-06-27 00:00:00,0.5576596,low,0.0,low,0.2307901403967537,low,low +P0012,2025-06-27 06:00:00,0.51924187,low,0.0,low,0.2295405752740196,low,low +P0012,2025-06-27 12:00:00,0.52619946,low,0.0025,low,0.1748125816955362,low,low +P0012,2025-06-27 18:00:00,0.47695535,low,0.0,low,0.1423186012571169,low,low +P0012,2025-06-28 00:00:00,0.45788676,low,0.0,low,0.2353461361748025,low,low +P0012,2025-06-28 06:00:00,0.46067578,low,0.0,low,0.1619877121898837,low,low +P0012,2025-06-28 12:00:00,0.43454096,low,0.0,low,0.2624778256274735,low,low +P0012,2025-06-28 18:00:00,0.39815038,low,0.0,low,0.2238455439766807,low,low +P0012,2025-06-29 00:00:00,0.40294832,low,0.03,low,0.1078483682078244,low,low +P0012,2025-06-29 06:00:00,0.5429838,low,0.03,low,0.1511540428639199,low,low +P0012,2025-06-29 12:00:00,0.6283195,low,0.0125,low,0.1571454255574246,low,low +P0012,2025-06-29 18:00:00,0.51942766,low,0.0,low,0.214735575795731,low,low +P0012,2025-06-30 00:00:00,0.49386466,low,0.005,low,0.19278177403713,low,low +P0012,2025-06-30 06:00:00,0.45544973,low,0.0125,low,0.2023281783764049,low,low +P0012,2025-06-30 12:00:00,0.43425953,low,0.0075,low,0.2865436418822376,low,low +P0012,2025-06-30 18:00:00,0.44828516,low,0.005,low,0.2161917306625524,low,low +P0013,2025-06-03 18:00:00,0.5293242,low,0.0,low,0.233151607567887,low,low +P0013,2025-06-04 00:00:00,0.4558061,low,0.0,low,0.1568560436730476,low,low +P0013,2025-06-04 06:00:00,0.4999449,low,0.0,low,0.2695118052502528,low,low +P0013,2025-06-04 12:00:00,0.4736382,low,0.0,low,0.1399053522007988,low,low +P0013,2025-06-04 18:00:00,0.44775167,low,0.0,low,0.1648017579026846,low,low +P0013,2025-06-05 00:00:00,0.64272666,low,0.0075,low,0.140858481896938,low,low +P0013,2025-06-05 06:00:00,0.6113935,low,0.0025,low,0.1295491124587209,low,low +P0013,2025-06-05 12:00:00,0.46519703,low,0.0,low,0.309343280497564,medium,low +P0013,2025-06-05 18:00:00,0.4755302,low,0.0,low,0.3195576763475534,medium,low +P0013,2025-06-06 00:00:00,0.4899006,low,0.0,low,0.0796343194950785,low,low +P0013,2025-06-06 06:00:00,0.5704253,low,0.0,low,0.1280511475255469,low,low +P0013,2025-06-06 12:00:00,0.61133504,low,0.0,low,0.2589119548545225,low,low +P0013,2025-06-06 18:00:00,0.60148466,low,0.0,low,0.2112129988003886,low,low +P0013,2025-06-07 00:00:00,0.657322,low,0.005,low,0.0907668052329062,low,low +P0013,2025-06-07 06:00:00,0.5715548,low,0.0,low,0.1953477270266468,low,low +P0013,2025-06-07 12:00:00,0.58912665,low,0.0,low,0.1138351922639268,low,low +P0013,2025-06-07 18:00:00,0.59662277,low,0.0,low,0.3313025298311081,medium,low +P0013,2025-06-08 00:00:00,0.44906002,low,0.0025,low,0.2295319890615864,low,low +P0013,2025-06-08 06:00:00,0.5800439,low,0.0,low,0.1051939666044316,low,low +P0013,2025-06-08 12:00:00,0.5495488,low,0.0025,low,0.1198507478515524,low,low +P0013,2025-06-08 18:00:00,0.5695592,low,0.0,low,0.2561918003484181,low,low +P0013,2025-06-09 00:00:00,0.6677067,low,0.0125,low,0.0981338350706875,low,low +P0013,2025-06-09 06:00:00,0.60671663,low,0.0775,low,0.1218542343682443,low,low +P0013,2025-06-09 12:00:00,0.84100944,low,0.035,low,0.2338060324549559,low,low +P0013,2025-06-09 18:00:00,0.9392831,low,0.0425,low,0.1553736970679639,low,low +P0013,2025-06-10 00:00:00,0.84806883,low,0.0275,low,0.1137256803772452,low,low +P0013,2025-06-11 00:00:00,0.52022547,low,0.0225,low,0.2386240156035693,low,low +P0013,2025-06-11 06:00:00,0.49502277,low,0.04,low,0.1381369601690402,low,low +P0013,2025-06-11 12:00:00,0.5498436,low,0.0075,low,0.1841422206622978,low,low +P0013,2025-06-11 18:00:00,0.66502583,low,0.035,low,0.1639445862363807,low,low +P0013,2025-06-12 00:00:00,0.6919366,low,0.0525,low,0.0937681469938953,low,low +P0013,2025-06-12 06:00:00,0.52821773,low,0.0,low,0.2002205699061235,low,low +P0013,2025-06-12 12:00:00,0.53692746,low,0.0,low,0.2112146215709525,low,low +P0013,2025-06-12 18:00:00,0.49386433,low,0.0075,low,0.0852770959787067,low,low +P0013,2025-06-13 00:00:00,0.59913725,low,0.0,low,0.3459867244506727,medium,low +P0013,2025-06-13 06:00:00,0.56408167,low,0.0,low,0.2635228941487652,low,low +P0013,2025-06-13 12:00:00,0.5587545,low,0.0,low,0.2645875466328601,low,low +P0013,2025-06-13 18:00:00,0.4870359,low,0.0,low,0.2534094492500524,low,low +P0013,2025-06-14 00:00:00,0.5068353,low,0.0,low,0.1809881820453642,low,low +P0013,2025-06-14 06:00:00,0.5153821,low,0.0,low,0.2135288854044521,low,low +P0013,2025-06-14 12:00:00,0.51858044,low,0.0,low,0.2308055988411783,low,low +P0013,2025-06-14 18:00:00,0.48737267,low,0.0,low,0.3017058026677712,medium,low +P0013,2025-06-15 00:00:00,0.49297047,low,0.0,low,0.2951425848639135,low,low +P0013,2025-06-15 06:00:00,0.4739292,low,0.0,low,0.1596194434790566,low,low +P0013,2025-06-15 12:00:00,0.49524626,low,0.0,low,0.3171122265308175,medium,low +P0013,2025-06-15 18:00:00,0.51922476,low,0.0,low,0.1602144930960828,low,low +P0013,2025-06-16 00:00:00,0.4860399,low,0.0,low,0.1509181525595121,low,low +P0013,2025-06-16 06:00:00,0.5234481,low,0.0,low,0.1883257590251774,low,low +P0013,2025-06-16 12:00:00,0.5003089,low,0.0,low,0.3749891941047671,medium,low +P0013,2025-06-16 18:00:00,0.5656939,low,0.0,low,0.2195700175572473,low,low +P0013,2025-06-17 00:00:00,0.5651498,low,0.0,low,0.3740171425633627,medium,low +P0013,2025-06-17 06:00:00,0.64164215,low,0.0025,low,0.2174707522438691,low,low +P0013,2025-06-17 12:00:00,0.6088723,low,0.0,low,0.0573305164642074,low,low +P0013,2025-06-17 18:00:00,0.6100254,low,0.0075,low,0.1913029355733267,low,low +P0013,2025-06-18 00:00:00,0.55646664,low,0.0025,low,0.1798433659669423,low,low +P0013,2025-06-18 06:00:00,0.54834723,low,0.0,low,0.1397735991534516,low,low +P0013,2025-06-18 12:00:00,0.51421857,low,0.0,low,0.1345033965911876,low,low +P0013,2025-06-18 18:00:00,0.54770446,low,0.0,low,0.2241774908973177,low,low +P0013,2025-06-19 00:00:00,0.5663542,low,0.0,low,0.3848051369280821,medium,low +P0013,2025-06-19 06:00:00,0.49433506,low,0.0,low,0.3027166835558468,medium,low +P0013,2025-06-19 12:00:00,0.49025467,low,0.0,low,0.1738275450891148,low,low +P0013,2025-06-19 18:00:00,0.5331301,low,0.0,low,0.1915148433894694,low,low +P0013,2025-06-20 00:00:00,0.5873431,low,0.0025,low,0.2587086755953314,low,low +P0013,2025-06-20 06:00:00,0.45026827,low,0.0,low,0.2081078492999388,low,low +P0013,2025-06-20 12:00:00,0.42067397,low,0.0,low,0.4983426005701382,medium,low +P0013,2025-06-20 18:00:00,0.3909006,low,0.0,low,0.1767326236396983,low,low +P0013,2025-06-21 00:00:00,0.5275886,low,0.005,low,0.1778398180096327,low,low +P0013,2025-06-21 06:00:00,0.5735805,low,0.0,low,0.2858670599186297,low,low +P0013,2025-06-21 12:00:00,0.57544357,low,0.0075,low,0.1390987892964533,low,low +P0013,2025-06-21 18:00:00,0.49870288,low,0.0,low,0.1784556095067909,low,low +P0013,2025-06-22 00:00:00,0.45571008,low,0.0,low,0.0987918573344,low,low +P0013,2025-06-22 06:00:00,0.54463094,low,0.005,low,0.1450455447590194,low,low +P0013,2025-06-22 12:00:00,0.7006446,low,0.005,low,0.3354987368321093,medium,low +P0013,2025-06-22 18:00:00,0.66872084,low,0.005,low,0.109192264085787,low,low +P0013,2025-06-23 00:00:00,0.6374018,low,0.0,low,0.2081651962916066,low,low +P0013,2025-06-23 06:00:00,0.6515504,low,0.005,low,0.2505755797974966,low,low +P0013,2025-06-23 12:00:00,0.7289311,low,0.005,low,0.1242505951886491,low,low +P0013,2025-06-23 18:00:00,0.77685094,low,0.005,low,0.0750099109143517,low,low +P0013,2025-06-24 00:00:00,0.46828187,low,0.0025,low,0.2808563985480796,low,low +P0013,2025-06-24 06:00:00,0.4677064,low,0.0025,low,0.3062558906504703,medium,low +P0013,2025-06-24 12:00:00,0.4851851,low,0.0,low,0.2677660511766017,low,low +P0013,2025-06-24 18:00:00,0.6208813,low,0.0,low,0.1974053495519314,low,low +P0013,2025-06-25 00:00:00,0.5928872,low,0.01,low,0.1146772919186851,low,low +P0013,2025-06-25 06:00:00,0.60875636,low,0.0,low,0.1623030045185943,low,low +P0013,2025-06-25 12:00:00,0.62826467,low,0.0,low,0.3841160425581598,medium,low +P0013,2025-06-25 18:00:00,0.5129957,low,0.0,low,0.1237194535072133,low,low +P0013,2025-06-26 00:00:00,0.47273573,low,0.0,low,0.1626623947108443,low,low +P0013,2025-06-26 06:00:00,0.43859088,low,0.0,low,0.2126236417237501,low,low +P0013,2025-06-26 12:00:00,0.44342667,low,0.0,low,0.1727938015522353,low,low +P0013,2025-06-26 18:00:00,0.42881578,low,0.0,low,0.1851579934237622,low,low +P0013,2025-06-27 00:00:00,0.41977307,low,0.0,low,0.2363242511603487,low,low +P0013,2025-06-27 06:00:00,0.42461357,low,0.0,low,0.1475646879128553,low,low +P0013,2025-06-27 12:00:00,0.36530155,low,0.0,low,0.3575314149644233,medium,low +P0013,2025-06-27 18:00:00,0.3364486,low,0.0,low,0.3397780612216861,medium,low +P0013,2025-06-28 00:00:00,0.31239536,low,0.0025,low,0.1262114338215812,low,low +P0013,2025-06-28 06:00:00,0.28974402,low,0.0025,low,0.2936953640811744,low,low +P0013,2025-06-28 12:00:00,0.33405387,low,0.0025,low,0.2693907254850302,low,low +P0013,2025-06-28 18:00:00,0.32848454,low,0.0025,low,0.2371476591312311,low,low +P0013,2025-06-29 00:00:00,0.31470373,low,0.0,low,0.1588908294857807,low,low +P0013,2025-06-29 06:00:00,0.38887903,low,0.0,low,0.2856333691209546,low,low +P0013,2025-06-29 12:00:00,0.35767165,low,0.0,low,0.3826642176476613,medium,low +P0013,2025-06-29 18:00:00,0.35911524,low,0.0,low,0.2347442151535781,low,low +P0013,2025-06-30 00:00:00,0.39613187,low,0.0,low,0.1996869720154236,low,low +P0013,2025-06-30 06:00:00,0.39595658,low,0.0,low,0.0808706780214319,low,low +P0013,2025-06-30 12:00:00,0.44077224,low,0.0,low,0.1547766512690014,low,low +P0013,2025-06-30 18:00:00,0.47820315,low,0.0,low,0.3604059444703539,medium,low +P0014,2025-06-03 18:00:00,0.5774266,low,0.0,low,0.2459693985735905,low,low +P0014,2025-06-04 00:00:00,0.51948667,low,0.0,low,0.2115646805181615,low,low +P0014,2025-06-04 06:00:00,0.51357555,low,0.0,low,0.2259043399222787,low,low +P0014,2025-06-04 12:00:00,0.5201593,low,0.0,low,0.1198019416619481,low,low +P0014,2025-06-04 18:00:00,0.54260826,low,0.0025,low,0.2310489599279712,low,low +P0014,2025-06-05 00:00:00,0.5451024,low,0.0,low,0.2277034860477761,low,low +P0014,2025-06-05 06:00:00,0.54615283,low,0.0025,low,0.1088966407827361,low,low +P0014,2025-06-05 12:00:00,0.5342508,low,0.0,low,0.3178325586947551,medium,low +P0014,2025-06-05 18:00:00,0.5646024,low,0.0025,low,0.2022241612411836,low,low +P0014,2025-06-06 00:00:00,0.4849966,low,0.0,low,0.1389252665529108,low,low +P0014,2025-06-06 06:00:00,0.52859384,low,0.0025,low,0.1483146393714146,low,low +P0014,2025-06-06 12:00:00,0.5448021,low,0.0,low,0.2187302093340971,low,low +P0014,2025-06-06 18:00:00,0.4992385,low,0.0,low,0.1579756506237955,low,low +P0014,2025-06-07 00:00:00,0.39823216,low,0.0,low,0.197822432775345,low,low +P0014,2025-06-07 06:00:00,0.39061752,low,0.0,low,0.2387103792113585,low,low +P0014,2025-06-07 12:00:00,0.43431517,low,0.0,low,0.2321628957246362,low,low +P0014,2025-06-07 18:00:00,0.49534628,low,0.0025,low,0.1921966345470664,low,low +P0014,2025-06-08 00:00:00,0.49173397,low,0.0,low,0.2322264618877726,low,low +P0014,2025-06-08 06:00:00,0.8094124,low,0.0,low,0.1572805389205169,low,low +P0014,2025-06-08 12:00:00,0.8273713,low,0.005,low,0.1243737638003485,low,low +P0014,2025-06-08 18:00:00,0.78091615,low,0.0,low,0.2919496090172647,low,low +P0014,2025-06-09 00:00:00,0.74338555,low,0.0025,low,0.1928008673800596,low,low +P0014,2025-06-09 06:00:00,0.7494018,low,0.0,low,0.4088733543665649,medium,low +P0014,2025-06-09 12:00:00,0.94040066,low,0.025,low,0.1359411282111133,low,low +P0014,2025-06-09 18:00:00,0.9146572,low,0.07,low,0.1369046084775982,low,low +P0014,2025-06-10 00:00:00,0.9016127,low,0.0625,low,0.2411818931922825,low,low +P0014,2025-06-10 06:00:00,0.85249954,low,0.115,low,0.2664743453715784,low,low +P0014,2025-06-10 12:00:00,0.81997514,low,0.0475,low,0.0729436705197993,low,low +P0014,2025-06-10 18:00:00,0.5435127,low,0.01,low,0.1443214367899024,low,low +P0014,2025-06-11 00:00:00,0.5148871,low,0.0075,low,0.2411301168424083,low,low +P0014,2025-06-11 06:00:00,0.38108036,low,0.005,low,0.2261730641820864,low,low +P0014,2025-06-11 12:00:00,0.33474663,low,0.0,low,0.1612661424491432,low,low +P0014,2025-06-11 18:00:00,0.35877255,low,0.0025,low,0.1402990443171979,low,low +P0014,2025-06-12 00:00:00,0.35732603,low,0.0,low,0.1313865551660834,low,low +P0014,2025-06-12 06:00:00,0.32976958,low,0.005,low,0.1780867502425233,low,low +P0014,2025-06-12 12:00:00,0.40694678,low,0.0025,low,0.1433267753657579,low,low +P0014,2025-06-12 18:00:00,0.4351567,low,0.0,low,0.1383381753108815,low,low +P0014,2025-06-13 00:00:00,0.3866447,low,0.0,low,0.1619581346041992,low,low +P0014,2025-06-13 06:00:00,0.43715197,low,0.0,low,0.3101966780774387,medium,low +P0014,2025-06-13 12:00:00,0.420972,low,0.0,low,0.2683662819547053,low,low +P0014,2025-06-13 18:00:00,0.39108533,low,0.0,low,0.2125801645800246,low,low +P0014,2025-06-14 00:00:00,0.38046977,low,0.0,low,0.1474181027659632,low,low +P0014,2025-06-14 06:00:00,0.34287047,low,0.0,low,0.2232212750869047,low,low +P0014,2025-06-14 12:00:00,0.40053356,low,0.0,low,0.1972413459243946,low,low +P0014,2025-06-14 18:00:00,0.4317614,low,0.0,low,0.1381299902148259,low,low +P0014,2025-06-15 00:00:00,0.48130047,low,0.0,low,0.3377277052651128,medium,low +P0014,2025-06-15 06:00:00,0.53351223,low,0.0,low,0.3366669905995391,medium,low +P0014,2025-06-15 12:00:00,0.54725516,low,0.0,low,0.2869044593373301,low,low +P0014,2025-06-15 18:00:00,0.55975693,low,0.0,low,0.2199777925172723,low,low +P0014,2025-06-16 00:00:00,0.4895807,low,0.0,low,0.120533623025563,low,low +P0014,2025-06-16 06:00:00,0.4520468,low,0.0,low,0.1892257472564403,low,low +P0014,2025-06-16 12:00:00,0.4694476,low,0.0,low,0.255608572931574,low,low +P0014,2025-06-16 18:00:00,0.48712954,low,0.0,low,0.2072392865414736,low,low +P0014,2025-06-17 00:00:00,0.48657238,low,0.0,low,0.1970491207983336,low,low +P0014,2025-06-17 06:00:00,0.4909164,low,0.0,low,0.2530506811413119,low,low +P0014,2025-06-17 12:00:00,0.45837915,low,0.0,low,0.2070717124442943,low,low +P0014,2025-06-17 18:00:00,0.43529966,low,0.0,low,0.256985977059003,low,low +P0014,2025-06-18 00:00:00,0.40413085,low,0.0,low,0.1855713391928286,low,low +P0014,2025-06-18 06:00:00,0.39096025,low,0.0,low,0.1649212293916194,low,low +P0014,2025-06-18 12:00:00,0.35869923,low,0.0,low,0.1464402229595487,low,low +P0014,2025-06-18 18:00:00,0.3383315,low,0.0,low,0.2685162934636885,low,low +P0014,2025-06-19 00:00:00,0.33639398,low,0.0,low,0.3262553524458541,medium,low +P0014,2025-06-19 06:00:00,0.3667529,low,0.0,low,0.2931339339221565,low,low +P0014,2025-06-19 12:00:00,0.38859832,low,0.0,low,0.4391918803363095,medium,low +P0014,2025-06-19 18:00:00,0.43969542,low,0.0,low,0.1569919916716716,low,low +P0014,2025-06-20 00:00:00,0.47483253,low,0.0,low,0.1946089705380313,low,low +P0014,2025-06-20 06:00:00,0.50981903,low,0.0,low,0.2219075936441489,low,low +P0014,2025-06-20 12:00:00,0.4722487,low,0.0,low,0.2390801199342392,low,low +P0014,2025-06-20 18:00:00,0.57911503,low,0.0,low,0.2006212882057259,low,low +P0014,2025-06-21 00:00:00,0.5370373,low,0.0,low,0.3445642809183019,medium,low +P0014,2025-06-21 06:00:00,0.64603305,low,0.005,low,0.2420316561096781,low,low +P0014,2025-06-21 12:00:00,0.6139266,low,0.0,low,0.1678823036315509,low,low +P0014,2025-06-21 18:00:00,0.58555806,low,0.0025,low,0.2195097858880543,low,low +P0014,2025-06-22 00:00:00,0.5853198,low,0.0,low,0.2739552366700711,low,low +P0014,2025-06-22 06:00:00,0.60132676,low,0.0025,low,0.1954582508374437,low,low +P0014,2025-06-22 12:00:00,0.60532826,low,0.0,low,0.1952397539449134,low,low +P0014,2025-06-22 18:00:00,0.590825,low,0.0,low,0.1791232158929255,low,low +P0014,2025-06-23 00:00:00,0.5739436,low,0.0025,low,0.2242780408556253,low,low +P0014,2025-06-23 06:00:00,0.53745186,low,0.0,low,0.3491040758335853,medium,low +P0014,2025-06-23 12:00:00,0.53353137,low,0.0025,low,0.2887600680290379,low,low +P0014,2025-06-23 18:00:00,0.45724446,low,0.0,low,0.0963225485647378,low,low +P0014,2025-06-24 00:00:00,0.5070686,low,0.0075,low,0.1001946329032734,low,low +P0014,2025-06-24 06:00:00,0.51504666,low,0.0,low,0.1571923590661071,low,low +P0014,2025-06-24 12:00:00,0.47731516,low,0.0,low,0.1218360643970954,low,low +P0014,2025-06-24 18:00:00,0.48208487,low,0.0,low,0.2981363167412162,low,low +P0014,2025-06-25 00:00:00,0.41415113,low,0.0,low,0.1714761664673447,low,low +P0014,2025-06-25 06:00:00,0.3829069,low,0.0,low,0.2119967560528086,low,low +P0014,2025-06-25 12:00:00,0.46226263,low,0.0,low,0.2484679685674976,low,low +P0014,2025-06-25 18:00:00,0.51830083,low,0.0,low,0.1427142106900041,low,low +P0014,2025-06-26 00:00:00,0.49722704,low,0.0,low,0.2997995186127444,low,low +P0014,2025-06-26 06:00:00,0.49429047,low,0.0,low,0.2839135361077109,low,low +P0014,2025-06-26 12:00:00,0.49067545,low,0.0,low,0.3738656552960469,medium,low +P0014,2025-06-26 18:00:00,0.561106,low,0.0,low,0.1315380041542259,low,low +P0014,2025-06-27 00:00:00,0.5413177,low,0.0,low,0.1677376462905073,low,low +P0014,2025-06-27 06:00:00,0.5305994,low,0.0025,low,0.0862044673390203,low,low +P0014,2025-06-27 12:00:00,0.52398247,low,0.0,low,0.1745710174377531,low,low +P0014,2025-06-27 18:00:00,0.48723337,low,0.0,low,0.1929064928321823,low,low +P0014,2025-06-28 00:00:00,0.50115514,low,0.0,low,0.1660853911206519,low,low +P0014,2025-06-28 06:00:00,0.63913536,low,0.0,low,0.0840065362601197,low,low +P0014,2025-06-28 12:00:00,0.509418,low,0.0,low,0.1378343016528912,low,low +P0014,2025-06-28 18:00:00,0.4659159,low,0.0,low,0.1149014320202558,low,low +P0014,2025-06-29 00:00:00,0.5177192,low,0.0,low,0.1091915480644415,low,low +P0014,2025-06-29 06:00:00,0.5313154,low,0.0,low,0.1579393357408398,low,low +P0014,2025-06-29 12:00:00,0.5655599,low,0.0,low,0.2810905370015999,low,low +P0014,2025-06-29 18:00:00,0.51972854,low,0.0,low,0.1811097988405601,low,low +P0014,2025-06-30 00:00:00,0.500302,low,0.0,low,0.2264324074713762,low,low +P0014,2025-06-30 06:00:00,0.44955146,low,0.0,low,0.2252959661095052,low,low +P0014,2025-06-30 12:00:00,0.4909286,low,0.0,low,0.1160502496414347,low,low +P0014,2025-06-30 18:00:00,0.5099027,low,0.0,low,0.2617661589752481,low,low +P0015,2025-06-03 18:00:00,0.5917825,low,0.0025,low,0.1381269625369077,low,low +P0015,2025-06-04 00:00:00,0.8265222,low,0.0375,low,0.1801129116955786,low,low +P0015,2025-06-04 18:00:00,0.8750621,low,0.06,low,0.1040416113742863,low,low +P0015,2025-06-05 00:00:00,0.884866,low,0.15,low,0.1765800019025974,low,low +P0015,2025-06-05 06:00:00,0.85602474,low,0.1375,low,0.182148707414248,low,low +P0015,2025-06-05 12:00:00,0.79974926,low,0.0875,low,0.2668518316724009,low,low +P0015,2025-06-05 18:00:00,0.78984964,low,0.0725,low,0.1854290822011211,low,low +P0015,2025-06-06 00:00:00,0.51821446,low,0.035,low,0.4235737710369257,medium,low +P0015,2025-06-06 06:00:00,0.53307456,low,0.135,low,0.2559452727503951,low,low +P0015,2025-06-06 12:00:00,0.5672154,low,0.0325,low,0.246115712986798,low,low +P0015,2025-06-06 18:00:00,0.60072297,low,0.04,low,0.1110830735787998,low,low +P0015,2025-06-07 00:00:00,0.5259173,low,0.02,low,0.1089555291296408,low,low +P0015,2025-06-07 06:00:00,0.5449012,low,0.005,low,0.1018915031696193,low,low +P0015,2025-06-07 12:00:00,0.82218814,low,0.0,low,0.2720186948261754,low,low +P0015,2025-06-07 18:00:00,0.5566051,low,0.0,low,0.1444678437839631,low,low +P0015,2025-06-08 00:00:00,0.54467654,low,0.005,low,0.1388744161721427,low,low +P0015,2025-06-08 06:00:00,0.53821576,low,0.005,low,0.1210630841458324,low,low +P0015,2025-06-08 12:00:00,0.4915887,low,0.0025,low,0.2208939357017936,low,low +P0015,2025-06-08 18:00:00,0.4300918,low,0.0025,low,0.209428269089559,low,low +P0015,2025-06-09 00:00:00,0.41214716,low,0.0,low,0.2501935256746128,low,low +P0015,2025-06-09 06:00:00,0.37555,low,0.0,low,0.1806196111998191,low,low +P0015,2025-06-09 12:00:00,0.38474867,low,0.0,low,0.1454108859541455,low,low +P0015,2025-06-09 18:00:00,0.41809112,low,0.0,low,0.1769201274577944,low,low +P0015,2025-06-10 00:00:00,0.5049677,low,0.0,low,0.1788345099402144,low,low +P0015,2025-06-10 06:00:00,0.5694583,low,0.0,low,0.2150654600652251,low,low +P0015,2025-06-10 12:00:00,0.6075525,low,0.0025,low,0.1618045823718234,low,low +P0015,2025-06-10 18:00:00,0.594123,low,0.0,low,0.2285972458706154,low,low +P0015,2025-06-11 00:00:00,0.60636467,low,0.0,low,0.2350301683242197,low,low +P0015,2025-06-11 06:00:00,0.6843283,low,0.025,low,0.1590972622690103,low,low +P0015,2025-06-11 12:00:00,0.6455171,low,0.005,low,0.1862058556252238,low,low +P0015,2025-06-11 18:00:00,0.6731591,low,0.0125,low,0.2010623956570036,low,low +P0015,2025-06-12 00:00:00,0.6669284,low,0.0,low,0.2817010605683627,low,low +P0015,2025-06-12 06:00:00,0.6651375,low,0.0,low,0.1758615080773922,low,low +P0015,2025-06-12 12:00:00,0.6678009,low,0.0075,low,0.3017885441146853,medium,low +P0015,2025-06-12 18:00:00,0.6335848,low,0.0025,low,0.1186110494344327,low,low +P0015,2025-06-13 00:00:00,0.68587035,low,0.0125,low,0.2115016143835335,low,low +P0015,2025-06-13 06:00:00,0.6967046,low,0.005,low,0.224809311158096,low,low +P0015,2025-06-13 12:00:00,0.65382403,low,0.0125,low,0.2581267665503736,low,low +P0015,2025-06-13 18:00:00,0.546376,low,0.0125,low,0.1788415559568444,low,low +P0015,2025-06-14 00:00:00,0.58862615,low,0.0225,low,0.1219098613095578,low,low +P0015,2025-06-14 06:00:00,0.5340307,low,0.0,low,0.1531291350492766,low,low +P0015,2025-06-14 12:00:00,0.5607075,low,0.005,low,0.2879080125693253,low,low +P0015,2025-06-14 18:00:00,0.6310423,low,0.005,low,0.1549411910777199,low,low +P0015,2025-06-15 00:00:00,0.55141,low,0.0025,low,0.2816182957820818,low,low +P0015,2025-06-15 06:00:00,0.52186215,low,0.0075,low,0.2505432982059046,low,low +P0015,2025-06-15 12:00:00,0.5445117,low,0.005,low,0.2422189581217739,low,low +P0015,2025-06-15 18:00:00,0.5497802,low,0.0,low,0.2600337905600632,low,low +P0015,2025-06-16 00:00:00,0.6017968,low,0.0,low,0.136463058835628,low,low +P0015,2025-06-16 06:00:00,0.68362784,low,0.0,low,0.1015485765772477,low,low +P0015,2025-06-16 12:00:00,0.56195354,low,0.0,low,0.1506319192733,low,low +P0015,2025-06-16 18:00:00,0.4818069,low,0.0,low,0.3183179155276288,medium,low +P0015,2025-06-17 00:00:00,0.47192377,low,0.0,low,0.193594998605049,low,low +P0015,2025-06-17 06:00:00,0.47326162,low,0.0,low,0.1883046415008773,low,low +P0015,2025-06-17 12:00:00,0.5050571,low,0.0,low,0.1807522580254471,low,low +P0015,2025-06-17 18:00:00,0.48668998,low,0.0,low,0.2404460641611539,low,low +P0015,2025-06-18 00:00:00,0.4593989,low,0.0,low,0.1574655621747133,low,low +P0015,2025-06-18 06:00:00,0.43221667,low,0.0,low,0.1357669137997396,low,low +P0015,2025-06-18 12:00:00,0.4264224,low,0.0,low,0.2178606836405334,low,low +P0015,2025-06-18 18:00:00,0.42911354,low,0.0,low,0.2671758387465331,low,low +P0015,2025-06-19 00:00:00,0.39506248,low,0.0,low,0.2864737856993095,low,low +P0015,2025-06-19 06:00:00,0.5153135,low,0.0,low,0.2412971834226209,low,low +P0015,2025-06-19 12:00:00,0.49259546,low,0.0,low,0.2614979245690429,low,low +P0015,2025-06-19 18:00:00,0.57194674,low,0.0,low,0.2178246004527737,low,low +P0015,2025-06-20 00:00:00,0.52043384,low,0.0,low,0.1377151840150048,low,low +P0015,2025-06-20 06:00:00,0.5219228,low,0.0,low,0.1742122674591376,low,low +P0015,2025-06-20 12:00:00,0.48124853,low,0.0,low,0.2787615716779938,low,low +P0015,2025-06-20 18:00:00,0.4801285,low,0.0,low,0.1929946222079912,low,low +P0015,2025-06-21 00:00:00,0.6037794,low,0.005,low,0.1565392950565078,low,low +P0015,2025-06-21 06:00:00,0.62364644,low,0.0,low,0.1741655434796937,low,low +P0015,2025-06-21 12:00:00,0.5956884,low,0.0025,low,0.1453269469429874,low,low +P0015,2025-06-21 18:00:00,0.67211086,low,0.0075,low,0.2899014447043527,low,low +P0015,2025-06-22 00:00:00,0.6297475,low,0.0075,low,0.2042704209081209,low,low +P0015,2025-06-22 06:00:00,0.6834265,low,0.0,low,0.1884953627376181,low,low +P0015,2025-06-22 12:00:00,0.6397187,low,0.0075,low,0.211578447591801,low,low +P0015,2025-06-22 18:00:00,0.5523235,low,0.0,low,0.1878095146061279,low,low +P0015,2025-06-23 00:00:00,0.53047824,low,0.0,low,0.2630523179275028,low,low +P0015,2025-06-23 06:00:00,0.5466429,low,0.005,low,0.1051258934354831,low,low +P0015,2025-06-23 12:00:00,0.59168136,low,0.0,low,0.1309560187420227,low,low +P0015,2025-06-23 18:00:00,0.5454802,low,0.005,low,0.1231649060010101,low,low +P0015,2025-06-24 00:00:00,0.62582856,low,0.0,low,0.2357371720599441,low,low +P0015,2025-06-24 06:00:00,0.62464345,low,0.0,low,0.3285861747869422,medium,low +P0015,2025-06-24 12:00:00,0.5732865,low,0.0,low,0.1416552452733057,low,low +P0015,2025-06-24 18:00:00,0.6099112,low,0.0,low,0.1723601235721192,low,low +P0015,2025-06-25 00:00:00,0.6135784,low,0.0,low,0.1273654678670628,low,low +P0015,2025-06-25 06:00:00,0.59150714,low,0.0,low,0.1176251035389459,low,low +P0015,2025-06-25 12:00:00,0.5748926,low,0.0,low,0.1987850402177841,low,low +P0015,2025-06-25 18:00:00,0.5733474,low,0.0,low,0.2197803695539354,low,low +P0015,2025-06-26 00:00:00,0.5133716,low,0.0,low,0.218120257209713,low,low +P0015,2025-06-26 06:00:00,0.47893,low,0.0,low,0.1943128159913698,low,low +P0015,2025-06-26 12:00:00,0.46406782,low,0.0,low,0.3657547197543209,medium,low +P0015,2025-06-26 18:00:00,0.4478001,low,0.0025,low,0.1939212397378614,low,low +P0015,2025-06-27 00:00:00,0.44217393,low,0.0,low,0.2061225107197027,low,low +P0015,2025-06-27 06:00:00,0.43514708,low,0.0,low,0.1137366032407272,low,low +P0015,2025-06-27 12:00:00,0.44971636,low,0.0,low,0.2731426599491489,low,low +P0015,2025-06-27 18:00:00,0.43171766,low,0.0,low,0.2164365719588121,low,low +P0015,2025-06-28 00:00:00,0.4466806,low,0.0,low,0.3253010224463447,medium,low +P0015,2025-06-28 06:00:00,0.4327765,low,0.0,low,0.2425248712368545,low,low +P0015,2025-06-28 12:00:00,0.43795645,low,0.0,low,0.1578746177524334,low,low +P0015,2025-06-28 18:00:00,0.41889468,low,0.0,low,0.1530080036942983,low,low +P0015,2025-06-29 00:00:00,0.542028,low,0.0025,low,0.1573634893139517,low,low +P0015,2025-06-29 06:00:00,0.66917336,low,0.0025,low,0.1035661946512672,low,low +P0015,2025-06-29 12:00:00,0.6516782,low,0.0025,low,0.1139991184683583,low,low +P0015,2025-06-29 18:00:00,0.69304997,low,0.0025,low,0.155885001299503,low,low +P0015,2025-06-30 00:00:00,0.47770917,low,0.0,low,0.1994908220443174,low,low +P0015,2025-06-30 06:00:00,0.41010576,low,0.0,low,0.1590777037329213,low,low +P0015,2025-06-30 12:00:00,0.47581714,low,0.0,low,0.2256391595762349,low,low +P0015,2025-06-30 18:00:00,0.50924444,low,0.0,low,0.2738018844647721,low,low diff --git a/AI Guardian/Alert_System/outputs/guardian_classifier_predictions.csv b/AI Guardian/Alert_System/outputs/guardian_classifier_predictions.csv new file mode 100644 index 00000000..a31f26ab --- /dev/null +++ b/AI Guardian/Alert_System/outputs/guardian_classifier_predictions.csv @@ -0,0 +1,1756 @@ +patientId_seqEnd,seq_end_time,rf_prob,rf_risk,mlp_prob,mlp_risk +P0001,2025-06-03 18:00:00,0.0125,low,0.2092148623456424,low +P0001,2025-06-04 00:00:00,0.04,low,0.1866149306891479,low +P0001,2025-06-04 06:00:00,0.0075,low,0.12131753977495464,low +P0001,2025-06-04 12:00:00,0.0575,low,0.14978338127539717,low +P0001,2025-06-04 18:00:00,0.01,low,0.23521808249432655,low +P0001,2025-06-05 00:00:00,0.7875,high,0.09646427508012673,low +P0001,2025-06-05 06:00:00,0.0025,low,0.12272068202409665,low +P0001,2025-06-05 12:00:00,0.01,low,0.19130919450392733,low +P0001,2025-06-05 18:00:00,0.0,low,0.12934372213502457,low +P0001,2025-06-06 00:00:00,0.0,low,0.16236416812895327,low +P0001,2025-06-06 06:00:00,0.0,low,0.17021947963414966,low +P0001,2025-06-06 12:00:00,0.0,low,0.2098439687080826,low +P0001,2025-06-06 18:00:00,0.0,low,0.22515587176818783,low +P0001,2025-06-07 00:00:00,0.0025,low,0.1358102689586333,low +P0001,2025-06-07 06:00:00,0.0025,low,0.30111519446053253,medium +P0001,2025-06-07 12:00:00,0.005,low,0.15075233849161676,low +P0001,2025-06-07 18:00:00,0.0,low,0.21692680256454672,low +P0001,2025-06-08 00:00:00,0.0,low,0.4738069145225415,medium +P0001,2025-06-08 06:00:00,0.0025,low,0.2082255911007394,low +P0001,2025-06-08 12:00:00,0.005,low,0.2461514351303269,low +P0001,2025-06-08 18:00:00,0.01,low,0.2699795291620387,low +P0001,2025-06-09 00:00:00,0.0425,low,0.18960306315538056,low +P0001,2025-06-09 06:00:00,0.03,low,0.294564125441645,low +P0001,2025-06-09 12:00:00,0.0075,low,0.1596435807302204,low +P0001,2025-06-09 18:00:00,0.0025,low,0.22198966870544615,low +P0001,2025-06-10 00:00:00,0.005,low,0.13803070199204034,low +P0001,2025-06-10 06:00:00,0.015,low,0.09785096999471102,low +P0001,2025-06-10 12:00:00,0.0075,low,0.13081908871642087,low +P0001,2025-06-10 18:00:00,0.0025,low,0.19449200989273835,low +P0001,2025-06-11 00:00:00,0.005,low,0.09236988288144866,low +P0001,2025-06-11 06:00:00,0.0,low,0.17137326698719352,low +P0001,2025-06-11 12:00:00,0.0,low,0.14265365997838717,low +P0001,2025-06-11 18:00:00,0.0,low,0.2432063211920443,low +P0001,2025-06-12 00:00:00,0.0,low,0.16406241563008986,low +P0001,2025-06-12 06:00:00,0.0,low,0.10260309346429118,low +P0001,2025-06-12 12:00:00,0.0,low,0.2194501468262367,low +P0001,2025-06-12 18:00:00,0.0,low,0.23175865680400273,low +P0001,2025-06-13 00:00:00,0.0,low,0.1968316422143177,low +P0001,2025-06-13 06:00:00,0.0,low,0.42399761406349434,medium +P0001,2025-06-13 12:00:00,0.0,low,0.12718837603503805,low +P0001,2025-06-13 18:00:00,0.0,low,0.3231842631726592,medium +P0001,2025-06-14 00:00:00,0.0,low,0.2007024936267882,low +P0001,2025-06-14 06:00:00,0.0,low,0.16008992074472414,low +P0001,2025-06-14 12:00:00,0.0,low,0.11914890894760989,low +P0001,2025-06-14 18:00:00,0.0,low,0.21132231524458442,low +P0001,2025-06-15 00:00:00,0.0,low,0.23841667253122725,low +P0001,2025-06-15 06:00:00,0.0,low,0.1689910901114803,low +P0001,2025-06-15 12:00:00,0.0,low,0.2936868096651288,low +P0001,2025-06-15 18:00:00,0.0025,low,0.23019373252110634,low +P0001,2025-06-16 00:00:00,0.0,low,0.13480861397753144,low +P0001,2025-06-16 06:00:00,0.0,low,0.14619360100345447,low +P0001,2025-06-16 12:00:00,0.0,low,0.14064071507489528,low +P0001,2025-06-16 18:00:00,0.0,low,0.2626144475880474,low +P0001,2025-06-17 00:00:00,0.0,low,0.1888910452385914,low +P0001,2025-06-17 06:00:00,0.0025,low,0.28735132397514473,low +P0001,2025-06-17 12:00:00,0.0,low,0.19692269165488938,low +P0001,2025-06-17 18:00:00,0.0,low,0.1549586538969544,low +P0001,2025-06-18 00:00:00,0.0,low,0.21590475351377508,low +P0001,2025-06-18 06:00:00,0.0,low,0.21446315967806778,low +P0001,2025-06-18 12:00:00,0.0,low,0.13241866866379706,low +P0001,2025-06-18 18:00:00,0.0,low,0.26509794679720483,low +P0001,2025-06-19 00:00:00,0.0,low,0.18000272799885436,low +P0001,2025-06-19 06:00:00,0.0,low,0.37590776807474346,medium +P0001,2025-06-19 12:00:00,0.0375,low,0.10442463495930529,low +P0001,2025-06-19 18:00:00,0.09,low,0.272127526853485,low +P0001,2025-06-20 00:00:00,0.1925,low,0.27823148557257593,low +P0001,2025-06-20 06:00:00,0.0025,low,0.3341771075623558,medium +P0001,2025-06-20 12:00:00,0.0025,low,0.20820577944451724,low +P0001,2025-06-20 18:00:00,0.0025,low,0.1532407402960084,low +P0001,2025-06-21 00:00:00,0.02,low,0.06988238482950172,low +P0001,2025-06-21 06:00:00,0.0,low,0.32039447873965193,medium +P0001,2025-06-21 12:00:00,0.005,low,0.09101511372004249,low +P0001,2025-06-21 18:00:00,0.005,low,0.17438045060634547,low +P0001,2025-06-22 00:00:00,0.0,low,0.11035955158556837,low +P0001,2025-06-22 06:00:00,0.005,low,0.0884110557802237,low +P0001,2025-06-22 12:00:00,0.0,low,0.2047467036172272,low +P0001,2025-06-22 18:00:00,0.0025,low,0.09207832468910505,low +P0001,2025-06-23 00:00:00,0.0,low,0.20393839850526196,low +P0001,2025-06-23 06:00:00,0.0,low,0.5119549860380845,medium +P0001,2025-06-23 12:00:00,0.0,low,0.14618441566568705,low +P0001,2025-06-23 18:00:00,0.0,low,0.34392419643168637,medium +P0001,2025-06-24 00:00:00,0.0,low,0.21802003518935387,low +P0001,2025-06-24 06:00:00,0.0,low,0.15742700365640588,low +P0001,2025-06-24 12:00:00,0.0,low,0.12385098567846313,low +P0001,2025-06-24 18:00:00,0.0,low,0.3546429420043776,medium +P0001,2025-06-25 00:00:00,0.0,low,0.2317366108528658,low +P0001,2025-06-25 06:00:00,0.0,low,0.18395097759833234,low +P0001,2025-06-25 12:00:00,0.0,low,0.36090197978171284,medium +P0001,2025-06-25 18:00:00,0.005,low,0.3166417987561344,medium +P0001,2025-06-26 00:00:00,0.0,low,0.22044341995626135,low +P0001,2025-06-26 06:00:00,0.0,low,0.15372809821589384,low +P0001,2025-06-26 12:00:00,0.0,low,0.17001677100330903,low +P0001,2025-06-26 18:00:00,0.0025,low,0.12616129516451974,low +P0001,2025-06-27 00:00:00,0.0,low,0.1507311311737149,low +P0001,2025-06-27 06:00:00,0.0,low,0.1395596330522993,low +P0001,2025-06-27 12:00:00,0.0,low,0.1830699480905229,low +P0001,2025-06-27 18:00:00,0.0,low,0.20517317584692552,low +P0001,2025-06-28 00:00:00,0.0,low,0.24499664534391602,low +P0001,2025-06-28 06:00:00,0.0,low,0.15878260665349309,low +P0001,2025-06-28 12:00:00,0.005,low,0.14702396975572235,low +P0001,2025-06-28 18:00:00,0.0,low,0.21350441391151917,low +P0001,2025-06-29 00:00:00,0.0,low,0.1729889212216921,low +P0001,2025-06-29 06:00:00,0.0,low,0.21664914779747477,low +P0001,2025-06-29 12:00:00,0.0,low,0.14659203308306826,low +P0001,2025-06-29 18:00:00,0.0,low,0.3907238791454414,medium +P0001,2025-06-30 00:00:00,0.0,low,0.2555667005125585,low +P0001,2025-06-30 06:00:00,0.0,low,0.1808492240885146,low +P0001,2025-06-30 12:00:00,0.0,low,0.1897677666372176,low +P0001,2025-06-30 18:00:00,0.0075,low,0.25783281947384235,low +P0001,2025-07-01 00:00:00,0.0,low,0.20578938133046396,low +P0001,2025-07-01 06:00:00,0.0075,low,0.17590174339363496,low +P0001,2025-07-01 12:00:00,0.0,low,0.3416190991894992,medium +P0001,2025-07-01 18:00:00,0.0,low,0.15312150325216764,low +P0001,2025-07-02 00:00:00,0.0,low,0.16571660441700836,low +P0001,2025-07-02 06:00:00,0.0,low,0.25422674609940354,low +P0001,2025-07-02 12:00:00,0.0,low,0.17872436884708143,low +P0001,2025-07-02 18:00:00,0.0,low,0.18601424437563005,low +P0001,2025-07-03 00:00:00,0.0,low,0.23574837732114548,low +P0001,2025-07-03 06:00:00,0.0025,low,0.31450915875086655,medium +P0001,2025-07-03 12:00:00,0.0,low,0.15621943794465698,low +P0001,2025-07-03 18:00:00,0.0,low,0.2533707463206042,low +P0001,2025-07-04 00:00:00,0.005,low,0.307498383085606,medium +P0001,2025-07-04 06:00:00,0.0025,low,0.12371327547154719,low +P0001,2025-07-04 12:00:00,0.69,high,0.19843329061546972,low +P0001,2025-07-04 18:00:00,0.6675,high,0.28987883012635,low +P0001,2025-07-05 00:00:00,0.6025,high,0.19784138434784307,low +P0001,2025-07-05 06:00:00,0.8425,high,0.15006040392402015,low +P0001,2025-07-05 12:00:00,0.71,high,0.19156641486550216,low +P0001,2025-07-05 18:00:00,0.645,high,0.12059471100866129,low +P0001,2025-07-06 00:00:00,0.735,high,0.16836614312168982,low +P0001,2025-07-06 06:00:00,0.835,high,0.22568598615421057,low +P0001,2025-07-06 12:00:00,0.785,high,0.09843717219962471,low +P0001,2025-07-06 18:00:00,0.385,medium,0.12525766254740492,low +P0001,2025-07-07 00:00:00,0.815,high,0.19223935876895162,low +P0001,2025-07-07 06:00:00,0.125,low,0.10424801015367326,low +P0001,2025-07-07 12:00:00,0.055,low,0.10228014323621577,low +P0001,2025-07-07 18:00:00,0.045,low,0.2418247602835831,low +P0001,2025-07-08 00:00:00,0.025,low,0.16917397280909202,low +P0001,2025-07-08 06:00:00,0.005,low,0.2014950685171181,low +P0001,2025-07-08 12:00:00,0.0125,low,0.25443397622659303,low +P0001,2025-07-08 18:00:00,0.005,low,0.21684319598959528,low +P0001,2025-07-09 00:00:00,0.05,low,0.2319772311631711,low +P0001,2025-07-09 06:00:00,0.065,low,0.14152061379194153,low +P0001,2025-07-09 12:00:00,0.085,low,0.1693515751469625,low +P0001,2025-07-09 18:00:00,0.0775,low,0.21483459232797425,low +P0001,2025-07-10 00:00:00,0.165,low,0.22381117556832403,low +P0001,2025-07-10 06:00:00,0.0675,low,0.2528467162565036,low +P0001,2025-07-10 12:00:00,0.095,low,0.14173922299921202,low +P0001,2025-07-10 18:00:00,0.0625,low,0.11583873320415057,low +P0001,2025-07-11 00:00:00,0.07,low,0.1461312417413226,low +P0001,2025-07-11 06:00:00,0.0225,low,0.12786169963322724,low +P0001,2025-07-11 12:00:00,0.0125,low,0.1404529224380708,low +P0001,2025-07-11 18:00:00,0.0175,low,0.23442732973157426,low +P0001,2025-07-12 00:00:00,0.03,low,0.1314380761518254,low +P0001,2025-07-12 06:00:00,0.0,low,0.13050897952773727,low +P0001,2025-07-12 12:00:00,0.0375,low,0.13110188798562572,low +P0001,2025-07-12 18:00:00,0.115,low,0.202525175881026,low +P0001,2025-07-13 00:00:00,0.025,low,0.18310619187498517,low +P0001,2025-07-13 06:00:00,0.0325,low,0.26754107926002924,low +P0001,2025-07-13 12:00:00,0.76,high,0.081267248678622,low +P0001,2025-07-13 18:00:00,0.1875,low,0.12372761861604528,low +P0001,2025-07-14 00:00:00,0.0775,low,0.18697662351920885,low +P0001,2025-07-14 06:00:00,0.025,low,0.2963477319334081,low +P0001,2025-07-14 12:00:00,0.0125,low,0.3696184953612849,medium +P0001,2025-07-14 18:00:00,0.845,high,0.17625511261030402,low +P0001,2025-07-15 00:00:00,0.72,high,0.19264291358945623,low +P0001,2025-07-15 06:00:00,0.9475,high,0.19110282156307895,low +P0001,2025-07-15 12:00:00,0.5525,medium,0.12939671672173916,low +P0001,2025-07-15 18:00:00,0.975,high,0.2819614052169838,low +P0001,2025-07-16 00:00:00,0.8525,high,0.09739079296619961,low +P0001,2025-07-16 06:00:00,0.86,high,0.1556317281356007,low +P0001,2025-07-16 12:00:00,0.855,high,0.10656164335245093,low +P0001,2025-07-16 18:00:00,0.8475,high,0.09438912736102562,low +P0001,2025-07-17 00:00:00,0.7675,high,0.0940017426491267,low +P0001,2025-07-17 06:00:00,0.9425,high,0.09434468173338284,low +P0001,2025-07-17 12:00:00,0.865,high,0.1376257266004481,low +P0001,2025-07-17 18:00:00,0.8275,high,0.19597220294587608,low +P0001,2025-07-18 00:00:00,0.435,medium,0.08632182689745771,low +P0001,2025-07-18 06:00:00,0.6975,high,0.08242193291624456,low +P0001,2025-07-18 12:00:00,0.7775,high,0.08594159189969477,low +P0001,2025-07-18 18:00:00,0.205,low,0.17197547858451104,low +P0001,2025-07-19 00:00:00,0.04,low,0.09396767519966776,low +P0001,2025-07-19 06:00:00,0.76,high,0.27755329631529374,low +P0001,2025-07-19 12:00:00,0.7275,high,0.11828185868712512,low +P0001,2025-07-19 18:00:00,0.78,high,0.1566864118268897,low +P0001,2025-07-20 00:00:00,0.81,high,0.14738058009598629,low +P0001,2025-07-20 06:00:00,0.435,medium,0.19750631141180922,low +P0001,2025-07-20 12:00:00,0.24,low,0.15139904661041886,low +P0001,2025-07-20 18:00:00,0.8575,high,0.11812705191987,low +P0001,2025-07-21 00:00:00,0.7975,high,0.10607512930401977,low +P0001,2025-07-21 06:00:00,0.0775,low,0.10964155091417592,low +P0001,2025-07-21 12:00:00,0.0875,low,0.1512354448358746,low +P0001,2025-07-21 18:00:00,0.7925,high,0.1283698999169995,low +P0001,2025-07-22 00:00:00,0.715,high,0.16055471289381565,low +P0001,2025-07-22 06:00:00,0.0825,low,0.22124364647164207,low +P0001,2025-07-22 12:00:00,0.7925,high,0.1910409245135426,low +P0001,2025-07-22 18:00:00,0.735,high,0.22602841520090847,low +P0001,2025-07-23 00:00:00,0.78,high,0.17446950870331818,low +P0001,2025-07-23 06:00:00,0.7925,high,0.1178600634338368,low +P0001,2025-07-23 12:00:00,0.88,high,0.22521874688419993,low +P0001,2025-07-23 18:00:00,0.8925,high,0.11933635850843359,low +P0001,2025-07-24 00:00:00,0.955,high,0.19264602096674305,low +P0001,2025-07-24 06:00:00,0.9575,high,0.21152809306709086,low +P0001,2025-07-24 12:00:00,0.6225,high,0.12308631427229666,low +P0001,2025-07-24 18:00:00,0.8375,high,0.12036636680613769,low +P0001,2025-07-25 00:00:00,0.78,high,0.15194654152899578,low +P0001,2025-07-25 06:00:00,0.7175,high,0.05893542054919823,low +P0001,2025-07-25 12:00:00,0.13,low,0.165496930585002,low +P0001,2025-07-25 18:00:00,0.065,low,0.17227727590236425,low +P0001,2025-07-26 00:00:00,0.18,low,0.13324294759301952,low +P0001,2025-07-26 06:00:00,0.0575,low,0.08934885909114484,low +P0001,2025-07-26 12:00:00,0.0275,low,0.09738572821655916,low +P0001,2025-07-26 18:00:00,0.04,low,0.2044107363460303,low +P0001,2025-07-27 00:00:00,0.6625,high,0.1544527914470802,low +P0001,2025-07-27 06:00:00,0.0225,low,0.11996989834460364,low +P0001,2025-07-27 12:00:00,0.035,low,0.17753870568249092,low +P0001,2025-07-27 18:00:00,0.1425,low,0.20379470693392376,low +P0001,2025-07-28 00:00:00,0.025,low,0.2591738666511459,low +P0001,2025-07-28 06:00:00,0.0475,low,0.3635505104694242,medium +P0001,2025-07-28 12:00:00,0.015,low,0.18042166080720023,low +P0001,2025-07-28 18:00:00,0.05,low,0.1976448481943118,low +P0001,2025-07-29 00:00:00,0.01,low,0.18637274325449033,low +P0001,2025-07-29 06:00:00,0.02,low,0.10064067468741869,low +P0001,2025-07-29 12:00:00,0.03,low,0.20675476363772896,low +P0001,2025-07-29 18:00:00,0.0125,low,0.20584076277617827,low +P0001,2025-07-30 00:00:00,0.4225,medium,0.19593185688293094,low +P0001,2025-07-30 06:00:00,0.06,low,0.23265895315154433,low +P0001,2025-07-30 12:00:00,0.0975,low,0.2629030335589205,low +P0001,2025-07-30 18:00:00,0.685,high,0.18330426696219596,low +P0002,2025-06-03 18:00:00,0.01,low,0.2178251492273316,low +P0002,2025-06-04 00:00:00,0.0075,low,0.23126965035484096,low +P0002,2025-06-04 06:00:00,0.005,low,0.12162877507468624,low +P0002,2025-06-04 12:00:00,0.0325,low,0.1437863826903571,low +P0002,2025-06-04 18:00:00,0.01,low,0.2286254544727989,low +P0002,2025-06-05 00:00:00,0.9025,high,0.09393384326295914,low +P0002,2025-06-05 06:00:00,0.0,low,0.12253398359951405,low +P0002,2025-06-05 12:00:00,0.0025,low,0.15056150876710397,low +P0002,2025-06-05 18:00:00,0.0025,low,0.13518102942964635,low +P0002,2025-06-06 00:00:00,0.0025,low,0.10628083892671575,low +P0002,2025-06-06 06:00:00,0.0,low,0.3112989534103841,medium +P0002,2025-06-06 12:00:00,0.0,low,0.29650562767783983,low +P0002,2025-06-06 18:00:00,0.0,low,0.20168501697087435,low +P0002,2025-06-07 00:00:00,0.0,low,0.1839035549758984,low +P0002,2025-06-07 06:00:00,0.0,low,0.15278644019413484,low +P0002,2025-06-07 12:00:00,0.0,low,0.1291062602481306,low +P0002,2025-06-07 18:00:00,0.0,low,0.2870872494327241,low +P0002,2025-06-08 00:00:00,0.0,low,0.2939279310778017,low +P0002,2025-06-08 06:00:00,0.0,low,0.1358521626960453,low +P0002,2025-06-08 12:00:00,0.0,low,0.22378783829782747,low +P0002,2025-06-08 18:00:00,0.0,low,0.13012376226505878,low +P0002,2025-06-09 00:00:00,0.0975,low,0.16452324365947066,low +P0002,2025-06-09 06:00:00,0.68,high,0.25781496613623345,low +P0002,2025-06-09 12:00:00,0.86,high,0.25636961496965655,low +P0002,2025-06-09 18:00:00,0.8875,high,0.2740576195955108,low +P0002,2025-06-10 00:00:00,0.115,low,0.3167026288160792,medium +P0002,2025-06-10 06:00:00,0.135,low,0.15149058613466246,low +P0002,2025-06-10 12:00:00,0.0125,low,0.10976557320619812,low +P0002,2025-06-10 18:00:00,0.0075,low,0.22130271871737586,low +P0002,2025-06-11 00:00:00,0.0025,low,0.35902083656588984,medium +P0002,2025-06-11 06:00:00,0.03,low,0.16049030792803892,low +P0002,2025-06-11 12:00:00,0.01,low,0.26565465044736564,low +P0002,2025-06-11 18:00:00,0.055,low,0.19932108812716878,low +P0002,2025-06-12 00:00:00,0.0125,low,0.1394816483341829,low +P0002,2025-06-12 06:00:00,0.015,low,0.11622171042314194,low +P0002,2025-06-12 12:00:00,0.0,low,0.19306426510154148,low +P0002,2025-06-12 18:00:00,0.0,low,0.22092544994665217,low +P0002,2025-06-13 00:00:00,0.0,low,0.3995104941098836,medium +P0002,2025-06-13 06:00:00,0.0,low,0.09817247479146884,low +P0002,2025-06-13 12:00:00,0.0025,low,0.16868419075036492,low +P0002,2025-06-13 18:00:00,0.0,low,0.24319615557509155,low +P0002,2025-06-14 00:00:00,0.0025,low,0.1474046148791467,low +P0002,2025-06-14 06:00:00,0.005,low,0.1711393872723053,low +P0002,2025-06-14 12:00:00,0.0075,low,0.14870690449169754,low +P0002,2025-06-14 18:00:00,0.01,low,0.2905185053303424,low +P0002,2025-06-15 00:00:00,0.0,low,0.2877312725708064,low +P0002,2025-06-15 06:00:00,0.0,low,0.29666384650691296,low +P0002,2025-06-15 12:00:00,0.0025,low,0.32692717698210894,medium +P0002,2025-06-15 18:00:00,0.0,low,0.19763272554950215,low +P0002,2025-06-16 00:00:00,0.0,low,0.1504017849216822,low +P0002,2025-06-16 06:00:00,0.0025,low,0.14328998593646558,low +P0002,2025-06-16 12:00:00,0.0,low,0.2154059574429548,low +P0002,2025-06-16 18:00:00,0.005,low,0.1659262008111249,low +P0002,2025-06-17 00:00:00,0.0,low,0.3445856931959585,medium +P0002,2025-06-17 06:00:00,0.0,low,0.31225030907625756,medium +P0002,2025-06-17 12:00:00,0.0025,low,0.08654441634646665,low +P0002,2025-06-17 18:00:00,0.0225,low,0.1276550526648222,low +P0002,2025-06-18 00:00:00,0.0125,low,0.23830210544609676,low +P0002,2025-06-18 06:00:00,0.015,low,0.19702664423007923,low +P0002,2025-06-18 12:00:00,0.0925,low,0.21135720214787299,low +P0002,2025-06-18 18:00:00,0.025,low,0.16541662585737582,low +P0002,2025-06-19 00:00:00,0.005,low,0.22591657711978297,low +P0002,2025-06-19 06:00:00,0.04,low,0.1313367719504402,low +P0002,2025-06-19 12:00:00,0.0375,low,0.1625674851427417,low +P0002,2025-06-19 18:00:00,0.005,low,0.20449311133063783,low +P0002,2025-06-20 00:00:00,0.005,low,0.12569664334750358,low +P0002,2025-06-20 06:00:00,0.0025,low,0.17626284832436653,low +P0002,2025-06-20 12:00:00,0.0025,low,0.13683638197077147,low +P0002,2025-06-20 18:00:00,0.0,low,0.20630991166340448,low +P0002,2025-06-21 00:00:00,0.0,low,0.15149003850566906,low +P0002,2025-06-21 06:00:00,0.0,low,0.14716841547124346,low +P0002,2025-06-21 12:00:00,0.0,low,0.09058800673666632,low +P0002,2025-06-21 18:00:00,0.0,low,0.18455565735783744,low +P0002,2025-06-22 00:00:00,0.0,low,0.17597255070241094,low +P0002,2025-06-22 06:00:00,0.0,low,0.14769270943373541,low +P0002,2025-06-22 12:00:00,0.0,low,0.11724205310755931,low +P0002,2025-06-22 18:00:00,0.0,low,0.15630373363410224,low +P0002,2025-06-23 00:00:00,0.0,low,0.2903551602082377,low +P0002,2025-06-23 06:00:00,0.0,low,0.23433532944619992,low +P0002,2025-06-23 12:00:00,0.0,low,0.32053304182055875,medium +P0002,2025-06-23 18:00:00,0.0,low,0.10894624767363281,low +P0002,2025-06-24 00:00:00,0.0,low,0.20748291577274997,low +P0002,2025-06-24 06:00:00,0.0,low,0.09991117066610179,low +P0002,2025-06-24 12:00:00,0.0,low,0.2261096249247711,low +P0002,2025-06-24 18:00:00,0.0,low,0.14974980523728762,low +P0002,2025-06-25 00:00:00,0.0,low,0.2967640325912999,low +P0002,2025-06-25 06:00:00,0.0,low,0.3666544414792195,medium +P0002,2025-06-25 12:00:00,0.0,low,0.28777500710250115,low +P0002,2025-06-25 18:00:00,0.0,low,0.3041549354910609,medium +P0002,2025-06-26 00:00:00,0.0,low,0.13489277372316175,low +P0002,2025-06-26 06:00:00,0.0,low,0.16426177200249978,low +P0002,2025-06-26 12:00:00,0.0,low,0.2962172090343628,low +P0002,2025-06-26 18:00:00,0.0,low,0.1947808675360421,low +P0002,2025-06-27 00:00:00,0.0,low,0.23465261721316763,low +P0002,2025-06-27 06:00:00,0.0,low,0.22392205971532708,low +P0002,2025-06-27 12:00:00,0.0,low,0.1489151986736526,low +P0002,2025-06-27 18:00:00,0.0,low,0.14326473213602217,low +P0002,2025-06-28 00:00:00,0.0,low,0.14819171005650358,low +P0002,2025-06-28 06:00:00,0.0,low,0.18039955633964444,low +P0002,2025-06-28 12:00:00,0.0025,low,0.0982159666019747,low +P0002,2025-06-28 18:00:00,0.0,low,0.16369889546430896,low +P0002,2025-06-29 00:00:00,0.0,low,0.15526313171750228,low +P0002,2025-06-29 06:00:00,0.0,low,0.16348796430525028,low +P0002,2025-06-29 12:00:00,0.0,low,0.22528786326001832,low +P0002,2025-06-29 18:00:00,0.0,low,0.2334431789985866,low +P0002,2025-06-30 00:00:00,0.005,low,0.25870525347599177,low +P0002,2025-06-30 06:00:00,0.005,low,0.14562787898229432,low +P0002,2025-06-30 12:00:00,0.0075,low,0.2395023994412266,low +P0002,2025-06-30 18:00:00,0.0275,low,0.13431899794649318,low +P0003,2025-06-03 18:00:00,0.0,low,0.1918317949654556,low +P0003,2025-06-04 00:00:00,0.0,low,0.1289637542212128,low +P0003,2025-06-04 06:00:00,0.0,low,0.24819555842942115,low +P0003,2025-06-04 12:00:00,0.0025,low,0.18168999606546998,low +P0003,2025-06-04 18:00:00,0.0,low,0.28827442934370306,low +P0003,2025-06-05 00:00:00,0.0,low,0.30318059676032405,medium +P0003,2025-06-05 06:00:00,0.0,low,0.13805919341320708,low +P0003,2025-06-05 12:00:00,0.0,low,0.2612916543675767,low +P0003,2025-06-05 18:00:00,0.0,low,0.25324109121695326,low +P0003,2025-06-06 00:00:00,0.0,low,0.2870703512415069,low +P0003,2025-06-06 06:00:00,0.0,low,0.22647426166826354,low +P0003,2025-06-06 12:00:00,0.0,low,0.22588839042323536,low +P0003,2025-06-06 18:00:00,0.0,low,0.14336942493573243,low +P0003,2025-06-07 00:00:00,0.0,low,0.14357304678109709,low +P0003,2025-06-07 06:00:00,0.0,low,0.14897286182006617,low +P0003,2025-06-07 12:00:00,0.0,low,0.3662220644356613,medium +P0003,2025-06-07 18:00:00,0.0,low,0.12119931112173828,low +P0003,2025-06-08 00:00:00,0.0,low,0.18079228776339296,low +P0003,2025-06-08 06:00:00,0.0,low,0.15724168305953726,low +P0003,2025-06-08 12:00:00,0.0,low,0.1811118060565844,low +P0003,2025-06-08 18:00:00,0.0,low,0.209135221415436,low +P0003,2025-06-09 00:00:00,0.0,low,0.2315970683455609,low +P0003,2025-06-09 06:00:00,0.0,low,0.2836090366638503,low +P0003,2025-06-09 12:00:00,0.0,low,0.14809668224572614,low +P0003,2025-06-09 18:00:00,0.0,low,0.25756486113368127,low +P0003,2025-06-10 00:00:00,0.0,low,0.2535990166953042,low +P0003,2025-06-10 06:00:00,0.005,low,0.2922339658154423,low +P0003,2025-06-10 12:00:00,0.005,low,0.08836192146844359,low +P0003,2025-06-10 18:00:00,0.0,low,0.24382759957401834,low +P0003,2025-06-11 00:00:00,0.0,low,0.11229261756955135,low +P0003,2025-06-11 06:00:00,0.0,low,0.3158764538725532,medium +P0003,2025-06-11 12:00:00,0.0,low,0.10256111924200532,low +P0003,2025-06-11 18:00:00,0.0,low,0.1735078712956207,low +P0003,2025-06-12 00:00:00,0.0,low,0.17029915413281405,low +P0003,2025-06-12 06:00:00,0.0,low,0.3771985570318584,medium +P0003,2025-06-12 12:00:00,0.0,low,0.11962858368826769,low +P0003,2025-06-12 18:00:00,0.0175,low,0.16447937884307848,low +P0003,2025-06-13 00:00:00,0.01,low,0.3911727474882275,medium +P0003,2025-06-13 06:00:00,0.025,low,0.13275865314775245,low +P0003,2025-06-13 12:00:00,0.0225,low,0.11896876749156088,low +P0003,2025-06-13 18:00:00,0.1625,low,0.2291413270894332,low +P0003,2025-06-14 00:00:00,0.155,low,0.22275501896428618,low +P0003,2025-06-14 06:00:00,0.065,low,0.12186492301735623,low +P0003,2025-06-14 12:00:00,0.1825,low,0.19834600737859878,low +P0003,2025-06-14 18:00:00,0.16,low,0.2287075381024881,low +P0003,2025-06-15 00:00:00,0.1875,low,0.07449416783305123,low +P0003,2025-06-15 06:00:00,0.125,low,0.09848796997006673,low +P0003,2025-06-15 12:00:00,0.025,low,0.1534570888230845,low +P0003,2025-06-15 18:00:00,0.0,low,0.1369121863429604,low +P0003,2025-06-16 00:00:00,0.005,low,0.14383261241889655,low +P0003,2025-06-16 06:00:00,0.0,low,0.20865305912626692,low +P0003,2025-06-16 12:00:00,0.0,low,0.15388877128837955,low +P0003,2025-06-16 18:00:00,0.0,low,0.1891933333230145,low +P0003,2025-06-17 00:00:00,0.0,low,0.19169912287768948,low +P0003,2025-06-17 06:00:00,0.0,low,0.14273952358282055,low +P0003,2025-06-17 12:00:00,0.0,low,0.1408043464949983,low +P0003,2025-06-17 18:00:00,0.0,low,0.1833508822444547,low +P0003,2025-06-18 00:00:00,0.0025,low,0.22916434189083185,low +P0003,2025-06-18 06:00:00,0.005,low,0.17373198886510305,low +P0003,2025-06-18 12:00:00,0.005,low,0.21449679127826546,low +P0003,2025-06-18 18:00:00,0.0,low,0.21806583067211355,low +P0003,2025-06-19 00:00:00,0.005,low,0.3358887557650147,medium +P0003,2025-06-19 06:00:00,0.0025,low,0.205095330178897,low +P0003,2025-06-19 12:00:00,0.01,low,0.2949753305574196,low +P0003,2025-06-19 18:00:00,0.0075,low,0.14483715094181462,low +P0003,2025-06-20 00:00:00,0.0,low,0.1798782368238836,low +P0003,2025-06-20 06:00:00,0.0025,low,0.28266872644497815,low +P0003,2025-06-20 12:00:00,0.0025,low,0.16075055313610132,low +P0003,2025-06-20 18:00:00,0.0,low,0.18472573277525878,low +P0003,2025-06-21 00:00:00,0.005,low,0.12503395719551538,low +P0003,2025-06-21 06:00:00,0.0,low,0.1923803879263653,low +P0003,2025-06-21 12:00:00,0.0,low,0.2344736905360437,low +P0003,2025-06-21 18:00:00,0.0,low,0.2303228033757696,low +P0003,2025-06-22 00:00:00,0.0,low,0.29276112012404865,low +P0003,2025-06-22 06:00:00,0.0,low,0.21435043509985868,low +P0003,2025-06-22 12:00:00,0.0,low,0.1344442414398942,low +P0003,2025-06-22 18:00:00,0.0,low,0.15062205736432666,low +P0003,2025-06-23 00:00:00,0.03,low,0.14670983613744662,low +P0003,2025-06-23 06:00:00,0.02,low,0.23438445917265371,low +P0003,2025-06-23 12:00:00,0.0275,low,0.12151485338829532,low +P0003,2025-06-23 18:00:00,0.0075,low,0.2684626367538168,low +P0003,2025-06-24 00:00:00,0.0075,low,0.17786825619966873,low +P0003,2025-06-24 06:00:00,0.005,low,0.1647305229119684,low +P0003,2025-06-24 12:00:00,0.0525,low,0.12677072951831003,low +P0003,2025-06-24 18:00:00,0.1525,low,0.15015425640228772,low +P0003,2025-06-25 00:00:00,0.2325,low,0.17464519865773936,low +P0003,2025-06-25 06:00:00,0.1275,low,0.1764563538046459,low +P0003,2025-06-25 12:00:00,0.1975,low,0.15643500729461413,low +P0003,2025-06-25 18:00:00,0.67,high,0.08885709368754398,low +P0003,2025-06-26 00:00:00,0.01,low,0.1551910503935759,low +P0003,2025-06-26 06:00:00,0.0175,low,0.2248805968181269,low +P0003,2025-06-26 12:00:00,0.0075,low,0.08593597466232536,low +P0003,2025-06-26 18:00:00,0.005,low,0.33146140167830923,medium +P0003,2025-06-27 00:00:00,0.005,low,0.13763917349022142,low +P0003,2025-06-27 06:00:00,0.0275,low,0.08471051904828068,low +P0003,2025-06-27 12:00:00,0.0375,low,0.18219203174163148,low +P0003,2025-06-27 18:00:00,0.015,low,0.046438414571840524,low +P0003,2025-06-28 00:00:00,0.005,low,0.16145870722062705,low +P0003,2025-06-28 06:00:00,0.0,low,0.21318570513943597,low +P0003,2025-06-28 12:00:00,0.0,low,0.2186386544406676,low +P0003,2025-06-28 18:00:00,0.0025,low,0.10028284396372683,low +P0003,2025-06-29 00:00:00,0.0025,low,0.19695764377294916,low +P0003,2025-06-29 06:00:00,0.0,low,0.23955186272546908,low +P0003,2025-06-29 12:00:00,0.0,low,0.10696190386288297,low +P0003,2025-06-29 18:00:00,0.0,low,0.3181210450028814,medium +P0003,2025-06-30 00:00:00,0.0,low,0.16692702191488804,low +P0003,2025-06-30 06:00:00,0.0125,low,0.13324751023835127,low +P0003,2025-06-30 12:00:00,0.0,low,0.23832256904804755,low +P0003,2025-06-30 18:00:00,0.0,low,0.46998981497308423,medium +P0004,2025-06-03 18:00:00,0.0,low,0.21766648285887855,low +P0004,2025-06-04 00:00:00,0.0,low,0.11491007737662844,low +P0004,2025-06-04 06:00:00,0.0,low,0.21622195160182472,low +P0004,2025-06-04 12:00:00,0.0075,low,0.1375491495540627,low +P0004,2025-06-04 18:00:00,0.0025,low,0.12759661516360393,low +P0004,2025-06-05 00:00:00,0.0075,low,0.1471309335270828,low +P0004,2025-06-05 06:00:00,0.0,low,0.21340087873110367,low +P0004,2025-06-05 12:00:00,0.0,low,0.1759204798950509,low +P0004,2025-06-05 18:00:00,0.0025,low,0.14419148543252627,low +P0004,2025-06-06 00:00:00,0.015,low,0.22667136833465337,low +P0004,2025-06-06 06:00:00,0.0925,low,0.12377719963818454,low +P0004,2025-06-06 12:00:00,0.19,low,0.10739630148164522,low +P0004,2025-06-06 18:00:00,0.315,medium,0.18915716811135896,low +P0004,2025-06-07 00:00:00,0.7275,high,0.19983260069797623,low +P0004,2025-06-07 06:00:00,0.8125,high,0.2721456789885699,low +P0004,2025-06-07 12:00:00,0.0175,low,0.09447477788350478,low +P0004,2025-06-07 18:00:00,0.0325,low,0.1487502713993013,low +P0004,2025-06-08 00:00:00,0.085,low,0.26841539681839466,low +P0004,2025-06-08 06:00:00,0.0425,low,0.3133974473898404,medium +P0004,2025-06-08 12:00:00,0.635,high,0.07722152760810838,low +P0004,2025-06-08 18:00:00,0.0,low,0.16992466582105803,low +P0004,2025-06-09 00:00:00,0.0025,low,0.183781170133488,low +P0004,2025-06-09 06:00:00,0.0,low,0.3236236018713351,medium +P0004,2025-06-09 12:00:00,0.0,low,0.40706094768161016,medium +P0004,2025-06-09 18:00:00,0.0,low,0.395589481628734,medium +P0004,2025-06-10 00:00:00,0.0,low,0.18590479323375117,low +P0004,2025-06-10 06:00:00,0.0,low,0.22796599129272335,low +P0004,2025-06-10 12:00:00,0.0,low,0.28434094685861677,low +P0004,2025-06-10 18:00:00,0.0,low,0.252642952076768,low +P0004,2025-06-11 00:00:00,0.0,low,0.16662865049195455,low +P0004,2025-06-11 06:00:00,0.0,low,0.1357081926812095,low +P0004,2025-06-11 12:00:00,0.0,low,0.1767035283398719,low +P0004,2025-06-11 18:00:00,0.0025,low,0.12078922054900997,low +P0004,2025-06-12 00:00:00,0.0,low,0.26968966146222484,low +P0004,2025-06-12 06:00:00,0.0,low,0.15025815687602184,low +P0004,2025-06-12 12:00:00,0.0,low,0.21804388425825522,low +P0004,2025-06-12 18:00:00,0.0,low,0.14607823194594485,low +P0004,2025-06-13 00:00:00,0.01,low,0.1391830230457915,low +P0004,2025-06-13 06:00:00,0.0025,low,0.3066875556290554,medium +P0004,2025-06-13 12:00:00,0.0,low,0.14977341552487286,low +P0004,2025-06-13 18:00:00,0.005,low,0.17212535511989369,low +P0004,2025-06-14 00:00:00,0.0,low,0.30541146586065454,medium +P0004,2025-06-14 06:00:00,0.0025,low,0.23509900672972356,low +P0004,2025-06-14 12:00:00,0.0,low,0.291147010488926,low +P0004,2025-06-14 18:00:00,0.0,low,0.1794895030286409,low +P0004,2025-06-15 00:00:00,0.0025,low,0.1595475852717586,low +P0004,2025-06-15 06:00:00,0.0,low,0.2170054234113353,low +P0004,2025-06-15 12:00:00,0.0025,low,0.131870717269718,low +P0004,2025-06-15 18:00:00,0.0,low,0.3988707852651004,medium +P0004,2025-06-16 00:00:00,0.0,low,0.3134232254397461,medium +P0004,2025-06-16 06:00:00,0.0,low,0.17563195199254725,low +P0004,2025-06-16 12:00:00,0.0,low,0.1434562931000613,low +P0004,2025-06-16 18:00:00,0.0025,low,0.21508952396279563,low +P0004,2025-06-17 00:00:00,0.0,low,0.2580298997685982,low +P0004,2025-06-17 06:00:00,0.0,low,0.2201308158265144,low +P0004,2025-06-17 12:00:00,0.0,low,0.1354628437186897,low +P0004,2025-06-17 18:00:00,0.0,low,0.25948872791301586,low +P0004,2025-06-18 00:00:00,0.0,low,0.16210057786254245,low +P0004,2025-06-18 06:00:00,0.0,low,0.25453667916193334,low +P0004,2025-06-18 12:00:00,0.0,low,0.25451930850807064,low +P0004,2025-06-18 18:00:00,0.01,low,0.1664984961626741,low +P0004,2025-06-19 00:00:00,0.015,low,0.16733886269279083,low +P0004,2025-06-19 06:00:00,0.005,low,0.28216404747856333,low +P0004,2025-06-19 12:00:00,0.01,low,0.12028621599444325,low +P0004,2025-06-19 18:00:00,0.0025,low,0.2912639064995456,low +P0004,2025-06-20 00:00:00,0.0075,low,0.1685860178422987,low +P0004,2025-06-20 06:00:00,0.0125,low,0.2051545783479615,low +P0004,2025-06-20 12:00:00,0.0025,low,0.17626284832436653,low +P0004,2025-06-20 18:00:00,0.0125,low,0.13793993257916107,low +P0004,2025-06-21 00:00:00,0.0,low,0.09911449426593166,low +P0004,2025-06-21 06:00:00,0.0075,low,0.12597278975781379,low +P0004,2025-06-21 12:00:00,0.0075,low,0.15103155426160284,low +P0004,2025-06-21 18:00:00,0.0,low,0.24470440480528402,low +P0004,2025-06-22 00:00:00,0.0025,low,0.20330420454222886,low +P0004,2025-06-22 06:00:00,0.0075,low,0.28313748322594834,low +P0004,2025-06-22 12:00:00,0.0,low,0.20765280357266994,low +P0004,2025-06-22 18:00:00,0.0,low,0.20614016308671668,low +P0004,2025-06-23 00:00:00,0.0025,low,0.14691947128553073,low +P0004,2025-06-23 06:00:00,0.01,low,0.1577446505334496,low +P0004,2025-06-23 12:00:00,0.0025,low,0.1274260145937722,low +P0004,2025-06-23 18:00:00,0.0,low,0.16230963890476588,low +P0004,2025-06-24 00:00:00,0.0225,low,0.09482927325935776,low +P0004,2025-06-24 06:00:00,0.0,low,0.141886962308287,low +P0004,2025-06-24 12:00:00,0.0,low,0.16043817535847882,low +P0004,2025-06-24 18:00:00,0.0,low,0.1974435704414648,low +P0004,2025-06-25 00:00:00,0.0,low,0.24142397302616628,low +P0004,2025-06-25 06:00:00,0.0,low,0.15020207922307627,low +P0004,2025-06-25 12:00:00,0.0025,low,0.17566216866848927,low +P0004,2025-06-25 18:00:00,0.0,low,0.22646733326501933,low +P0004,2025-06-26 00:00:00,0.0025,low,0.2014249687268571,low +P0004,2025-06-26 06:00:00,0.0,low,0.2644170154594376,low +P0004,2025-06-26 12:00:00,0.0,low,0.2034925197068811,low +P0004,2025-06-26 18:00:00,0.005,low,0.12225002378924414,low +P0004,2025-06-27 00:00:00,0.0025,low,0.11738239204446244,low +P0004,2025-06-27 06:00:00,0.0125,low,0.10228246467029967,low +P0004,2025-06-27 12:00:00,0.025,low,0.1912909275564158,low +P0004,2025-06-27 18:00:00,0.0225,low,0.1750368539195892,low +P0004,2025-06-28 00:00:00,0.025,low,0.2783466455701866,low +P0004,2025-06-28 06:00:00,0.0175,low,0.1018520758322191,low +P0004,2025-06-28 12:00:00,0.075,low,0.12653829799543034,low +P0004,2025-06-28 18:00:00,0.7675,high,0.11583833695891288,low +P0004,2025-06-29 00:00:00,0.7575,high,0.20232271762809131,low +P0004,2025-06-29 06:00:00,0.875,high,0.2083156810223385,low +P0004,2025-06-29 12:00:00,0.73,high,0.11166686458187912,low +P0004,2025-06-29 18:00:00,0.015,low,0.2640905625489237,low +P0004,2025-06-30 00:00:00,0.0225,low,0.12547418838010327,low +P0004,2025-06-30 06:00:00,0.0,low,0.2906304012336389,low +P0004,2025-06-30 12:00:00,0.0025,low,0.1439726769353493,low +P0004,2025-06-30 18:00:00,0.0025,low,0.13676913204272229,low +P0005,2025-06-03 18:00:00,0.0075,low,0.0784274263615621,low +P0005,2025-06-04 00:00:00,0.0175,low,0.12400464549475407,low +P0005,2025-06-04 06:00:00,0.035,low,0.31463885529437763,medium +P0005,2025-06-04 12:00:00,0.0175,low,0.21979976092229644,low +P0005,2025-06-04 18:00:00,0.0,low,0.22424601601082025,low +P0005,2025-06-05 00:00:00,0.0225,low,0.14780519362742756,low +P0005,2025-06-05 06:00:00,0.0,low,0.15369804787840816,low +P0005,2025-06-05 12:00:00,0.0,low,0.09073464366158074,low +P0005,2025-06-05 18:00:00,0.0,low,0.13511736278495362,low +P0005,2025-06-06 00:00:00,0.0,low,0.16581587192739258,low +P0005,2025-06-06 06:00:00,0.0,low,0.2398883501389239,low +P0005,2025-06-06 12:00:00,0.0,low,0.4272352850835665,medium +P0005,2025-06-06 18:00:00,0.0,low,0.27620883064463153,low +P0005,2025-06-07 00:00:00,0.0,low,0.1286621918058781,low +P0005,2025-06-07 06:00:00,0.0,low,0.2016810856987284,low +P0005,2025-06-07 12:00:00,0.0,low,0.21666597051453024,low +P0005,2025-06-07 18:00:00,0.0,low,0.1794050641514227,low +P0005,2025-06-08 00:00:00,0.0,low,0.221954279403409,low +P0005,2025-06-08 06:00:00,0.0025,low,0.27091284165369894,low +P0005,2025-06-08 12:00:00,0.0,low,0.3172749739608937,medium +P0005,2025-06-08 18:00:00,0.0025,low,0.16611983927382334,low +P0005,2025-06-09 00:00:00,0.0,low,0.23229636571937945,low +P0005,2025-06-09 06:00:00,0.005,low,0.090098914151673,low +P0005,2025-06-09 12:00:00,0.0225,low,0.20532498723940862,low +P0005,2025-06-09 18:00:00,0.025,low,0.17081091369147075,low +P0005,2025-06-10 00:00:00,0.04,low,0.2674774114323183,low +P0005,2025-06-10 06:00:00,0.1025,low,0.18392007019627515,low +P0005,2025-06-10 12:00:00,0.0175,low,0.13236032728297667,low +P0005,2025-06-10 18:00:00,0.01,low,0.21231675681100184,low +P0005,2025-06-11 00:00:00,0.02,low,0.1336352478983607,low +P0005,2025-06-11 06:00:00,0.005,low,0.13869304242759867,low +P0005,2025-06-11 12:00:00,0.0025,low,0.20682531787209318,low +P0005,2025-06-11 18:00:00,0.0075,low,0.21789973363048157,low +P0005,2025-06-12 00:00:00,0.005,low,0.1440600095161817,low +P0005,2025-06-12 06:00:00,0.01,low,0.12552014483063748,low +P0005,2025-06-12 12:00:00,0.0,low,0.14107442657559333,low +P0005,2025-06-12 18:00:00,0.0,low,0.3183882924879119,medium +P0005,2025-06-13 00:00:00,0.0,low,0.305752006205251,medium +P0005,2025-06-13 06:00:00,0.0,low,0.1472874761053649,low +P0005,2025-06-13 12:00:00,0.0,low,0.4089958975045776,medium +P0005,2025-06-13 18:00:00,0.0,low,0.15178568806321519,low +P0005,2025-06-14 00:00:00,0.0,low,0.20630082085840676,low +P0005,2025-06-14 06:00:00,0.0,low,0.2036978946820193,low +P0005,2025-06-14 12:00:00,0.0,low,0.219364412149652,low +P0005,2025-06-14 18:00:00,0.0025,low,0.2962337060462665,low +P0005,2025-06-15 00:00:00,0.0,low,0.17494475401921192,low +P0005,2025-06-15 06:00:00,0.0,low,0.1940283032965701,low +P0005,2025-06-15 12:00:00,0.0,low,0.16762402357454834,low +P0005,2025-06-15 18:00:00,0.0,low,0.21941885336825953,low +P0005,2025-06-16 00:00:00,0.0025,low,0.14182013090070872,low +P0005,2025-06-16 06:00:00,0.0075,low,0.31131523824665697,medium +P0005,2025-06-16 12:00:00,0.0025,low,0.3162270377695223,medium +P0005,2025-06-16 18:00:00,0.0,low,0.2691210291956172,low +P0005,2025-06-17 00:00:00,0.0,low,0.22488918348938208,low +P0005,2025-06-17 06:00:00,0.0,low,0.2222414475352336,low +P0005,2025-06-17 12:00:00,0.0,low,0.22052054151497477,low +P0005,2025-06-17 18:00:00,0.0025,low,0.22280138850801728,low +P0005,2025-06-18 00:00:00,0.0025,low,0.3009519182698524,medium +P0005,2025-06-18 06:00:00,0.0025,low,0.16363870001613304,low +P0005,2025-06-18 12:00:00,0.005,low,0.13891885559468903,low +P0005,2025-06-18 18:00:00,0.0125,low,0.2557959404706283,low +P0005,2025-06-19 00:00:00,0.0,low,0.15040471052661084,low +P0005,2025-06-19 06:00:00,0.0025,low,0.13436924227386263,low +P0005,2025-06-19 12:00:00,0.0,low,0.2513687980495747,low +P0005,2025-06-19 18:00:00,0.0,low,0.303046001851313,medium +P0005,2025-06-20 00:00:00,0.0,low,0.19182851303045073,low +P0005,2025-06-20 06:00:00,0.0,low,0.14128939381872652,low +P0005,2025-06-20 12:00:00,0.0,low,0.1809129275056263,low +P0005,2025-06-20 18:00:00,0.0,low,0.1922125451872896,low +P0005,2025-06-21 00:00:00,0.0,low,0.29508093168868316,low +P0005,2025-06-21 06:00:00,0.0,low,0.40684380917083846,medium +P0005,2025-06-21 12:00:00,0.0,low,0.23951462843723123,low +P0005,2025-06-21 18:00:00,0.0,low,0.0972319530562059,low +P0005,2025-06-22 00:00:00,0.0,low,0.26777693518546813,low +P0005,2025-06-22 06:00:00,0.0,low,0.27052385172865423,low +P0005,2025-06-22 12:00:00,0.0,low,0.1901202167298273,low +P0005,2025-06-22 18:00:00,0.0075,low,0.1135483897709067,low +P0005,2025-06-23 00:00:00,0.005,low,0.21829389641678262,low +P0005,2025-06-23 06:00:00,0.0,low,0.2504441917296325,low +P0005,2025-06-23 12:00:00,0.0025,low,0.15784579033511154,low +P0005,2025-06-23 18:00:00,0.0025,low,0.09436140432074933,low +P0005,2025-06-24 00:00:00,0.0,low,0.2758301568634848,low +P0005,2025-06-24 06:00:00,0.0025,low,0.2078552925470536,low +P0005,2025-06-24 12:00:00,0.0025,low,0.17297399181206213,low +P0005,2025-06-24 18:00:00,0.0,low,0.11169949862128163,low +P0005,2025-06-25 00:00:00,0.01,low,0.11053246614035224,low +P0005,2025-06-25 06:00:00,0.0025,low,0.2043374566509308,low +P0005,2025-06-25 12:00:00,0.005,low,0.16518120114330448,low +P0005,2025-06-25 18:00:00,0.0,low,0.1080046173653789,low +P0005,2025-06-26 00:00:00,0.0,low,0.2451903975257971,low +P0005,2025-06-26 06:00:00,0.0,low,0.25304956132911227,low +P0005,2025-06-26 12:00:00,0.0,low,0.17819082773836495,low +P0005,2025-06-26 18:00:00,0.0,low,0.2590508320325701,low +P0005,2025-06-27 00:00:00,0.0,low,0.381943394364083,medium +P0005,2025-06-27 06:00:00,0.0,low,0.1824443270804991,low +P0005,2025-06-27 12:00:00,0.0,low,0.17905704603568104,low +P0005,2025-06-27 18:00:00,0.0,low,0.0817255622587611,low +P0005,2025-06-28 00:00:00,0.0,low,0.10913489161811893,low +P0005,2025-06-28 06:00:00,0.0,low,0.22119770217149679,low +P0005,2025-06-28 12:00:00,0.0,low,0.14804119809433544,low +P0005,2025-06-28 18:00:00,0.0,low,0.18369045436062903,low +P0005,2025-06-29 00:00:00,0.0,low,0.163365116973275,low +P0005,2025-06-29 06:00:00,0.0,low,0.18116733768496202,low +P0005,2025-06-29 12:00:00,0.0,low,0.14611332525626042,low +P0005,2025-06-29 18:00:00,0.0,low,0.23391111966443923,low +P0005,2025-06-30 00:00:00,0.0025,low,0.2196412257763464,low +P0005,2025-06-30 06:00:00,0.0025,low,0.15388074246189068,low +P0005,2025-06-30 12:00:00,0.0,low,0.24015889204518734,low +P0005,2025-06-30 18:00:00,0.0,low,0.29635390441945614,low +P0006,2025-06-03 18:00:00,0.0,low,0.1278181799125288,low +P0006,2025-06-04 00:00:00,0.0,low,0.17677423630222772,low +P0006,2025-06-04 06:00:00,0.0,low,0.1975224641087176,low +P0006,2025-06-04 12:00:00,0.0,low,0.20311929180809876,low +P0006,2025-06-04 18:00:00,0.0,low,0.30825389890678034,medium +P0006,2025-06-05 00:00:00,0.0,low,0.15699997004623922,low +P0006,2025-06-05 06:00:00,0.0,low,0.19066884799600328,low +P0006,2025-06-05 12:00:00,0.0,low,0.2824865474978883,low +P0006,2025-06-05 18:00:00,0.0025,low,0.2084436619417684,low +P0006,2025-06-06 00:00:00,0.005,low,0.08181406468392535,low +P0006,2025-06-06 06:00:00,0.005,low,0.19981774634201618,low +P0006,2025-06-06 12:00:00,0.0,low,0.1347859285605414,low +P0006,2025-06-06 18:00:00,0.0,low,0.29150057622490555,low +P0006,2025-06-07 00:00:00,0.0,low,0.22159937265586072,low +P0006,2025-06-07 06:00:00,0.0,low,0.14237381770253973,low +P0006,2025-06-07 12:00:00,0.0,low,0.3365379354548717,medium +P0006,2025-06-07 18:00:00,0.0,low,0.2910012847350908,low +P0006,2025-06-08 00:00:00,0.0,low,0.12904598589851246,low +P0006,2025-06-08 06:00:00,0.0,low,0.2696941477370262,low +P0006,2025-06-08 12:00:00,0.0,low,0.13769920651683396,low +P0006,2025-06-08 18:00:00,0.0,low,0.1569588660733084,low +P0006,2025-06-09 00:00:00,0.0,low,0.3126692482549602,medium +P0006,2025-06-09 06:00:00,0.0,low,0.231733308890652,low +P0006,2025-06-09 12:00:00,0.0,low,0.1929248734321782,low +P0006,2025-06-09 18:00:00,0.005,low,0.2208104311955007,low +P0006,2025-06-10 00:00:00,0.0,low,0.17227825802320604,low +P0006,2025-06-10 06:00:00,0.0,low,0.21610052211346423,low +P0006,2025-06-10 12:00:00,0.0,low,0.17320113144288973,low +P0006,2025-06-10 18:00:00,0.0,low,0.2605596269556039,low +P0006,2025-06-11 00:00:00,0.0,low,0.2175582704434584,low +P0006,2025-06-11 06:00:00,0.0,low,0.24823707641050638,low +P0006,2025-06-11 12:00:00,0.0,low,0.18082287018318424,low +P0006,2025-06-11 18:00:00,0.0,low,0.27028700400329064,low +P0006,2025-06-12 00:00:00,0.0,low,0.2043741220788553,low +P0006,2025-06-12 06:00:00,0.0,low,0.1391093726802235,low +P0006,2025-06-12 12:00:00,0.0,low,0.3697447548046336,medium +P0006,2025-06-12 18:00:00,0.0,low,0.21266180121474662,low +P0006,2025-06-13 00:00:00,0.0,low,0.1252657211874245,low +P0006,2025-06-13 06:00:00,0.0,low,0.42958750168338977,medium +P0006,2025-06-13 12:00:00,0.0,low,0.13927343197398595,low +P0006,2025-06-13 18:00:00,0.0,low,0.15964489302940446,low +P0006,2025-06-14 00:00:00,0.0,low,0.18480945806204083,low +P0006,2025-06-14 06:00:00,0.0,low,0.2861258251375513,low +P0006,2025-06-14 12:00:00,0.0,low,0.21991495724024462,low +P0006,2025-06-14 18:00:00,0.0,low,0.38207853942777303,medium +P0006,2025-06-15 00:00:00,0.0,low,0.269904779878922,low +P0006,2025-06-15 06:00:00,0.0,low,0.14804102404473032,low +P0006,2025-06-15 12:00:00,0.0,low,0.21527598746587276,low +P0006,2025-06-15 18:00:00,0.0,low,0.2574969402655855,low +P0006,2025-06-16 00:00:00,0.0,low,0.1012664388272835,low +P0006,2025-06-16 06:00:00,0.0,low,0.12454882472171341,low +P0006,2025-06-16 12:00:00,0.0,low,0.12857226785248538,low +P0006,2025-06-16 18:00:00,0.0,low,0.4746188296591923,medium +P0006,2025-06-17 00:00:00,0.0,low,0.12099021848420449,low +P0006,2025-06-17 06:00:00,0.0,low,0.21226571245449033,low +P0006,2025-06-17 12:00:00,0.0,low,0.2512076960365759,low +P0006,2025-06-17 18:00:00,0.0,low,0.1453747300737095,low +P0006,2025-06-18 00:00:00,0.0,low,0.2599357614383252,low +P0006,2025-06-18 06:00:00,0.0,low,0.27195069082825285,low +P0006,2025-06-18 12:00:00,0.0025,low,0.06504065315991026,low +P0006,2025-06-18 18:00:00,0.0,low,0.2159378899134279,low +P0006,2025-06-19 00:00:00,0.0,low,0.18354063283762384,low +P0006,2025-06-19 06:00:00,0.0025,low,0.2169529946717815,low +P0006,2025-06-19 12:00:00,0.0,low,0.1922331554857317,low +P0006,2025-06-19 18:00:00,0.01,low,0.18505429173765878,low +P0006,2025-06-20 00:00:00,0.015,low,0.2558627139661862,low +P0006,2025-06-20 06:00:00,0.0025,low,0.08452472263301485,low +P0006,2025-06-20 12:00:00,0.0,low,0.1903490578844206,low +P0006,2025-06-20 18:00:00,0.675,high,0.13579669315516565,low +P0006,2025-06-21 00:00:00,0.705,high,0.052382920035169575,low +P0006,2025-06-21 06:00:00,0.0025,low,0.2946574884874729,low +P0006,2025-06-21 12:00:00,0.0075,low,0.11003749738648314,low +P0006,2025-06-21 18:00:00,0.01,low,0.15341653092685198,low +P0006,2025-06-22 00:00:00,0.0,low,0.14388643260858283,low +P0006,2025-06-22 06:00:00,0.0,low,0.09907460374652116,low +P0006,2025-06-22 12:00:00,0.0,low,0.14900516284432905,low +P0006,2025-06-22 18:00:00,0.0,low,0.229009757517834,low +P0006,2025-06-23 00:00:00,0.0,low,0.24767425319719014,low +P0006,2025-06-23 06:00:00,0.0,low,0.32916271110475437,medium +P0006,2025-06-23 12:00:00,0.005,low,0.3317300411715267,medium +P0006,2025-06-23 18:00:00,0.0,low,0.2368305741934781,low +P0006,2025-06-24 00:00:00,0.0025,low,0.1997858327922108,low +P0006,2025-06-24 06:00:00,0.0,low,0.22306702631944117,low +P0006,2025-06-24 12:00:00,0.0,low,0.12409944844419563,low +P0006,2025-06-24 18:00:00,0.0025,low,0.23386092689250423,low +P0006,2025-06-25 00:00:00,0.0025,low,0.22848647486337503,low +P0006,2025-06-25 06:00:00,0.0025,low,0.11217585637838716,low +P0006,2025-06-25 12:00:00,0.0,low,0.25423031858705414,low +P0006,2025-06-25 18:00:00,0.0,low,0.13546513985866662,low +P0006,2025-06-26 00:00:00,0.0,low,0.21070840427203347,low +P0006,2025-06-26 06:00:00,0.0025,low,0.12772906797845238,low +P0006,2025-06-26 12:00:00,0.0,low,0.39791521115187434,medium +P0006,2025-06-26 18:00:00,0.0,low,0.22290801945919256,low +P0006,2025-06-27 00:00:00,0.0,low,0.10669939440235078,low +P0006,2025-06-27 06:00:00,0.0,low,0.19845395596553345,low +P0006,2025-06-27 12:00:00,0.0,low,0.08069024647378974,low +P0006,2025-06-27 18:00:00,0.0,low,0.12381525015995233,low +P0006,2025-06-28 00:00:00,0.0,low,0.274375950744015,low +P0006,2025-06-28 06:00:00,0.0275,low,0.20770152271250114,low +P0006,2025-06-28 12:00:00,0.02,low,0.11215041241873062,low +P0006,2025-06-28 18:00:00,0.0125,low,0.26046854821541837,low +P0006,2025-06-29 00:00:00,0.03,low,0.11931538256248368,low +P0006,2025-06-29 06:00:00,0.5725,medium,0.11659586353872771,low +P0006,2025-06-29 12:00:00,0.085,low,0.2056761925114887,low +P0006,2025-06-29 18:00:00,0.04,low,0.10583102846474773,low +P0006,2025-06-30 00:00:00,0.0025,low,0.21689668394486372,low +P0006,2025-06-30 06:00:00,0.0,low,0.3436812269199126,medium +P0006,2025-06-30 12:00:00,0.0,low,0.22685183651796012,low +P0006,2025-06-30 18:00:00,0.0,low,0.17335225975181406,low +P0007,2025-06-03 18:00:00,0.0025,low,0.29265324414647,low +P0007,2025-06-04 00:00:00,0.0,low,0.11867273442067255,low +P0007,2025-06-04 06:00:00,0.0,low,0.15167634798739482,low +P0007,2025-06-04 12:00:00,0.0,low,0.18940519704787648,low +P0007,2025-06-04 18:00:00,0.0,low,0.12977318700933047,low +P0007,2025-06-05 00:00:00,0.0,low,0.2734262880144571,low +P0007,2025-06-05 06:00:00,0.0,low,0.2989187513833256,low +P0007,2025-06-05 12:00:00,0.0,low,0.11175818725121774,low +P0007,2025-06-05 18:00:00,0.0,low,0.4465195454329395,medium +P0007,2025-06-06 00:00:00,0.0,low,0.32934670822687584,medium +P0007,2025-06-06 06:00:00,0.0,low,0.28064633617992435,low +P0007,2025-06-06 12:00:00,0.0,low,0.14326830022847747,low +P0007,2025-06-06 18:00:00,0.0,low,0.17115946804997292,low +P0007,2025-06-07 00:00:00,0.0,low,0.18367512101123307,low +P0007,2025-06-07 06:00:00,0.0,low,0.23491559802966075,low +P0007,2025-06-07 12:00:00,0.0,low,0.2344066128820368,low +P0007,2025-06-07 18:00:00,0.0,low,0.3814581935792566,medium +P0007,2025-06-08 00:00:00,0.0,low,0.27588020566575855,low +P0007,2025-06-08 06:00:00,0.0,low,0.19031996958317196,low +P0007,2025-06-08 12:00:00,0.0,low,0.19541657735204476,low +P0007,2025-06-08 18:00:00,0.0,low,0.2272500292487636,low +P0007,2025-06-09 00:00:00,0.0,low,0.28658077016439043,low +P0007,2025-06-09 06:00:00,0.0025,low,0.1924789892542045,low +P0007,2025-06-09 12:00:00,0.0075,low,0.15755744189226348,low +P0007,2025-06-09 18:00:00,0.0,low,0.17474243455103364,low +P0007,2025-06-10 00:00:00,0.0,low,0.27103871518643413,low +P0007,2025-06-10 06:00:00,0.01,low,0.25793563875943626,low +P0007,2025-06-10 12:00:00,0.0125,low,0.15181993641590563,low +P0007,2025-06-10 18:00:00,0.01,low,0.2716286618043142,low +P0007,2025-06-11 00:00:00,0.0175,low,0.05493696516840173,low +P0007,2025-06-11 06:00:00,0.0,low,0.22013164904102478,low +P0007,2025-06-11 12:00:00,0.0,low,0.12071138588019253,low +P0007,2025-06-11 18:00:00,0.0,low,0.1856584388322565,low +P0007,2025-06-12 00:00:00,0.0,low,0.21538706189020512,low +P0007,2025-06-12 06:00:00,0.0125,low,0.24901863315350087,low +P0007,2025-06-12 12:00:00,0.0,low,0.12688503256269318,low +P0007,2025-06-12 18:00:00,0.01,low,0.15563723157285692,low +P0007,2025-06-13 00:00:00,0.0025,low,0.36180612095668185,medium +P0007,2025-06-13 06:00:00,0.0325,low,0.26423393242911325,low +P0007,2025-06-13 12:00:00,0.01,low,0.11492728629353874,low +P0007,2025-06-13 18:00:00,0.01,low,0.23559896769555996,low +P0007,2025-06-14 00:00:00,0.3275,medium,0.22237731094919236,low +P0007,2025-06-14 06:00:00,0.0875,low,0.12431823612708888,low +P0007,2025-06-14 12:00:00,0.28,low,0.1474926528633456,low +P0007,2025-06-14 18:00:00,0.0875,low,0.23077829538034755,low +P0007,2025-06-15 00:00:00,0.8225,high,0.09791322083215316,low +P0007,2025-06-15 06:00:00,0.0175,low,0.32569473992792763,medium +P0007,2025-06-15 12:00:00,0.015,low,0.2275230906551567,low +P0007,2025-06-15 18:00:00,0.0,low,0.13383707349399998,low +P0007,2025-06-16 00:00:00,0.005,low,0.16264363414088018,low +P0007,2025-06-16 06:00:00,0.0,low,0.12910052455670723,low +P0007,2025-06-16 12:00:00,0.0025,low,0.32029292341018234,medium +P0007,2025-06-16 18:00:00,0.0,low,0.20458758266918106,low +P0007,2025-06-17 00:00:00,0.0,low,0.20045533590351083,low +P0007,2025-06-17 06:00:00,0.0,low,0.17847206181896855,low +P0007,2025-06-17 12:00:00,0.0,low,0.14134635298031634,low +P0007,2025-06-17 18:00:00,0.0,low,0.28528315439116453,low +P0007,2025-06-18 00:00:00,0.0,low,0.27254090197824193,low +P0007,2025-06-18 06:00:00,0.005,low,0.11627726864742202,low +P0007,2025-06-18 12:00:00,0.0,low,0.24688504987745652,low +P0007,2025-06-18 18:00:00,0.0025,low,0.22952546693225997,low +P0007,2025-06-19 00:00:00,0.0,low,0.1534252827403699,low +P0007,2025-06-19 06:00:00,0.0,low,0.25183538210547673,low +P0007,2025-06-19 12:00:00,0.0,low,0.15000021455610835,low +P0007,2025-06-19 18:00:00,0.0,low,0.17391477507549252,low +P0007,2025-06-20 00:00:00,0.0,low,0.359120147621892,medium +P0007,2025-06-20 06:00:00,0.0,low,0.27964463834689995,low +P0007,2025-06-20 12:00:00,0.0,low,0.19220492176747528,low +P0007,2025-06-20 18:00:00,0.0,low,0.1515666316069582,low +P0007,2025-06-21 00:00:00,0.005,low,0.10179027916977682,low +P0007,2025-06-21 06:00:00,0.0,low,0.216309233796211,low +P0007,2025-06-21 12:00:00,0.0025,low,0.12629580764827383,low +P0007,2025-06-21 18:00:00,0.0,low,0.20062962070483537,low +P0007,2025-06-22 00:00:00,0.01,low,0.07722352870266819,low +P0007,2025-06-22 06:00:00,0.025,low,0.24881705743822236,low +P0007,2025-06-22 12:00:00,0.0125,low,0.23055927717823813,low +P0007,2025-06-22 18:00:00,0.0775,low,0.09178026744362582,low +P0007,2025-06-23 00:00:00,0.7225,high,0.23955990660023796,low +P0007,2025-06-23 06:00:00,0.78,high,0.12022756133098832,low +P0007,2025-06-23 12:00:00,0.275,low,0.18797985417697577,low +P0007,2025-06-23 18:00:00,0.1425,low,0.35721250574993246,medium +P0007,2025-06-24 00:00:00,0.085,low,0.12820686639167694,low +P0007,2025-06-24 06:00:00,0.04,low,0.0978747153003432,low +P0007,2025-06-24 12:00:00,0.645,high,0.32643398723865724,medium +P0007,2025-06-24 18:00:00,0.04,low,0.11121270983591856,low +P0007,2025-06-25 00:00:00,0.0,low,0.18819587756726014,low +P0007,2025-06-25 06:00:00,0.0,low,0.11581888558078465,low +P0007,2025-06-25 12:00:00,0.0,low,0.13656853566649238,low +P0007,2025-06-25 18:00:00,0.0,low,0.2585714501859991,low +P0007,2025-06-26 00:00:00,0.0,low,0.22282551778835485,low +P0007,2025-06-26 06:00:00,0.0,low,0.47002267522543745,medium +P0007,2025-06-26 12:00:00,0.0,low,0.3442469181819829,medium +P0007,2025-06-26 18:00:00,0.0,low,0.2923341079339927,low +P0007,2025-06-27 00:00:00,0.0,low,0.1512992882156546,low +P0007,2025-06-27 06:00:00,0.0,low,0.14860733859206332,low +P0007,2025-06-27 12:00:00,0.0,low,0.4671647764227232,medium +P0007,2025-06-27 18:00:00,0.0,low,0.3038285998537446,medium +P0007,2025-06-28 00:00:00,0.0125,low,0.31546560005963153,medium +P0007,2025-06-28 06:00:00,0.0,low,0.22519533750410456,low +P0007,2025-06-28 12:00:00,0.01,low,0.12408555988811655,low +P0007,2025-06-28 18:00:00,0.0075,low,0.11171537534389882,low +P0007,2025-06-29 00:00:00,0.0025,low,0.1291428450257404,low +P0007,2025-06-29 06:00:00,0.01,low,0.10731607103899514,low +P0007,2025-06-29 12:00:00,0.02,low,0.1087001409166859,low +P0007,2025-06-29 18:00:00,0.015,low,0.051223067023456775,low +P0007,2025-06-30 00:00:00,0.01,low,0.18675504711318688,low +P0007,2025-06-30 06:00:00,0.0,low,0.11133092788785752,low +P0007,2025-06-30 12:00:00,0.0,low,0.14470442583243448,low +P0007,2025-06-30 18:00:00,0.0,low,0.14941033859251202,low +P0008,2025-06-03 18:00:00,0.0,low,0.3349692465168915,medium +P0008,2025-06-04 00:00:00,0.0,low,0.16831842438997485,low +P0008,2025-06-04 06:00:00,0.0,low,0.23088350864805413,low +P0008,2025-06-04 12:00:00,0.0,low,0.1251114630854312,low +P0008,2025-06-04 18:00:00,0.0,low,0.21816836429980363,low +P0008,2025-06-05 00:00:00,0.005,low,0.2516176193354755,low +P0008,2025-06-05 06:00:00,0.0,low,0.1763941802779608,low +P0008,2025-06-05 12:00:00,0.0,low,0.2207758993012418,low +P0008,2025-06-05 18:00:00,0.0,low,0.20529245659959588,low +P0008,2025-06-06 00:00:00,0.0,low,0.2346106526727244,low +P0008,2025-06-06 06:00:00,0.0,low,0.13284030761742835,low +P0008,2025-06-06 12:00:00,0.0,low,0.2582454392161247,low +P0008,2025-06-06 18:00:00,0.0,low,0.3103785988656841,medium +P0008,2025-06-07 00:00:00,0.0,low,0.16845330271907683,low +P0008,2025-06-07 06:00:00,0.0025,low,0.2857971022739747,low +P0008,2025-06-07 12:00:00,0.0,low,0.18910083854924162,low +P0008,2025-06-07 18:00:00,0.0,low,0.15642928705830306,low +P0008,2025-06-08 00:00:00,0.0,low,0.29589467187404267,low +P0008,2025-06-08 06:00:00,0.0,low,0.2102783022325585,low +P0008,2025-06-08 12:00:00,0.0,low,0.13381545008449533,low +P0008,2025-06-08 18:00:00,0.0,low,0.262521118640568,low +P0008,2025-06-09 00:00:00,0.0,low,0.16025653834350315,low +P0008,2025-06-09 06:00:00,0.0,low,0.3720183179680298,medium +P0008,2025-06-09 12:00:00,0.025,low,0.101026896578358,low +P0008,2025-06-09 18:00:00,0.1025,low,0.27812976735368683,low +P0008,2025-06-10 00:00:00,0.065,low,0.27734269971752734,low +P0008,2025-06-10 06:00:00,0.0025,low,0.3360954873972702,medium +P0008,2025-06-10 12:00:00,0.0,low,0.1643283282904736,low +P0008,2025-06-10 18:00:00,0.0,low,0.11486164645618568,low +P0008,2025-06-11 00:00:00,0.0075,low,0.10121837705526138,low +P0008,2025-06-11 06:00:00,0.0025,low,0.28397606246604096,low +P0008,2025-06-11 12:00:00,0.0025,low,0.216259430236317,low +P0008,2025-06-11 18:00:00,0.005,low,0.18562954819738672,low +P0008,2025-06-12 00:00:00,0.0,low,0.13951115050002666,low +P0008,2025-06-12 06:00:00,0.0025,low,0.08750973179653561,low +P0008,2025-06-12 12:00:00,0.0,low,0.2001061002080518,low +P0008,2025-06-12 18:00:00,0.0,low,0.22388412457742748,low +P0008,2025-06-13 00:00:00,0.0,low,0.328151328871898,medium +P0008,2025-06-13 06:00:00,0.0,low,0.1470394554864008,low +P0008,2025-06-13 12:00:00,0.0,low,0.20110663290488218,low +P0008,2025-06-13 18:00:00,0.0,low,0.10452811088670129,low +P0008,2025-06-14 00:00:00,0.0,low,0.2019434663003009,low +P0008,2025-06-14 06:00:00,0.0,low,0.14911651918153093,low +P0008,2025-06-14 12:00:00,0.0025,low,0.13132771607712035,low +P0008,2025-06-14 18:00:00,0.0,low,0.37295851818721737,medium +P0008,2025-06-15 00:00:00,0.0,low,0.2861876935055684,low +P0008,2025-06-15 06:00:00,0.0,low,0.3067385267001966,medium +P0008,2025-06-15 12:00:00,0.0,low,0.13444728867010078,low +P0008,2025-06-15 18:00:00,0.0,low,0.1600310493597005,low +P0008,2025-06-16 00:00:00,0.0,low,0.29793682186575116,low +P0008,2025-06-16 06:00:00,0.0,low,0.2954357366747613,low +P0008,2025-06-16 12:00:00,0.0,low,0.2376300739545486,low +P0008,2025-06-16 18:00:00,0.01,low,0.17286169998220377,low +P0008,2025-06-17 00:00:00,0.0025,low,0.17038655460299856,low +P0008,2025-06-17 06:00:00,0.0025,low,0.38863819978551223,medium +P0008,2025-06-17 12:00:00,0.005,low,0.18772151296325076,low +P0008,2025-06-17 18:00:00,0.0025,low,0.15945324426454036,low +P0008,2025-06-18 00:00:00,0.0,low,0.07622753702736752,low +P0008,2025-06-18 06:00:00,0.0,low,0.1974804296008414,low +P0008,2025-06-18 12:00:00,0.005,low,0.2912981187222899,low +P0008,2025-06-18 18:00:00,0.62,high,0.20571526080516478,low +P0008,2025-06-19 00:00:00,0.01,low,0.15285401197666454,low +P0008,2025-06-19 06:00:00,0.0,low,0.18785029494643815,low +P0008,2025-06-19 12:00:00,0.02,low,0.17925083651835302,low +P0008,2025-06-19 18:00:00,0.0,low,0.12419513707504846,low +P0008,2025-06-20 00:00:00,0.0,low,0.14155191296068598,low +P0008,2025-06-20 06:00:00,0.0,low,0.1540522626478029,low +P0008,2025-06-20 12:00:00,0.0025,low,0.1303691932544177,low +P0008,2025-06-20 18:00:00,0.0325,low,0.13635550223684878,low +P0008,2025-06-21 00:00:00,0.0475,low,0.10824525928612763,low +P0008,2025-06-21 06:00:00,0.0875,low,0.15753719429642368,low +P0008,2025-06-21 12:00:00,0.055,low,0.13649139947379574,low +P0008,2025-06-21 18:00:00,0.0075,low,0.23568506371672798,low +P0008,2025-06-22 00:00:00,0.0075,low,0.1297508210995138,low +P0008,2025-06-22 06:00:00,0.0025,low,0.17791907018632597,low +P0008,2025-06-22 12:00:00,0.0025,low,0.21453477080434294,low +P0008,2025-06-22 18:00:00,0.0075,low,0.22965337477589612,low +P0008,2025-06-23 00:00:00,0.0,low,0.17389634014901492,low +P0008,2025-06-23 06:00:00,0.005,low,0.08581565938962869,low +P0008,2025-06-23 12:00:00,0.0025,low,0.13132834574587207,low +P0008,2025-06-23 18:00:00,0.01,low,0.06648969542173931,low +P0008,2025-06-24 00:00:00,0.0,low,0.18981634742915268,low +P0008,2025-06-24 06:00:00,0.0,low,0.17431209504944795,low +P0008,2025-06-24 12:00:00,0.0,low,0.23423849441829042,low +P0008,2025-06-24 18:00:00,0.0,low,0.2687015712493497,low +P0008,2025-06-25 00:00:00,0.0,low,0.36907490166137447,medium +P0008,2025-06-25 06:00:00,0.0,low,0.2340726277391228,low +P0008,2025-06-25 12:00:00,0.0,low,0.13116735401568147,low +P0008,2025-06-25 18:00:00,0.0,low,0.1848232781352227,low +P0008,2025-06-26 00:00:00,0.0,low,0.2744522766371085,low +P0008,2025-06-26 06:00:00,0.0,low,0.14961047750899936,low +P0008,2025-06-26 12:00:00,0.0,low,0.1472903276180356,low +P0008,2025-06-26 18:00:00,0.005,low,0.2827924808132167,low +P0008,2025-06-27 00:00:00,0.0,low,0.15335423556183397,low +P0008,2025-06-27 06:00:00,0.0025,low,0.23571414781228478,low +P0008,2025-06-27 12:00:00,0.0025,low,0.16767472207798592,low +P0008,2025-06-27 18:00:00,0.0,low,0.21111611544412814,low +P0008,2025-06-28 00:00:00,0.025,low,0.2113838981230963,low +P0008,2025-06-28 06:00:00,0.015,low,0.25476127794937314,low +P0008,2025-06-28 12:00:00,0.01,low,0.15066063057911577,low +P0008,2025-06-28 18:00:00,0.0075,low,0.13397620911423647,low +P0008,2025-06-29 00:00:00,0.02,low,0.28204511717053543,low +P0008,2025-06-29 06:00:00,0.0075,low,0.28231504611728625,low +P0008,2025-06-29 12:00:00,0.115,low,0.13643040811342558,low +P0008,2025-06-29 18:00:00,0.0025,low,0.12033719455398383,low +P0008,2025-06-30 00:00:00,0.0025,low,0.19395499357617413,low +P0008,2025-06-30 06:00:00,0.0025,low,0.10303071389162549,low +P0008,2025-06-30 12:00:00,0.0075,low,0.26257635648881966,low +P0008,2025-06-30 18:00:00,0.0025,low,0.2585581635412395,low +P0009,2025-06-03 18:00:00,0.0,low,0.08533909725285643,low +P0009,2025-06-04 00:00:00,0.0,low,0.18194860249242795,low +P0009,2025-06-04 06:00:00,0.0,low,0.13055414786588834,low +P0009,2025-06-04 12:00:00,0.0,low,0.24819555842942115,low +P0009,2025-06-04 18:00:00,0.0025,low,0.18168999606546998,low +P0009,2025-06-05 00:00:00,0.0,low,0.28827442934370306,low +P0009,2025-06-05 06:00:00,0.0,low,0.30318059676032405,medium +P0009,2025-06-05 12:00:00,0.0,low,0.13805919341320708,low +P0009,2025-06-05 18:00:00,0.0,low,0.16166198717563843,low +P0009,2025-06-06 00:00:00,0.0,low,0.29349530904654886,low +P0009,2025-06-06 06:00:00,0.0,low,0.19324437547078277,low +P0009,2025-06-06 12:00:00,0.0,low,0.22661053042127988,low +P0009,2025-06-06 18:00:00,0.0,low,0.22245160919744983,low +P0009,2025-06-07 00:00:00,0.0,low,0.14634373784370122,low +P0009,2025-06-07 06:00:00,0.0,low,0.2395997536738451,low +P0009,2025-06-07 12:00:00,0.0,low,0.23455799234839475,low +P0009,2025-06-07 18:00:00,0.0,low,0.19681753267837032,low +P0009,2025-06-08 00:00:00,0.0,low,0.14550517929936468,low +P0009,2025-06-08 06:00:00,0.0,low,0.2582949399742547,low +P0009,2025-06-08 12:00:00,0.0025,low,0.1907085618032929,low +P0009,2025-06-08 18:00:00,0.0025,low,0.18489652172689003,low +P0009,2025-06-09 00:00:00,0.0,low,0.2238455439766807,low +P0009,2025-06-09 06:00:00,0.03,low,0.10784836820782444,low +P0009,2025-06-09 12:00:00,0.03,low,0.15115404286391995,low +P0009,2025-06-09 18:00:00,0.0125,low,0.15714542555742464,low +P0009,2025-06-10 00:00:00,0.0,low,0.21473557579573105,low +P0009,2025-06-10 06:00:00,0.005,low,0.19278177403713,low +P0009,2025-06-10 12:00:00,0.0175,low,0.137009020625503,low +P0009,2025-06-10 18:00:00,0.0075,low,0.28774138987232917,low +P0009,2025-06-11 00:00:00,0.0025,low,0.14332726415557698,low +P0009,2025-06-11 06:00:00,0.005,low,0.16673299576020806,low +P0009,2025-06-11 12:00:00,0.005,low,0.22152534372036994,low +P0009,2025-06-11 18:00:00,0.0125,low,0.1381173670207578,low +P0009,2025-06-12 00:00:00,0.0175,low,0.17671085457125774,low +P0009,2025-06-12 06:00:00,0.0125,low,0.26762037037383574,low +P0009,2025-06-12 12:00:00,0.0125,low,0.24467105999117753,low +P0009,2025-06-12 18:00:00,0.005,low,0.288213997879135,low +P0009,2025-06-13 00:00:00,0.005,low,0.12184067607245053,low +P0009,2025-06-13 06:00:00,0.005,low,0.29568873664124246,low +P0009,2025-06-13 12:00:00,0.0,low,0.2116960106646309,low +P0009,2025-06-13 18:00:00,0.0,low,0.19123441336519717,low +P0009,2025-06-14 00:00:00,0.0,low,0.13830877233989275,low +P0009,2025-06-14 06:00:00,0.0,low,0.2448438288020655,low +P0009,2025-06-14 12:00:00,0.0,low,0.1943704370986379,low +P0009,2025-06-14 18:00:00,0.0,low,0.14562713810314495,low +P0009,2025-06-15 00:00:00,0.0,low,0.11101119533975573,low +P0009,2025-06-15 06:00:00,0.0,low,0.22394039295300677,low +P0009,2025-06-15 12:00:00,0.0,low,0.16192563464506032,low +P0009,2025-06-15 18:00:00,0.0,low,0.41547397863690205,medium +P0009,2025-06-16 00:00:00,0.0,low,0.13337374568520433,low +P0009,2025-06-16 06:00:00,0.0,low,0.17148541167060177,low +P0009,2025-06-16 12:00:00,0.005,low,0.2609019210397844,low +P0009,2025-06-16 18:00:00,0.0025,low,0.1882959541372018,low +P0009,2025-06-17 00:00:00,0.0025,low,0.1779146093652325,low +P0009,2025-06-17 06:00:00,0.0,low,0.303551652616036,medium +P0009,2025-06-17 12:00:00,0.0025,low,0.258041132791493,low +P0009,2025-06-17 18:00:00,0.0325,low,0.14468862374485764,low +P0009,2025-06-18 00:00:00,0.01,low,0.3016896569551345,medium +P0009,2025-06-18 06:00:00,0.0125,low,0.09898030932099358,low +P0009,2025-06-18 12:00:00,0.005,low,0.13937085228079696,low +P0009,2025-06-18 18:00:00,0.0075,low,0.11941979421472035,low +P0009,2025-06-19 00:00:00,0.0125,low,0.2868797062021595,low +P0009,2025-06-19 06:00:00,0.0225,low,0.1307821679154196,low +P0009,2025-06-19 12:00:00,0.0,low,0.12484338239702121,low +P0009,2025-06-19 18:00:00,0.0,low,0.16983346982835557,low +P0009,2025-06-20 00:00:00,0.0,low,0.29311483361293483,low +P0009,2025-06-20 06:00:00,0.0025,low,0.2040241134830879,low +P0009,2025-06-20 12:00:00,0.0,low,0.15956766430388947,low +P0009,2025-06-20 18:00:00,0.0,low,0.14558443664225917,low +P0009,2025-06-21 00:00:00,0.0,low,0.2342270659524166,low +P0009,2025-06-21 06:00:00,0.0,low,0.15232694119201678,low +P0009,2025-06-21 12:00:00,0.0025,low,0.11149907632700325,low +P0009,2025-06-21 18:00:00,0.005,low,0.14932561432401972,low +P0009,2025-06-22 00:00:00,0.0,low,0.16525006311760584,low +P0009,2025-06-22 06:00:00,0.0,low,0.2729824467225107,low +P0009,2025-06-22 12:00:00,0.0,low,0.11769464226660799,low +P0009,2025-06-22 18:00:00,0.755,high,0.1245756390874602,low +P0009,2025-06-23 00:00:00,0.7775,high,0.16094646256170114,low +P0009,2025-06-23 06:00:00,0.4925,medium,0.06686317865512947,low +P0009,2025-06-23 12:00:00,0.7725,high,0.14470094845136092,low +P0009,2025-06-23 18:00:00,0.0775,low,0.19694559145091856,low +P0009,2025-06-24 00:00:00,0.02,low,0.2029288302341044,low +P0009,2025-06-24 06:00:00,0.1125,low,0.1379992070624703,low +P0009,2025-06-24 12:00:00,0.1,low,0.07770876832252532,low +P0009,2025-06-24 18:00:00,0.0025,low,0.11930539789616204,low +P0009,2025-06-25 00:00:00,0.0075,low,0.14199366793721963,low +P0009,2025-06-25 06:00:00,0.025,low,0.22824253978476058,low +P0009,2025-06-25 12:00:00,0.01,low,0.17778445788933506,low +P0009,2025-06-25 18:00:00,0.0025,low,0.14698968601167936,low +P0009,2025-06-26 00:00:00,0.0,low,0.2613351415692698,low +P0009,2025-06-26 06:00:00,0.0,low,0.1633305898424912,low +P0009,2025-06-26 12:00:00,0.0,low,0.2252955311298279,low +P0009,2025-06-26 18:00:00,0.0,low,0.2422754015926152,low +P0009,2025-06-27 00:00:00,0.0,low,0.1348675867832516,low +P0009,2025-06-27 06:00:00,0.0,low,0.24562970009848606,low +P0009,2025-06-27 12:00:00,0.0,low,0.30120695321132374,medium +P0009,2025-06-27 18:00:00,0.0,low,0.20643912120882837,low +P0009,2025-06-28 00:00:00,0.0,low,0.08521366791509316,low +P0009,2025-06-28 06:00:00,0.0,low,0.2226187403968812,low +P0009,2025-06-28 12:00:00,0.0,low,0.25303629023935464,low +P0009,2025-06-28 18:00:00,0.0,low,0.11022789609244761,low +P0009,2025-06-29 00:00:00,0.0,low,0.1700124294831115,low +P0009,2025-06-29 06:00:00,0.0,low,0.21864326328759182,low +P0009,2025-06-29 12:00:00,0.0,low,0.14117479396471783,low +P0009,2025-06-29 18:00:00,0.0,low,0.19365989646222664,low +P0009,2025-06-30 00:00:00,0.0,low,0.22320217019804495,low +P0009,2025-06-30 06:00:00,0.0,low,0.10024793826703328,low +P0009,2025-06-30 12:00:00,0.0,low,0.23501417931204097,low +P0009,2025-06-30 18:00:00,0.0,low,0.3511803340098065,medium +P0010,2025-06-03 18:00:00,0.0,low,0.21947651304789373,low +P0010,2025-06-04 00:00:00,0.0,low,0.20885365488164254,low +P0010,2025-06-04 06:00:00,0.0,low,0.1779448657344452,low +P0010,2025-06-04 12:00:00,0.0,low,0.2545836869163143,low +P0010,2025-06-04 18:00:00,0.0,low,0.16979757353515745,low +P0010,2025-06-05 00:00:00,0.0025,low,0.20205993102016387,low +P0010,2025-06-05 06:00:00,0.0,low,0.18056069498040372,low +P0010,2025-06-05 12:00:00,0.0,low,0.21327850757371014,low +P0010,2025-06-05 18:00:00,0.0,low,0.22982898239430044,low +P0010,2025-06-06 00:00:00,0.0,low,0.1877334279689325,low +P0010,2025-06-06 06:00:00,0.0,low,0.20215513581060773,low +P0010,2025-06-06 12:00:00,0.0,low,0.1950833733001212,low +P0010,2025-06-06 18:00:00,0.0,low,0.2440823788520453,low +P0010,2025-06-07 00:00:00,0.0,low,0.2819248702289311,low +P0010,2025-06-07 06:00:00,0.0,low,0.26778633732094814,low +P0010,2025-06-07 12:00:00,0.0,low,0.3117009839929202,medium +P0010,2025-06-07 18:00:00,0.0,low,0.43317367543097396,medium +P0010,2025-06-08 00:00:00,0.0,low,0.3397780612216861,medium +P0010,2025-06-08 06:00:00,0.0025,low,0.12621143382158126,low +P0010,2025-06-08 12:00:00,0.0025,low,0.2936953640811744,low +P0010,2025-06-08 18:00:00,0.0025,low,0.26939072548503024,low +P0010,2025-06-09 00:00:00,0.0025,low,0.23714765913123112,low +P0010,2025-06-09 06:00:00,0.0,low,0.15889082948578076,low +P0010,2025-06-09 12:00:00,0.0,low,0.28563336912095466,low +P0010,2025-06-09 18:00:00,0.0,low,0.38266421764766134,medium +P0010,2025-06-10 00:00:00,0.0,low,0.3481412009050023,medium +P0010,2025-06-10 06:00:00,0.0,low,0.2668378838712811,low +P0010,2025-06-10 12:00:00,0.0,low,0.18470903493827517,low +P0010,2025-06-10 18:00:00,0.0,low,0.14255307339751538,low +P0010,2025-06-11 00:00:00,0.0,low,0.2643702871452242,low +P0010,2025-06-11 06:00:00,0.0,low,0.2004428598271206,low +P0010,2025-06-11 12:00:00,0.0,low,0.16573515478760328,low +P0010,2025-06-11 18:00:00,0.0025,low,0.21722545803677568,low +P0010,2025-06-12 00:00:00,0.0,low,0.30550218615410846,medium +P0010,2025-06-12 06:00:00,0.0,low,0.2370865939563682,low +P0010,2025-06-12 12:00:00,0.0,low,0.17626179755792964,low +P0010,2025-06-12 18:00:00,0.0,low,0.21107045227806773,low +P0010,2025-06-13 00:00:00,0.0,low,0.22837230520016455,low +P0010,2025-06-13 06:00:00,0.0,low,0.2539033741670711,low +P0010,2025-06-13 12:00:00,0.0,low,0.21026625226481044,low +P0010,2025-06-13 18:00:00,0.0,low,0.10990840304163396,low +P0010,2025-06-14 00:00:00,0.0,low,0.1928178712954521,low +P0010,2025-06-14 06:00:00,0.005,low,0.1728375892555458,low +P0010,2025-06-14 12:00:00,0.0075,low,0.09722167737472791,low +P0010,2025-06-14 18:00:00,0.0075,low,0.13831735093524108,low +P0010,2025-06-15 00:00:00,0.0025,low,0.17458082345432657,low +P0010,2025-06-15 06:00:00,0.01,low,0.23049294984408866,low +P0010,2025-06-15 12:00:00,0.17,low,0.17246812193762848,low +P0010,2025-06-15 18:00:00,0.075,low,0.16450999129085978,low +P0010,2025-06-16 00:00:00,0.085,low,0.15078456456083325,low +P0010,2025-06-16 06:00:00,0.04,low,0.25661943849597346,low +P0010,2025-06-16 12:00:00,0.015,low,0.232281036050826,low +P0010,2025-06-16 18:00:00,0.035,low,0.16763008477531363,low +P0010,2025-06-17 00:00:00,0.03,low,0.11576548391126236,low +P0010,2025-06-17 06:00:00,0.0025,low,0.2274813525496621,low +P0010,2025-06-17 12:00:00,0.0025,low,0.10774319395285462,low +P0010,2025-06-17 18:00:00,0.0,low,0.16028268937992948,low +P0010,2025-06-18 00:00:00,0.0025,low,0.14325528996265977,low +P0010,2025-06-18 06:00:00,0.0,low,0.1621498741600472,low +P0010,2025-06-18 12:00:00,0.0,low,0.18860427695386314,low +P0010,2025-06-18 18:00:00,0.0,low,0.14949889961288848,low +P0010,2025-06-19 00:00:00,0.005,low,0.2545751653032083,low +P0010,2025-06-19 06:00:00,0.0025,low,0.4115894701623931,medium +P0010,2025-06-19 12:00:00,0.0,low,0.2281287439673046,low +P0010,2025-06-19 18:00:00,0.0,low,0.20503026924506199,low +P0010,2025-06-20 00:00:00,0.0,low,0.16528525871345648,low +P0010,2025-06-20 06:00:00,0.0,low,0.33349517178661525,medium +P0010,2025-06-20 12:00:00,0.02,low,0.13211718646419457,low +P0010,2025-06-20 18:00:00,0.005,low,0.17990957885660933,low +P0010,2025-06-21 00:00:00,0.0225,low,0.16850137565450254,low +P0010,2025-06-21 06:00:00,0.045,low,0.30057636511863195,medium +P0010,2025-06-21 12:00:00,0.045,low,0.2489424751529713,low +P0010,2025-06-21 18:00:00,0.03,low,0.11487502212129018,low +P0010,2025-06-22 00:00:00,0.0025,low,0.16380499819175806,low +P0010,2025-06-22 06:00:00,0.0025,low,0.2210222704731817,low +P0010,2025-06-22 12:00:00,0.0025,low,0.13117475872008258,low +P0010,2025-06-22 18:00:00,0.0,low,0.27443659972091455,low +P0010,2025-06-23 00:00:00,0.0,low,0.29705823595813596,low +P0010,2025-06-23 06:00:00,0.0075,low,0.1240268432748832,low +P0010,2025-06-23 12:00:00,0.0,low,0.24924617031423518,low +P0010,2025-06-23 18:00:00,0.0,low,0.15208713264741008,low +P0010,2025-06-24 00:00:00,0.0,low,0.28422310539842804,low +P0010,2025-06-24 06:00:00,0.0,low,0.17267014055939353,low +P0010,2025-06-24 12:00:00,0.0,low,0.2070330983148099,low +P0010,2025-06-24 18:00:00,0.0,low,0.31642926669940147,medium +P0010,2025-06-25 00:00:00,0.005,low,0.15937074507921878,low +P0010,2025-06-25 06:00:00,0.0,low,0.3253643005574238,medium +P0010,2025-06-25 12:00:00,0.0,low,0.23558318098745443,low +P0010,2025-06-25 18:00:00,0.0,low,0.2498810438367809,low +P0010,2025-06-26 00:00:00,0.0,low,0.25104264267468357,low +P0010,2025-06-26 06:00:00,0.0,low,0.20641841331448343,low +P0010,2025-06-26 12:00:00,0.0125,low,0.26815656650043523,low +P0010,2025-06-26 18:00:00,0.005,low,0.17244967557991744,low +P0010,2025-06-27 00:00:00,0.0025,low,0.20544669561703754,low +P0010,2025-06-27 06:00:00,0.0025,low,0.15348255670359784,low +P0010,2025-06-27 12:00:00,0.0575,low,0.10720303110247116,low +P0010,2025-06-27 18:00:00,0.045,low,0.2543570000274255,low +P0010,2025-06-28 00:00:00,0.0325,low,0.23375354096720993,low +P0010,2025-06-28 06:00:00,0.0425,low,0.24376355816026576,low +P0010,2025-06-28 12:00:00,0.025,low,0.25416695549635093,low +P0010,2025-06-28 18:00:00,0.015,low,0.12269702922404155,low +P0010,2025-06-29 00:00:00,0.015,low,0.2431435615138206,low +P0010,2025-06-29 06:00:00,0.05,low,0.084050336245722,low +P0010,2025-06-29 12:00:00,0.02,low,0.2574898322046761,low +P0010,2025-06-29 18:00:00,0.0075,low,0.26280613004148634,low +P0010,2025-06-30 00:00:00,0.04,low,0.28827194497954034,low +P0010,2025-06-30 06:00:00,0.0775,low,0.09131105783891777,low +P0010,2025-06-30 12:00:00,0.0,low,0.08917363119698385,low +P0010,2025-06-30 18:00:00,0.0,low,0.2327066381762302,low +P0011,2025-06-03 18:00:00,0.0,low,0.1154902401124541,low +P0011,2025-06-04 00:00:00,0.0,low,0.12391160147896406,low +P0011,2025-06-04 06:00:00,0.0,low,0.18463294297856975,low +P0011,2025-06-04 12:00:00,0.0,low,0.3308477483815127,medium +P0011,2025-06-04 18:00:00,0.0,low,0.21178820697472636,low +P0011,2025-06-05 00:00:00,0.0,low,0.4149709171153307,medium +P0011,2025-06-05 06:00:00,0.0,low,0.2692233823271924,low +P0011,2025-06-05 12:00:00,0.0,low,0.19210593102224685,low +P0011,2025-06-05 18:00:00,0.0,low,0.2626672462261292,low +P0011,2025-06-06 00:00:00,0.0,low,0.15283176738453708,low +P0011,2025-06-06 06:00:00,0.0,low,0.2920684415716389,low +P0011,2025-06-06 12:00:00,0.0,low,0.31265028606105455,medium +P0011,2025-06-06 18:00:00,0.0,low,0.22758695689577713,low +P0011,2025-06-07 00:00:00,0.0,low,0.20081847824207477,low +P0011,2025-06-07 06:00:00,0.0025,low,0.157191268412157,low +P0011,2025-06-07 12:00:00,0.0,low,0.26148557839599745,low +P0011,2025-06-07 18:00:00,0.0,low,0.20123627108935277,low +P0011,2025-06-08 00:00:00,0.0,low,0.20154244915269645,low +P0011,2025-06-08 06:00:00,0.0,low,0.10669228426683586,low +P0011,2025-06-08 12:00:00,0.0025,low,0.07777342957215601,low +P0011,2025-06-08 18:00:00,0.0,low,0.3648985145979698,medium +P0011,2025-06-09 00:00:00,0.0,low,0.22597922410611743,low +P0011,2025-06-09 06:00:00,0.0,low,0.11138951451621072,low +P0011,2025-06-09 12:00:00,0.0,low,0.20708636383732287,low +P0011,2025-06-09 18:00:00,0.0,low,0.1651712646404642,low +P0011,2025-06-10 00:00:00,0.0,low,0.38659241371295533,medium +P0011,2025-06-10 06:00:00,0.0,low,0.32057176983301816,medium +P0011,2025-06-10 12:00:00,0.0,low,0.24378661015187642,low +P0011,2025-06-10 18:00:00,0.0,low,0.17227061906965446,low +P0011,2025-06-11 00:00:00,0.0,low,0.10575039362100724,low +P0011,2025-06-11 06:00:00,0.0,low,0.34131024029397083,medium +P0011,2025-06-11 12:00:00,0.0,low,0.13615541369494547,low +P0011,2025-06-11 18:00:00,0.0,low,0.15335139705164386,low +P0011,2025-06-12 00:00:00,0.0,low,0.25305333091392185,low +P0011,2025-06-12 06:00:00,0.0,low,0.1467270436071616,low +P0011,2025-06-12 12:00:00,0.0,low,0.10910120178579905,low +P0011,2025-06-12 18:00:00,0.0,low,0.13039172710312896,low +P0011,2025-06-13 00:00:00,0.0025,low,0.28780105056692856,low +P0011,2025-06-13 06:00:00,0.005,low,0.10023099644508578,low +P0011,2025-06-13 12:00:00,0.0,low,0.2833082673029817,low +P0011,2025-06-13 18:00:00,0.0025,low,0.20656304521921126,low +P0011,2025-06-14 00:00:00,0.04,low,0.12525619991772702,low +P0011,2025-06-14 06:00:00,0.015,low,0.12056333477348893,low +P0011,2025-06-14 12:00:00,0.05,low,0.15080024517878957,low +P0011,2025-06-14 18:00:00,0.0225,low,0.23258702020936678,low +P0011,2025-06-15 00:00:00,0.2075,low,0.10293559881887134,low +P0011,2025-06-15 06:00:00,0.005,low,0.13042097907857672,low +P0011,2025-06-15 12:00:00,0.01,low,0.20695192003512883,low +P0011,2025-06-15 18:00:00,0.0,low,0.12901046162632077,low +P0011,2025-06-16 00:00:00,0.0025,low,0.17887075662689056,low +P0011,2025-06-16 06:00:00,0.01,low,0.10598770017462007,low +P0011,2025-06-16 12:00:00,0.0,low,0.25362450166674805,low +P0011,2025-06-16 18:00:00,0.0,low,0.145343473641132,low +P0011,2025-06-17 00:00:00,0.0,low,0.1969262651434326,low +P0011,2025-06-17 06:00:00,0.0,low,0.17350028466293227,low +P0011,2025-06-17 12:00:00,0.0,low,0.16006575774191265,low +P0011,2025-06-17 18:00:00,0.0,low,0.21872713837236604,low +P0011,2025-06-18 00:00:00,0.0,low,0.31000826186805935,medium +P0011,2025-06-18 06:00:00,0.0,low,0.27647047232884425,low +P0011,2025-06-18 12:00:00,0.0,low,0.24726933192788705,low +P0011,2025-06-18 18:00:00,0.0,low,0.29385835010810835,low +P0011,2025-06-19 00:00:00,0.0,low,0.30517195759912374,medium +P0011,2025-06-19 06:00:00,0.0,low,0.17075904229640185,low +P0011,2025-06-19 12:00:00,0.0,low,0.1646362636815682,low +P0011,2025-06-19 18:00:00,0.0,low,0.13537292574222573,low +P0011,2025-06-20 00:00:00,0.0025,low,0.32639889281368195,medium +P0011,2025-06-20 06:00:00,0.005,low,0.17071065191492815,low +P0011,2025-06-20 12:00:00,0.025,low,0.16123541304198039,low +P0011,2025-06-20 18:00:00,0.015,low,0.1380831725605858,low +P0011,2025-06-21 00:00:00,0.0225,low,0.035373990855557355,low +P0011,2025-06-21 06:00:00,0.0,low,0.20447565235350895,low +P0011,2025-06-21 12:00:00,0.0,low,0.11905567321407892,low +P0011,2025-06-21 18:00:00,0.0,low,0.14147299587301712,low +P0011,2025-06-22 00:00:00,0.0,low,0.18152683211221698,low +P0011,2025-06-22 06:00:00,0.0575,low,0.22475151981849203,low +P0011,2025-06-22 12:00:00,0.0,low,0.1054824495685098,low +P0011,2025-06-22 18:00:00,0.005,low,0.13405287257950993,low +P0011,2025-06-23 00:00:00,0.01,low,0.3966718905046905,medium +P0011,2025-06-23 06:00:00,0.015,low,0.17554179445884696,low +P0011,2025-06-23 12:00:00,0.0075,low,0.16578316912751254,low +P0011,2025-06-23 18:00:00,0.01,low,0.2178251492273316,low +P0011,2025-06-24 00:00:00,0.0075,low,0.23126965035484096,low +P0011,2025-06-24 06:00:00,0.005,low,0.12162877507468624,low +P0011,2025-06-24 12:00:00,0.0325,low,0.1437863826903571,low +P0011,2025-06-24 18:00:00,0.01,low,0.2286254544727989,low +P0011,2025-06-25 00:00:00,0.9025,high,0.09393384326295914,low +P0011,2025-06-25 06:00:00,0.0075,low,0.3261642768714309,medium +P0011,2025-06-25 12:00:00,0.005,low,0.21880300695090282,low +P0011,2025-06-25 18:00:00,0.0,low,0.13445205656518017,low +P0011,2025-06-26 00:00:00,0.0,low,0.15927486348539002,low +P0011,2025-06-26 06:00:00,0.0,low,0.17339262161929792,low +P0011,2025-06-26 12:00:00,0.0,low,0.23874947138963698,low +P0011,2025-06-26 18:00:00,0.0,low,0.28258725668724205,low +P0011,2025-06-27 00:00:00,0.0,low,0.13405135076218755,low +P0011,2025-06-27 06:00:00,0.0,low,0.26842556915260324,low +P0011,2025-06-27 12:00:00,0.0,low,0.24660589519298745,low +P0011,2025-06-27 18:00:00,0.0,low,0.21713439689603825,low +P0011,2025-06-28 00:00:00,0.005,low,0.18850482694551646,low +P0011,2025-06-28 06:00:00,0.0,low,0.19483109194234718,low +P0011,2025-06-28 12:00:00,0.0,low,0.1308686821336369,low +P0011,2025-06-28 18:00:00,0.0,low,0.23925740024572947,low +P0011,2025-06-29 00:00:00,0.0,low,0.129803559792857,low +P0011,2025-06-29 06:00:00,0.0,low,0.39381066583585733,medium +P0011,2025-06-29 12:00:00,0.0,low,0.3057467084000162,medium +P0011,2025-06-29 18:00:00,0.0,low,0.17222566082562693,low +P0011,2025-06-30 00:00:00,0.0,low,0.3070905074896156,medium +P0011,2025-06-30 06:00:00,0.0,low,0.1440639018365991,low +P0011,2025-06-30 12:00:00,0.0,low,0.23492224078155494,low +P0011,2025-06-30 18:00:00,0.005,low,0.127288509368835,low +P0012,2025-06-03 18:00:00,0.0,low,0.1145236230152642,low +P0012,2025-06-04 00:00:00,0.0,low,0.25449734483647724,low +P0012,2025-06-04 06:00:00,0.0,low,0.2783252215306785,low +P0012,2025-06-04 12:00:00,0.0,low,0.20958774102058303,low +P0012,2025-06-04 18:00:00,0.0,low,0.16052810175262178,low +P0012,2025-06-05 00:00:00,0.0,low,0.10955312193366444,low +P0012,2025-06-05 06:00:00,0.0,low,0.23882503589864768,low +P0012,2025-06-05 12:00:00,0.0275,low,0.2856178884329147,low +P0012,2025-06-05 18:00:00,0.0025,low,0.173204984741912,low +P0012,2025-06-06 00:00:00,0.0025,low,0.26042610522843945,low +P0012,2025-06-06 06:00:00,0.0,low,0.22690907976261698,low +P0012,2025-06-06 12:00:00,0.0025,low,0.18053920080328348,low +P0012,2025-06-06 18:00:00,0.055,low,0.2493035356939232,low +P0012,2025-06-07 00:00:00,0.0175,low,0.17409648530282654,low +P0012,2025-06-07 06:00:00,0.005,low,0.16532087984392577,low +P0012,2025-06-07 12:00:00,0.1725,low,0.2207718162144607,low +P0012,2025-06-07 18:00:00,0.2075,low,0.16058541762305828,low +P0012,2025-06-08 00:00:00,0.0775,low,0.24539913878066913,low +P0012,2025-06-08 06:00:00,0.095,low,0.09361022062110998,low +P0012,2025-06-08 12:00:00,0.0,low,0.3261453621470974,medium +P0012,2025-06-08 18:00:00,0.0,low,0.11855310168289104,low +P0012,2025-06-09 00:00:00,0.06,low,0.08975401076122588,low +P0012,2025-06-09 06:00:00,0.035,low,0.14031038714847724,low +P0012,2025-06-09 12:00:00,0.745,high,0.1732414249514512,low +P0012,2025-06-09 18:00:00,0.7125,high,0.18145019933368783,low +P0012,2025-06-10 00:00:00,0.7525,high,0.15758544126448973,low +P0012,2025-06-10 06:00:00,0.76,high,0.17031880222026122,low +P0012,2025-06-10 12:00:00,0.0025,low,0.26886949053609255,low +P0012,2025-06-10 18:00:00,0.0125,low,0.2963123860243196,low +P0012,2025-06-11 00:00:00,0.005,low,0.10438925497223084,low +P0012,2025-06-11 06:00:00,0.005,low,0.19436950852792875,low +P0012,2025-06-11 12:00:00,0.015,low,0.3363415225790596,medium +P0012,2025-06-11 18:00:00,0.01,low,0.18907835167228648,low +P0012,2025-06-12 00:00:00,0.0,low,0.1320327418366843,low +P0012,2025-06-12 06:00:00,0.0,low,0.07699527441338404,low +P0012,2025-06-12 12:00:00,0.0,low,0.3084815184779443,medium +P0012,2025-06-12 18:00:00,0.0,low,0.15006263238908624,low +P0012,2025-06-13 00:00:00,0.0,low,0.1823591656541798,low +P0012,2025-06-13 06:00:00,0.0,low,0.24340196731836555,low +P0012,2025-06-13 12:00:00,0.0,low,0.15499632224858242,low +P0012,2025-06-13 18:00:00,0.0,low,0.09464540144409168,low +P0012,2025-06-14 00:00:00,0.0,low,0.18635565794707004,low +P0012,2025-06-14 06:00:00,0.0,low,0.14178591193001655,low +P0012,2025-06-14 12:00:00,0.0,low,0.28197271928750234,low +P0012,2025-06-14 18:00:00,0.0,low,0.22422880788233243,low +P0012,2025-06-15 00:00:00,0.0,low,0.26754145264888535,low +P0012,2025-06-15 06:00:00,0.0,low,0.25990534886485517,low +P0012,2025-06-15 12:00:00,0.0,low,0.10214171482295697,low +P0012,2025-06-15 18:00:00,0.0,low,0.23470604367395337,low +P0012,2025-06-16 00:00:00,0.0,low,0.2073315627976849,low +P0012,2025-06-16 06:00:00,0.0,low,0.15056766943833433,low +P0012,2025-06-16 12:00:00,0.0,low,0.12224108141109606,low +P0012,2025-06-16 18:00:00,0.005,low,0.165018679744066,low +P0012,2025-06-17 00:00:00,0.0075,low,0.15684649195134695,low +P0012,2025-06-17 06:00:00,0.0,low,0.25540828955094175,low +P0012,2025-06-17 12:00:00,0.005,low,0.2572432645897232,low +P0012,2025-06-17 18:00:00,0.0025,low,0.15212149660940055,low +P0012,2025-06-18 00:00:00,0.0025,low,0.07516677127231931,low +P0012,2025-06-18 06:00:00,0.0025,low,0.18863370222802958,low +P0012,2025-06-18 12:00:00,0.0025,low,0.13301106187364173,low +P0012,2025-06-18 18:00:00,0.005,low,0.255287208820486,low +P0012,2025-06-19 00:00:00,0.01,low,0.14771285467446738,low +P0012,2025-06-19 06:00:00,0.0025,low,0.26228977904846457,low +P0012,2025-06-19 12:00:00,0.005,low,0.0886307736012433,low +P0012,2025-06-19 18:00:00,0.0,low,0.3042272792293715,medium +P0012,2025-06-20 00:00:00,0.0,low,0.26826811697048253,low +P0012,2025-06-20 06:00:00,0.0,low,0.15980975602171332,low +P0012,2025-06-20 12:00:00,0.0,low,0.2886051526943452,low +P0012,2025-06-20 18:00:00,0.0,low,0.1443557464345836,low +P0012,2025-06-21 00:00:00,0.0,low,0.22638967909245863,low +P0012,2025-06-21 06:00:00,0.0325,low,0.1825059941161312,low +P0012,2025-06-21 12:00:00,0.0075,low,0.12036175421384337,low +P0012,2025-06-21 18:00:00,0.76,high,0.09268175880086595,low +P0012,2025-06-22 00:00:00,0.905,high,0.2128791565017015,low +P0012,2025-06-22 06:00:00,0.8375,high,0.1636260679512769,low +P0012,2025-06-22 12:00:00,0.83,high,0.09061008866136434,low +P0012,2025-06-22 18:00:00,0.1675,low,0.12183657843287825,low +P0012,2025-06-23 00:00:00,0.0825,low,0.13475111729533812,low +P0012,2025-06-23 06:00:00,0.0625,low,0.18914476193584026,low +P0012,2025-06-23 12:00:00,0.0475,low,0.19645840938714043,low +P0012,2025-06-23 18:00:00,0.0475,low,0.08230015011352211,low +P0012,2025-06-24 00:00:00,0.0325,low,0.08731013292302389,low +P0012,2025-06-24 06:00:00,0.01,low,0.28080257959032595,low +P0012,2025-06-24 12:00:00,0.0075,low,0.16780986370992132,low +P0012,2025-06-24 18:00:00,0.005,low,0.19901926678333842,low +P0012,2025-06-25 00:00:00,0.0,low,0.2699953842874596,low +P0012,2025-06-25 06:00:00,0.0,low,0.3547471129497357,medium +P0012,2025-06-25 12:00:00,0.0,low,0.3602680217841974,medium +P0012,2025-06-25 18:00:00,0.0,low,0.20777832919663267,low +P0012,2025-06-26 00:00:00,0.0,low,0.1417786115340589,low +P0012,2025-06-26 06:00:00,0.0,low,0.18534632586476127,low +P0012,2025-06-26 12:00:00,0.0,low,0.24221274833288972,low +P0012,2025-06-26 18:00:00,0.0025,low,0.14142547608634912,low +P0012,2025-06-27 00:00:00,0.0,low,0.23079014039675372,low +P0012,2025-06-27 06:00:00,0.0,low,0.2295405752740196,low +P0012,2025-06-27 12:00:00,0.0025,low,0.1748125816955362,low +P0012,2025-06-27 18:00:00,0.0,low,0.14231860125711698,low +P0012,2025-06-28 00:00:00,0.0,low,0.23534613617480254,low +P0012,2025-06-28 06:00:00,0.0,low,0.16198771218988375,low +P0012,2025-06-28 12:00:00,0.0,low,0.2624778256274735,low +P0012,2025-06-28 18:00:00,0.0,low,0.2238455439766807,low +P0012,2025-06-29 00:00:00,0.03,low,0.10784836820782444,low +P0012,2025-06-29 06:00:00,0.03,low,0.15115404286391995,low +P0012,2025-06-29 12:00:00,0.0125,low,0.15714542555742464,low +P0012,2025-06-29 18:00:00,0.0,low,0.21473557579573105,low +P0012,2025-06-30 00:00:00,0.005,low,0.19278177403713,low +P0012,2025-06-30 06:00:00,0.0125,low,0.20232817837640493,low +P0012,2025-06-30 12:00:00,0.0075,low,0.28654364188223763,low +P0012,2025-06-30 18:00:00,0.005,low,0.2161917306625524,low +P0013,2025-06-03 18:00:00,0.0,low,0.23315160756788708,low +P0013,2025-06-04 00:00:00,0.0,low,0.15685604367304762,low +P0013,2025-06-04 06:00:00,0.0,low,0.2695118052502528,low +P0013,2025-06-04 12:00:00,0.0,low,0.13990535220079883,low +P0013,2025-06-04 18:00:00,0.0,low,0.16480175790268464,low +P0013,2025-06-05 00:00:00,0.0075,low,0.14085848189693803,low +P0013,2025-06-05 06:00:00,0.0025,low,0.1295491124587209,low +P0013,2025-06-05 12:00:00,0.0,low,0.309343280497564,medium +P0013,2025-06-05 18:00:00,0.0,low,0.3195576763475534,medium +P0013,2025-06-06 00:00:00,0.0,low,0.07963431949507853,low +P0013,2025-06-06 06:00:00,0.0,low,0.12805114752554694,low +P0013,2025-06-06 12:00:00,0.0,low,0.25891195485452256,low +P0013,2025-06-06 18:00:00,0.0,low,0.21121299880038868,low +P0013,2025-06-07 00:00:00,0.005,low,0.09076680523290627,low +P0013,2025-06-07 06:00:00,0.0,low,0.19534772702664685,low +P0013,2025-06-07 12:00:00,0.0,low,0.11383519226392683,low +P0013,2025-06-07 18:00:00,0.0,low,0.3313025298311081,medium +P0013,2025-06-08 00:00:00,0.0025,low,0.22953198906158642,low +P0013,2025-06-08 06:00:00,0.0,low,0.10519396660443169,low +P0013,2025-06-08 12:00:00,0.0025,low,0.11985074785155247,low +P0013,2025-06-08 18:00:00,0.0,low,0.25619180034841815,low +P0013,2025-06-09 00:00:00,0.0125,low,0.09813383507068754,low +P0013,2025-06-09 06:00:00,0.0775,low,0.12185423436824434,low +P0013,2025-06-09 12:00:00,0.035,low,0.23380603245495596,low +P0013,2025-06-09 18:00:00,0.0425,low,0.1553736970679639,low +P0013,2025-06-10 00:00:00,0.0275,low,0.11372568037724522,low +P0013,2025-06-10 06:00:00,0.3975,medium,0.10653301466251965,low +P0013,2025-06-10 12:00:00,0.3825,medium,0.23344388912787847,low +P0013,2025-06-10 18:00:00,0.775,high,0.25855699120195375,low +P0013,2025-06-11 00:00:00,0.0225,low,0.23862401560356936,low +P0013,2025-06-11 06:00:00,0.04,low,0.13813696016904028,low +P0013,2025-06-11 12:00:00,0.0075,low,0.18414222066229782,low +P0013,2025-06-11 18:00:00,0.035,low,0.16394458623638075,low +P0013,2025-06-12 00:00:00,0.0525,low,0.09376814699389535,low +P0013,2025-06-12 06:00:00,0.0,low,0.20022056990612352,low +P0013,2025-06-12 12:00:00,0.0,low,0.21121462157095255,low +P0013,2025-06-12 18:00:00,0.0075,low,0.08527709597870674,low +P0013,2025-06-13 00:00:00,0.0,low,0.34598672445067274,medium +P0013,2025-06-13 06:00:00,0.0,low,0.26352289414876523,low +P0013,2025-06-13 12:00:00,0.0,low,0.26458754663286016,low +P0013,2025-06-13 18:00:00,0.0,low,0.2534094492500524,low +P0013,2025-06-14 00:00:00,0.0,low,0.18098818204536427,low +P0013,2025-06-14 06:00:00,0.0,low,0.21352888540445214,low +P0013,2025-06-14 12:00:00,0.0,low,0.2308055988411783,low +P0013,2025-06-14 18:00:00,0.0,low,0.3017058026677712,medium +P0013,2025-06-15 00:00:00,0.0,low,0.29514258486391354,low +P0013,2025-06-15 06:00:00,0.0,low,0.15961944347905666,low +P0013,2025-06-15 12:00:00,0.0,low,0.3171122265308175,medium +P0013,2025-06-15 18:00:00,0.0,low,0.16021449309608285,low +P0013,2025-06-16 00:00:00,0.0,low,0.15091815255951216,low +P0013,2025-06-16 06:00:00,0.0,low,0.18832575902517745,low +P0013,2025-06-16 12:00:00,0.0,low,0.3749891941047671,medium +P0013,2025-06-16 18:00:00,0.0,low,0.21957001755724737,low +P0013,2025-06-17 00:00:00,0.0,low,0.3740171425633627,medium +P0013,2025-06-17 06:00:00,0.0025,low,0.2174707522438691,low +P0013,2025-06-17 12:00:00,0.0,low,0.05733051646420745,low +P0013,2025-06-17 18:00:00,0.0075,low,0.19130293557332675,low +P0013,2025-06-18 00:00:00,0.0025,low,0.1798433659669423,low +P0013,2025-06-18 06:00:00,0.0,low,0.1397735991534516,low +P0013,2025-06-18 12:00:00,0.0,low,0.13450339659118768,low +P0013,2025-06-18 18:00:00,0.0,low,0.22417749089731773,low +P0013,2025-06-19 00:00:00,0.0,low,0.3848051369280821,medium +P0013,2025-06-19 06:00:00,0.0,low,0.30271668355584685,medium +P0013,2025-06-19 12:00:00,0.0,low,0.17382754508911485,low +P0013,2025-06-19 18:00:00,0.0,low,0.19151484338946945,low +P0013,2025-06-20 00:00:00,0.0025,low,0.25870867559533145,low +P0013,2025-06-20 06:00:00,0.0,low,0.20810784929993886,low +P0013,2025-06-20 12:00:00,0.0,low,0.4983426005701382,medium +P0013,2025-06-20 18:00:00,0.0,low,0.1767326236396983,low +P0013,2025-06-21 00:00:00,0.005,low,0.1778398180096327,low +P0013,2025-06-21 06:00:00,0.0,low,0.28586705991862976,low +P0013,2025-06-21 12:00:00,0.0075,low,0.13909878929645333,low +P0013,2025-06-21 18:00:00,0.0,low,0.1784556095067909,low +P0013,2025-06-22 00:00:00,0.0,low,0.0987918573344,low +P0013,2025-06-22 06:00:00,0.005,low,0.1450455447590194,low +P0013,2025-06-22 12:00:00,0.005,low,0.3354987368321093,medium +P0013,2025-06-22 18:00:00,0.005,low,0.109192264085787,low +P0013,2025-06-23 00:00:00,0.0,low,0.20816519629160662,low +P0013,2025-06-23 06:00:00,0.005,low,0.2505755797974966,low +P0013,2025-06-23 12:00:00,0.005,low,0.12425059518864914,low +P0013,2025-06-23 18:00:00,0.005,low,0.0750099109143517,low +P0013,2025-06-24 00:00:00,0.0025,low,0.28085639854807964,low +P0013,2025-06-24 06:00:00,0.0025,low,0.3062558906504703,medium +P0013,2025-06-24 12:00:00,0.0,low,0.26776605117660174,low +P0013,2025-06-24 18:00:00,0.0,low,0.19740534955193148,low +P0013,2025-06-25 00:00:00,0.01,low,0.11467729191868518,low +P0013,2025-06-25 06:00:00,0.0,low,0.16230300451859436,low +P0013,2025-06-25 12:00:00,0.0,low,0.38411604255815984,medium +P0013,2025-06-25 18:00:00,0.0,low,0.12371945350721339,low +P0013,2025-06-26 00:00:00,0.0,low,0.16266239471084437,low +P0013,2025-06-26 06:00:00,0.0,low,0.21262364172375017,low +P0013,2025-06-26 12:00:00,0.0,low,0.17279380155223537,low +P0013,2025-06-26 18:00:00,0.0,low,0.1851579934237622,low +P0013,2025-06-27 00:00:00,0.0,low,0.23632425116034875,low +P0013,2025-06-27 06:00:00,0.0,low,0.14756468791285537,low +P0013,2025-06-27 12:00:00,0.0,low,0.3575314149644233,medium +P0013,2025-06-27 18:00:00,0.0,low,0.3397780612216861,medium +P0013,2025-06-28 00:00:00,0.0025,low,0.12621143382158126,low +P0013,2025-06-28 06:00:00,0.0025,low,0.2936953640811744,low +P0013,2025-06-28 12:00:00,0.0025,low,0.26939072548503024,low +P0013,2025-06-28 18:00:00,0.0025,low,0.23714765913123112,low +P0013,2025-06-29 00:00:00,0.0,low,0.15889082948578076,low +P0013,2025-06-29 06:00:00,0.0,low,0.28563336912095466,low +P0013,2025-06-29 12:00:00,0.0,low,0.38266421764766134,medium +P0013,2025-06-29 18:00:00,0.0,low,0.23474421515357816,low +P0013,2025-06-30 00:00:00,0.0,low,0.19968697201542362,low +P0013,2025-06-30 06:00:00,0.0,low,0.0808706780214319,low +P0013,2025-06-30 12:00:00,0.0,low,0.15477665126900145,low +P0013,2025-06-30 18:00:00,0.0,low,0.36040594447035396,medium +P0014,2025-06-03 18:00:00,0.0,low,0.2459693985735905,low +P0014,2025-06-04 00:00:00,0.0,low,0.21156468051816152,low +P0014,2025-06-04 06:00:00,0.0,low,0.22590433992227874,low +P0014,2025-06-04 12:00:00,0.0,low,0.11980194166194814,low +P0014,2025-06-04 18:00:00,0.0025,low,0.23104895992797123,low +P0014,2025-06-05 00:00:00,0.0,low,0.22770348604777613,low +P0014,2025-06-05 06:00:00,0.0025,low,0.10889664078273616,low +P0014,2025-06-05 12:00:00,0.0,low,0.3178325586947551,medium +P0014,2025-06-05 18:00:00,0.0025,low,0.20222416124118367,low +P0014,2025-06-06 00:00:00,0.0,low,0.13892526655291088,low +P0014,2025-06-06 06:00:00,0.0025,low,0.14831463937141462,low +P0014,2025-06-06 12:00:00,0.0,low,0.2187302093340971,low +P0014,2025-06-06 18:00:00,0.0,low,0.15797565062379557,low +P0014,2025-06-07 00:00:00,0.0,low,0.19782243277534506,low +P0014,2025-06-07 06:00:00,0.0,low,0.23871037921135857,low +P0014,2025-06-07 12:00:00,0.0,low,0.23216289572463625,low +P0014,2025-06-07 18:00:00,0.0025,low,0.1921966345470664,low +P0014,2025-06-08 00:00:00,0.0,low,0.23222646188777266,low +P0014,2025-06-08 06:00:00,0.0,low,0.15728053892051697,low +P0014,2025-06-08 12:00:00,0.005,low,0.1243737638003485,low +P0014,2025-06-08 18:00:00,0.0,low,0.29194960901726474,low +P0014,2025-06-09 00:00:00,0.0025,low,0.1928008673800596,low +P0014,2025-06-09 06:00:00,0.0,low,0.4088733543665649,medium +P0014,2025-06-09 12:00:00,0.025,low,0.13594112821111337,low +P0014,2025-06-09 18:00:00,0.07,low,0.13690460847759825,low +P0014,2025-06-10 00:00:00,0.0625,low,0.2411818931922825,low +P0014,2025-06-10 06:00:00,0.115,low,0.26647434537157844,low +P0014,2025-06-10 12:00:00,0.0475,low,0.07294367051979933,low +P0014,2025-06-10 18:00:00,0.01,low,0.14432143678990242,low +P0014,2025-06-11 00:00:00,0.0075,low,0.24113011684240837,low +P0014,2025-06-11 06:00:00,0.005,low,0.2261730641820864,low +P0014,2025-06-11 12:00:00,0.0,low,0.16126614244914322,low +P0014,2025-06-11 18:00:00,0.0025,low,0.14029904431719797,low +P0014,2025-06-12 00:00:00,0.0,low,0.1313865551660834,low +P0014,2025-06-12 06:00:00,0.005,low,0.17808675024252335,low +P0014,2025-06-12 12:00:00,0.0025,low,0.14332677536575797,low +P0014,2025-06-12 18:00:00,0.0,low,0.1383381753108815,low +P0014,2025-06-13 00:00:00,0.0,low,0.1619581346041992,low +P0014,2025-06-13 06:00:00,0.0,low,0.3101966780774387,medium +P0014,2025-06-13 12:00:00,0.0,low,0.2683662819547053,low +P0014,2025-06-13 18:00:00,0.0,low,0.21258016458002468,low +P0014,2025-06-14 00:00:00,0.0,low,0.14741810276596326,low +P0014,2025-06-14 06:00:00,0.0,low,0.22322127508690473,low +P0014,2025-06-14 12:00:00,0.0,low,0.1972413459243946,low +P0014,2025-06-14 18:00:00,0.0,low,0.13812999021482592,low +P0014,2025-06-15 00:00:00,0.0,low,0.33772770526511287,medium +P0014,2025-06-15 06:00:00,0.0,low,0.3366669905995391,medium +P0014,2025-06-15 12:00:00,0.0,low,0.2869044593373301,low +P0014,2025-06-15 18:00:00,0.0,low,0.2199777925172723,low +P0014,2025-06-16 00:00:00,0.0,low,0.12053362302556309,low +P0014,2025-06-16 06:00:00,0.0,low,0.1892257472564403,low +P0014,2025-06-16 12:00:00,0.0,low,0.255608572931574,low +P0014,2025-06-16 18:00:00,0.0,low,0.2072392865414736,low +P0014,2025-06-17 00:00:00,0.0,low,0.19704912079833364,low +P0014,2025-06-17 06:00:00,0.0,low,0.2530506811413119,low +P0014,2025-06-17 12:00:00,0.0,low,0.20707171244429431,low +P0014,2025-06-17 18:00:00,0.0,low,0.25698597705900306,low +P0014,2025-06-18 00:00:00,0.0,low,0.18557133919282862,low +P0014,2025-06-18 06:00:00,0.0,low,0.16492122939161946,low +P0014,2025-06-18 12:00:00,0.0,low,0.14644022295954878,low +P0014,2025-06-18 18:00:00,0.0,low,0.2685162934636885,low +P0014,2025-06-19 00:00:00,0.0,low,0.3262553524458541,medium +P0014,2025-06-19 06:00:00,0.0,low,0.29313393392215653,low +P0014,2025-06-19 12:00:00,0.0,low,0.43919188033630957,medium +P0014,2025-06-19 18:00:00,0.0,low,0.15699199167167163,low +P0014,2025-06-20 00:00:00,0.0,low,0.19460897053803133,low +P0014,2025-06-20 06:00:00,0.0,low,0.22190759364414894,low +P0014,2025-06-20 12:00:00,0.0,low,0.23908011993423922,low +P0014,2025-06-20 18:00:00,0.0,low,0.20062128820572595,low +P0014,2025-06-21 00:00:00,0.0,low,0.34456428091830194,medium +P0014,2025-06-21 06:00:00,0.005,low,0.24203165610967814,low +P0014,2025-06-21 12:00:00,0.0,low,0.16788230363155096,low +P0014,2025-06-21 18:00:00,0.0025,low,0.21950978588805437,low +P0014,2025-06-22 00:00:00,0.0,low,0.2739552366700711,low +P0014,2025-06-22 06:00:00,0.0025,low,0.19545825083744375,low +P0014,2025-06-22 12:00:00,0.0,low,0.19523975394491347,low +P0014,2025-06-22 18:00:00,0.0,low,0.1791232158929255,low +P0014,2025-06-23 00:00:00,0.0025,low,0.22427804085562533,low +P0014,2025-06-23 06:00:00,0.0,low,0.3491040758335853,medium +P0014,2025-06-23 12:00:00,0.0025,low,0.2887600680290379,low +P0014,2025-06-23 18:00:00,0.0,low,0.0963225485647378,low +P0014,2025-06-24 00:00:00,0.0075,low,0.10019463290327343,low +P0014,2025-06-24 06:00:00,0.0,low,0.15719235906610718,low +P0014,2025-06-24 12:00:00,0.0,low,0.12183606439709549,low +P0014,2025-06-24 18:00:00,0.0,low,0.2981363167412162,low +P0014,2025-06-25 00:00:00,0.0,low,0.17147616646734476,low +P0014,2025-06-25 06:00:00,0.0,low,0.21199675605280868,low +P0014,2025-06-25 12:00:00,0.0,low,0.24846796856749767,low +P0014,2025-06-25 18:00:00,0.0,low,0.14271421069000417,low +P0014,2025-06-26 00:00:00,0.0,low,0.29979951861274445,low +P0014,2025-06-26 06:00:00,0.0,low,0.2839135361077109,low +P0014,2025-06-26 12:00:00,0.0,low,0.3738656552960469,medium +P0014,2025-06-26 18:00:00,0.0,low,0.1315380041542259,low +P0014,2025-06-27 00:00:00,0.0,low,0.1677376462905073,low +P0014,2025-06-27 06:00:00,0.0025,low,0.08620446733902032,low +P0014,2025-06-27 12:00:00,0.0,low,0.17457101743775316,low +P0014,2025-06-27 18:00:00,0.0,low,0.19290649283218234,low +P0014,2025-06-28 00:00:00,0.0,low,0.16608539112065193,low +P0014,2025-06-28 06:00:00,0.0,low,0.0840065362601197,low +P0014,2025-06-28 12:00:00,0.0,low,0.1378343016528912,low +P0014,2025-06-28 18:00:00,0.0,low,0.11490143202025584,low +P0014,2025-06-29 00:00:00,0.0,low,0.10919154806444159,low +P0014,2025-06-29 06:00:00,0.0,low,0.1579393357408398,low +P0014,2025-06-29 12:00:00,0.0,low,0.2810905370015999,low +P0014,2025-06-29 18:00:00,0.0,low,0.18110979884056017,low +P0014,2025-06-30 00:00:00,0.0,low,0.2264324074713762,low +P0014,2025-06-30 06:00:00,0.0,low,0.22529596610950525,low +P0014,2025-06-30 12:00:00,0.0,low,0.11605024964143473,low +P0014,2025-06-30 18:00:00,0.0,low,0.26176615897524813,low +P0015,2025-06-03 18:00:00,0.0025,low,0.13812696253690776,low +P0015,2025-06-04 00:00:00,0.0375,low,0.18011291169557864,low +P0015,2025-06-04 06:00:00,0.725,high,0.14572602665714404,low +P0015,2025-06-04 12:00:00,0.88,high,0.3095154503186396,medium +P0015,2025-06-04 18:00:00,0.06,low,0.10404161137428639,low +P0015,2025-06-05 00:00:00,0.15,low,0.17658000190259746,low +P0015,2025-06-05 06:00:00,0.1375,low,0.18214870741424807,low +P0015,2025-06-05 12:00:00,0.0875,low,0.2668518316724009,low +P0015,2025-06-05 18:00:00,0.0725,low,0.18542908220112111,low +P0015,2025-06-06 00:00:00,0.035,low,0.42357377103692573,medium +P0015,2025-06-06 06:00:00,0.135,low,0.2559452727503951,low +P0015,2025-06-06 12:00:00,0.0325,low,0.24611571298679807,low +P0015,2025-06-06 18:00:00,0.04,low,0.11108307357879987,low +P0015,2025-06-07 00:00:00,0.02,low,0.10895552912964082,low +P0015,2025-06-07 06:00:00,0.005,low,0.10189150316961935,low +P0015,2025-06-07 12:00:00,0.0,low,0.2720186948261754,low +P0015,2025-06-07 18:00:00,0.0,low,0.14446784378396313,low +P0015,2025-06-08 00:00:00,0.005,low,0.13887441617214272,low +P0015,2025-06-08 06:00:00,0.005,low,0.12106308414583249,low +P0015,2025-06-08 12:00:00,0.0025,low,0.2208939357017936,low +P0015,2025-06-08 18:00:00,0.0025,low,0.20942826908955903,low +P0015,2025-06-09 00:00:00,0.0,low,0.25019352567461284,low +P0015,2025-06-09 06:00:00,0.0,low,0.18061961119981917,low +P0015,2025-06-09 12:00:00,0.0,low,0.14541088595414553,low +P0015,2025-06-09 18:00:00,0.0,low,0.17692012745779445,low +P0015,2025-06-10 00:00:00,0.0,low,0.17883450994021446,low +P0015,2025-06-10 06:00:00,0.0,low,0.2150654600652251,low +P0015,2025-06-10 12:00:00,0.0025,low,0.16180458237182346,low +P0015,2025-06-10 18:00:00,0.0,low,0.22859724587061547,low +P0015,2025-06-11 00:00:00,0.0,low,0.23503016832421977,low +P0015,2025-06-11 06:00:00,0.025,low,0.1590972622690103,low +P0015,2025-06-11 12:00:00,0.005,low,0.18620585562522388,low +P0015,2025-06-11 18:00:00,0.0125,low,0.2010623956570036,low +P0015,2025-06-12 00:00:00,0.0,low,0.2817010605683627,low +P0015,2025-06-12 06:00:00,0.0,low,0.17586150807739226,low +P0015,2025-06-12 12:00:00,0.0075,low,0.3017885441146853,medium +P0015,2025-06-12 18:00:00,0.0025,low,0.11861104943443271,low +P0015,2025-06-13 00:00:00,0.0125,low,0.21150161438353354,low +P0015,2025-06-13 06:00:00,0.005,low,0.22480931115809602,low +P0015,2025-06-13 12:00:00,0.0125,low,0.2581267665503736,low +P0015,2025-06-13 18:00:00,0.0125,low,0.17884155595684445,low +P0015,2025-06-14 00:00:00,0.0225,low,0.12190986130955785,low +P0015,2025-06-14 06:00:00,0.0,low,0.15312913504927664,low +P0015,2025-06-14 12:00:00,0.005,low,0.28790801256932536,low +P0015,2025-06-14 18:00:00,0.005,low,0.15494119107771998,low +P0015,2025-06-15 00:00:00,0.0025,low,0.28161829578208186,low +P0015,2025-06-15 06:00:00,0.0075,low,0.2505432982059046,low +P0015,2025-06-15 12:00:00,0.005,low,0.2422189581217739,low +P0015,2025-06-15 18:00:00,0.0,low,0.2600337905600632,low +P0015,2025-06-16 00:00:00,0.0,low,0.13646305883562806,low +P0015,2025-06-16 06:00:00,0.0,low,0.10154857657724778,low +P0015,2025-06-16 12:00:00,0.0,low,0.1506319192733,low +P0015,2025-06-16 18:00:00,0.0,low,0.3183179155276288,medium +P0015,2025-06-17 00:00:00,0.0,low,0.19359499860504908,low +P0015,2025-06-17 06:00:00,0.0,low,0.18830464150087736,low +P0015,2025-06-17 12:00:00,0.0,low,0.18075225802544712,low +P0015,2025-06-17 18:00:00,0.0,low,0.24044606416115397,low +P0015,2025-06-18 00:00:00,0.0,low,0.15746556217471339,low +P0015,2025-06-18 06:00:00,0.0,low,0.13576691379973962,low +P0015,2025-06-18 12:00:00,0.0,low,0.21786068364053346,low +P0015,2025-06-18 18:00:00,0.0,low,0.2671758387465331,low +P0015,2025-06-19 00:00:00,0.0,low,0.28647378569930954,low +P0015,2025-06-19 06:00:00,0.0,low,0.2412971834226209,low +P0015,2025-06-19 12:00:00,0.0,low,0.26149792456904297,low +P0015,2025-06-19 18:00:00,0.0,low,0.21782460045277371,low +P0015,2025-06-20 00:00:00,0.0,low,0.13771518401500488,low +P0015,2025-06-20 06:00:00,0.0,low,0.1742122674591376,low +P0015,2025-06-20 12:00:00,0.0,low,0.27876157167799387,low +P0015,2025-06-20 18:00:00,0.0,low,0.19299462220799127,low +P0015,2025-06-21 00:00:00,0.005,low,0.1565392950565078,low +P0015,2025-06-21 06:00:00,0.0,low,0.17416554347969374,low +P0015,2025-06-21 12:00:00,0.0025,low,0.14532694694298742,low +P0015,2025-06-21 18:00:00,0.0075,low,0.28990144470435275,low +P0015,2025-06-22 00:00:00,0.0075,low,0.2042704209081209,low +P0015,2025-06-22 06:00:00,0.0,low,0.18849536273761816,low +P0015,2025-06-22 12:00:00,0.0075,low,0.21157844759180103,low +P0015,2025-06-22 18:00:00,0.0,low,0.18780951460612794,low +P0015,2025-06-23 00:00:00,0.0,low,0.26305231792750283,low +P0015,2025-06-23 06:00:00,0.005,low,0.10512589343548318,low +P0015,2025-06-23 12:00:00,0.0,low,0.13095601874202276,low +P0015,2025-06-23 18:00:00,0.005,low,0.12316490600101017,low +P0015,2025-06-24 00:00:00,0.0,low,0.23573717205994413,low +P0015,2025-06-24 06:00:00,0.0,low,0.32858617478694224,medium +P0015,2025-06-24 12:00:00,0.0,low,0.14165524527330575,low +P0015,2025-06-24 18:00:00,0.0,low,0.17236012357211927,low +P0015,2025-06-25 00:00:00,0.0,low,0.1273654678670628,low +P0015,2025-06-25 06:00:00,0.0,low,0.11762510353894594,low +P0015,2025-06-25 12:00:00,0.0,low,0.19878504021778415,low +P0015,2025-06-25 18:00:00,0.0,low,0.21978036955393548,low +P0015,2025-06-26 00:00:00,0.0,low,0.218120257209713,low +P0015,2025-06-26 06:00:00,0.0,low,0.19431281599136985,low +P0015,2025-06-26 12:00:00,0.0,low,0.36575471975432094,medium +P0015,2025-06-26 18:00:00,0.0025,low,0.1939212397378614,low +P0015,2025-06-27 00:00:00,0.0,low,0.20612251071970275,low +P0015,2025-06-27 06:00:00,0.0,low,0.11373660324072724,low +P0015,2025-06-27 12:00:00,0.0,low,0.27314265994914894,low +P0015,2025-06-27 18:00:00,0.0,low,0.21643657195881214,low +P0015,2025-06-28 00:00:00,0.0,low,0.32530102244634473,medium +P0015,2025-06-28 06:00:00,0.0,low,0.24252487123685457,low +P0015,2025-06-28 12:00:00,0.0,low,0.15787461775243342,low +P0015,2025-06-28 18:00:00,0.0,low,0.15300800369429837,low +P0015,2025-06-29 00:00:00,0.0025,low,0.15736348931395175,low +P0015,2025-06-29 06:00:00,0.0025,low,0.1035661946512672,low +P0015,2025-06-29 12:00:00,0.0025,low,0.11399911846835839,low +P0015,2025-06-29 18:00:00,0.0025,low,0.15588500129950306,low +P0015,2025-06-30 00:00:00,0.0,low,0.1994908220443174,low +P0015,2025-06-30 06:00:00,0.0,low,0.15907770373292132,low +P0015,2025-06-30 12:00:00,0.0,low,0.2256391595762349,low +P0015,2025-06-30 18:00:00,0.0,low,0.2738018844647721,low diff --git a/AI Guardian/Alert_System/outputs/top_alerts.csv b/AI Guardian/Alert_System/outputs/top_alerts.csv new file mode 100644 index 00000000..dcae3276 --- /dev/null +++ b/AI Guardian/Alert_System/outputs/top_alerts.csv @@ -0,0 +1,31 @@ +user_id,timestamp,recon_error,risk_pred,rf_prob,rf_risk,mlp_prob,mlp_risk,risk +P0001,2025-07-30 18:00:00,1.1051549,medium,0.685,high,0.1833042669621959,low,high +P0001,2025-07-27 00:00:00,1.006605,medium,0.6625,high,0.1544527914470802,low,high +P0001,2025-07-25 06:00:00,1.1545347,medium,0.7175,high,0.0589354205491982,low,high +P0001,2025-07-25 00:00:00,1.1608577,medium,0.78,high,0.1519465415289957,low,high +P0001,2025-07-24 18:00:00,1.0959871,medium,0.8375,high,0.1203663668061376,low,high +P0001,2025-07-24 12:00:00,1.3775542,medium,0.6225,high,0.1230863142722966,low,high +P0001,2025-07-24 06:00:00,1.2829137,medium,0.9575,high,0.2115280930670908,low,high +P0001,2025-07-24 00:00:00,1.2326787,medium,0.955,high,0.192646020966743,low,high +P0001,2025-07-23 18:00:00,1.3669305,medium,0.8925,high,0.1193363585084335,low,high +P0001,2025-07-23 12:00:00,1.1404407,medium,0.88,high,0.2252187468841999,low,high +P0001,2025-07-23 06:00:00,1.1406858,medium,0.7925,high,0.1178600634338368,low,high +P0001,2025-07-23 00:00:00,1.2556379,medium,0.78,high,0.1744695087033181,low,high +P0001,2025-07-22 18:00:00,1.3352492,medium,0.735,high,0.2260284152009084,low,high +P0001,2025-07-22 12:00:00,1.296288,medium,0.7925,high,0.1910409245135426,low,high +P0001,2025-07-22 00:00:00,0.9803611,medium,0.715,high,0.1605547128938156,low,high +P0001,2025-07-21 18:00:00,0.9649722,medium,0.7925,high,0.1283698999169995,low,high +P0001,2025-07-21 00:00:00,1.2877522,medium,0.7975,high,0.1060751293040197,low,high +P0001,2025-07-20 18:00:00,1.3085321,medium,0.8575,high,0.11812705191987,low,high +P0001,2025-07-20 00:00:00,1.2606425,medium,0.81,high,0.1473805800959862,low,high +P0001,2025-07-19 18:00:00,1.2347757,medium,0.78,high,0.1566864118268897,low,high +P0001,2025-07-19 12:00:00,1.2750401,medium,0.7275,high,0.1182818586871251,low,high +P0001,2025-07-19 06:00:00,1.0263627,medium,0.76,high,0.2775532963152937,low,high +P0001,2025-07-18 12:00:00,1.0333142,medium,0.7775,high,0.0859415918996947,low,high +P0001,2025-07-18 06:00:00,0.9215423,low,0.6975,high,0.0824219329162445,low,high +P0001,2025-07-17 18:00:00,0.95264775,medium,0.8275,high,0.195972202945876,low,high +P0001,2025-07-17 12:00:00,1.2006096,medium,0.865,high,0.1376257266004481,low,high +P0001,2025-07-17 06:00:00,1.2313502,medium,0.9425,high,0.0943446817333828,low,high +P0001,2025-07-17 00:00:00,1.305201,medium,0.7675,high,0.0940017426491267,low,high +P0001,2025-07-16 18:00:00,1.4037213,medium,0.8475,high,0.0943891273610256,low,high +P0001,2025-07-16 12:00:00,1.5141187,high,0.855,high,0.1065616433524509,low,high diff --git a/Guardian b/Guardian new file mode 160000 index 00000000..8cbcd88c --- /dev/null +++ b/Guardian @@ -0,0 +1 @@ +Subproject commit 8cbcd88cbfb866d9ea39d41351d2e0ceb83d009e diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/DockerFile b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/DockerFile new file mode 100644 index 00000000..8ddbf892 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/DockerFile @@ -0,0 +1,18 @@ +# Use Node.js LTS image +FROM node:18 + +# Set working directory +WORKDIR /usr/src/app + +# Copy package.json and install dependencies +COPY package*.json ./ +RUN npm install + +# Copy source code +COPY . . + +# Expose port 3000 +EXPOSE 3000 + +# Start the app +CMD [ "npm", "start" ] diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/index.js new file mode 100644 index 00000000..9eb89147 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/index.js @@ -0,0 +1,12 @@ +// index.js +const express = require('express'); +const app = express(); +const port = process.env.PORT || 3000; + +app.get('/', (req, res) => { + res.send('SIT323 Task 5.2D is running!'); +}); + +app.listen(port, () => { + console.log(`App listening on port ${port}`); +}); diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime new file mode 100644 index 00000000..7751de3c --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../mime/cli.js" "$@" +else + exec node "$basedir/../mime/cli.js" "$@" +fi diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.cmd b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.cmd new file mode 100644 index 00000000..54491f12 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mime\cli.js" %* diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.ps1 b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.ps1 new file mode 100644 index 00000000..2222f40b --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.bin/mime.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../mime/cli.js" $args + } else { + & "$basedir/node$exe" "$basedir/../mime/cli.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../mime/cli.js" $args + } else { + & "node$exe" "$basedir/../mime/cli.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.package-lock.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.package-lock.json new file mode 100644 index 00000000..2f417f1e --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/.package-lock.json @@ -0,0 +1,825 @@ +{ + "name": "sit323-2025-prac5d", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/HISTORY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/HISTORY.md new file mode 100644 index 00000000..cb5990c7 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/HISTORY.md @@ -0,0 +1,243 @@ +1.3.8 / 2022-02-02 +================== + + * deps: mime-types@~2.1.34 + - deps: mime-db@~1.51.0 + * deps: negotiator@0.6.3 + +1.3.7 / 2019-04-29 +================== + + * deps: negotiator@0.6.2 + - Fix sorting charset, encoding, and language with extra parameters + +1.3.6 / 2019-04-28 +================== + + * deps: mime-types@~2.1.24 + - deps: mime-db@~1.40.0 + +1.3.5 / 2018-02-28 +================== + + * deps: mime-types@~2.1.18 + - deps: mime-db@~1.33.0 + +1.3.4 / 2017-08-22 +================== + + * deps: mime-types@~2.1.16 + - deps: mime-db@~1.29.0 + +1.3.3 / 2016-05-02 +================== + + * deps: mime-types@~2.1.11 + - deps: mime-db@~1.23.0 + * deps: negotiator@0.6.1 + - perf: improve `Accept` parsing speed + - perf: improve `Accept-Charset` parsing speed + - perf: improve `Accept-Encoding` parsing speed + - perf: improve `Accept-Language` parsing speed + +1.3.2 / 2016-03-08 +================== + + * deps: mime-types@~2.1.10 + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + - deps: mime-db@~1.22.0 + +1.3.1 / 2016-01-19 +================== + + * deps: mime-types@~2.1.9 + - deps: mime-db@~1.21.0 + +1.3.0 / 2015-09-29 +================== + + * deps: mime-types@~2.1.7 + - deps: mime-db@~1.19.0 + * deps: negotiator@0.6.0 + - Fix including type extensions in parameters in `Accept` parsing + - Fix parsing `Accept` parameters with quoted equals + - Fix parsing `Accept` parameters with quoted semicolons + - Lazy-load modules from main entry point + - perf: delay type concatenation until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove closures getting spec properties + - perf: remove a closure from media type parsing + - perf: remove property delete from media type parsing + +1.2.13 / 2015-09-06 +=================== + + * deps: mime-types@~2.1.6 + - deps: mime-db@~1.18.0 + +1.2.12 / 2015-07-30 +=================== + + * deps: mime-types@~2.1.4 + - deps: mime-db@~1.16.0 + +1.2.11 / 2015-07-16 +=================== + + * deps: mime-types@~2.1.3 + - deps: mime-db@~1.15.0 + +1.2.10 / 2015-07-01 +=================== + + * deps: mime-types@~2.1.2 + - deps: mime-db@~1.14.0 + +1.2.9 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - perf: fix deopt during mapping + +1.2.8 / 2015-06-07 +================== + + * deps: mime-types@~2.1.0 + - deps: mime-db@~1.13.0 + * perf: avoid argument reassignment & argument slice + * perf: avoid negotiator recursive construction + * perf: enable strict mode + * perf: remove unnecessary bitwise operator + +1.2.7 / 2015-05-10 +================== + + * deps: negotiator@0.5.3 + - Fix media type parameter matching to be case-insensitive + +1.2.6 / 2015-05-07 +================== + + * deps: mime-types@~2.0.11 + - deps: mime-db@~1.9.1 + * deps: negotiator@0.5.2 + - Fix comparing media types with quoted values + - Fix splitting media types with quoted commas + +1.2.5 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - deps: mime-db@~1.8.0 + +1.2.4 / 2015-02-14 +================== + + * Support Node.js 0.6 + * deps: mime-types@~2.0.9 + - deps: mime-db@~1.7.0 + * deps: negotiator@0.5.1 + - Fix preference sorting to be stable for long acceptable lists + +1.2.3 / 2015-01-31 +================== + + * deps: mime-types@~2.0.8 + - deps: mime-db@~1.6.0 + +1.2.2 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - deps: mime-db@~1.5.0 + +1.2.1 / 2014-12-30 +================== + + * deps: mime-types@~2.0.5 + - deps: mime-db@~1.3.1 + +1.2.0 / 2014-12-19 +================== + + * deps: negotiator@0.5.0 + - Fix list return order when large accepted list + - Fix missing identity encoding when q=0 exists + - Remove dynamic building of Negotiator class + +1.1.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - deps: mime-db@~1.3.0 + +1.1.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - deps: mime-db@~1.2.0 + +1.1.2 / 2014-10-14 +================== + + * deps: negotiator@0.4.9 + - Fix error when media type has invalid parameter + +1.1.1 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - deps: mime-db@~1.1.0 + * deps: negotiator@0.4.8 + - Fix all negotiations to be case-insensitive + - Stable sort preferences of same quality according to client order + +1.1.0 / 2014-09-02 +================== + + * update `mime-types` + +1.0.7 / 2014-07-04 +================== + + * Fix wrong type returned from `type` when match after unknown extension + +1.0.6 / 2014-06-24 +================== + + * deps: negotiator@0.4.7 + +1.0.5 / 2014-06-20 +================== + + * fix crash when unknown extension given + +1.0.4 / 2014-06-19 +================== + + * use `mime-types` + +1.0.3 / 2014-06-11 +================== + + * deps: negotiator@0.4.6 + - Order by specificity when quality is the same + +1.0.2 / 2014-05-29 +================== + + * Fix interpretation when header not in request + * deps: pin negotiator@0.4.5 + +1.0.1 / 2014-01-18 +================== + + * Identity encoding isn't always acceptable + * deps: negotiator@~0.4.0 + +1.0.0 / 2013-12-27 +================== + + * Genesis diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/LICENSE new file mode 100644 index 00000000..06166077 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/README.md new file mode 100644 index 00000000..82680c53 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/README.md @@ -0,0 +1,140 @@ +# accepts + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). +Extracted from [koa](https://www.npmjs.com/package/koa) for general use. + +In addition to negotiator, it allows: + +- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` + as well as `('text/html', 'application/json')`. +- Allows type shorthands such as `json`. +- Returns `false` when no types match +- Treats non-existent headers as `*` + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install accepts +``` + +## API + +```js +var accepts = require('accepts') +``` + +### accepts(req) + +Create a new `Accepts` object for the given `req`. + +#### .charset(charsets) + +Return the first accepted charset. If nothing in `charsets` is accepted, +then `false` is returned. + +#### .charsets() + +Return the charsets that the request accepts, in the order of the client's +preference (most preferred first). + +#### .encoding(encodings) + +Return the first accepted encoding. If nothing in `encodings` is accepted, +then `false` is returned. + +#### .encodings() + +Return the encodings that the request accepts, in the order of the client's +preference (most preferred first). + +#### .language(languages) + +Return the first accepted language. If nothing in `languages` is accepted, +then `false` is returned. + +#### .languages() + +Return the languages that the request accepts, in the order of the client's +preference (most preferred first). + +#### .type(types) + +Return the first accepted type (and it is returned as the same text as what +appears in the `types` array). If nothing in `types` is accepted, then `false` +is returned. + +The `types` array can contain full MIME types or file extensions. Any value +that is not a full MIME types is passed to `require('mime-types').lookup`. + +#### .types() + +Return the types that the request accepts, in the order of the client's +preference (most preferred first). + +## Examples + +### Simple type negotiation + +This simple example shows how to use `accepts` to return a different typed +respond body based on what the client wants to accept. The server lists it's +preferences in order and will get back the best match between the client and +server. + +```js +var accepts = require('accepts') +var http = require('http') + +function app (req, res) { + var accept = accepts(req) + + // the order of this list is significant; should be server preferred order + switch (accept.type(['json', 'html'])) { + case 'json': + res.setHeader('Content-Type', 'application/json') + res.write('{"hello":"world!"}') + break + case 'html': + res.setHeader('Content-Type', 'text/html') + res.write('hello, world!') + break + default: + // the fallback is text/plain, so no need to specify it above + res.setHeader('Content-Type', 'text/plain') + res.write('hello, world!') + break + } + + res.end() +} + +http.createServer(app).listen(3000) +``` + +You can test this out with the cURL program: +```sh +curl -I -H'Accept: text/html' http://localhost:3000/ +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master +[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml +[node-version-image]: https://badgen.net/npm/node/accepts +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/accepts +[npm-url]: https://npmjs.org/package/accepts +[npm-version-image]: https://badgen.net/npm/v/accepts diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/index.js new file mode 100644 index 00000000..e9b2f63f --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/index.js @@ -0,0 +1,238 @@ +/*! + * accepts + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var Negotiator = require('negotiator') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = Accepts + +/** + * Create a new Accepts object for the given req. + * + * @param {object} req + * @public + */ + +function Accepts (req) { + if (!(this instanceof Accepts)) { + return new Accepts(req) + } + + this.headers = req.headers + this.negotiator = new Negotiator(req) +} + +/** + * Check if the given `type(s)` is acceptable, returning + * the best match when true, otherwise `undefined`, in which + * case you should respond with 406 "Not Acceptable". + * + * The `type` value may be a single mime type string + * such as "application/json", the extension name + * such as "json" or an array `["json", "html", "text/plain"]`. When a list + * or array is given the _best_ match, if any is returned. + * + * Examples: + * + * // Accept: text/html + * this.types('html'); + * // => "html" + * + * // Accept: text/*, application/json + * this.types('html'); + * // => "html" + * this.types('text/html'); + * // => "text/html" + * this.types('json', 'text'); + * // => "json" + * this.types('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * this.types('image/png'); + * this.types('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * this.types(['html', 'json']); + * this.types('html', 'json'); + * // => "json" + * + * @param {String|Array} types... + * @return {String|Array|Boolean} + * @public + */ + +Accepts.prototype.type = +Accepts.prototype.types = function (types_) { + var types = types_ + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i] + } + } + + // no types, return all requested types + if (!types || types.length === 0) { + return this.negotiator.mediaTypes() + } + + // no accept header, return first given type + if (!this.headers.accept) { + return types[0] + } + + var mimes = types.map(extToMime) + var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) + var first = accepts[0] + + return first + ? types[mimes.indexOf(first)] + : false +} + +/** + * Return accepted encodings or best fit based on `encodings`. + * + * Given `Accept-Encoding: gzip, deflate` + * an array sorted by quality is returned: + * + * ['gzip', 'deflate'] + * + * @param {String|Array} encodings... + * @return {String|Array} + * @public + */ + +Accepts.prototype.encoding = +Accepts.prototype.encodings = function (encodings_) { + var encodings = encodings_ + + // support flattened arguments + if (encodings && !Array.isArray(encodings)) { + encodings = new Array(arguments.length) + for (var i = 0; i < encodings.length; i++) { + encodings[i] = arguments[i] + } + } + + // no encodings, return all requested encodings + if (!encodings || encodings.length === 0) { + return this.negotiator.encodings() + } + + return this.negotiator.encodings(encodings)[0] || false +} + +/** + * Return accepted charsets or best fit based on `charsets`. + * + * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` + * an array sorted by quality is returned: + * + * ['utf-8', 'utf-7', 'iso-8859-1'] + * + * @param {String|Array} charsets... + * @return {String|Array} + * @public + */ + +Accepts.prototype.charset = +Accepts.prototype.charsets = function (charsets_) { + var charsets = charsets_ + + // support flattened arguments + if (charsets && !Array.isArray(charsets)) { + charsets = new Array(arguments.length) + for (var i = 0; i < charsets.length; i++) { + charsets[i] = arguments[i] + } + } + + // no charsets, return all requested charsets + if (!charsets || charsets.length === 0) { + return this.negotiator.charsets() + } + + return this.negotiator.charsets(charsets)[0] || false +} + +/** + * Return accepted languages or best fit based on `langs`. + * + * Given `Accept-Language: en;q=0.8, es, pt` + * an array sorted by quality is returned: + * + * ['es', 'pt', 'en'] + * + * @param {String|Array} langs... + * @return {Array|String} + * @public + */ + +Accepts.prototype.lang = +Accepts.prototype.langs = +Accepts.prototype.language = +Accepts.prototype.languages = function (languages_) { + var languages = languages_ + + // support flattened arguments + if (languages && !Array.isArray(languages)) { + languages = new Array(arguments.length) + for (var i = 0; i < languages.length; i++) { + languages[i] = arguments[i] + } + } + + // no languages, return all requested languages + if (!languages || languages.length === 0) { + return this.negotiator.languages() + } + + return this.negotiator.languages(languages)[0] || false +} + +/** + * Convert extnames to mime. + * + * @param {String} type + * @return {String} + * @private + */ + +function extToMime (type) { + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if mime is valid. + * + * @param {String} type + * @return {String} + * @private + */ + +function validMime (type) { + return typeof type === 'string' +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/package.json new file mode 100644 index 00000000..0f2d15da --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/accepts/package.json @@ -0,0 +1,47 @@ +{ + "name": "accepts", + "description": "Higher-level content negotiation", + "version": "1.3.8", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "jshttp/accepts", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "keywords": [ + "content", + "negotiation", + "accept", + "accepts" + ] +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/README.md new file mode 100644 index 00000000..91fa5b63 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/README.md @@ -0,0 +1,43 @@ +# Array Flatten + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. + +## Installation + +``` +npm install array-flatten --save +``` + +## Usage + +```javascript +var flatten = require('array-flatten') + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) +//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) +//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] + +(function () { + flatten(arguments) //=> [1, 2, 3] +})(1, [2, 3]) +``` + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat +[npm-url]: https://npmjs.org/package/array-flatten +[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat +[downloads-url]: https://npmjs.org/package/array-flatten +[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat +[travis-url]: https://travis-ci.org/blakeembrey/array-flatten +[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat +[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/array-flatten.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/array-flatten.js new file mode 100644 index 00000000..089117b3 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/array-flatten.js @@ -0,0 +1,64 @@ +'use strict' + +/** + * Expose `arrayFlatten`. + */ +module.exports = arrayFlatten + +/** + * Recursive flatten function with depth. + * + * @param {Array} array + * @param {Array} result + * @param {Number} depth + * @return {Array} + */ +function flattenWithDepth (array, result, depth) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (depth > 0 && Array.isArray(value)) { + flattenWithDepth(value, result, depth - 1) + } else { + result.push(value) + } + } + + return result +} + +/** + * Recursive flatten function. Omitting depth is slightly faster. + * + * @param {Array} array + * @param {Array} result + * @return {Array} + */ +function flattenForever (array, result) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (Array.isArray(value)) { + flattenForever(value, result) + } else { + result.push(value) + } + } + + return result +} + +/** + * Flatten an array, with the ability to define a depth. + * + * @param {Array} array + * @param {Number} depth + * @return {Array} + */ +function arrayFlatten (array, depth) { + if (depth == null) { + return flattenForever(array, []) + } + + return flattenWithDepth(array, [], depth) +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/package.json new file mode 100644 index 00000000..1a24e2a1 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/array-flatten/package.json @@ -0,0 +1,39 @@ +{ + "name": "array-flatten", + "version": "1.1.1", + "description": "Flatten an array of nested arrays into a single flat array", + "main": "array-flatten.js", + "files": [ + "array-flatten.js", + "LICENSE" + ], + "scripts": { + "test": "istanbul cover _mocha -- -R spec" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/array-flatten.git" + }, + "keywords": [ + "array", + "flatten", + "arguments", + "depth" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/array-flatten/issues" + }, + "homepage": "https://github.com/blakeembrey/array-flatten", + "devDependencies": { + "istanbul": "^0.3.13", + "mocha": "^2.2.4", + "pre-commit": "^1.0.7", + "standard": "^3.7.3" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/HISTORY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/HISTORY.md new file mode 100644 index 00000000..81d23e06 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/HISTORY.md @@ -0,0 +1,672 @@ +1.20.3 / 2024-09-10 +=================== + + * deps: qs@6.13.0 + * add `depth` option to customize the depth level in the parser + * IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`) + +1.20.2 / 2023-02-21 +=================== + + * Fix strict json error message on Node.js 19+ + * deps: content-type@~1.0.5 + - perf: skip value escaping when unnecessary + * deps: raw-body@2.5.2 + +1.20.1 / 2022-10-06 +=================== + + * deps: qs@6.11.0 + * perf: remove unnecessary object clone + +1.20.0 / 2022-04-02 +=================== + + * Fix error message for json parse whitespace in `strict` + * Fix internal error when inflated body exceeds limit + * Prevent loss of async hooks context + * Prevent hanging when request already read + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: qs@6.10.3 + * deps: raw-body@2.5.1 + - deps: http-errors@2.0.0 + +1.19.2 / 2022-02-15 +=================== + + * deps: bytes@3.1.2 + * deps: qs@6.9.7 + * Fix handling of `__proto__` keys + * deps: raw-body@2.4.3 + - deps: bytes@3.1.2 + +1.19.1 / 2021-12-10 +=================== + + * deps: bytes@3.1.1 + * deps: http-errors@1.8.1 + - deps: inherits@2.0.4 + - deps: toidentifier@1.0.1 + - deps: setprototypeof@1.2.0 + * deps: qs@6.9.6 + * deps: raw-body@2.4.2 + - deps: bytes@3.1.1 + - deps: http-errors@1.8.1 + * deps: safe-buffer@5.2.1 + * deps: type-is@~1.6.18 + +1.19.0 / 2019-04-25 +=================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: raw-body@2.4.0 + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + * deps: type-is@~1.6.17 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +1.18.3 / 2018-05-14 +=================== + + * Fix stack trace for strict json parse error + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: http-errors@~1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + * deps: qs@6.5.2 + * deps: raw-body@2.3.3 + - deps: http-errors@1.6.3 + - deps: iconv-lite@0.4.23 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +1.18.2 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: remove argument reassignment + +1.18.1 / 2017-09-12 +=================== + + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: raw-body@2.3.2 + - deps: iconv-lite@0.4.19 + +1.18.0 / 2017-09-08 +=================== + + * Fix JSON strict violation error to match native parse error + * Include the `body` property on verify errors + * Include the `type` property on all generated errors + * Use `http-errors` to set status code on errors + * deps: bytes@3.0.0 + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + * deps: qs@6.5.0 + * deps: raw-body@2.3.1 + - Use `http-errors` for standard emitted errors + - deps: bytes@3.0.0 + - deps: iconv-lite@0.4.18 + - perf: skip buffer decoding on overage chunk + * perf: prevent internal `throw` when missing charset + +1.17.2 / 2017-05-17 +=================== + + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + +1.17.1 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +1.17.0 / 2017-03-01 +=================== + + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + * deps: qs@6.3.1 + - Fix compacting nested arrays + +1.16.1 / 2017-02-10 +=================== + + * deps: debug@2.6.1 + - Fix deprecation messages in WebStorm and other editors + - Undeprecate `DEBUG_FD` set to `1` or `2` + +1.16.0 / 2017-01-17 +=================== + + * deps: debug@2.6.0 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + * deps: qs@6.2.1 + - Fix array parsing from skipping empty values + * deps: raw-body@~2.2.0 + - deps: iconv-lite@0.4.15 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +1.15.2 / 2016-06-19 +=================== + + * deps: bytes@2.4.0 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: http-errors@~1.5.0 + - Use `setprototypeof` module to replace `__proto__` setting + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: qs@6.2.0 + * deps: raw-body@~2.1.7 + - deps: bytes@2.4.0 + - perf: remove double-cleanup on happy path + * deps: type-is@~1.6.13 + - deps: mime-types@~2.1.11 + +1.15.1 / 2016-05-05 +=================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + * deps: raw-body@~2.1.6 + - deps: bytes@2.3.0 + * deps: type-is@~1.6.12 + - deps: mime-types@~2.1.10 + +1.15.0 / 2016-02-10 +=================== + + * deps: http-errors@~1.4.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.2.1 < 2' + * deps: qs@6.1.0 + * deps: type-is@~1.6.11 + - deps: mime-types@~2.1.9 + +1.14.2 / 2015-12-16 +=================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + * deps: qs@5.2.0 + * deps: raw-body@~2.1.5 + - deps: bytes@2.2.0 + - deps: iconv-lite@0.4.13 + * deps: type-is@~1.6.10 + - deps: mime-types@~2.1.8 + +1.14.1 / 2015-09-27 +=================== + + * Fix issue where invalid charset results in 400 when `verify` used + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + * deps: raw-body@~2.1.4 + - Fix masking critical errors from `iconv-lite` + - deps: iconv-lite@0.4.12 + * deps: type-is@~1.6.9 + - deps: mime-types@~2.1.7 + +1.14.0 / 2015-09-16 +=================== + + * Fix JSON strict parse error to match syntax errors + * Provide static `require` analysis in `urlencoded` parser + * deps: depd@~1.1.0 + - Support web browser loading + * deps: qs@5.1.0 + * deps: raw-body@~2.1.3 + - Fix sync callback when attaching data listener causes sync read + * deps: type-is@~1.6.8 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.6 + +1.13.3 / 2015-07-31 +=================== + + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +1.13.2 / 2015-07-05 +=================== + + * deps: iconv-lite@0.4.11 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix user-visible incompatibilities from 3.1.0 + - Fix various parsing edge cases + * deps: raw-body@~2.1.2 + - Fix error stack traces to skip `makeError` + - deps: iconv-lite@0.4.11 + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +1.13.1 / 2015-06-16 +=================== + + * deps: qs@2.4.2 + - Downgraded from 3.1.0 because of user-visible incompatibilities + +1.13.0 / 2015-06-14 +=================== + + * Add `statusCode` property on `Error`s, in addition to `status` + * Change `type` default to `application/json` for JSON parser + * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser + * Provide static `require` analysis + * Use the `http-errors` module to generate errors + * deps: bytes@2.1.0 + - Slight optimizations + * deps: iconv-lite@0.4.10 + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + - Leading BOM is now removed when decoding + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: qs@3.1.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + - Parsed object now has `null` prototype + * deps: raw-body@~2.1.1 + - Use `unpipe` module for unpiping requests + - deps: iconv-lite@0.4.10 + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: remove argument reassignment + * perf: remove delete call + +1.12.4 / 2015-05-10 +=================== + + * deps: debug@~2.2.0 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: on-finished@~2.2.1 + * deps: raw-body@~2.0.1 + - Fix a false-positive when unpiping in Node.js 0.8 + - deps: bytes@2.0.1 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +1.12.3 / 2015-04-15 +=================== + + * Slight efficiency improvement when not debugging + * deps: depd@~1.0.1 + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + * deps: raw-body@1.3.4 + - Fix hanging callback if request aborts during read + - deps: iconv-lite@0.4.8 + +1.12.2 / 2015-03-16 +=================== + + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + +1.12.1 / 2015-03-15 +=================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +1.12.0 / 2015-02-13 +=================== + + * add `debug` messages + * accept a function for the `type` option + * use `content-type` to parse `Content-Type` headers + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + * deps: raw-body@1.3.3 + - deps: iconv-lite@0.4.7 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +1.11.0 / 2015-01-30 +=================== + + * make internal `extended: true` depth limit infinity + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +1.10.2 / 2015-01-20 +=================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + * deps: raw-body@1.3.2 + - deps: iconv-lite@0.4.6 + +1.10.1 / 2015-01-01 +=================== + + * deps: on-finished@~2.2.0 + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +1.10.0 / 2014-12-02 +=================== + + * make internal `extended: true` array limit dynamic + +1.9.3 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + * deps: raw-body@1.3.1 + - deps: iconv-lite@0.4.5 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +1.9.2 / 2014-10-27 +================== + + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +1.9.1 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +1.9.0 / 2014-09-24 +================== + + * include the charset in "unsupported charset" error message + * include the encoding in "unsupported content encoding" error message + * deps: depd@~1.0.0 + +1.8.4 / 2014-09-23 +================== + + * fix content encoding to be case-insensitive + +1.8.3 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +1.8.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + +1.8.1 / 2014-09-07 +================== + + * deps: media-typer@0.3.0 + * deps: type-is@~1.5.1 + +1.8.0 / 2014-09-05 +================== + + * make empty-body-handling consistent between chunked requests + - empty `json` produces `{}` + - empty `raw` produces `new Buffer(0)` + - empty `text` produces `''` + - empty `urlencoded` produces `{}` + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: type-is@~1.5.0 + - fix `hasbody` to be true for `content-length: 0` + +1.7.0 / 2014-09-01 +================== + + * add `parameterLimit` option to `urlencoded` parser + * change `urlencoded` extended array limit to 100 + * respond with 413 when over `parameterLimit` in `urlencoded` + +1.6.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +1.6.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +1.6.5 / 2014-08-16 +================== + + * deps: on-finished@2.1.0 + +1.6.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + +1.6.3 / 2014-08-10 +================== + + * deps: qs@1.2.1 + +1.6.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +1.6.1 / 2014-08-06 +================== + + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +1.6.0 / 2014-08-05 +================== + + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + +1.5.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +1.5.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +1.5.0 / 2014-07-20 +================== + + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + * deps: raw-body@1.3.0 + - deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + - Fix `Cannot switch to old mode now` error on Node.js 0.10+ + * deps: type-is@~1.3.2 + +1.4.3 / 2014-06-19 +================== + + * deps: type-is@1.3.1 + - fix global variable leak + +1.4.2 / 2014-06-19 +================== + + * deps: type-is@1.3.0 + - improve type parsing + +1.4.1 / 2014-06-19 +================== + + * fix urlencoded extended deprecation message + +1.4.0 / 2014-06-19 +================== + + * add `text` parser + * add `raw` parser + * check accepted charset in content-type (accepts utf-8) + * check accepted encoding in content-encoding (accepts identity) + * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed + * deprecate `urlencoded()` without provided `extended` option + * lazy-load urlencoded parsers + * parsers split into files for reduced mem usage + * support gzip and deflate bodies + - set `inflate: false` to turn off + * deps: raw-body@1.2.2 + - Support all encodings from `iconv-lite` + +1.3.1 / 2014-06-11 +================== + + * deps: type-is@1.2.1 + - Switch dependency from mime to mime-types@1.0.0 + +1.3.0 / 2014-05-31 +================== + + * add `extended` option to urlencoded parser + +1.2.2 / 2014-05-27 +================== + + * deps: raw-body@1.1.6 + - assert stream encoding on node.js 0.8 + - assert stream encoding on node.js < 0.10.6 + - deps: bytes@1 + +1.2.1 / 2014-05-26 +================== + + * invoke `next(err)` after request fully read + - prevents hung responses and socket hang ups + +1.2.0 / 2014-05-11 +================== + + * add `verify` option + * deps: type-is@1.2.0 + - support suffix matching + +1.1.2 / 2014-05-11 +================== + + * improve json parser speed + +1.1.1 / 2014-05-11 +================== + + * fix repeated limit parsing with every request + +1.1.0 / 2014-05-10 +================== + + * add `type` option + * deps: pin for safety and consistency + +1.0.2 / 2014-04-14 +================== + + * use `type-is` module + +1.0.1 / 2014-03-20 +================== + + * lower default limits to 100kb diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/LICENSE new file mode 100644 index 00000000..386b7b69 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/README.md new file mode 100644 index 00000000..f6661b7d --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/README.md @@ -0,0 +1,476 @@ +# body-parser + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] +[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] + +Node.js body parsing middleware. + +Parse incoming request bodies in a middleware before your handlers, available +under the `req.body` property. + +**Note** As `req.body`'s shape is based on user-controlled input, all +properties and values in this object are untrusted and should be validated +before trusting. For example, `req.body.foo.toString()` may fail in multiple +ways, for example the `foo` property may not be there or may not be a string, +and `toString` may not be a function and instead a string or other user input. + +[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). + +_This does not handle multipart bodies_, due to their complex and typically +large nature. For multipart bodies, you may be interested in the following +modules: + + * [busboy](https://www.npmjs.org/package/busboy#readme) and + [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) + * [multiparty](https://www.npmjs.org/package/multiparty#readme) and + [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) + * [formidable](https://www.npmjs.org/package/formidable#readme) + * [multer](https://www.npmjs.org/package/multer#readme) + +This module provides the following parsers: + + * [JSON body parser](#bodyparserjsonoptions) + * [Raw body parser](#bodyparserrawoptions) + * [Text body parser](#bodyparsertextoptions) + * [URL-encoded form body parser](#bodyparserurlencodedoptions) + +Other body parsers you might be interested in: + +- [body](https://www.npmjs.org/package/body#readme) +- [co-body](https://www.npmjs.org/package/co-body#readme) + +## Installation + +```sh +$ npm install body-parser +``` + +## API + +```js +var bodyParser = require('body-parser') +``` + +The `bodyParser` object exposes various factories to create middlewares. All +middlewares will populate the `req.body` property with the parsed body when +the `Content-Type` request header matches the `type` option, or an empty +object (`{}`) if there was no body to parse, the `Content-Type` was not matched, +or an error occurred. + +The various errors returned by this module are described in the +[errors section](#errors). + +### bodyParser.json([options]) + +Returns middleware that only parses `json` and only looks at requests where +the `Content-Type` header matches the `type` option. This parser accepts any +Unicode encoding of the body and supports automatic inflation of `gzip` and +`deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). + +#### Options + +The `json` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### reviver + +The `reviver` option is passed directly to `JSON.parse` as the second +argument. You can find more information on this argument +[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). + +##### strict + +When set to `true`, will only accept arrays and objects; when `false` will +accept anything `JSON.parse` accepts. Defaults to `true`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not a +function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `json`), a mime type (like `application/json`), or +a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a truthy +value. Defaults to `application/json`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.raw([options]) + +Returns middleware that parses all bodies as a `Buffer` and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a `Buffer` object +of the body. + +#### Options + +The `raw` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. +If not a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this +can be an extension name (like `bin`), a mime type (like +`application/octet-stream`), or a mime type with a wildcard (like `*/*` or +`application/*`). If a function, the `type` option is called as `fn(req)` +and the request is parsed if it returns a truthy value. Defaults to +`application/octet-stream`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.text([options]) + +Returns middleware that parses all bodies as a string and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` string containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a string of the +body. + +#### Options + +The `text` function takes an optional `options` object that may contain any of +the following keys: + +##### defaultCharset + +Specify the default character set for the text content if the charset is not +specified in the `Content-Type` header of the request. Defaults to `utf-8`. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `txt`), a mime type (like `text/plain`), or a mime +type with a wildcard (like `*/*` or `text/*`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a +truthy value. Defaults to `text/plain`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.urlencoded([options]) + +Returns middleware that only parses `urlencoded` bodies and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser accepts only UTF-8 encoding of the body and supports automatic +inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This object will contain +key-value pairs, where the value can be a string or array (when `extended` is +`false`), or any type (when `extended` is `true`). + +#### Options + +The `urlencoded` function takes an optional `options` object that may contain +any of the following keys: + +##### extended + +The `extended` option allows to choose between parsing the URL-encoded data +with the `querystring` library (when `false`) or the `qs` library (when +`true`). The "extended" syntax allows for rich objects and arrays to be +encoded into the URL-encoded format, allowing for a JSON-like experience +with URL-encoded. For more information, please +[see the qs library](https://www.npmjs.org/package/qs#readme). + +Defaults to `true`, but using the default has been deprecated. Please +research into the difference between `qs` and `querystring` and choose the +appropriate setting. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### parameterLimit + +The `parameterLimit` option controls the maximum number of parameters that +are allowed in the URL-encoded data. If a request contains more parameters +than this value, a 413 will be returned to the client. Defaults to `1000`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `urlencoded`), a mime type (like +`application/x-www-form-urlencoded`), or a mime type with a wildcard (like +`*/x-www-form-urlencoded`). If a function, the `type` option is called as +`fn(req)` and the request is parsed if it returns a truthy value. Defaults +to `application/x-www-form-urlencoded`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +#### depth + +The `depth` option is used to configure the maximum depth of the `qs` library when `extended` is `true`. This allows you to limit the amount of keys that are parsed and can be useful to prevent certain types of abuse. Defaults to `32`. It is recommended to keep this value as low as possible. + +## Errors + +The middlewares provided by this module create errors using the +[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors +will typically have a `status`/`statusCode` property that contains the suggested +HTTP response code, an `expose` property to determine if the `message` property +should be displayed to the client, a `type` property to determine the type of +error without matching against the `message`, and a `body` property containing +the read body, if available. + +The following are the common errors created, though any error can come through +for various reasons. + +### content encoding unsupported + +This error will occur when the request had a `Content-Encoding` header that +contained an encoding but the "inflation" option was set to `false`. The +`status` property is set to `415`, the `type` property is set to +`'encoding.unsupported'`, and the `charset` property will be set to the +encoding that is unsupported. + +### entity parse failed + +This error will occur when the request contained an entity that could not be +parsed by the middleware. The `status` property is set to `400`, the `type` +property is set to `'entity.parse.failed'`, and the `body` property is set to +the entity value that failed parsing. + +### entity verify failed + +This error will occur when the request contained an entity that could not be +failed verification by the defined `verify` option. The `status` property is +set to `403`, the `type` property is set to `'entity.verify.failed'`, and the +`body` property is set to the entity value that failed verification. + +### request aborted + +This error will occur when the request is aborted by the client before reading +the body has finished. The `received` property will be set to the number of +bytes received before the request was aborted and the `expected` property is +set to the number of expected bytes. The `status` property is set to `400` +and `type` property is set to `'request.aborted'`. + +### request entity too large + +This error will occur when the request body's size is larger than the "limit" +option. The `limit` property will be set to the byte limit and the `length` +property will be set to the request body's length. The `status` property is +set to `413` and the `type` property is set to `'entity.too.large'`. + +### request size did not match content length + +This error will occur when the request's length did not match the length from +the `Content-Length` header. This typically occurs when the request is malformed, +typically when the `Content-Length` header was calculated based on characters +instead of bytes. The `status` property is set to `400` and the `type` property +is set to `'request.size.invalid'`. + +### stream encoding should not be set + +This error will occur when something called the `req.setEncoding` method prior +to this middleware. This module operates directly on bytes only and you cannot +call `req.setEncoding` when using this module. The `status` property is set to +`500` and the `type` property is set to `'stream.encoding.set'`. + +### stream is not readable + +This error will occur when the request is no longer readable when this middleware +attempts to read it. This typically means something other than a middleware from +this module read the request body already and the middleware was also configured to +read the same request. The `status` property is set to `500` and the `type` +property is set to `'stream.not.readable'`. + +### too many parameters + +This error will occur when the content of the request exceeds the configured +`parameterLimit` for the `urlencoded` parser. The `status` property is set to +`413` and the `type` property is set to `'parameters.too.many'`. + +### unsupported charset "BOGUS" + +This error will occur when the request had a charset parameter in the +`Content-Type` header, but the `iconv-lite` module does not support it OR the +parser does not support it. The charset is contained in the message as well +as in the `charset` property. The `status` property is set to `415`, the +`type` property is set to `'charset.unsupported'`, and the `charset` property +is set to the charset that is unsupported. + +### unsupported content encoding "bogus" + +This error will occur when the request had a `Content-Encoding` header that +contained an unsupported encoding. The encoding is contained in the message +as well as in the `encoding` property. The `status` property is set to `415`, +the `type` property is set to `'encoding.unsupported'`, and the `encoding` +property is set to the encoding that is unsupported. + +### The input exceeded the depth + +This error occurs when using `bodyParser.urlencoded` with the `extended` property set to `true` and the input exceeds the configured `depth` option. The `status` property is set to `400`. It is recommended to review the `depth` option and evaluate if it requires a higher value. When the `depth` option is set to `32` (default value), the error will not be thrown. + +## Examples + +### Express/Connect top-level generic + +This example demonstrates adding a generic JSON and URL-encoded parser as a +top-level middleware, which will parse the bodies of all incoming requests. +This is the simplest setup. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: false })) + +// parse application/json +app.use(bodyParser.json()) + +app.use(function (req, res) { + res.setHeader('Content-Type', 'text/plain') + res.write('you posted:\n') + res.end(JSON.stringify(req.body, null, 2)) +}) +``` + +### Express route-specific + +This example demonstrates adding body parsers specifically to the routes that +need them. In general, this is the most recommended way to use body-parser with +Express. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// create application/json parser +var jsonParser = bodyParser.json() + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }) + +// POST /login gets urlencoded bodies +app.post('/login', urlencodedParser, function (req, res) { + res.send('welcome, ' + req.body.username) +}) + +// POST /api/users gets JSON bodies +app.post('/api/users', jsonParser, function (req, res) { + // create user in req.body +}) +``` + +### Change accepted type for parsers + +All the parsers accept a `type` option which allows you to change the +`Content-Type` that the middleware will parse. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse various different custom JSON types as JSON +app.use(bodyParser.json({ type: 'application/*+json' })) + +// parse some custom thing into a Buffer +app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) + +// parse an HTML body into a string +app.use(bodyParser.text({ type: 'text/html' })) +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci +[ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master +[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master +[node-version-image]: https://badgen.net/npm/node/body-parser +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/body-parser +[npm-url]: https://npmjs.org/package/body-parser +[npm-version-image]: https://badgen.net/npm/v/body-parser +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/body-parser/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/body-parser \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/SECURITY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/SECURITY.md new file mode 100644 index 00000000..9694d429 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The Express team and community take all security bugs seriously. Thank you +for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `body-parser`. This +information can be found in the npm registry using the command +`npm owner ls body-parser`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/expressjs/body-parser/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/index.js new file mode 100644 index 00000000..bb24d739 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/index.js @@ -0,0 +1,156 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('body-parser') + +/** + * Cache of loaded parsers. + * @private + */ + +var parsers = Object.create(null) + +/** + * @typedef Parsers + * @type {function} + * @property {function} json + * @property {function} raw + * @property {function} text + * @property {function} urlencoded + */ + +/** + * Module exports. + * @type {Parsers} + */ + +exports = module.exports = deprecate.function(bodyParser, + 'bodyParser: use individual json/urlencoded middlewares') + +/** + * JSON parser. + * @public + */ + +Object.defineProperty(exports, 'json', { + configurable: true, + enumerable: true, + get: createParserGetter('json') +}) + +/** + * Raw parser. + * @public + */ + +Object.defineProperty(exports, 'raw', { + configurable: true, + enumerable: true, + get: createParserGetter('raw') +}) + +/** + * Text parser. + * @public + */ + +Object.defineProperty(exports, 'text', { + configurable: true, + enumerable: true, + get: createParserGetter('text') +}) + +/** + * URL-encoded parser. + * @public + */ + +Object.defineProperty(exports, 'urlencoded', { + configurable: true, + enumerable: true, + get: createParserGetter('urlencoded') +}) + +/** + * Create a middleware to parse json and urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @deprecated + * @public + */ + +function bodyParser (options) { + // use default type for parsers + var opts = Object.create(options || null, { + type: { + configurable: true, + enumerable: true, + value: undefined, + writable: true + } + }) + + var _urlencoded = exports.urlencoded(opts) + var _json = exports.json(opts) + + return function bodyParser (req, res, next) { + _json(req, res, function (err) { + if (err) return next(err) + _urlencoded(req, res, next) + }) + } +} + +/** + * Create a getter for loading a parser. + * @private + */ + +function createParserGetter (name) { + return function get () { + return loadParser(name) + } +} + +/** + * Load a parser module. + * @private + */ + +function loadParser (parserName) { + var parser = parsers[parserName] + + if (parser !== undefined) { + return parser + } + + // this uses a switch for static require analysis + switch (parserName) { + case 'json': + parser = require('./lib/types/json') + break + case 'raw': + parser = require('./lib/types/raw') + break + case 'text': + parser = require('./lib/types/text') + break + case 'urlencoded': + parser = require('./lib/types/urlencoded') + break + } + + // store to prevent invoking require() + return (parsers[parserName] = parser) +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/read.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/read.js new file mode 100644 index 00000000..fce6283f --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/read.js @@ -0,0 +1,205 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var destroy = require('destroy') +var getBody = require('raw-body') +var iconv = require('iconv-lite') +var onFinished = require('on-finished') +var unpipe = require('unpipe') +var zlib = require('zlib') + +/** + * Module exports. + */ + +module.exports = read + +/** + * Read a request into a buffer and parse. + * + * @param {object} req + * @param {object} res + * @param {function} next + * @param {function} parse + * @param {function} debug + * @param {object} options + * @private + */ + +function read (req, res, next, parse, debug, options) { + var length + var opts = options + var stream + + // flag as parsed + req._body = true + + // read options + var encoding = opts.encoding !== null + ? opts.encoding + : null + var verify = opts.verify + + try { + // get the content stream + stream = contentstream(req, debug, opts.inflate) + length = stream.length + stream.length = undefined + } catch (err) { + return next(err) + } + + // set raw-body options + opts.length = length + opts.encoding = verify + ? null + : encoding + + // assert charset is supported + if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { + return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + })) + } + + // read body + debug('read body') + getBody(stream, opts, function (error, body) { + if (error) { + var _error + + if (error.type === 'encoding.unsupported') { + // echo back charset + _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + }) + } else { + // set status code on error + _error = createError(400, error) + } + + // unpipe from stream and destroy + if (stream !== req) { + unpipe(req) + destroy(stream, true) + } + + // read off entire request + dump(req, function onfinished () { + next(createError(400, _error)) + }) + return + } + + // verify + if (verify) { + try { + debug('verify body') + verify(req, res, body, encoding) + } catch (err) { + next(createError(403, err, { + body: body, + type: err.type || 'entity.verify.failed' + })) + return + } + } + + // parse + var str = body + try { + debug('parse body') + str = typeof body !== 'string' && encoding !== null + ? iconv.decode(body, encoding) + : body + req.body = parse(str) + } catch (err) { + next(createError(400, err, { + body: str, + type: err.type || 'entity.parse.failed' + })) + return + } + + next() + }) +} + +/** + * Get the content stream of the request. + * + * @param {object} req + * @param {function} debug + * @param {boolean} [inflate=true] + * @return {object} + * @api private + */ + +function contentstream (req, debug, inflate) { + var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() + var length = req.headers['content-length'] + var stream + + debug('content-encoding "%s"', encoding) + + if (inflate === false && encoding !== 'identity') { + throw createError(415, 'content encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + switch (encoding) { + case 'deflate': + stream = zlib.createInflate() + debug('inflate body') + req.pipe(stream) + break + case 'gzip': + stream = zlib.createGunzip() + debug('gunzip body') + req.pipe(stream) + break + case 'identity': + stream = req + stream.length = length + break + default: + throw createError(415, 'unsupported content encoding "' + encoding + '"', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + return stream +} + +/** + * Dump the contents of a request. + * + * @param {object} req + * @param {function} callback + * @api private + */ + +function dump (req, callback) { + if (onFinished.isFinished(req)) { + callback(null) + } else { + onFinished(req, callback) + req.resume() + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/json.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/json.js new file mode 100644 index 00000000..59f3f7e2 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/json.js @@ -0,0 +1,247 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:json') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = json + +/** + * RegExp to match the first non-space in a string. + * + * Allowed whitespace is defined in RFC 7159: + * + * ws = *( + * %x20 / ; Space + * %x09 / ; Horizontal tab + * %x0A / ; Line feed or New line + * %x0D ) ; Carriage return + */ + +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex + +var JSON_SYNTAX_CHAR = '#' +var JSON_SYNTAX_REGEXP = /#+/g + +/** + * Create a middleware to parse JSON bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function json (options) { + var opts = options || {} + + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var inflate = opts.inflate !== false + var reviver = opts.reviver + var strict = opts.strict !== false + var type = opts.type || 'application/json' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + if (body.length === 0) { + // special-case empty json body, as it's a common client-side mistake + // TODO: maybe make this configurable or part of "strict" option + return {} + } + + if (strict) { + var first = firstchar(body) + + if (first !== '{' && first !== '[') { + debug('strict violation') + throw createStrictSyntaxError(body, first) + } + } + + try { + debug('parse json') + return JSON.parse(body, reviver) + } catch (e) { + throw normalizeJsonSyntaxError(e, { + message: e.message, + stack: e.stack + }) + } + } + + return function jsonParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset per RFC 7159 sec 8.1 + var charset = getCharset(req) || 'utf-8' + if (charset.slice(0, 4) !== 'utf-') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Create strict violation syntax error matching native error. + * + * @param {string} str + * @param {string} char + * @return {Error} + * @private + */ + +function createStrictSyntaxError (str, char) { + var index = str.indexOf(char) + var partial = '' + + if (index !== -1) { + partial = str.substring(0, index) + JSON_SYNTAX_CHAR + + for (var i = index + 1; i < str.length; i++) { + partial += JSON_SYNTAX_CHAR + } + } + + try { + JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') + } catch (e) { + return normalizeJsonSyntaxError(e, { + message: e.message.replace(JSON_SYNTAX_REGEXP, function (placeholder) { + return str.substring(index, index + placeholder.length) + }), + stack: e.stack + }) + } +} + +/** + * Get the first non-whitespace character in a string. + * + * @param {string} str + * @return {function} + * @private + */ + +function firstchar (str) { + var match = FIRST_CHAR_REGEXP.exec(str) + + return match + ? match[1] + : undefined +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Normalize a SyntaxError for JSON.parse. + * + * @param {SyntaxError} error + * @param {object} obj + * @return {SyntaxError} + */ + +function normalizeJsonSyntaxError (error, obj) { + var keys = Object.getOwnPropertyNames(error) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key !== 'stack' && key !== 'message') { + delete error[key] + } + } + + // replace stack before message for Node.js 0.10 and below + error.stack = obj.stack.replace(error.message, obj.message) + error.message = obj.message + + return error +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/raw.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/raw.js new file mode 100644 index 00000000..f5d1b674 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/raw.js @@ -0,0 +1,101 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var debug = require('debug')('body-parser:raw') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = raw + +/** + * Create a middleware to parse raw bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function raw (options) { + var opts = options || {} + + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/octet-stream' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function rawParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // read + read(req, res, next, parse, debug, { + encoding: null, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/text.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/text.js new file mode 100644 index 00000000..083a0090 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/text.js @@ -0,0 +1,121 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var debug = require('debug')('body-parser:text') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = text + +/** + * Create a middleware to parse text bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function text (options) { + var opts = options || {} + + var defaultCharset = opts.defaultCharset || 'utf-8' + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'text/plain' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function textParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // get charset + var charset = getCharset(req) || defaultCharset + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/urlencoded.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/urlencoded.js new file mode 100644 index 00000000..2bd4485f --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/lib/types/urlencoded.js @@ -0,0 +1,307 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:urlencoded') +var deprecate = require('depd')('body-parser') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = urlencoded + +/** + * Cache of parser modules. + */ + +var parsers = Object.create(null) + +/** + * Create a middleware to parse urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function urlencoded (options) { + var opts = options || {} + + // notice because option default will flip in next major + if (opts.extended === undefined) { + deprecate('undefined extended: provide extended option') + } + + var extended = opts.extended !== false + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/x-www-form-urlencoded' + var verify = opts.verify || false + var depth = typeof opts.depth !== 'number' + ? Number(opts.depth || 32) + : opts.depth + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate query parser + var queryparse = extended + ? extendedparser(opts) + : simpleparser(opts) + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + return body.length + ? queryparse(body) + : {} + } + + return function urlencodedParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset + var charset = getCharset(req) || 'utf-8' + if (charset !== 'utf-8') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + debug: debug, + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify, + depth: depth + }) + } +} + +/** + * Get the extended query parser. + * + * @param {object} options + */ + +function extendedparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + + var depth = typeof options.depth !== 'number' + ? Number(options.depth || 32) + : options.depth + var parse = parser('qs') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isNaN(depth) || depth < 0) { + throw new TypeError('option depth must be a zero or a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + var arrayLimit = Math.max(100, paramCount) + + debug('parse extended urlencoding') + try { + return parse(body, { + allowPrototypes: true, + arrayLimit: arrayLimit, + depth: depth, + strictDepth: true, + parameterLimit: parameterLimit + }) + } catch (err) { + if (err instanceof RangeError) { + throw createError(400, 'The input exceeded the depth', { + type: 'querystring.parse.rangeError' + }) + } else { + throw err + } + } + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Count the number of parameters, stopping once limit reached + * + * @param {string} body + * @param {number} limit + * @api private + */ + +function parameterCount (body, limit) { + var count = 0 + var index = 0 + + while ((index = body.indexOf('&', index)) !== -1) { + count++ + index++ + + if (count === limit) { + return undefined + } + } + + return count +} + +/** + * Get parser for module name dynamically. + * + * @param {string} name + * @return {function} + * @api private + */ + +function parser (name) { + var mod = parsers[name] + + if (mod !== undefined) { + return mod.parse + } + + // this uses a switch for static require analysis + switch (name) { + case 'qs': + mod = require('qs') + break + case 'querystring': + mod = require('querystring') + break + } + + // store to prevent invoking require() + parsers[name] = mod + + return mod.parse +} + +/** + * Get the simple query parser. + * + * @param {object} options + */ + +function simpleparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('querystring') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + debug('parse urlencoding') + return parse(body, undefined, undefined, { maxKeys: parameterLimit }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/package.json new file mode 100644 index 00000000..3c9926fc --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/body-parser/package.json @@ -0,0 +1,56 @@ +{ + "name": "body-parser", + "description": "Node.js body parsing middleware", + "version": "1.20.3", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "expressjs/body-parser", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "devDependencies": { + "eslint": "8.34.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-markdown": "3.0.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-standard": "4.1.0", + "methods": "1.1.2", + "mocha": "10.2.0", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "supertest": "6.3.3" + }, + "files": [ + "lib/", + "LICENSE", + "HISTORY.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/History.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/History.md new file mode 100644 index 00000000..d60ce0e6 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/History.md @@ -0,0 +1,97 @@ +3.1.2 / 2022-01-27 +================== + + * Fix return value for un-parsable strings + +3.1.1 / 2021-11-15 +================== + + * Fix "thousandsSeparator" incorrecting formatting fractional part + +3.1.0 / 2019-01-22 +================== + + * Add petabyte (`pb`) support + +3.0.0 / 2017-08-31 +================== + + * Change "kB" to "KB" in format output + * Remove support for Node.js 0.6 + * Remove support for ComponentJS + +2.5.0 / 2017-03-24 +================== + + * Add option "unit" + +2.4.0 / 2016-06-01 +================== + + * Add option "unitSeparator" + +2.3.0 / 2016-02-15 +================== + + * Drop partial bytes on all parsed units + * Fix non-finite numbers to `.format` to return `null` + * Fix parsing byte string that looks like hex + * perf: hoist regular expressions + +2.2.0 / 2015-11-13 +================== + + * add option "decimalPlaces" + * add option "fixedDecimals" + +2.1.0 / 2015-05-21 +================== + + * add `.format` export + * add `.parse` export + +2.0.2 / 2015-05-20 +================== + + * remove map recreation + * remove unnecessary object construction + +2.0.1 / 2015-05-07 +================== + + * fix browserify require + * remove node.extend dependency + +2.0.0 / 2015-04-12 +================== + + * add option "case" + * add option "thousandsSeparator" + * return "null" on invalid parse input + * support proper round-trip: bytes(bytes(num)) === num + * units no longer case sensitive when parsing + +1.0.0 / 2014-05-05 +================== + + * add negative support. fixes #6 + +0.3.0 / 2014-03-19 +================== + + * added terabyte support + +0.2.1 / 2013-04-01 +================== + + * add .component + +0.2.0 / 2012-10-28 +================== + + * bytes(200).should.eql('200b') + +0.1.0 / 2012-07-04 +================== + + * add bytes to string conversion [yields] diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/LICENSE new file mode 100644 index 00000000..63e95a96 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/Readme.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/Readme.md new file mode 100644 index 00000000..5790e23e --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/Readme.md @@ -0,0 +1,152 @@ +# Bytes utility + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install bytes +``` + +## Usage + +```js +var bytes = require('bytes'); +``` + +#### bytes(number|string value, [options]): number|string|null + +Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number`|`string` | Number value to format or string value to parse | +| options | `Object` | Conversion options for `format` | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. | + +**Example** + +```js +bytes(1024); +// output: '1KB' + +bytes('1KB'); +// output: 1024 +``` + +#### bytes.format(number value, [options]): string|null + +Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is + rounded. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number` | Value in bytes | +| options | `Object` | Conversion options | + +**Options** + +| Property | Type | Description | +|-------------------|--------|-----------------------------------------------------------------------------------------| +| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | +| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | +| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. | +| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | +| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`null` | Return null upon error. String value otherwise. | + +**Example** + +```js +bytes.format(1024); +// output: '1KB' + +bytes.format(1000); +// output: '1000B' + +bytes.format(1000, {thousandsSeparator: ' '}); +// output: '1 000B' + +bytes.format(1024 * 1.7, {decimalPlaces: 0}); +// output: '2KB' + +bytes.format(1024, {unitSeparator: ' '}); +// output: '1 KB' +``` + +#### bytes.parse(string|number value): number|null + +Parse the string value into an integer in bytes. If no unit is given, or `value` +is a number, it is assumed the value is in bytes. + +Supported units and abbreviations are as follows and are case-insensitive: + + * `b` for bytes + * `kb` for kilobytes + * `mb` for megabytes + * `gb` for gigabytes + * `tb` for terabytes + * `pb` for petabytes + +The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. + +**Arguments** + +| Name | Type | Description | +|---------------|--------|--------------------| +| value | `string`|`number` | String to parse, or number in bytes. | + +**Returns** + +| Name | Type | Description | +|---------|-------------|-------------------------| +| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | + +**Example** + +```js +bytes.parse('1KB'); +// output: 1024 + +bytes.parse('1024'); +// output: 1024 + +bytes.parse(1024); +// output: 1024 +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci +[ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master +[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master +[downloads-image]: https://badgen.net/npm/dm/bytes +[downloads-url]: https://npmjs.org/package/bytes +[npm-image]: https://badgen.net/npm/v/bytes +[npm-url]: https://npmjs.org/package/bytes diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/index.js new file mode 100644 index 00000000..6f2d0f89 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/index.js @@ -0,0 +1,170 @@ +/*! + * bytes + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015 Jed Watson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = bytes; +module.exports.format = format; +module.exports.parse = parse; + +/** + * Module variables. + * @private + */ + +var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; + +var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; + +var map = { + b: 1, + kb: 1 << 10, + mb: 1 << 20, + gb: 1 << 30, + tb: Math.pow(1024, 4), + pb: Math.pow(1024, 5), +}; + +var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i; + +/** + * Convert the given value in bytes into a string or parse to string to an integer in bytes. + * + * @param {string|number} value + * @param {{ + * case: [string], + * decimalPlaces: [number] + * fixedDecimals: [boolean] + * thousandsSeparator: [string] + * unitSeparator: [string] + * }} [options] bytes options. + * + * @returns {string|number|null} + */ + +function bytes(value, options) { + if (typeof value === 'string') { + return parse(value); + } + + if (typeof value === 'number') { + return format(value, options); + } + + return null; +} + +/** + * Format the given value in bytes into a string. + * + * If the value is negative, it is kept as such. If it is a float, + * it is rounded. + * + * @param {number} value + * @param {object} [options] + * @param {number} [options.decimalPlaces=2] + * @param {number} [options.fixedDecimals=false] + * @param {string} [options.thousandsSeparator=] + * @param {string} [options.unit=] + * @param {string} [options.unitSeparator=] + * + * @returns {string|null} + * @public + */ + +function format(value, options) { + if (!Number.isFinite(value)) { + return null; + } + + var mag = Math.abs(value); + var thousandsSeparator = (options && options.thousandsSeparator) || ''; + var unitSeparator = (options && options.unitSeparator) || ''; + var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; + var fixedDecimals = Boolean(options && options.fixedDecimals); + var unit = (options && options.unit) || ''; + + if (!unit || !map[unit.toLowerCase()]) { + if (mag >= map.pb) { + unit = 'PB'; + } else if (mag >= map.tb) { + unit = 'TB'; + } else if (mag >= map.gb) { + unit = 'GB'; + } else if (mag >= map.mb) { + unit = 'MB'; + } else if (mag >= map.kb) { + unit = 'KB'; + } else { + unit = 'B'; + } + } + + var val = value / map[unit.toLowerCase()]; + var str = val.toFixed(decimalPlaces); + + if (!fixedDecimals) { + str = str.replace(formatDecimalsRegExp, '$1'); + } + + if (thousandsSeparator) { + str = str.split('.').map(function (s, i) { + return i === 0 + ? s.replace(formatThousandsRegExp, thousandsSeparator) + : s + }).join('.'); + } + + return str + unitSeparator + unit; +} + +/** + * Parse the string value into an integer in bytes. + * + * If no unit is given, it is assumed the value is in bytes. + * + * @param {number|string} val + * + * @returns {number|null} + * @public + */ + +function parse(val) { + if (typeof val === 'number' && !isNaN(val)) { + return val; + } + + if (typeof val !== 'string') { + return null; + } + + // Test if the string passed is valid + var results = parseRegExp.exec(val); + var floatValue; + var unit = 'b'; + + if (!results) { + // Nothing could be extracted from the given string + floatValue = parseInt(val, 10); + unit = 'b' + } else { + // Retrieve the value and the unit + floatValue = parseFloat(results[1]); + unit = results[4].toLowerCase(); + } + + if (isNaN(floatValue)) { + return null; + } + + return Math.floor(map[unit] * floatValue); +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/package.json new file mode 100644 index 00000000..f2b6a8b0 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/bytes/package.json @@ -0,0 +1,42 @@ +{ + "name": "bytes", + "description": "Utility to parse a string bytes to bytes and vice-versa", + "version": "3.1.2", + "author": "TJ Holowaychuk (http://tjholowaychuk.com)", + "contributors": [ + "Jed Watson ", + "Théo FIDRY " + ], + "license": "MIT", + "keywords": [ + "byte", + "bytes", + "utility", + "parse", + "parser", + "convert", + "converter" + ], + "repository": "visionmedia/bytes.js", + "devDependencies": { + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "History.md", + "LICENSE", + "Readme.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --check-leaks --reporter spec", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.eslintrc b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.eslintrc new file mode 100644 index 00000000..201e859b --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.eslintrc @@ -0,0 +1,17 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "func-name-matching": 0, + "id-length": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + "no-extra-parens": 0, + "no-magic-numbers": 0, + }, +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.github/FUNDING.yml b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.github/FUNDING.yml new file mode 100644 index 00000000..0011e9d6 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/call-bind-apply-helpers +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.nycrc b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.nycrc new file mode 100644 index 00000000..bdd626ce --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/.nycrc @@ -0,0 +1,9 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "exclude": [ + "coverage", + "test" + ] +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/CHANGELOG.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/CHANGELOG.md new file mode 100644 index 00000000..24849428 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.0.2](https://github.com/ljharb/call-bind-apply-helpers/compare/v1.0.1...v1.0.2) - 2025-02-12 + +### Commits + +- [types] improve inferred types [`e6f9586`](https://github.com/ljharb/call-bind-apply-helpers/commit/e6f95860a3c72879cb861a858cdfb8138fbedec1) +- [Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`, `es-value-fixtures`, `for-each`, `has-strict-mode`, `object-inspect` [`e43d540`](https://github.com/ljharb/call-bind-apply-helpers/commit/e43d5409f97543bfbb11f345d47d8ce4e066d8c1) + +## [v1.0.1](https://github.com/ljharb/call-bind-apply-helpers/compare/v1.0.0...v1.0.1) - 2024-12-08 + +### Commits + +- [types] `reflectApply`: fix types [`4efc396`](https://github.com/ljharb/call-bind-apply-helpers/commit/4efc3965351a4f02cc55e836fa391d3d11ef2ef8) +- [Fix] `reflectApply`: oops, Reflect is not a function [`83cc739`](https://github.com/ljharb/call-bind-apply-helpers/commit/83cc7395de6b79b7730bdf092f1436f0b1263c75) +- [Dev Deps] update `@arethetypeswrong/cli` [`80bd5d3`](https://github.com/ljharb/call-bind-apply-helpers/commit/80bd5d3ae58b4f6b6995ce439dd5a1bcb178a940) + +## v1.0.0 - 2024-12-05 + +### Commits + +- Initial implementation, tests, readme [`7879629`](https://github.com/ljharb/call-bind-apply-helpers/commit/78796290f9b7430c9934d6f33d94ae9bc89fce04) +- Initial commit [`3f1dc16`](https://github.com/ljharb/call-bind-apply-helpers/commit/3f1dc164afc43285631b114a5f9dd9137b2b952f) +- npm init [`081df04`](https://github.com/ljharb/call-bind-apply-helpers/commit/081df048c312fcee400922026f6e97281200a603) +- Only apps should have lockfiles [`5b9ca0f`](https://github.com/ljharb/call-bind-apply-helpers/commit/5b9ca0fe8101ebfaf309c549caac4e0a017ed930) diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/LICENSE new file mode 100644 index 00000000..f82f3896 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/README.md new file mode 100644 index 00000000..8fc0dae1 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/README.md @@ -0,0 +1,62 @@ +# call-bind-apply-helpers [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +Helper functions around Function call/apply/bind, for use in `call-bind`. + +The only packages that should likely ever use this package directly are `call-bind` and `get-intrinsic`. +Please use `call-bind` unless you have a very good reason not to. + +## Getting started + +```sh +npm install --save call-bind-apply-helpers +``` + +## Usage/Examples + +```js +const assert = require('assert'); +const callBindBasic = require('call-bind-apply-helpers'); + +function f(a, b) { + assert.equal(this, 1); + assert.equal(a, 2); + assert.equal(b, 3); + assert.equal(arguments.length, 2); +} + +const fBound = callBindBasic([f, 1]); + +delete Function.prototype.call; +delete Function.prototype.bind; + +fBound(2, 3); +``` + +## Tests + +Clone the repo, `npm install`, and run `npm test` + +[package-url]: https://npmjs.org/package/call-bind-apply-helpers +[npm-version-svg]: https://versionbadg.es/ljharb/call-bind-apply-helpers.svg +[deps-svg]: https://david-dm.org/ljharb/call-bind-apply-helpers.svg +[deps-url]: https://david-dm.org/ljharb/call-bind-apply-helpers +[dev-deps-svg]: https://david-dm.org/ljharb/call-bind-apply-helpers/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/call-bind-apply-helpers#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/call-bind-apply-helpers.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/call-bind-apply-helpers.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/call-bind-apply-helpers.svg +[downloads-url]: https://npm-stat.com/charts.html?package=call-bind-apply-helpers +[codecov-image]: https://codecov.io/gh/ljharb/call-bind-apply-helpers/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/call-bind-apply-helpers/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bind-apply-helpers +[actions-url]: https://github.com/ljharb/call-bind-apply-helpers/actions diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.d.ts new file mode 100644 index 00000000..b87286a2 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.d.ts @@ -0,0 +1 @@ +export = Reflect.apply; \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.js new file mode 100644 index 00000000..ffa51355 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/actualApply.js @@ -0,0 +1,10 @@ +'use strict'; + +var bind = require('function-bind'); + +var $apply = require('./functionApply'); +var $call = require('./functionCall'); +var $reflectApply = require('./reflectApply'); + +/** @type {import('./actualApply')} */ +module.exports = $reflectApply || bind.call($call, $apply); diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.d.ts new file mode 100644 index 00000000..d176c1ab --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.d.ts @@ -0,0 +1,19 @@ +import actualApply from './actualApply'; + +type TupleSplitHead = T['length'] extends N + ? T + : T extends [...infer R, any] + ? TupleSplitHead + : never + +type TupleSplitTail = O['length'] extends N + ? T + : T extends [infer F, ...infer R] + ? TupleSplitTail<[...R], N, [...O, F]> + : never + +type TupleSplit = [TupleSplitHead, TupleSplitTail] + +declare function applyBind(...args: TupleSplit, 2>[1]): ReturnType; + +export = applyBind; \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.js new file mode 100644 index 00000000..d2b77231 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/applyBind.js @@ -0,0 +1,10 @@ +'use strict'; + +var bind = require('function-bind'); +var $apply = require('./functionApply'); +var actualApply = require('./actualApply'); + +/** @type {import('./applyBind')} */ +module.exports = function applyBind() { + return actualApply(bind, $apply, arguments); +}; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.d.ts new file mode 100644 index 00000000..1f6e11b3 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.d.ts @@ -0,0 +1 @@ +export = Function.prototype.apply; \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.js new file mode 100644 index 00000000..c71df9c2 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionApply.js @@ -0,0 +1,4 @@ +'use strict'; + +/** @type {import('./functionApply')} */ +module.exports = Function.prototype.apply; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.d.ts new file mode 100644 index 00000000..15e93df3 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.d.ts @@ -0,0 +1 @@ +export = Function.prototype.call; \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.js new file mode 100644 index 00000000..7a8d8735 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/functionCall.js @@ -0,0 +1,4 @@ +'use strict'; + +/** @type {import('./functionCall')} */ +module.exports = Function.prototype.call; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.d.ts new file mode 100644 index 00000000..541516bd --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.d.ts @@ -0,0 +1,64 @@ +type RemoveFromTuple< + Tuple extends readonly unknown[], + RemoveCount extends number, + Index extends 1[] = [] +> = Index["length"] extends RemoveCount + ? Tuple + : Tuple extends [infer First, ...infer Rest] + ? RemoveFromTuple + : Tuple; + +type ConcatTuples< + Prefix extends readonly unknown[], + Suffix extends readonly unknown[] +> = [...Prefix, ...Suffix]; + +type ExtractFunctionParams = T extends (this: infer TThis, ...args: infer P extends readonly unknown[]) => infer R + ? { thisArg: TThis; params: P; returnType: R } + : never; + +type BindFunction< + T extends (this: any, ...args: any[]) => any, + TThis, + TBoundArgs extends readonly unknown[], + ReceiverBound extends boolean +> = ExtractFunctionParams extends { + thisArg: infer OrigThis; + params: infer P extends readonly unknown[]; + returnType: infer R; +} + ? ReceiverBound extends true + ? (...args: RemoveFromTuple>) => R extends [OrigThis, ...infer Rest] + ? [TThis, ...Rest] // Replace `this` with `thisArg` + : R + : >>( + thisArg: U, + ...args: RemainingArgs + ) => R extends [OrigThis, ...infer Rest] + ? [U, ...ConcatTuples] // Preserve bound args in return type + : R + : never; + +declare function callBind< + const T extends (this: any, ...args: any[]) => any, + Extracted extends ExtractFunctionParams, + const TBoundArgs extends Partial & readonly unknown[], + const TThis extends Extracted["thisArg"] +>( + args: [fn: T, thisArg: TThis, ...boundArgs: TBoundArgs] +): BindFunction; + +declare function callBind< + const T extends (this: any, ...args: any[]) => any, + Extracted extends ExtractFunctionParams, + const TBoundArgs extends Partial & readonly unknown[] +>( + args: [fn: T, ...boundArgs: TBoundArgs] +): BindFunction; + +declare function callBind( + args: [fn: Exclude, ...rest: TArgs] +): never; + +// export as namespace callBind; +export = callBind; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.js new file mode 100644 index 00000000..2f6dab4c --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/index.js @@ -0,0 +1,15 @@ +'use strict'; + +var bind = require('function-bind'); +var $TypeError = require('es-errors/type'); + +var $call = require('./functionCall'); +var $actualApply = require('./actualApply'); + +/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */ +module.exports = function callBindBasic(args) { + if (args.length < 1 || typeof args[0] !== 'function') { + throw new $TypeError('a function is required'); + } + return $actualApply(bind, $call, args); +}; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/package.json new file mode 100644 index 00000000..923b8be2 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/package.json @@ -0,0 +1,85 @@ +{ + "name": "call-bind-apply-helpers", + "version": "1.0.2", + "description": "Helper functions around Function call/apply/bind, for use in `call-bind`", + "main": "index.js", + "exports": { + ".": "./index.js", + "./actualApply": "./actualApply.js", + "./applyBind": "./applyBind.js", + "./functionApply": "./functionApply.js", + "./functionCall": "./functionCall.js", + "./reflectApply": "./reflectApply.js", + "./package.json": "./package.json" + }, + "scripts": { + "prepack": "npmignore --auto --commentLines=auto", + "prepublish": "not-in-publish || npm run prepublishOnly", + "prepublishOnly": "safe-publish-latest", + "prelint": "evalmd README.md", + "lint": "eslint --ext=.js,.mjs .", + "postlint": "tsc -p . && attw -P", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "npx npm@'>=10.2' audit --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/call-bind-apply-helpers.git" + }, + "author": "Jordan Harband ", + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/call-bind-apply-helpers/issues" + }, + "homepage": "https://github.com/ljharb/call-bind-apply-helpers#readme", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.3", + "@ljharb/eslint-config": "^21.1.1", + "@ljharb/tsconfig": "^0.2.3", + "@types/for-each": "^0.3.3", + "@types/function-bind": "^1.1.10", + "@types/object-inspect": "^1.13.0", + "@types/tape": "^5.8.1", + "auto-changelog": "^2.5.0", + "encoding": "^0.1.13", + "es-value-fixtures": "^1.7.1", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.5", + "has-strict-mode": "^1.1.0", + "in-publish": "^2.0.1", + "npmignore": "^0.3.1", + "nyc": "^10.3.2", + "object-inspect": "^1.13.4", + "safe-publish-latest": "^2.0.0", + "tape": "^5.9.0", + "typescript": "next" + }, + "testling": { + "files": "test/index.js" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows" + ] + }, + "engines": { + "node": ">= 0.4" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.d.ts new file mode 100644 index 00000000..6b2ae764 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.d.ts @@ -0,0 +1,3 @@ +declare const reflectApply: false | typeof Reflect.apply; + +export = reflectApply; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.js new file mode 100644 index 00000000..3d03caa6 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/reflectApply.js @@ -0,0 +1,4 @@ +'use strict'; + +/** @type {import('./reflectApply')} */ +module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/test/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/test/index.js new file mode 100644 index 00000000..1cdc89ed --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/test/index.js @@ -0,0 +1,63 @@ +'use strict'; + +var callBind = require('../'); +var hasStrictMode = require('has-strict-mode')(); +var forEach = require('for-each'); +var inspect = require('object-inspect'); +var v = require('es-value-fixtures'); + +var test = require('tape'); + +test('callBindBasic', function (t) { + forEach(v.nonFunctions, function (nonFunction) { + t['throws']( + // @ts-expect-error + function () { callBind([nonFunction]); }, + TypeError, + inspect(nonFunction) + ' is not a function' + ); + }); + + var sentinel = { sentinel: true }; + /** @type {(this: T, a: A, b: B) => [T | undefined, A, B]} */ + var func = function (a, b) { + // eslint-disable-next-line no-invalid-this + return [!hasStrictMode && this === global ? undefined : this, a, b]; + }; + t.equal(func.length, 2, 'original function length is 2'); + + /** type {(thisArg: unknown, a: number, b: number) => [unknown, number, number]} */ + var bound = callBind([func]); + /** type {((a: number, b: number) => [typeof sentinel, typeof a, typeof b])} */ + var boundR = callBind([func, sentinel]); + /** type {((b: number) => [typeof sentinel, number, typeof b])} */ + var boundArg = callBind([func, sentinel, /** @type {const} */ (1)]); + + // @ts-expect-error + t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with no args'); + + // @ts-expect-error + t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args'); + // @ts-expect-error + t.deepEqual(bound(1, 2), [hasStrictMode ? 1 : Object(1), 2, undefined], 'bound func too few args'); + // @ts-expect-error + t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args'); + // @ts-expect-error + t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args'); + + t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args'); + t.deepEqual(bound(1, 2, 3), [hasStrictMode ? 1 : Object(1), 2, 3], 'bound func with right args'); + t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args'); + t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg'); + + // @ts-expect-error + t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args'); + // @ts-expect-error + t.deepEqual(bound(1, 2, 3, 4), [hasStrictMode ? 1 : Object(1), 2, 3], 'bound func with too many args'); + // @ts-expect-error + t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args'); + // @ts-expect-error + t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args'); + + t.end(); +}); diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/tsconfig.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/tsconfig.json new file mode 100644 index 00000000..aef99930 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bind-apply-helpers/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@ljharb/tsconfig", + "compilerOptions": { + "target": "es2021", + }, + "exclude": [ + "coverage", + ], +} \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.eslintrc b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.eslintrc new file mode 100644 index 00000000..2612ed8f --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.eslintrc @@ -0,0 +1,13 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "new-cap": [2, { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + }, +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.github/FUNDING.yml b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.github/FUNDING.yml new file mode 100644 index 00000000..2a2a1357 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/call-bound +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.nycrc b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.nycrc new file mode 100644 index 00000000..bdd626ce --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/.nycrc @@ -0,0 +1,9 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "exclude": [ + "coverage", + "test" + ] +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/CHANGELOG.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/CHANGELOG.md new file mode 100644 index 00000000..8bde4e9a --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/CHANGELOG.md @@ -0,0 +1,42 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.0.4](https://github.com/ljharb/call-bound/compare/v1.0.3...v1.0.4) - 2025-03-03 + +### Commits + +- [types] improve types [`e648922`](https://github.com/ljharb/call-bound/commit/e6489222a9e54f350fbf952ceabe51fd8b6027ff) +- [Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`, `es-value-fixtures`, `for-each`, `has-strict-mode`, `object-inspect` [`a42a5eb`](https://github.com/ljharb/call-bound/commit/a42a5ebe6c1b54fcdc7997c7dc64fdca9e936719) +- [Deps] update `call-bind-apply-helpers`, `get-intrinsic` [`f529eac`](https://github.com/ljharb/call-bound/commit/f529eac132404c17156bbc23ab2297a25d0f20b8) + +## [v1.0.3](https://github.com/ljharb/call-bound/compare/v1.0.2...v1.0.3) - 2024-12-15 + +### Commits + +- [Refactor] use `call-bind-apply-helpers` instead of `call-bind` [`5e0b134`](https://github.com/ljharb/call-bound/commit/5e0b13496df14fb7d05dae9412f088da8d3f75be) +- [Deps] update `get-intrinsic` [`41fc967`](https://github.com/ljharb/call-bound/commit/41fc96732a22c7b7e8f381f93ccc54bb6293be2e) +- [readme] fix example [`79a0137`](https://github.com/ljharb/call-bound/commit/79a0137723f7c6d09c9c05452bbf8d5efb5d6e49) +- [meta] add `sideEffects` flag [`08b07be`](https://github.com/ljharb/call-bound/commit/08b07be7f1c03f67dc6f3cdaf0906259771859f7) + +## [v1.0.2](https://github.com/ljharb/call-bound/compare/v1.0.1...v1.0.2) - 2024-12-10 + +### Commits + +- [Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `gopd` [`e6a5ffe`](https://github.com/ljharb/call-bound/commit/e6a5ffe849368fe4f74dfd6cdeca1b9baa39e8d5) +- [Deps] update `call-bind`, `get-intrinsic` [`2aeb5b5`](https://github.com/ljharb/call-bound/commit/2aeb5b521dc2b2683d1345c753ea1161de2d1c14) +- [types] improve return type [`1a0c9fe`](https://github.com/ljharb/call-bound/commit/1a0c9fe3114471e7ca1f57d104e2efe713bb4871) + +## v1.0.1 - 2024-12-05 + +### Commits + +- Initial implementation, tests, readme, types [`6d94121`](https://github.com/ljharb/call-bound/commit/6d94121a9243602e506334069f7a03189fe3363d) +- Initial commit [`0eae867`](https://github.com/ljharb/call-bound/commit/0eae867334ea025c33e6e91cdecfc9df96680cf9) +- npm init [`71b2479`](https://github.com/ljharb/call-bound/commit/71b2479c6723e0b7d91a6b663613067e98b7b275) +- Only apps should have lockfiles [`c3754a9`](https://github.com/ljharb/call-bound/commit/c3754a949b7f9132b47e2d18c1729889736741eb) +- [actions] skip `npm ls` in node < 10 [`74275a5`](https://github.com/ljharb/call-bound/commit/74275a5186b8caf6309b6b97472bdcb0df4683a8) +- [Dev Deps] add missing peer dep [`1354de8`](https://github.com/ljharb/call-bound/commit/1354de8679413e4ae9c523d85f76fa7a5e032d97) diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/LICENSE new file mode 100644 index 00000000..f82f3896 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/README.md new file mode 100644 index 00000000..a44e43e5 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/README.md @@ -0,0 +1,53 @@ +# call-bound [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +Robust call-bound JavaScript intrinsics, using `call-bind` and `get-intrinsic`. + +## Getting started + +```sh +npm install --save call-bound +``` + +## Usage/Examples + +```js +const assert = require('assert'); +const callBound = require('call-bound'); + +const slice = callBound('Array.prototype.slice'); + +delete Function.prototype.call; +delete Function.prototype.bind; +delete Array.prototype.slice; + +assert.deepEqual(slice([1, 2, 3, 4], 1, -1), [2, 3]); +``` + +## Tests + +Clone the repo, `npm install`, and run `npm test` + +[package-url]: https://npmjs.org/package/call-bound +[npm-version-svg]: https://versionbadg.es/ljharb/call-bound.svg +[deps-svg]: https://david-dm.org/ljharb/call-bound.svg +[deps-url]: https://david-dm.org/ljharb/call-bound +[dev-deps-svg]: https://david-dm.org/ljharb/call-bound/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/call-bound#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/call-bound.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/call-bound.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/call-bound.svg +[downloads-url]: https://npm-stat.com/charts.html?package=call-bound +[codecov-image]: https://codecov.io/gh/ljharb/call-bound/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/call-bound/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bound +[actions-url]: https://github.com/ljharb/call-bound/actions diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.d.ts b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.d.ts new file mode 100644 index 00000000..5562f00e --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.d.ts @@ -0,0 +1,94 @@ +type Intrinsic = typeof globalThis; + +type IntrinsicName = keyof Intrinsic | `%${keyof Intrinsic}%`; + +type IntrinsicPath = IntrinsicName | `${StripPercents}.${string}` | `%${StripPercents}.${string}%`; + +type AllowMissing = boolean; + +type StripPercents = T extends `%${infer U}%` ? U : T; + +type BindMethodPrecise = + F extends (this: infer This, ...args: infer Args) => infer R + ? (obj: This, ...args: Args) => R + : F extends { + (this: infer This1, ...args: infer Args1): infer R1; + (this: infer This2, ...args: infer Args2): infer R2 + } + ? { + (obj: This1, ...args: Args1): R1; + (obj: This2, ...args: Args2): R2 + } + : never + +// Extract method type from a prototype +type GetPrototypeMethod = + (typeof globalThis)[T] extends { prototype: any } + ? M extends keyof (typeof globalThis)[T]['prototype'] + ? (typeof globalThis)[T]['prototype'][M] + : never + : never + +// Get static property/method +type GetStaticMember = + P extends keyof (typeof globalThis)[T] ? (typeof globalThis)[T][P] : never + +// Type that maps string path to actual bound function or value with better precision +type BoundIntrinsic = + S extends `${infer Obj}.prototype.${infer Method}` + ? Obj extends keyof typeof globalThis + ? BindMethodPrecise> + : unknown + : S extends `${infer Obj}.${infer Prop}` + ? Obj extends keyof typeof globalThis + ? GetStaticMember + : unknown + : unknown + +declare function arraySlice(array: readonly T[], start?: number, end?: number): T[]; +declare function arraySlice(array: ArrayLike, start?: number, end?: number): T[]; +declare function arraySlice(array: IArguments, start?: number, end?: number): T[]; + +// Special cases for methods that need explicit typing +interface SpecialCases { + '%Object.prototype.isPrototypeOf%': (thisArg: {}, obj: unknown) => boolean; + '%String.prototype.replace%': { + (str: string, searchValue: string | RegExp, replaceValue: string): string; + (str: string, searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string + }; + '%Object.prototype.toString%': (obj: {}) => string; + '%Object.prototype.hasOwnProperty%': (obj: {}, v: PropertyKey) => boolean; + '%Array.prototype.slice%': typeof arraySlice; + '%Array.prototype.map%': (array: readonly T[], callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any) => U[]; + '%Array.prototype.filter%': (array: readonly T[], predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any) => T[]; + '%Array.prototype.indexOf%': (array: readonly T[], searchElement: T, fromIndex?: number) => number; + '%Function.prototype.apply%': (fn: (...args: A) => R, thisArg: any, args: A) => R; + '%Function.prototype.call%': (fn: (...args: A) => R, thisArg: any, ...args: A) => R; + '%Function.prototype.bind%': (fn: (...args: A) => R, thisArg: any, ...args: A) => (...remainingArgs: A) => R; + '%Promise.prototype.then%': { + (promise: Promise, onfulfilled: (value: T) => R | PromiseLike): Promise; + (promise: Promise, onfulfilled: ((value: T) => R | PromiseLike) | undefined | null, onrejected: (reason: any) => R | PromiseLike): Promise; + }; + '%RegExp.prototype.test%': (regexp: RegExp, str: string) => boolean; + '%RegExp.prototype.exec%': (regexp: RegExp, str: string) => RegExpExecArray | null; + '%Error.prototype.toString%': (error: Error) => string; + '%TypeError.prototype.toString%': (error: TypeError) => string; + '%String.prototype.split%': ( + obj: unknown, + splitter: string | RegExp | { + [Symbol.split](string: string, limit?: number): string[]; + }, + limit?: number | undefined + ) => string[]; +} + +/** + * Returns a bound function for a prototype method, or a value for a static property. + * + * @param name - The name of the intrinsic (e.g. 'Array.prototype.slice') + * @param {AllowMissing} [allowMissing] - Whether to allow missing intrinsics (default: false) + */ +declare function callBound, S extends IntrinsicPath>(name: K, allowMissing?: AllowMissing): SpecialCases[`%${StripPercents}%`]; +declare function callBound, S extends IntrinsicPath>(name: S, allowMissing?: AllowMissing): BoundIntrinsic; + +export = callBound; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.js new file mode 100644 index 00000000..e9ade749 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/index.js @@ -0,0 +1,19 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var callBindBasic = require('call-bind-apply-helpers'); + +/** @type {(thisArg: string, searchString: string, position?: number) => number} */ +var $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]); + +/** @type {import('.')} */ +module.exports = function callBoundIntrinsic(name, allowMissing) { + /* eslint no-extra-parens: 0 */ + + var intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing)); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBindBasic(/** @type {const} */ ([intrinsic])); + } + return intrinsic; +}; diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/package.json new file mode 100644 index 00000000..d542db43 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/package.json @@ -0,0 +1,99 @@ +{ + "name": "call-bound", + "version": "1.0.4", + "description": "Robust call-bound JavaScript intrinsics, using `call-bind` and `get-intrinsic`.", + "main": "index.js", + "exports": { + ".": "./index.js", + "./package.json": "./package.json" + }, + "sideEffects": false, + "scripts": { + "prepack": "npmignore --auto --commentLines=auto", + "prepublish": "not-in-publish || npm run prepublishOnly", + "prepublishOnly": "safe-publish-latest", + "prelint": "evalmd README.md", + "lint": "eslint --ext=.js,.mjs .", + "postlint": "tsc -p . && attw -P", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "npx npm@'>=10.2' audit --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/call-bound.git" + }, + "keywords": [ + "javascript", + "ecmascript", + "es", + "js", + "callbind", + "callbound", + "call", + "bind", + "bound", + "call-bind", + "call-bound", + "function", + "es-abstract" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/call-bound/issues" + }, + "homepage": "https://github.com/ljharb/call-bound#readme", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@ljharb/eslint-config": "^21.1.1", + "@ljharb/tsconfig": "^0.3.0", + "@types/call-bind": "^1.0.5", + "@types/get-intrinsic": "^1.2.3", + "@types/tape": "^5.8.1", + "auto-changelog": "^2.5.0", + "encoding": "^0.1.13", + "es-value-fixtures": "^1.7.1", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "has-strict-mode": "^1.1.0", + "in-publish": "^2.0.1", + "npmignore": "^0.3.1", + "nyc": "^10.3.2", + "object-inspect": "^1.13.4", + "safe-publish-latest": "^2.0.0", + "tape": "^5.9.0", + "typescript": "next" + }, + "testling": { + "files": "test/index.js" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows" + ] + }, + "engines": { + "node": ">= 0.4" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/test/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/test/index.js new file mode 100644 index 00000000..a2fc9f0f --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/test/index.js @@ -0,0 +1,61 @@ +'use strict'; + +var test = require('tape'); + +var callBound = require('../'); + +/** @template {true} T @template U @typedef {T extends U ? T : never} AssertType */ + +test('callBound', function (t) { + // static primitive + t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself'); + t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself'); + + // static non-function object + t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself'); + t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself'); + t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself'); + t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself'); + + // static function + t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself'); + t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself'); + + // prototype primitive + t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself'); + t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself'); + + var x = callBound('Object.prototype.toString'); + var y = callBound('%Object.prototype.toString%'); + + // prototype function + t.notEqual(x, Object.prototype.toString, 'Object.prototype.toString does not yield itself'); + t.notEqual(y, Object.prototype.toString, '%Object.prototype.toString% does not yield itself'); + t.equal(x(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original'); + t.equal(y(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original'); + + t['throws']( + // @ts-expect-error + function () { callBound('does not exist'); }, + SyntaxError, + 'nonexistent intrinsic throws' + ); + t['throws']( + // @ts-expect-error + function () { callBound('does not exist', true); }, + SyntaxError, + 'allowMissing arg still throws for unknown intrinsic' + ); + + t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) { + st['throws']( + function () { callBound('WeakRef'); }, + TypeError, + 'real but absent intrinsic throws' + ); + st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception'); + st.end(); + }); + + t.end(); +}); diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/tsconfig.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/tsconfig.json new file mode 100644 index 00000000..8976d98b --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/call-bound/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@ljharb/tsconfig", + "compilerOptions": { + "target": "ESNext", + "lib": ["es2024"], + }, + "exclude": [ + "coverage", + ], +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/HISTORY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/HISTORY.md new file mode 100644 index 00000000..488effa0 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/HISTORY.md @@ -0,0 +1,60 @@ +0.5.4 / 2021-12-10 +================== + + * deps: safe-buffer@5.2.1 + +0.5.3 / 2018-12-17 +================== + + * Use `safe-buffer` for improved Buffer API + +0.5.2 / 2016-12-08 +================== + + * Fix `parse` to accept any linear whitespace character + +0.5.1 / 2016-01-17 +================== + + * perf: enable strict mode + +0.5.0 / 2014-10-11 +================== + + * Add `parse` function + +0.4.0 / 2014-09-21 +================== + + * Expand non-Unicode `filename` to the full ISO-8859-1 charset + +0.3.0 / 2014-09-20 +================== + + * Add `fallback` option + * Add `type` option + +0.2.0 / 2014-09-19 +================== + + * Reduce ambiguity of file names with hex escape in buggy browsers + +0.1.2 / 2014-09-19 +================== + + * Fix periodic invalid Unicode filename header + +0.1.1 / 2014-09-19 +================== + + * Fix invalid characters appearing in `filename*` parameter + +0.1.0 / 2014-09-18 +================== + + * Make the `filename` argument optional + +0.0.0 / 2014-09-18 +================== + + * Initial release diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/LICENSE new file mode 100644 index 00000000..84441fbb --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/README.md new file mode 100644 index 00000000..3a0bb055 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/README.md @@ -0,0 +1,142 @@ +# content-disposition + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Create and parse HTTP `Content-Disposition` header + +## Installation + +```sh +$ npm install content-disposition +``` + +## API + +```js +var contentDisposition = require('content-disposition') +``` + +### contentDisposition(filename, options) + +Create an attachment `Content-Disposition` header value using the given file name, +if supplied. The `filename` is optional and if no file name is desired, but you +want to specify `options`, set `filename` to `undefined`. + +```js +res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf')) +``` + +**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this +header through a means different from `setHeader` in Node.js, you'll want to specify +the `'binary'` encoding in Node.js. + +#### Options + +`contentDisposition` accepts these properties in the options object. + +##### fallback + +If the `filename` option is outside ISO-8859-1, then the file name is actually +stored in a supplemental field for clients that support Unicode file names and +a ISO-8859-1 version of the file name is automatically generated. + +This specifies the ISO-8859-1 file name to override the automatic generation or +disables the generation all together, defaults to `true`. + + - A string will specify the ISO-8859-1 file name to use in place of automatic + generation. + - `false` will disable including a ISO-8859-1 file name and only include the + Unicode version (unless the file name is already ISO-8859-1). + - `true` will enable automatic generation if the file name is outside ISO-8859-1. + +If the `filename` option is ISO-8859-1 and this option is specified and has a +different value, then the `filename` option is encoded in the extended field +and this set as the fallback field, even though they are both ISO-8859-1. + +##### type + +Specifies the disposition type, defaults to `"attachment"`. This can also be +`"inline"`, or any other value (all values except inline are treated like +`attachment`, but can convey additional information if both parties agree to +it). The type is normalized to lower-case. + +### contentDisposition.parse(string) + +```js +var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt') +``` + +Parse a `Content-Disposition` header string. This automatically handles extended +("Unicode") parameters by decoding them and providing them under the standard +parameter name. This will return an object with the following properties (examples +are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`): + + - `type`: The disposition type (always lower case). Example: `'attachment'` + + - `parameters`: An object of the parameters in the disposition (name of parameter + always lower case and extended versions replace non-extended versions). Example: + `{filename: "€ rates.txt"}` + +## Examples + +### Send a file for download + +```js +var contentDisposition = require('content-disposition') +var destroy = require('destroy') +var fs = require('fs') +var http = require('http') +var onFinished = require('on-finished') + +var filePath = '/path/to/public/plans.pdf' + +http.createServer(function onRequest (req, res) { + // set headers + res.setHeader('Content-Type', 'application/pdf') + res.setHeader('Content-Disposition', contentDisposition(filePath)) + + // send file + var stream = fs.createReadStream(filePath) + stream.pipe(res) + onFinished(res, function () { + destroy(stream) + }) +}) +``` + +## Testing + +```sh +$ npm test +``` + +## References + +- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616] +- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987] +- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266] +- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231] + +[rfc-2616]: https://tools.ietf.org/html/rfc2616 +[rfc-5987]: https://tools.ietf.org/html/rfc5987 +[rfc-6266]: https://tools.ietf.org/html/rfc6266 +[tc-2231]: http://greenbytes.de/tech/tc2231/ + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/content-disposition.svg +[npm-url]: https://npmjs.org/package/content-disposition +[node-version-image]: https://img.shields.io/node/v/content-disposition.svg +[node-version-url]: https://nodejs.org/en/download +[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg +[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master +[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg +[downloads-url]: https://npmjs.org/package/content-disposition +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/content-disposition/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/content-disposition?query=workflow%3Aci diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/index.js new file mode 100644 index 00000000..ecec899a --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/index.js @@ -0,0 +1,458 @@ +/*! + * content-disposition + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = contentDisposition +module.exports.parse = parse + +/** + * Module dependencies. + * @private + */ + +var basename = require('path').basename +var Buffer = require('safe-buffer').Buffer + +/** + * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") + * @private + */ + +var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex + +/** + * RegExp to match percent encoding escape. + * @private + */ + +var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/ +var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g + +/** + * RegExp to match non-latin1 characters. + * @private + */ + +var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g + +/** + * RegExp to match quoted-pair in RFC 2616 + * + * quoted-pair = "\" CHAR + * CHAR = + * @private + */ + +var QESC_REGEXP = /\\([\u0000-\u007f])/g // eslint-disable-line no-control-regex + +/** + * RegExp to match chars that must be quoted-pair in RFC 2616 + * @private + */ + +var QUOTE_REGEXP = /([\\"])/g + +/** + * RegExp for various RFC 2616 grammar + * + * parameter = token "=" ( token | quoted-string ) + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) + * qdtext = > + * quoted-pair = "\" CHAR + * CHAR = + * TEXT = + * LWS = [CRLF] 1*( SP | HT ) + * CRLF = CR LF + * CR = + * LF = + * SP = + * HT = + * CTL = + * OCTET = + * @private + */ + +var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex +var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/ +var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/ + +/** + * RegExp for various RFC 5987 grammar + * + * ext-value = charset "'" [ language ] "'" value-chars + * charset = "UTF-8" / "ISO-8859-1" / mime-charset + * mime-charset = 1*mime-charsetc + * mime-charsetc = ALPHA / DIGIT + * / "!" / "#" / "$" / "%" / "&" + * / "+" / "-" / "^" / "_" / "`" + * / "{" / "}" / "~" + * language = ( 2*3ALPHA [ extlang ] ) + * / 4ALPHA + * / 5*8ALPHA + * extlang = *3( "-" 3ALPHA ) + * value-chars = *( pct-encoded / attr-char ) + * pct-encoded = "%" HEXDIG HEXDIG + * attr-char = ALPHA / DIGIT + * / "!" / "#" / "$" / "&" / "+" / "-" / "." + * / "^" / "_" / "`" / "|" / "~" + * @private + */ + +var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/ + +/** + * RegExp for various RFC 6266 grammar + * + * disposition-type = "inline" | "attachment" | disp-ext-type + * disp-ext-type = token + * disposition-parm = filename-parm | disp-ext-parm + * filename-parm = "filename" "=" value + * | "filename*" "=" ext-value + * disp-ext-parm = token "=" value + * | ext-token "=" ext-value + * ext-token = + * @private + */ + +var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex + +/** + * Create an attachment Content-Disposition header. + * + * @param {string} [filename] + * @param {object} [options] + * @param {string} [options.type=attachment] + * @param {string|boolean} [options.fallback=true] + * @return {string} + * @public + */ + +function contentDisposition (filename, options) { + var opts = options || {} + + // get type + var type = opts.type || 'attachment' + + // get parameters + var params = createparams(filename, opts.fallback) + + // format into string + return format(new ContentDisposition(type, params)) +} + +/** + * Create parameters object from filename and fallback. + * + * @param {string} [filename] + * @param {string|boolean} [fallback=true] + * @return {object} + * @private + */ + +function createparams (filename, fallback) { + if (filename === undefined) { + return + } + + var params = {} + + if (typeof filename !== 'string') { + throw new TypeError('filename must be a string') + } + + // fallback defaults to true + if (fallback === undefined) { + fallback = true + } + + if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { + throw new TypeError('fallback must be a string or boolean') + } + + if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) { + throw new TypeError('fallback must be ISO-8859-1 string') + } + + // restrict to file base name + var name = basename(filename) + + // determine if name is suitable for quoted string + var isQuotedString = TEXT_REGEXP.test(name) + + // generate fallback name + var fallbackName = typeof fallback !== 'string' + ? fallback && getlatin1(name) + : basename(fallback) + var hasFallback = typeof fallbackName === 'string' && fallbackName !== name + + // set extended filename parameter + if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) { + params['filename*'] = name + } + + // set filename parameter + if (isQuotedString || hasFallback) { + params.filename = hasFallback + ? fallbackName + : name + } + + return params +} + +/** + * Format object to Content-Disposition header. + * + * @param {object} obj + * @param {string} obj.type + * @param {object} [obj.parameters] + * @return {string} + * @private + */ + +function format (obj) { + var parameters = obj.parameters + var type = obj.type + + if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) { + throw new TypeError('invalid type') + } + + // start with normalized type + var string = String(type).toLowerCase() + + // append parameters + if (parameters && typeof parameters === 'object') { + var param + var params = Object.keys(parameters).sort() + + for (var i = 0; i < params.length; i++) { + param = params[i] + + var val = param.substr(-1) === '*' + ? ustring(parameters[param]) + : qstring(parameters[param]) + + string += '; ' + param + '=' + val + } + } + + return string +} + +/** + * Decode a RFC 5987 field value (gracefully). + * + * @param {string} str + * @return {string} + * @private + */ + +function decodefield (str) { + var match = EXT_VALUE_REGEXP.exec(str) + + if (!match) { + throw new TypeError('invalid extended field value') + } + + var charset = match[1].toLowerCase() + var encoded = match[2] + var value + + // to binary string + var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode) + + switch (charset) { + case 'iso-8859-1': + value = getlatin1(binary) + break + case 'utf-8': + value = Buffer.from(binary, 'binary').toString('utf8') + break + default: + throw new TypeError('unsupported charset in extended field') + } + + return value +} + +/** + * Get ISO-8859-1 version of string. + * + * @param {string} val + * @return {string} + * @private + */ + +function getlatin1 (val) { + // simple Unicode -> ISO-8859-1 transformation + return String(val).replace(NON_LATIN1_REGEXP, '?') +} + +/** + * Parse Content-Disposition header string. + * + * @param {string} string + * @return {object} + * @public + */ + +function parse (string) { + if (!string || typeof string !== 'string') { + throw new TypeError('argument string is required') + } + + var match = DISPOSITION_TYPE_REGEXP.exec(string) + + if (!match) { + throw new TypeError('invalid type format') + } + + // normalize type + var index = match[0].length + var type = match[1].toLowerCase() + + var key + var names = [] + var params = {} + var value + + // calculate index to start at + index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';' + ? index - 1 + : index + + // match parameters + while ((match = PARAM_REGEXP.exec(string))) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') + } + + index += match[0].length + key = match[1].toLowerCase() + value = match[2] + + if (names.indexOf(key) !== -1) { + throw new TypeError('invalid duplicate parameter') + } + + names.push(key) + + if (key.indexOf('*') + 1 === key.length) { + // decode extended value + key = key.slice(0, -1) + value = decodefield(value) + + // overwrite existing value + params[key] = value + continue + } + + if (typeof params[key] === 'string') { + continue + } + + if (value[0] === '"') { + // remove quotes and escapes + value = value + .substr(1, value.length - 2) + .replace(QESC_REGEXP, '$1') + } + + params[key] = value + } + + if (index !== -1 && index !== string.length) { + throw new TypeError('invalid parameter format') + } + + return new ContentDisposition(type, params) +} + +/** + * Percent decode a single character. + * + * @param {string} str + * @param {string} hex + * @return {string} + * @private + */ + +function pdecode (str, hex) { + return String.fromCharCode(parseInt(hex, 16)) +} + +/** + * Percent encode a single character. + * + * @param {string} char + * @return {string} + * @private + */ + +function pencode (char) { + return '%' + String(char) + .charCodeAt(0) + .toString(16) + .toUpperCase() +} + +/** + * Quote a string for HTTP. + * + * @param {string} val + * @return {string} + * @private + */ + +function qstring (val) { + var str = String(val) + + return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' +} + +/** + * Encode a Unicode string for HTTP (RFC 5987). + * + * @param {string} val + * @return {string} + * @private + */ + +function ustring (val) { + var str = String(val) + + // percent encode as UTF-8 + var encoded = encodeURIComponent(str) + .replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode) + + return 'UTF-8\'\'' + encoded +} + +/** + * Class for parsed Content-Disposition header for v8 optimization + * + * @public + * @param {string} type + * @param {object} parameters + * @constructor + */ + +function ContentDisposition (type, parameters) { + this.type = type + this.parameters = parameters +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/package.json new file mode 100644 index 00000000..43c70ce2 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-disposition/package.json @@ -0,0 +1,44 @@ +{ + "name": "content-disposition", + "description": "Create and parse Content-Disposition header", + "version": "0.5.4", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "content-disposition", + "http", + "rfc6266", + "res" + ], + "repository": "jshttp/content-disposition", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "7.32.0", + "eslint-config-standard": "13.0.1", + "eslint-plugin-import": "2.25.3", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "istanbul": "0.4.5", + "mocha": "9.1.3" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/HISTORY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/HISTORY.md new file mode 100644 index 00000000..45836713 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/HISTORY.md @@ -0,0 +1,29 @@ +1.0.5 / 2023-01-29 +================== + + * perf: skip value escaping when unnecessary + +1.0.4 / 2017-09-11 +================== + + * perf: skip parameter parsing when no parameters + +1.0.3 / 2017-09-10 +================== + + * perf: remove argument reassignment + +1.0.2 / 2016-05-09 +================== + + * perf: enable strict mode + +1.0.1 / 2015-02-13 +================== + + * Improve missing `Content-Type` header error message + +1.0.0 / 2015-02-01 +================== + + * Initial implementation, derived from `media-typer@0.3.0` diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/LICENSE new file mode 100644 index 00000000..34b1a2de --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/README.md new file mode 100644 index 00000000..c1a922a9 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/README.md @@ -0,0 +1,94 @@ +# content-type + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Create and parse HTTP Content-Type header according to RFC 7231 + +## Installation + +```sh +$ npm install content-type +``` + +## API + +```js +var contentType = require('content-type') +``` + +### contentType.parse(string) + +```js +var obj = contentType.parse('image/svg+xml; charset=utf-8') +``` + +Parse a `Content-Type` header. This will return an object with the following +properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): + + - `type`: The media type (the type and subtype, always lower case). + Example: `'image/svg+xml'` + + - `parameters`: An object of the parameters in the media type (name of parameter + always lower case). Example: `{charset: 'utf-8'}` + +Throws a `TypeError` if the string is missing or invalid. + +### contentType.parse(req) + +```js +var obj = contentType.parse(req) +``` + +Parse the `Content-Type` header from the given `req`. Short-cut for +`contentType.parse(req.headers['content-type'])`. + +Throws a `TypeError` if the `Content-Type` header is missing or invalid. + +### contentType.parse(res) + +```js +var obj = contentType.parse(res) +``` + +Parse the `Content-Type` header set on the given `res`. Short-cut for +`contentType.parse(res.getHeader('content-type'))`. + +Throws a `TypeError` if the `Content-Type` header is missing or invalid. + +### contentType.format(obj) + +```js +var str = contentType.format({ + type: 'image/svg+xml', + parameters: { charset: 'utf-8' } +}) +``` + +Format an object into a `Content-Type` header. This will return a string of the +content type for the given object with the following properties (examples are +shown that produce the string `'image/svg+xml; charset=utf-8'`): + + - `type`: The media type (will be lower-cased). Example: `'image/svg+xml'` + + - `parameters`: An object of the parameters in the media type (name of the + parameter will be lower-cased). Example: `{charset: 'utf-8'}` + +Throws a `TypeError` if the object contains an invalid type or parameter names. + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/content-type/master?label=ci +[ci-url]: https://github.com/jshttp/content-type/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/content-type/master +[coveralls-url]: https://coveralls.io/r/jshttp/content-type?branch=master +[node-image]: https://badgen.net/npm/node/content-type +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/content-type +[npm-url]: https://npmjs.org/package/content-type +[npm-version-image]: https://badgen.net/npm/v/content-type diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/index.js new file mode 100644 index 00000000..41840e7b --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/index.js @@ -0,0 +1,225 @@ +/*! + * content-type + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 + * + * parameter = token "=" ( token / quoted-string ) + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE + * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text + * obs-text = %x80-FF + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + */ +var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex +var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex +var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ + +/** + * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 + * + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + * obs-text = %x80-FF + */ +var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g // eslint-disable-line no-control-regex + +/** + * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 + */ +var QUOTE_REGEXP = /([\\"])/g + +/** + * RegExp to match type in RFC 7231 sec 3.1.1.1 + * + * media-type = type "/" subtype + * type = token + * subtype = token + */ +var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ + +/** + * Module exports. + * @public + */ + +exports.format = format +exports.parse = parse + +/** + * Format object to media type. + * + * @param {object} obj + * @return {string} + * @public + */ + +function format (obj) { + if (!obj || typeof obj !== 'object') { + throw new TypeError('argument obj is required') + } + + var parameters = obj.parameters + var type = obj.type + + if (!type || !TYPE_REGEXP.test(type)) { + throw new TypeError('invalid type') + } + + var string = type + + // append parameters + if (parameters && typeof parameters === 'object') { + var param + var params = Object.keys(parameters).sort() + + for (var i = 0; i < params.length; i++) { + param = params[i] + + if (!TOKEN_REGEXP.test(param)) { + throw new TypeError('invalid parameter name') + } + + string += '; ' + param + '=' + qstring(parameters[param]) + } + } + + return string +} + +/** + * Parse media type to object. + * + * @param {string|object} string + * @return {Object} + * @public + */ + +function parse (string) { + if (!string) { + throw new TypeError('argument string is required') + } + + // support req/res-like objects as argument + var header = typeof string === 'object' + ? getcontenttype(string) + : string + + if (typeof header !== 'string') { + throw new TypeError('argument string is required to be a string') + } + + var index = header.indexOf(';') + var type = index !== -1 + ? header.slice(0, index).trim() + : header.trim() + + if (!TYPE_REGEXP.test(type)) { + throw new TypeError('invalid media type') + } + + var obj = new ContentType(type.toLowerCase()) + + // parse parameters + if (index !== -1) { + var key + var match + var value + + PARAM_REGEXP.lastIndex = index + + while ((match = PARAM_REGEXP.exec(header))) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') + } + + index += match[0].length + key = match[1].toLowerCase() + value = match[2] + + if (value.charCodeAt(0) === 0x22 /* " */) { + // remove quotes + value = value.slice(1, -1) + + // remove escapes + if (value.indexOf('\\') !== -1) { + value = value.replace(QESC_REGEXP, '$1') + } + } + + obj.parameters[key] = value + } + + if (index !== header.length) { + throw new TypeError('invalid parameter format') + } + } + + return obj +} + +/** + * Get content-type from req/res objects. + * + * @param {object} + * @return {Object} + * @private + */ + +function getcontenttype (obj) { + var header + + if (typeof obj.getHeader === 'function') { + // res-like + header = obj.getHeader('content-type') + } else if (typeof obj.headers === 'object') { + // req-like + header = obj.headers && obj.headers['content-type'] + } + + if (typeof header !== 'string') { + throw new TypeError('content-type header is missing from object') + } + + return header +} + +/** + * Quote a string if necessary. + * + * @param {string} val + * @return {string} + * @private + */ + +function qstring (val) { + var str = String(val) + + // no need to quote tokens + if (TOKEN_REGEXP.test(str)) { + return str + } + + if (str.length > 0 && !TEXT_REGEXP.test(str)) { + throw new TypeError('invalid parameter value') + } + + return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' +} + +/** + * Class to represent a content type. + * @private + */ +function ContentType (type) { + this.parameters = Object.create(null) + this.type = type +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/package.json new file mode 100644 index 00000000..9db19f63 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/content-type/package.json @@ -0,0 +1,42 @@ +{ + "name": "content-type", + "description": "Create and parse HTTP Content-Type header", + "version": "1.0.5", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "content-type", + "http", + "req", + "res", + "rfc7231" + ], + "repository": "jshttp/content-type", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "8.32.0", + "eslint-config-standard": "15.0.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "10.2.0", + "nyc": "15.1.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/.npmignore b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/History.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/History.md new file mode 100644 index 00000000..78513cc3 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/History.md @@ -0,0 +1,38 @@ +1.0.6 / 2015-02-03 +================== + +* use `npm test` instead of `make test` to run tests +* clearer assertion messages when checking input + + +1.0.5 / 2014-09-05 +================== + +* add license to package.json + +1.0.4 / 2014-06-25 +================== + + * corrected avoidance of timing attacks (thanks @tenbits!) + +1.0.3 / 2014-01-28 +================== + + * [incorrect] fix for timing attacks + +1.0.2 / 2014-01-28 +================== + + * fix missing repository warning + * fix typo in test + +1.0.1 / 2013-04-15 +================== + + * Revert "Changed underlying HMAC algo. to sha512." + * Revert "Fix for timing attacks on MAC verification." + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/Readme.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/Readme.md new file mode 100644 index 00000000..2559e841 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/Readme.md @@ -0,0 +1,42 @@ + +# cookie-signature + + Sign and unsign cookies. + +## Example + +```js +var cookie = require('cookie-signature'); + +var val = cookie.sign('hello', 'tobiiscool'); +val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); + +var val = cookie.sign('hello', 'tobiiscool'); +cookie.unsign(val, 'tobiiscool').should.equal('hello'); +cookie.unsign(val, 'luna').should.be.false; +``` + +## License + +(The MIT License) + +Copyright (c) 2012 LearnBoost <tj@learnboost.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/index.js new file mode 100644 index 00000000..b8c9463a --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/index.js @@ -0,0 +1,51 @@ +/** + * Module dependencies. + */ + +var crypto = require('crypto'); + +/** + * Sign the given `val` with `secret`. + * + * @param {String} val + * @param {String} secret + * @return {String} + * @api private + */ + +exports.sign = function(val, secret){ + if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); + if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); + return val + '.' + crypto + .createHmac('sha256', secret) + .update(val) + .digest('base64') + .replace(/\=+$/, ''); +}; + +/** + * Unsign and decode the given `val` with `secret`, + * returning `false` if the signature is invalid. + * + * @param {String} val + * @param {String} secret + * @return {String|Boolean} + * @api private + */ + +exports.unsign = function(val, secret){ + if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); + if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); + var str = val.slice(0, val.lastIndexOf('.')) + , mac = exports.sign(str, secret); + + return sha1(mac) == sha1(val) ? str : false; +}; + +/** + * Private + */ + +function sha1(str){ + return crypto.createHash('sha1').update(str).digest('hex'); +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/package.json b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/package.json new file mode 100644 index 00000000..29c4498e --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie-signature/package.json @@ -0,0 +1,18 @@ +{ + "name": "cookie-signature", + "version": "1.0.6", + "description": "Sign and unsign cookies", + "keywords": ["cookie", "sign", "unsign"], + "author": "TJ Holowaychuk ", + "license": "MIT", + "repository": { "type": "git", "url": "https://github.com/visionmedia/node-cookie-signature.git"}, + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "scripts": { + "test": "mocha --require should --reporter spec" + }, + "main": "index" +} diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/LICENSE b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/LICENSE new file mode 100644 index 00000000..058b6b4e --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/README.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/README.md new file mode 100644 index 00000000..71fdac11 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/README.md @@ -0,0 +1,317 @@ +# cookie + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Basic HTTP cookie parser and serializer for HTTP servers. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install cookie +``` + +## API + +```js +var cookie = require('cookie'); +``` + +### cookie.parse(str, options) + +Parse an HTTP `Cookie` header string and returning an object of all cookie name-value pairs. +The `str` argument is the string representing a `Cookie` header value and `options` is an +optional object containing additional parsing options. + +```js +var cookies = cookie.parse('foo=bar; equation=E%3Dmc%5E2'); +// { foo: 'bar', equation: 'E=mc^2' } +``` + +#### Options + +`cookie.parse` accepts these properties in the options object. + +##### decode + +Specifies a function that will be used to decode a cookie's value. Since the value of a cookie +has a limited character set (and must be a simple string), this function can be used to decode +a previously-encoded cookie value into a JavaScript string or other object. + +The default function is the global `decodeURIComponent`, which will decode any URL-encoded +sequences into their byte representations. + +**note** if an error is thrown from this function, the original, non-decoded cookie value will +be returned as the cookie's value. + +### cookie.serialize(name, value, options) + +Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the +name for the cookie, the `value` argument is the value to set the cookie to, and the `options` +argument is an optional object containing additional serialization options. + +```js +var setCookie = cookie.serialize('foo', 'bar'); +// foo=bar +``` + +#### Options + +`cookie.serialize` accepts these properties in the options object. + +##### domain + +Specifies the value for the [`Domain` `Set-Cookie` attribute][rfc-6265-5.2.3]. By default, no +domain is set, and most clients will consider the cookie to apply to only the current domain. + +##### encode + +Specifies a function that will be used to encode a cookie's value. Since value of a cookie +has a limited character set (and must be a simple string), this function can be used to encode +a value into a string suited for a cookie's value. + +The default function is the global `encodeURIComponent`, which will encode a JavaScript string +into UTF-8 byte sequences and then URL-encode any that fall outside of the cookie range. + +##### expires + +Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute][rfc-6265-5.2.1]. +By default, no expiration is set, and most clients will consider this a "non-persistent cookie" and +will delete it on a condition like exiting a web browser application. + +**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and +`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this, +so if both are set, they should point to the same date and time. + +##### httpOnly + +Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute][rfc-6265-5.2.6]. When truthy, +the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` attribute is not set. + +**note** be careful when setting this to `true`, as compliant clients will not allow client-side +JavaScript to see the cookie in `document.cookie`. + +##### maxAge + +Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute][rfc-6265-5.2.2]. +The given number will be converted to an integer by rounding down. By default, no maximum age is set. + +**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and +`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this, +so if both are set, they should point to the same date and time. + +##### partitioned + +Specifies the `boolean` value for the [`Partitioned` `Set-Cookie`](rfc-cutler-httpbis-partitioned-cookies) +attribute. When truthy, the `Partitioned` attribute is set, otherwise it is not. By default, the +`Partitioned` attribute is not set. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +More information about can be found in [the proposal](https://github.com/privacycg/CHIPS). + +##### path + +Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6265-5.2.4]. By default, the path +is considered the ["default path"][rfc-6265-5.1.4]. + +##### priority + +Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1]. + + - `'low'` will set the `Priority` attribute to `Low`. + - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set. + - `'high'` will set the `Priority` attribute to `High`. + +More information about the different priority levels can be found in +[the specification][rfc-west-cookie-priority-00-4.1]. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +##### sameSite + +Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-09-5.4.7]. + + - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement. + - `false` will not set the `SameSite` attribute. + - `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement. + - `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie. + - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement. + +More information about the different enforcement levels can be found in +[the specification][rfc-6265bis-09-5.4.7]. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +##### secure + +Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute][rfc-6265-5.2.5]. When truthy, +the `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set. + +**note** be careful when setting this to `true`, as compliant clients will not send the cookie back to +the server in the future if the browser does not have an HTTPS connection. + +## Example + +The following example uses this module in conjunction with the Node.js core HTTP server +to prompt a user for their name and display it back on future visits. + +```js +var cookie = require('cookie'); +var escapeHtml = require('escape-html'); +var http = require('http'); +var url = require('url'); + +function onRequest(req, res) { + // Parse the query string + var query = url.parse(req.url, true, true).query; + + if (query && query.name) { + // Set a new cookie with the name + res.setHeader('Set-Cookie', cookie.serialize('name', String(query.name), { + httpOnly: true, + maxAge: 60 * 60 * 24 * 7 // 1 week + })); + + // Redirect back after setting cookie + res.statusCode = 302; + res.setHeader('Location', req.headers.referer || '/'); + res.end(); + return; + } + + // Parse the cookies on the request + var cookies = cookie.parse(req.headers.cookie || ''); + + // Get the visitor name set in the cookie + var name = cookies.name; + + res.setHeader('Content-Type', 'text/html; charset=UTF-8'); + + if (name) { + res.write('

Welcome back, ' + escapeHtml(name) + '!

'); + } else { + res.write('

Hello, new visitor!

'); + } + + res.write('
'); + res.write(' '); + res.end('
'); +} + +http.createServer(onRequest).listen(3000); +``` + +## Testing + +```sh +$ npm test +``` + +## Benchmark + +``` +$ npm run bench + +> cookie@0.5.0 bench +> node benchmark/index.js + + node@18.18.2 + acorn@8.10.0 + ada@2.6.0 + ares@1.19.1 + brotli@1.0.9 + cldr@43.1 + icu@73.2 + llhttp@6.0.11 + modules@108 + napi@9 + nghttp2@1.57.0 + nghttp3@0.7.0 + ngtcp2@0.8.1 + openssl@3.0.10+quic + simdutf@3.2.14 + tz@2023c + undici@5.26.3 + unicode@15.0 + uv@1.44.2 + uvwasi@0.0.18 + v8@10.2.154.26-node.26 + zlib@1.2.13.1-motley + +> node benchmark/parse-top.js + + cookie.parse - top sites + + 14 tests completed. + + parse accounts.google.com x 2,588,913 ops/sec ±0.74% (186 runs sampled) + parse apple.com x 2,370,002 ops/sec ±0.69% (186 runs sampled) + parse cloudflare.com x 2,213,102 ops/sec ±0.88% (188 runs sampled) + parse docs.google.com x 2,194,157 ops/sec ±1.03% (184 runs sampled) + parse drive.google.com x 2,265,084 ops/sec ±0.79% (187 runs sampled) + parse en.wikipedia.org x 457,099 ops/sec ±0.81% (186 runs sampled) + parse linkedin.com x 504,407 ops/sec ±0.89% (186 runs sampled) + parse maps.google.com x 1,230,959 ops/sec ±0.98% (186 runs sampled) + parse microsoft.com x 926,294 ops/sec ±0.88% (184 runs sampled) + parse play.google.com x 2,311,338 ops/sec ±0.83% (185 runs sampled) + parse support.google.com x 1,508,850 ops/sec ±0.86% (186 runs sampled) + parse www.google.com x 1,022,582 ops/sec ±1.32% (182 runs sampled) + parse youtu.be x 332,136 ops/sec ±1.02% (185 runs sampled) + parse youtube.com x 323,833 ops/sec ±0.77% (183 runs sampled) + +> node benchmark/parse.js + + cookie.parse - generic + + 6 tests completed. + + simple x 3,214,032 ops/sec ±1.61% (183 runs sampled) + decode x 587,237 ops/sec ±1.16% (187 runs sampled) + unquote x 2,954,618 ops/sec ±1.35% (183 runs sampled) + duplicates x 857,008 ops/sec ±0.89% (187 runs sampled) + 10 cookies x 292,133 ops/sec ±0.89% (187 runs sampled) + 100 cookies x 22,610 ops/sec ±0.68% (187 runs sampled) +``` + +## References + +- [RFC 6265: HTTP State Management Mechanism][rfc-6265] +- [Same-site Cookies][rfc-6265bis-09-5.4.7] + +[rfc-cutler-httpbis-partitioned-cookies]: https://tools.ietf.org/html/draft-cutler-httpbis-partitioned-cookies/ +[rfc-west-cookie-priority-00-4.1]: https://tools.ietf.org/html/draft-west-cookie-priority-00#section-4.1 +[rfc-6265bis-09-5.4.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-09#section-5.4.7 +[rfc-6265]: https://tools.ietf.org/html/rfc6265 +[rfc-6265-5.1.4]: https://tools.ietf.org/html/rfc6265#section-5.1.4 +[rfc-6265-5.2.1]: https://tools.ietf.org/html/rfc6265#section-5.2.1 +[rfc-6265-5.2.2]: https://tools.ietf.org/html/rfc6265#section-5.2.2 +[rfc-6265-5.2.3]: https://tools.ietf.org/html/rfc6265#section-5.2.3 +[rfc-6265-5.2.4]: https://tools.ietf.org/html/rfc6265#section-5.2.4 +[rfc-6265-5.2.5]: https://tools.ietf.org/html/rfc6265#section-5.2.5 +[rfc-6265-5.2.6]: https://tools.ietf.org/html/rfc6265#section-5.2.6 +[rfc-6265-5.3]: https://tools.ietf.org/html/rfc6265#section-5.3 + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/cookie/master?label=ci +[ci-url]: https://github.com/jshttp/cookie/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/cookie/master +[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master +[node-image]: https://badgen.net/npm/node/cookie +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/cookie +[npm-url]: https://npmjs.org/package/cookie +[npm-version-image]: https://badgen.net/npm/v/cookie diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/SECURITY.md b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/SECURITY.md new file mode 100644 index 00000000..fd4a6c53 --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The `cookie` team and community take all security bugs seriously. Thank +you for improving the security of the project. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `cookie`. This +information can be found in the npm registry using the command +`npm owner ls cookie`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/jshttp/cookie/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/index.js b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/index.js new file mode 100644 index 00000000..51a58cbe --- /dev/null +++ b/OneDrive/Desktop/SIT323/sit323-2025-prac5d/node_modules/cookie/index.js @@ -0,0 +1,334 @@ +/*! + * cookie + * Copyright(c) 2012-2014 Roman Shtylman + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +exports.parse = parse; +exports.serialize = serialize; + +/** + * Module variables. + * @private + */ + +var __toString = Object.prototype.toString + +/** + * RegExp to match cookie-name in RFC 6265 sec 4.1.1 + * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2 + * which has been replaced by the token definition in RFC 7230 appendix B. + * + * cookie-name = token + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / + * "*" / "+" / "-" / "." / "^" / "_" / + * "`" / "|" / "~" / DIGIT / ALPHA + */ + +var cookieNameRegExp = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/; + +/** + * RegExp to match cookie-value in RFC 6265 sec 4.1.1 + * + * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) + * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + * ; US-ASCII characters excluding CTLs, + * ; whitespace DQUOTE, comma, semicolon, + * ; and backslash + */ + +var cookieValueRegExp = /^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/; + +/** + * RegExp to match domain-value in RFC 6265 sec 4.1.1 + * + * domain-value = + * ; defined in [RFC1034], Section 3.5, as + * ; enhanced by [RFC1123], Section 2.1 + * =